%\iffalse % tex-locale.dtx generated using makedtx version 1.2 (c) Nicola Talbot % Command line args: % -src "tex-locale.sty\Z=>tex-locale.sty" % -src "tex-locale.tex\Z=>tex-locale.tex" % -src "tex-locale-scripts-enc.def\Z=>tex-locale-scripts-enc.def" % -src "tex-locale-encodings.def\Z=>tex-locale-encodings.def" % -src "tex-locale-support.def\Z=>tex-locale-support.def" % -author "Nicola Talbot" % -section "chapter" % -doc "tex-locale-manual.tex" % tex-locale % Created on 2018/8/26 19:14 %\fi %\iffalse %<*package> %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % %\fi % \iffalse % Doc-Source file to use with LaTeX2e % Copyright (C) 2018 Nicola Talbot, all rights reserved. % \fi % \iffalse %<*driver> \documentclass[report,widecs,inlinetitle]{nlctdoc} \DeleteShortVerb{|} \usepackage{metalogo} \let\orgtheindex\theindex \let\orgendtheindex\endtheindex \usepackage{imakeidx} \usepackage[a4paper,left=1.5in,right=0.5in]{geometry} \usepackage[colorlinks, bookmarks, hyperindex=false, pdfauthor={Nicola L.C. Talbot}, pdftitle={tex-locale: setup document locale}]{hyperref} \CheckSum{3313} \newcommand{\file}[1]{\texttt{#1}} \doxitem{Option}{option}{package options} \renewcommand{\nlctdocmarginfmt}{\scriptsize\raggedright} \renewcommand\MacroFont{\ttfamily\mdseries} \renewcommand*{\usage}[1]{\textit{\hyperpage{#1}}} \renewcommand*{\main}[1]{\underline{\hyperpage{#1}}} \PageIndex \setcounter{IndexColumns}{2} \newcommand*{\PrintCodeIndex}{% \bgroup \let\theindex\orgtheindex \let\endtheindex\orgendtheindex \PrintIndex \egroup } \IndexPrologue{% \clearpage\phantomsection \addcontentsline{toc}{chapter}{Code Index}% \chapter*{Code Index}\markboth{Code Index}{Code Index}% } \newenvironment{code}% {\begin{flushleft}\ttfamily\obeylines\obeyspaces} {\end{flushleft}\ignorespacesafterend} \makeindex[name=user,title=Main Index,intoc] \renewcommand{\iapp}[1]{\index[user]{#1@\appfmt{#1}|hyperpage}} \renewcommand{\iterm}[1]{\index[user]{#1|hyperpage}} \renewcommand{\ics}[1]{\cs{#1}\index[user]{#1@\protect\cs{#1}|hyperpage}} \renewcommand*{\ipkgopt}[2][]{% \ifstrempty{#1}% {\index[user]{package options:!#2@\pkgoptfmt{#2}|hyperpage}}% {\index[user]{package options:!#2@\pkgoptfmt{#2}!#1@\pkgoptfmt{#1}|hyperpage}}% } \renewcommand*{\pkgopt}[2][]{% \pkgoptfmt{#2}\ifstrempty{#1}% {\index[user]{package options:!#2@\pkgoptfmt{#2}|hyperpage}}% {\index[user]{package options:!#2@\pkgoptfmt{#2}!#1@\pkgoptfmt{#1}|hyperpage}}% } \renewcommand*{\isty}[1]{% \index[user]{#1 package@\styfmt{#1} package|hyperpage}} \newcommand{\attrfmt}[1]{\texttt{#1}} \newcommand{\attr}[2]{% \attrfmt{#2}% \index[user]{attributes!#1!#2@\protect\attrfmt{#2}}} \newcommand{\mattr}[2]{% \attr{#1@\protect\meta{#1}}{#2}% } \newcommand{\dattr}[1]{\mattr{dialect}{#1}} \newcommand{\rattr}[1]{\mattr{region}{#1}} \newcommand{\cattr}[1]{\mattr{currency}{#1}} \newcommand{\longarg}[1]{\texttt{-{}-#1}} \newcommand{\shortarg}[1]{\texttt{-#1}} \newcommand{\PDFLaTeX}{PDF\LaTeX} \setcounter{secnumdepth}{3} \setcounter{tocdepth}{3} \begin{document} \DocInput{tex-locale.dtx} \end{document} % %\fi % %\MakeShortVerb{"} % %\title{tex-locale v1.0: %setup document locale} %\author{Nicola L. C. Talbot\\\url{http://www.dickimaw-books.com/}} % %\date{2018-08-26} %\maketitle % %\begin{abstract} %The generic \TeX\ \file{tex-locale.tex} code uses both \sty{tracklang} %(at least v1.3.4) and \sty{texosquery} (at least v1.2, but newest %version recommended) to look up the locale information from the %operating system and provide commands that can access %locale-dependent information, such as the currency symbol and %numeric separators. This works best with the shell escape when %building the document. (Some \hyperref[sec:noshell]{adjustments} are %needed to work without the shell escape.) \TeX\ Live 2017 now %includes \app{texosquery-jre8} on the restricted list, but the %\sty{texosquery} installation needs to be set up to enable this. %Set up instructions are in the file \file{texosquery.cfg}, which is %distributed with the \sty{texosquery} package. If the application %isn't on the restricted list, then you'll need to enable the %unrestricted mode, but take care as this mode is insecure. % %Example plain \XeTeX\ document: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\input locale % %Currency: \CurrentLocaleCurrency. %Date: \CurrentLocaleDate. %Time: \CurrentLocaleTime. %\bye %\end{verbatim} % %The \LaTeX\ package \file{tex-locale.sty} can additionally load %\sty{babel} or \sty{polyglossia} with the locale's language %setting, as well as various other %packages such as \sty{fontspec} (\XeLaTeX\ or \LuaLaTeX) or %\sty{fontenc} and \sty{inputenc}. Packages that provide currency %symbols can also be loaded automatically (\sty{textcomp} by default). %Example \LaTeX\ document: %\begin{verbatim} %\documentclass{article} % %\usepackage{tex-locale} % %\begin{document} %Currency: \CurrentLocaleCurrency. %Date: \CurrentLocaleDate. %Time: \CurrentLocaleTime. %\end{document} %\end{verbatim} %\end{abstract} % %\begin{important} %\TeX's restricted mode prohibits the use of quotes in the shell %escape for security reasons. This means that if you want the file %modification date and you have spaces in your filename you must use %the unrestricted mode to allow the filename to be delimited by %quotes. In general it's best to avoid spaces in file names. %\end{important} % % %\tableofcontents %\chapter{Introduction} % %The \sty{tex-locale} package is designed to set up the document's %locale-sensitive information by querying the relevant information %from the operating system using \app{texosquery}. %\sectionref{sec:generic} describes generic commands that can be used %in \LaTeX\ or plain \TeX\ documents. \sectionref{sec:latex} %describes the \LaTeX-specific package \file{tex-locale.sty}, which does %more than simply input \file{tex-locale.tex}. % %The generic code \file{tex-locale.tex} requires: \file{tracklang.tex} and %\file{texosquery.tex}. The \LaTeX\ package \file{tex-locale.sty} %additionally requires: \file{tracklang.sty}, \file{texosquery.sty}, %\sty{etoolbox}, \sty{xfor}, \sty{ifxetex}, \sty{ifluatex}, \sty{xkeyval} %and optionally: %\begin{itemize} %\item \sty{datetime2} (and associated language modules); %\item \sty{textcomp} or \sty{fontawesome}; %\item \sty{fontspec} or \sty{fontenc}\&\sty{inputenc}; %\item \sty{polyglossia} or \sty{babel}; %\item \sty{CJK}, \sty{CJKutf8} or \sty{xeCJK}; %\item \sty{tracklang-scripts} (provided with \sty{tracklang}). %\end{itemize} % %The \sty{texosquery} package (distributed separately) comes with generic %\TeX\ code \file{texosquery.tex}, a simple \LaTeX\ package wrapper %\file{texosquery.sty} and a Java application that comes in three %variants: %\begin{itemize} %\item \file{texosquery-jre8.jar}: the full application, requires at %least Java 8. %\item \file{texosquery.jar}: a slightly cut-down version of the %application with less locale support, requires at least Java 7. %\item \file{texosquery-jre5.jar}: a significantly reduced version of %the application with poor locale support, requires at least Java 5. %\emph{Less secure than the other variants.} %\end{itemize} %The Java~8 variant (\app{texosquery-jre8}) is on \TeX~Live %2017's restricted list, so it's possible to use it with %the restricted shell escape. The other variants should not be added %to the restricted list as old versions of Java are deprecated and %considered security risks. In particular, the Java~5 variant's file %listing actions are less secure as they allow file listings outside %of the current directory path, which the Java~7 and 8 variants %prohibit. If you have Java~8 installed, I recommend that you make %\app{texosquery-jre8} the default. This can be done by editing the %configuration file \file{texosquery.cfg}. See the \sty{texosquery} %documentation for further details. (This document assumes %\app{texosquery-jre8} in the examples. Substitute the appropriate command if you %have a different set up.) % %\begin{important} %MiKTeX users will need to enable piped shell escape with %\longarg{enable-pipes} (unless the non-shell escape method described %in \sectionref{sec:noshell} is used). %\end{important} % %The information returned by \app{texosquery} has special markup %that's converted by \cs{TeXOSQuery} or \cs{TeXOSQueryFromFile}. For %example, \ics{fhyn} is used to represent a literal hyphen (category %code~12) whereas \ics{thyn} is used for a textual hyphen. %For example, if a file name containing a hyphen is returned, the %hyphen will be marked as \cs{fhyn}, whereas a date containing a %hyphen will use \cs{thyn}. % %\section{Using the package without the shell escape} %\label{sec:noshell} % %The \sty{tex-locale} package is designed for use with the piped shell escape %(preferably the restricted mode for greater security), but it's %still possible to use \file{tex-locale.tex} when the shell escape is disabled, %although it's less convenient. (You will need at least %\sty{texosquery} v1.4 for this method.) % %First compile your document with the shell escape disabled. The dry %run mode will automatically be on, and the \sty{texosquery} command %\cs{TeXOSQuery} will simply write the command it would've tried to %the transcript. This will be prefixed by \texttt{TeXOSQuery:} % %For example, suppose the file \texttt{test.tex} contains: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{de-CH-1996,fr-BE} % %\input locale % %Currency: \CurrentLocaleCurrency. % %\bye %\end{verbatim} %Here the main locale has been explicitly set to %\texttt{en-GB} and the other locales have been set to %\texttt{de-CH-1996} and \texttt{fr-BE}, so the transcript file %\texttt{test.log} will include: %\begin{verbatim} %TeXOSQuery: texosquery-jre8 -o -r -a -n -N -C -d 'test.tex' -D en-GB %-D de-CH-1996 -D fr-BE %\end{verbatim} %Copy and paste this command into a command prompt or terminal and redirect the %output to a file. (Don't include the initial \texttt{TeXOSQuery:} %and don't include any line breaks.) For example (omit line break): %\begin{verbatim} %texosquery-jre8 -o -r -a -n -N -C -d 'test.tex' -D en-GB %-D de-CH-1996 -D fr-BE > localesettings.tex %\end{verbatim} %Then define %\begin{definition}[\DescribeMacro\LocaleQueryFile] %\cs{LocaleQueryFile} %\end{definition} %to the file name before loading \sty{tex-locale}: %\begin{verbatim} %\def\LocaleQueryFile{localesettings} %\def\LocaleMain{en-GB} %\def\LocaleOther{de-CH-1996,fr-BE} % %\input locale % %Currency: \CurrentLocaleCurrency. % %\bye %\end{verbatim} %If you change any of the document settings you'll need to re-run %\app{texosquery} to update the query result file. % %\begin{important} %If you want the current date or time, the result files will need to %be updated before every document build. %\end{important} % %For example, if the file \texttt{test.tex} is simply: %\begin{verbatim} %\input locale % %Today: \CurrentLocaleShortDate. %Currency: \CurrentLocaleCurrency. % %\bye %\end{verbatim} %Then the document build process would be: %\begin{verbatim} %texosquery-jre8 -o -r -a -n -N -C -d 'test.tex' -D > testsettings.tex %etex '\def\LocaleQueryFile{testsettings}\input test' %\end{verbatim} %(Replace \app{etex} with \app{pdftex} or \app{xetex}, as required.) % %\begin{important} %If \cs{LocaleQueryFile} is defined and non-empty, the non-shell escape method %will automatically be implemented even if the shell escape is actually %enabled. %\end{important} % %If you're using \LaTeX\ (\file{tex-locale.sty}), there may be an initial query with %\texttt{-b} or \texttt{-C} (or both) before \file{tex-locale.tex} is %input. The result of this will also need to be captured in a file. %For example: %\begin{verbatim} %texosquery-jre8 -b -C > localestysettings.tex %\end{verbatim} %This file name should be provided in the command %\begin{definition}[\DescribeMacro\LocaleStyQueryFile] %\cs{LocaleStyQueryFile} %\end{definition} %In this case you only need to update the file if you change the %document locales, encoding or engine. (For example, if you change the %value of the package options \pkgopt{main}, \pkgopt{other}, %\pkgopt{support}, \pkgopt{inputenc} or \pkgopt{fontenc}.) % %\LaTeX\ example: %\begin{verbatim} %\documentclass{article} %\newcommand{\LocaleStyQueryFile}{localestysettings} %\newcommand{\LocaleQueryFile}{localesettings} %\usepackage[main=en-GB,other={de-CH-1996,fr-BE}]{tex-locale} %\begin{document} %Currency: \CurrentLocaleCurrency. %\end{document} %\end{verbatim} % %\begin{important} %Even if the shell escape is on, if \cs{LocaleQueryFile} or %\cs{LocaleStyQueryFile} have been set (to a non-empty value), %they'll be used instead. %\end{important} % %It's possible to define one but not the other command. For example: %\begin{verbatim} %\documentclass{article} %\newcommand{\LocaleStyQueryFile}{localestysettings} %\usepackage[main=en-GB,other={de-CH-1996,fr-BE}]{tex-locale} %\begin{document} %Currency: \CurrentLocaleCurrency. %\end{document} %\end{verbatim} %This requires the shell escape for the main locale information %(used in \file{tex-locale.tex}) but omits the \LaTeX-specific shell %escape used in \file{tex-locale.sty}. % %\section{Encoding} %\label{sec:encoding} % %The default encoding used by \app{texosquery} when writing the %results to STDOUT (which are piped in through the shell escape) %can be obtained with \longarg{codeset} (from v1.6). For example: %\begin{verbatim} %texosquery-jre8 --codeset %\end{verbatim} %The short form of this switch is \shortarg{cs}. So the above is %equivalent to %\begin{verbatim} %texosquery-jre8 -cs %\end{verbatim} %For example, if the encoding is UTF-8, then this returns %\begin{verbatim} %UTF\fhyn 8 %\end{verbatim} % %There's a similar switch \longarg{codeset-lcs} (from v1.2) that %converts the encoding name to lower case and strips hyphens. %For example %\begin{verbatim} %texosquery-jre8 --codeset-lcs %\end{verbatim} %The short form is \shortarg{C} %\begin{verbatim} %texosquery-jre8 -C %\end{verbatim} %For example, if the encoding is UTF-8, then this returns %\begin{verbatim} %utf8 %\end{verbatim} %(The switches are case-sensitive. The lower case \shortarg{c} has a %different meaning.) % %The document encoding must match the encoding used by %\app{texosquery} when the query is made (through \cs{TeXOSQuery} or %\cs{TeXOSQueryFromFile}). This is why the \LaTeX\ package %\file{tex-locale.sty} makes an initial query with \shortarg{C} so that %it can set up the appropriate input encoding when used with the %\pkgoptfmt{inputenc=auto} package option. If the document doesn't use %this interface, then the encoding needs to be correctly set before %the query is made. % %You have a choice of either changing the document encoding to match %the encoding used by \app{texosquery} or by changing %\app{texosquery}'s encoding to match all your documents. %For example, if your Java runtime environment is set up so that the %default file encoding is ISO~8859-1 (Latin-1) but you always use %UTF-8 in your source code, then you can instruct \app{texosquery} to %use UTF-8 with the \longarg{encoding} option (from v1.6). For example: %\begin{verbatim} %texosquery-jre8 --encoding UTF-8 -N %\end{verbatim} %will ensure that the currency symbol is written as a UTF-8 %character. The short form is \shortarg{enc}. For example: %\begin{verbatim} %texosquery-jre8 -enc UTF-8 -N %\end{verbatim} %You can append this option to the definition of %\cs{TeXOSInvokerName}. For example: %\begin{verbatim} %\def\TeXOSInvokerName{texosquery-jre8 -enc UTF-8} %\end{verbatim} % %There are two hooks which, if defined, are used immediately before %or immediately after the main query is made in \file{tex-locale.tex}. %The hook used before the query is %\begin{definition}[\DescribeMacro\localeprequery] %\cs{localeprequery} %\end{definition} %and the hook used after the query is %\begin{definition}[\DescribeMacro\localepostquery] %\cs{localepostquery} %\end{definition} %These may start and end a grouping, if required, as the result from %the query is given a global assignment, so these may be used to %temporarily switch the input encoding just for the query. This is %done by \file{tex-locale.sty} if it detects that the document requires %\sty{CJKutf8}. In this case it defines the hooks to locally switch %the encoding while the CJK characters are read from the query result. % %In addition to using markup commands like \cs{fhyn} and \cs{thyn}, %\app{texosquery} also wraps non-ASCII characters in the argument of %\cs{fwrp} (which expands to \cs{texosquerynonasciidetokwrap}) and %\cs{twrp} (which expands to \cs{texosquerynonasciiwrap}). The %expanded versions of these commands may be changed to deal with %non-ASCII characters, but in general it's simpler to either use the %same encoding as the document or use the hooks to temporarily switch %encoding while the information is read. % %\chapter{Generic Use} %\label{sec:generic} % %The commands available for generic use are defined in %\file{tex-locale.tex}. Plain \TeX\ users can load this using \cs{input}: %\begin{verbatim} %\input locale %\end{verbatim} %\LaTeX\ users are also able to do this, but are better off loading %\file{tex-locale.sty} instead: %\begin{verbatim} %\usepackage{tex-locale} %\end{verbatim} %This does more than simply inputting \file{tex-locale.tex} as it also %loads other packages as well, such as \sty{babel} or %\sty{polyglossia}. See \sectionref{sec:latex} for \LaTeX\ package options. % %By default \file{tex-locale.tex} assumes that the document locale should %match your own locale as identified by your operating system. This %means that the same document code will produce different results %when compiled in different locations. If you want information for a %specific locale, then you need to identify the document's main %locale and optionally other locales. For plain \TeX\ users, this %means defining \cs{LocaleMain} and \cs{LocaleOther} \emph{before} loading %\file{tex-locale.tex}. For \LaTeX\ users, this is done through the %package options provided by \file{tex-locale.sty}. % %\begin{definition}[\DescribeMacro\LocaleMain] %\cs{LocaleMain} %\end{definition} %If this is defined before \file{tex-locale.tex} is input, then this may %be defined as the keyword \texttt{locale}: %\begin{verbatim} %\def\LocaleMain{locale} %\end{verbatim} %or the relevant language tag. For example: %\begin{verbatim} %\def\LocaleMain{de-CH-1996} %\end{verbatim} %The \texttt{locale} keyword indicates that the main locale should be %found by querying the operating system (using \app{texosquery}). %After \file{tex-locale.tex} has been input, this command will be set to %the language tag for the main locale. If \cs{LocaleMain} is undefined before %\file{tex-locale.tex} is input, then \texttt{locale} is assumed. % %\begin{definition}[\DescribeMacro\LocaleOther] %\cs{LocaleOther} %\end{definition} %If this is defined before \file{tex-locale.tex} is input, then this %should be a comma-separated list of language tags for the other %locales. If \cs{LocaleMain} has been defined to a language tag, the %list may also include the keyword \texttt{locale} to indicate the %operating system's locale. % %Note that the generic \file{tex-locale.tex} doesn't load \sty{babel} or %\sty{polyglossia}, but it does track each language using %\sty{tracklang}'s interface. You can switch to any of these locales %using\label{pg:selectlocale} %\begin{definition}[\DescribeMacro\selectlocale] %\cs{selectlocale}\marg{locale} %\end{definition} %where \meta{locale} is either a language tag or \sty{tracklang} %dialect label. If the locale is unrecognised, an error will occur %unless \sty{texosquery}'s dry run mode is on, in which case it will %just be a warning. % %This uses \sty{tracklang}'s %\cs{SetCurrentTrackedDialect}\marg{dialect} but additionally, if %\cs{selectlanguage} has been defined, it will try to determine the %correct label to pass to \ics{selectlanguage}. % %This means that if you use \LaTeX\ with \file{tex-locale.sty}, which %loads \sty{babel} or \sty{polyglossia}, then you don't need to %remember, for example, that \texttt{en-GB} has the \sty{babel} %dialect label \texttt{british}, and can simply do %\begin{verbatim} %\selectlocale{en-GB} %\end{verbatim} %If \cs{selectlanguage} isn't defined, then this command doesn't %switch the document language (that is, it doesn't change the %hyphenation patterns or \cs{languagename}) but it does allow %the \cs{CurrentLocale\ldots} commands (described in \sectionref{sec:currentlocale}) to reflect %the change in locale. % %Here's a plain \XeTeX\ document that sets up three locales for the %document. The first (main one) is obtained from the operating system %(because \cs{LocaleMain} isn't defined) and the other two are %explicitly set by defining \cs{LocaleOther} before \file{tex-locale.tex} %is input: %\begin{verbatim} %\def\LocaleOther{fr-BE,de-CH-1996} % %\input locale % %Currency: \CurrentLocaleCurrency. % %\selectlocale{fr-BE} % %Currency: \CurrentLocaleCurrency. % %\selectlocale{de-CH-1996} % %Currency: \CurrentLocaleCurrency. %\bye %\end{verbatim} %If this document is in a file called \file{test.tex}, then it can be %compiled using: %\begin{verbatim} %pdftex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %etex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %xetex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %luatex --shell-escape test %\end{verbatim} %(Omit \longarg{shell-escape} if the application given by %\cs{TeXOSInvokerName} is on the restricted list.) % %The equivalent \LaTeX\ document is: %\begin{verbatim} %\documentclass{article} % %\usepackage[other={fr-BE,de-CH-1996}]{tex-locale} % %\begin{document} %Currency: \CurrentLocaleCurrency. % %\selectlocale{fr-BE} % %Currency: \CurrentLocaleCurrency. % %\selectlocale{de-CH-1996} % %Currency: \CurrentLocaleCurrency. % %\end{document} %\end{verbatim} %If this document is in a file called \file{test.tex}, then it can be %compiled using: %\begin{verbatim} %pdflatex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %latex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %xelatex --shell-escape test %\end{verbatim} %or %\begin{verbatim} %lualatex --shell-escape test %\end{verbatim} %(Again, omit \longarg{shell-escape} if the application given by %\cs{TeXOSInvokerName} is on the restricted list.) % %In the first two cases (\texttt{pdflatex} or \texttt{latex}), %\sty{babel} will be loaded (and also \sty{fontenc} and \sty{inputenc} %and various other packages). Whereas in the last two cases %(\texttt{xelatex} or \texttt{lualatex}), %\sty{polyglossia} will be loaded (and also \sty{fontspec} and %various other packages). This means that \cs{selectlocale} will also %use \cs{selectlanguage} to switch the document language. In the %plain \TeX\ version, \cs{languagename} remains undefined. % %The other difference between the plain \TeX\ and the \LaTeX\ %examples, is the default output produced by %\cs{CurrentLocaleCurrency}. The plain \TeX\ version uses the %currency codes (for example, EUR) whereas the \LaTeX\ version uses %currency symbols. These differences are described in more detail %below. % %\section{General Information} %\label{sec:general} % %Each invocation of \app{texosquery} requires starting up the %Java Virtual Machine, so \file{tex-locale.tex} minimises this overhead by %only using a single system call. The \file{tex-locale.sty} \LaTeX\ %package may need additional information that also requires a %\app{texosquery} call before \file{tex-locale.tex} is input. So \LaTeX\ %users will have at most two system calls to \app{texosquery} when %loading \file{tex-locale.sty} whereas plain \TeX\ users will only have a %single system call when loading just \file{tex-locale.tex}. % %Since it's necessary to run \app{texosquery} to obtain all the %locale information, \file{tex-locale.tex} uses the opportunity to also %fetch more general information that may be of use. % %\begin{definition}[\DescribeMacro\LocaleOSname] %\cs{LocaleOSname} %\end{definition} %This expands to the operating system name. For example, %\texttt{Linux}. % %\begin{definition}[\DescribeMacro\LocaleOSversion] %\cs{LocaleOSversion} %\end{definition} %This expands to the operating system version. For example, %\verb|4.1.13-100.fc21.x86_64|. (Note that the underscore in this %case has been detokenized.) % %\begin{definition}[\DescribeMacro\LocaleOSarch] %\cs{LocaleOSarch} %\end{definition} %This expands to the architecture. For example, %\texttt{amd64}. % %\begin{definition}[\DescribeMacro\LocaleOScodeset] %\cs{LocaleOScodeset} %\end{definition} %This expands to the operating system's default file encoding (or the %value of the Java setting \texttt{file.encoding}). This uses %\app{texosquery}'s \shortarg{C} switch, which converts the encoding %name to lower case and strips the hyphens. (For example, \texttt{UTF-8} %is converted to \texttt{utf8}.) If you prefer to use the %\shortarg{cs} (or \longarg{codeset}) switch, you can define %\begin{definition}[\DescribeMacro\LocaleQueryCodesetParam] %\cs{LocaleQueryCodesetParam} %\end{definition} %to the required switch. For example: %\begin{verbatim} %\def\LocaleQueryCodesetParam{-cs} %\input locale %Encoding: \LocaleOScodeset. %\bye %\end{verbatim} %(Note that \cs{codeset} was added to \app{texosquery} v1.6.) % %\begin{definition}[\DescribeMacro\LocaleOStag] %\cs{LocaleOStag} %\end{definition} %This expands to the operating system's language tag, but note that %this doesn't mean that this locale has been tracked (either as the %main locale or one of the other document locales). It's for %informational purposes only. % %\begin{definition}[\DescribeMacro\LocaleNowStamp] %\cs{LocaleNowStamp} %\end{definition} %This expands to the current date-time in PDF format. This is like %the PDF primitive \ics{pdfcreationdate} (also available with \LuaTeX\ %through \cs{pdffeedback}). Since \cs{pdfcreationdate} isn't provided %by \XeTeX, \cs{LocaleNowStamp} can be used instead if required. % %You can also obtain the file modification date of the document %source file. The file is assumed to be \cs{jobname}\texttt{.tex}, %but you can choose another instead by first defining %\begin{definition}[\DescribeMacro\LocaleMainFile] %\cs{LocaleMainFile} %\end{definition} %before loading \file{tex-locale.tex}. The value should be the file name. %For example: %\begin{verbatim} %\def\LocaleMainFile{mydoc.tex} %\input locale %\end{verbatim} %You can define this command to empty if you don't want the file %modification PDF date-stamp. For example: %\begin{verbatim} %\def\LocaleMainFile{} %\input locale %\end{verbatim} %If the file name contains spaces, you can't use the restricted shell %escape and will have to use the less secure unrestricted mode instead. % %If \cs{LocaleMainFile} is not empty, the modification date can be %accessed using %\begin{definition}[\DescribeMacro\LocaleFileMod] %\cs{LocaleFileMod} %\end{definition} %For example: %\begin{verbatim} %\input locale % %\pdfinfo{ % /CreationDate (\LocaleNowStamp) % /ModDate (\LocaleFileMod) %} % %Now: \LocaleNowStamp. %Mod: \LocaleFileMod. % %\bye %\end{verbatim} %This command will be empty if the modification date wasn't found. % %\section{Attributes} %\label{sec:attributes} % %The \file{tex-locale.tex} package stores and references information %through the use of attributes. These are set using: %\begin{definition}[\DescribeMacro\LocaleSetAttribute] %\cs{LocaleSetAttribute}\marg{label}\marg{attribute}\marg{value} %\end{definition} %and accessed using %\begin{definition}[\DescribeMacro\LocaleGetAttribute] %\cs{LocaleGetAttribute}\marg{label}\marg{attribute} %\end{definition} %The \meta{label} identifies the type of information, %\meta{attribute} is the attribute's label and \meta{value} is the %attribute's value. % %There are three particular types of identifiers: locales, regions %and currencies. For convenience, there are some shortcut commands so %you don't need to use the special prefix part of the label. % %For locales, where \meta{dialect} is the \sty{tracklang} dialect %label associated with that locale: %\begin{definition}[\DescribeMacro\LocaleSetDialectAttribute] %\cs{LocaleSetDialectAttribute}\marg{dialect}\marg{attribute}\marg{value} %\end{definition} %\begin{definition}[\DescribeMacro\LocaleGetDialectAttribute] %\cs{LocaleGetDialectAttribute}\marg{dialect}\marg{attribute} %\end{definition} % %Region attributes are set using: %\begin{definition}[\DescribeMacro\LocaleSetRegionAttribute] %\cs{LocaleSetRegionAttribute}\marg{region code}\marg{attribute}\marg{value} %\end{definition} %where \meta{region code} is the ISO territory code (for example, %\texttt{GB} or \texttt{CH}). %You can fetch a region's attribute value using: %\begin{definition}[\DescribeMacro\LocaleGetRegionAttribute] %\cs{LocaleGetRegionAttribute}\marg{region code}\marg{attribute} %\end{definition} % %Currency attributes are set using: %\begin{definition}[\DescribeMacro\LocaleSetCurrencyAttribute] %\cs{LocaleSetCurrencyAttribute}\marg{currency code}\marg{attribute}\marg{value} %\end{definition} %where \meta{currency code} is the ISO currency code (for example, %\texttt{GBP} or \texttt{EUR}). %You can fetch a currency's attribute value using: %\begin{definition}[\DescribeMacro\LocaleGetCurrencyAttribute] %\cs{LocaleGetCurrencyAttribute}\marg{currency code}\marg{attribute} %\end{definition} % %There's a debugging command available that uses \ics{show} to show %an attribute's value (or an error if undefined): %\begin{definition}[\DescribeMacro\localeshowattribute] %\cs{localeshowattribute}\marg{label}\marg{attribute} %\end{definition} % %Again there are shortcuts for the dialect, region and currency attribute groups: %\begin{definition}[\DescribeMacro\localeshowdialectattribute] %\cs{localeshowdialectattribute}\marg{dialect}\marg{attribute} %\end{definition} %\begin{definition}[\DescribeMacro\localeshowregionattribute] %\cs{localeshowregionattribute}\marg{region code}\marg{attribute} %\end{definition} %\begin{definition}[\DescribeMacro\localeshowcurrencyattribute] %\cs{localeshowcurrencyattribute}\marg{currency code}\marg{attribute} %\end{definition} %Further details of these and other attribute commands can be found in %\sectionref{sec:code.attributes}. % %For the most part, the attributes are stored and accessed internally %by the various commands described in this chapter, so you %won't usually need to worry about them. However, you can modify the %attributes. For example, the \texttt{de-CH-1996} locale uses an %apostrophe \verb|'| as the numeric group separator. This is actually %returned by \app{texosquery} as the 0x27 straight apostrophe from %the Basic Latin block. This isn't a problem for plain \TeX\ using %the default Computer Modern font, as illustrated by the following %document: %\begin{verbatim} %1'234.5 %\bye %\end{verbatim} %This uses a curly quote in the resulting 1'234.5. However, changing the font can result in a %straight apostrophe instead, as illustrated in this plain \XeTeX\ %document: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %1'234.5 %\bye %\end{verbatim} %This isn't a problem with \XeLaTeX\ if the \sty{fontspec} package is %used: %\begin{verbatim} %\documentclass{article} %\usepackage{fontspec} %\setmainfont{NimbusRoman-Regular} % %\begin{document} %1'234.5 %\end{document} %\end{verbatim} % %So a plain \XeTeX\ user might prefer to change the numeric group %separator to the right single quote character ' (0x2019). %The numeric group separator is provided by the \dattr{groupsep} %dialect attribute. The \sty{tracklang} dialect label corresponding %to the \texttt{de-CH-1996} locale is \texttt{nswissgerman}. So the %group separator for this dialect can be changed by setting the %attribute to the new value using: %\begin{code} %\cs{LocaleSetDialectAttribute}\{nswissgerman\}\{groupsep\}\{\textquoteright\} %\end{code} %(See \sectionref{sec:generalattr} to convert a language tag to %dialect label.) % %\subsection{Attribute Lists} %\label{sec:attrlists} % %Some attribute values may be comma-separated lists. You can %add a unique item to a list using: %\begin{definition}[\DescribeMacro\LocaleAddToAttributeList] %\cs{LocaleAddToAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} %This will do nothing if the item is already in the list, otherwise %it will append \meta{item} to the list. No %expansion is performed on \meta{item}. The item may be empty. % %\begin{definition}[\DescribeMacro\LocaleXpAddToAttributeList] %\cs{LocaleXpAddToAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} %As above but the first token of \meta{item} is expanded before %being added to the list. % %You can test if an item is in one of those lists using: %\begin{definition}[\DescribeMacro\LocaleIfInAttributeList] %\cs{LocaleIfInAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} %where \meta{item} is the item. This does \meta{true} if %\meta{item} is found in the \meta{attribute} list for %\meta{label}, otherwise it does \meta{false}. If the attribute %hasn't been defined, \meta{false} is done. % %There's a similar command that expands the first token of %\meta{item} before performing the test: %\begin{definition}[\DescribeMacro\LocaleIfInAttributeList] %\cs{LocaleIfXpInAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %You can iterate over the list using: %\begin{definition}[\DescribeMacro\LocaleForEachInAttributeList] %\cs{LocaleForEachInAttributeList}\marg{label}\marg{attribute}\marg{cs}\marg{body} %\end{definition} %This iterates over each element of the list, setting %the control sequence \meta{cs} to the current item and performing %\meta{body}. Note that this doesn't skip empty items. % %There are shortcut commands for the dialect, region and currency %attributes: % %\begin{definition}[\DescribeMacro\LocaleAddToDialectAttributeList] %\cs{LocaleAddToDialectAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleXpAddToDialectAttributeList] %\cs{LocaleXpAddToDialectAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInDialectAttributeList] %\cs{LocaleIfInDialectAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInDialectAttributeList] %\cs{LocaleIfXpInDialectAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleForEachInDialectAttributeList] %\cs{LocaleForEachInDialectAttributeList}\marg{label}\marg{attribute}\marg{cs}\marg{body} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleAddToRegionAttributeList] %\cs{LocaleAddToRegionAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleXpAddToRegionAttributeList] %\cs{LocaleXpAddToRegionAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInRegionAttributeList] %\cs{LocaleIfInRegionAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInRegionAttributeList] %\cs{LocaleIfXpInRegionAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleForEachInRegionAttributeList] %\cs{LocaleForEachInRegionAttributeList}\marg{label}\marg{attribute}\marg{cs}\marg{body} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleAddToCurrencyAttributeList] %\cs{LocaleAddToCurrencyAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleXpAddToCurrencyAttributeList] %\cs{LocaleXpAddToCurrencyAttributeList}\marg{label}\marg{attribute}\marg{item} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInCurrencyAttributeList] %\cs{LocaleIfInCurrencyAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleIfInCurrencyAttributeList] %\cs{LocaleIfXpInCurrencyAttributeList}\marg{label}\marg{attribute}\marg{item}\marg{true}\marg{false} %\end{definition} % %\begin{definition}[\DescribeMacro\LocaleForEachInCurrencyAttributeList] %\cs{LocaleForEachInCurrencyAttributeList}\marg{label}\marg{attribute}\marg{cs}\marg{body} %\end{definition} % %\subsection{General Attributes} %\label{sec:generalattr} % %The language tag attribute type \mattr{lang tag}{tagtodialect} is set using %\begin{code} %\cs{LocaleSetAttribute}\marg{label}\{tagtodialect\}\marg{value} %\end{code} %and can be accessed using %\begin{code} %\cs{LocaleGetAttribute}\marg{label}\{tagtodialect\} %\end{code} %The \meta{label} is a language tag (such as \texttt{de-CH-1996}) %and the \meta{value} is the associated \sty{tracklang} dialect label %(for example, \texttt{nswissgerman}). %This attribute is used by \ics{selectlocale} to convert the language %tag to the corresponding dialect label. % %If the time zone information was fetched with \app{texosquery}'s %\texttt{-Z} switch, then the time zone IDs will be stored %in the time zone \attr{timezone}{id} attribute list that can be fetched with %\begin{verbatim} %\LocaleGetAttribute{timezone}{id} %\end{verbatim} %or iterated over using \cs{LocaleForEachInAttributeList}. %For example: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} % %\input locale % %Time zone IDs: % %\LocaleForEachInAttributeList{timezone}{id}{\ThisId}{\ThisId\endgraf} % %\bye %\end{verbatim} %This simply lists all the known time zone identifiers. (Since %\cs{LocaleForEachInAttributeList} is a short command, %\cs{endgraf} is used to create a paragraph break in the above %example.) % %There are two general currency attribute lists, where the %\meta{label} is \texttt{currencies} and the attribute values %are \attr{currencies}{official} for the list of official currency codes %and \attr{currencies}{regional} for the regional currency codes. %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM,en-GG,fr-BE,nl-BE,de-DE-1996} % %\input locale % %Official: \LocaleGetAttribute{currencies}{official}. %Regional: \LocaleGetAttribute{currencies}{regional}. % %\bye %\end{verbatim} %produces: %\begin{quote} %Official: GBP,EUR. Regional: GBP,IMP,GGP,EUR. %\end{quote} % %You can iterate over these lists using %\cs{LocaleForEachInAttributeList}. For example: %\begin{verbatim} %% arara: xetex: {shell: on} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM,en-GG,fr-BE,nl-BE,de-DE-1996} % %\input locale % %\LocaleForEachInAttributeList{currencies}{regional}{\thiscode}% %{\thiscode\ (\LocaleGetCurrencyAttribute{\thiscode}{sym}) } % %\bye %\end{verbatim} %which produces: %\begin{quote} %GBP (\pounds) IMP (M\pounds) GGP (\pounds) EUR (\texteuro) %\end{quote} % %\subsection{Dialect Attributes} %\label{sec:dialectattr} % %The following attributes are associated with dialects and can be set %using %\begin{code} %\cs{LocaleSetDialectAttribute}\marg{dialect}\marg{attribute}\marg{value} %\end{code} %or fetched with %\begin{code} %\cs{LocaleGetDialectAttribute}\marg{dialect}\marg{attribute} %\end{code} %where \meta{dialect} is the \sty{tracklang} dialect label. %Known values of \meta{attribute} are listed below. % %\subsubsection{General Dialect Attributes} %\label{sec:dialectgenattr} % %\begin{itemize} %\item\dattr{langtag}: the \meta{value} is the language tag associated with the %dialect label \meta{dialect}. %\item\dattr{langname}: the \meta{value} is the language name associated with the %dialect label \meta{dialect}. %\item\dattr{nativelangname}: the \meta{value} is the native language name %associated with the dialect label \meta{dialect}. %\item\dattr{regionname}: the \meta{value} is the region name associated with the %dialect label \meta{dialect}. %\item\dattr{nativeregionname}: the \meta{value} is the native region name %associated with the dialect label \meta{dialect}. %\item\dattr{variantname}: the \meta{value} is the variant name associated with the %dialect label \meta{dialect}. %\item\dattr{nativevariantname}: the \meta{value} is the native variant name associated with the %dialect label \meta{dialect}. %\end{itemize} % %\subsubsection{Dates and Times Dialect Attributes} %\label{sec:attrdatetime} % %The commands described in \sectionref{sec:datetimes} use these attributes. % %\begin{itemize} %\item\dattr{fulldate}: the \meta{value} is the full date associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleFullDate}.) %\item\dattr{longdate}: the \meta{value} is the long date associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleLongDate}.) %\item\dattr{meddate}: the \meta{value} is the medium date associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleMediumDate}.) %\item\dattr{shortdate}: the \meta{value} is the short date associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleShortDate}.) %\item\dattr{firstday}: the \meta{value} is the index of the first day of the week associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleFirstDayIndex}.) %\item\dattr{fulltime}: the \meta{value} is the full time associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleFullTime}.) %\item\dattr{longtime}: the \meta{value} is the long time associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleLongTime}.) %\item\dattr{medtime}: the \meta{value} is the medium time associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleMediumTime}.) %\item\dattr{shorttime}: the \meta{value} is the short time associated with the %dialect label \meta{dialect}. (Used by \ics{LocaleShortTime}.) %\item\dattr{fulldatetime}: the \meta{value} is the full date and time %associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleFullDateTime}.) %\item\dattr{longdatetime}: the \meta{value} is the long date and time %associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleLongDateTime}.) %\item\dattr{meddatetime}: the \meta{value} is the medium date and time %associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleMediumDateTime}.) %\item\dattr{shortdatetime}: the \meta{value} is the short date and time %associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleShortDateTime}.) %\end{itemize} %Note that the combined date and time attributes (such as %\attrfmt{fulldatetime}) aren't used by %\ics{CurrentLocaleDateTime}. % %\paragraph{Patterns} %The following attributes store date or time patterns (see %\sectionref{sec:datetimepat}). %\begin{itemize} %\item\dattr{fulldatefmt}: the \meta{value} is the full date format associated %with the dialect label \meta{dialect}. %\item\dattr{longdatefmt}: the \meta{value} is the long date format associated %with the dialect label \meta{dialect}. %\item\dattr{meddatefmt}: the \meta{value} is the medium date format associated %with the dialect label \meta{dialect}. %\item\dattr{shortdatefmt}: the \meta{value} is the short date format associated %with the dialect label \meta{dialect}. %\item\dattr{fulltimefmt}: the \meta{value} is the full time format associated %with the dialect label \meta{dialect}. %\item\dattr{longtimefmt}: the \meta{value} is the long time format associated %with the dialect label \meta{dialect}. %\item\dattr{medtimefmt}: the \meta{value} is the medium time format associated %with the dialect label \meta{dialect}. %\item\dattr{shorttimefmt}: the \meta{value} is the short time format associated %with the dialect label \meta{dialect}. %\item\dattr{fulldatetimefmt}: the \meta{value} is the full date time format %associated with the dialect label \meta{dialect}. %\item\dattr{longdatetimefmt}: the \meta{value} is the long date time format %associated with the dialect label \meta{dialect}. %\item\dattr{meddatetimefmt}: the \meta{value} is the medium date time format %associated with the dialect label \meta{dialect}. %\item\dattr{shortdatetimefmt}: the \meta{value} is the short date time format %associated with the dialect label \meta{dialect}. %\end{itemize} % %\paragraph{Day Names} % %The commands \ics{LocaleDayName}, \ics{LocaleShortDayName}, %\ics{LocaleStandaloneDayName} and \ics{LocaleStandaloneShortDayName} %use these attributes. % %\begin{itemize} %\item\dattr{day.0}: the \meta{value} is the name for day~0 (Monday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.1}: the \meta{value} is the name for day~1 (Tuesday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.2}: the \meta{value} is the name for day~2 (Wednesday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.3}: the \meta{value} is the name for day~3 (Thursday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.4}: the \meta{value} is the name for day~4 (Friday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.5}: the \meta{value} is the name for day~5 (Saturday) %associated with the dialect label \meta{dialect}. %\item\dattr{day.6}: the \meta{value} is the name for day~6 (Sunday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.0}: the \meta{value} is the short name for day~0 (Monday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.1}: the \meta{value} is the short name for day~1 (Tuesday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.2}: the \meta{value} is the short name for day~2 (Wednesday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.3}: the \meta{value} is the short name for day~3 (Thursday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.4}: the \meta{value} is the short name for day~4 (Friday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.5}: the \meta{value} is the short name for day~5 (Saturday) %associated with the dialect label \meta{dialect}. %\item\dattr{shortday.6}: the \meta{value} is the short name for day~6 (Sunday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.0}: the \meta{value} is the name for day~0 (Monday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.1}: the \meta{value} is the standalone name for day~1 (Tuesday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.2}: the \meta{value} is the standalone name for day~2 (Wednesday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.3}: the \meta{value} is the standalone name for day~3 (Thursday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.4}: the \meta{value} is the standalone name for day~4 (Friday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.5}: the \meta{value} is the standalone name for day~5 (Saturday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.day.6}: the \meta{value} is the standalone name for day~6 (Sunday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.0}: the \meta{value} is the standalone short name for day~0 (Monday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.1}: the \meta{value} is the standalone short name for day~1 (Tuesday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.2}: the \meta{value} is the standalone short name for day~2 (Wednesday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.3}: the \meta{value} is the standalone short name for day~3 (Thursday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.4}: the \meta{value} is the standalone short name for day~4 (Friday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.5}: the \meta{value} is the standalone short name for day~5 (Saturday) %associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortday.6}: the \meta{value} is the standalone short name for day~6 (Sunday) %associated with the dialect label \meta{dialect}. %\end{itemize} % %\paragraph{Month Names} % %The commands \ics{LocaleMonthName}, \ics{LocaleShortMonthName}, %\ics{LocaleStandaloneMonthName} and \ics{LocaleStandaloneShortMonthName} %use these attributes. % %\begin{itemize} %\item\dattr{month.1}: the \meta{value} is the name for month~1 %(January) associated with the dialect label \meta{dialect}. %\item\dattr{month.2}: the \meta{value} is the name for month~2 %(February) associated with the dialect label \meta{dialect}. %\item\dattr{month.3}: the \meta{value} is the name for month~3 %(March) associated with the dialect label \meta{dialect}. %\item\dattr{month.4}: the \meta{value} is the name for month~4 %(April) associated with the dialect label \meta{dialect}. %\item\dattr{month.5}: the \meta{value} is the name for month~5 %(May) associated with the dialect label \meta{dialect}. %\item\dattr{month.6}: the \meta{value} is the name for month~6 %(June) associated with the dialect label \meta{dialect}. %\item\dattr{month.7}: the \meta{value} is the name for month~7 %(July) associated with the dialect label \meta{dialect}. %\item\dattr{month.8}: the \meta{value} is the name for month~8 %(August) associated with the dialect label \meta{dialect}. %\item\dattr{month.9}: the \meta{value} is the name for month~9 %(September) associated with the dialect label \meta{dialect}. %\item\dattr{month.10}: the \meta{value} is the name for month~10 %(October) associated with the dialect label \meta{dialect}. %\item\dattr{month.11}: the \meta{value} is the name for month~11 %(November) associated with the dialect label \meta{dialect}. %\item\dattr{month.12}: the \meta{value} is the name for month~12 %(December) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.1}: the \meta{value} is the short name for month~1 %(January) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.2}: the \meta{value} is the short name for month~2 %(February) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.3}: the \meta{value} is the short name for month~3 %(March) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.4}: the \meta{value} is the short name for month~4 %(April) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.5}: the \meta{value} is the short name for month~5 %(May) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.6}: the \meta{value} is the short name for month~6 %(June) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.7}: the \meta{value} is the short name for month~7 %(July) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.8}: the \meta{value} is the short name for month~8 %(August) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.9}: the \meta{value} is the short name for month~9 %(September) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.10}: the \meta{value} is the short name for month~10 %(October) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.11}: the \meta{value} is the short name for month~11 %(November) associated with the dialect label \meta{dialect}. %\item\dattr{shortmonth.12}: the \meta{value} is the short name for month~12 %(December) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.1}: the \meta{value} is the standalone name for month~1 %(January) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.2}: the \meta{value} is the standalone name for month~2 %(February) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.3}: the \meta{value} is the standalone name for month~3 %(March) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.4}: the \meta{value} is the standalone name for month~4 %(April) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.5}: the \meta{value} is the standalone name for month~5 %(May) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.6}: the \meta{value} is the standalone name for month~6 %(June) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.7}: the \meta{value} is the standalone name for month~7 %(July) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.8}: the \meta{value} is the standalone name for month~8 %(August) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.9}: the \meta{value} is the standalone name for month~9 %(September) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.10}: the \meta{value} is the standalone name for month~10 %(October) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.11}: the \meta{value} is the standalone name for month~11 %(November) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.month.12}: the \meta{value} is the standalone name for month~12 %(December) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.1}: the \meta{value} is the standalone short name for month~1 %(January) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.2}: the \meta{value} is the standalone short name for month~2 %(February) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.3}: the \meta{value} is the standalone short name for month~3 %(March) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.4}: the \meta{value} is the standalone short name for month~4 %(April) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.5}: the \meta{value} is the standalone short name for month~5 %(May) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.6}: the \meta{value} is the standalone short name for month~6 %(June) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.7}: the \meta{value} is the standalone short name for month~7 %(July) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.8}: the \meta{value} is the standalone short name for month~8 %(August) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.9}: the \meta{value} is the standalone short name for month~9 %(September) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.10}: the \meta{value} is the standalone short name for month~10 %(October) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.11}: the \meta{value} is the standalone short name for month~11 %(November) associated with the dialect label \meta{dialect}. %\item\dattr{standalone.shortmonth.12}: the \meta{value} is the standalone short name for month~12 %(December) associated with the dialect label \meta{dialect}. %\end{itemize} % %\subsubsection{Time Zones} % %These attributes won't be set if the time zone information wasn't %fetched (with \app{texosquery}'s \texttt{-Z} switch). These attributes %include the time zone identifier in the %attribute label. (The list of known identifiers is stored %in the \texttt{timezone} \attr{timezone}{id} attribute.) For example, \texttt{Europe/London} is the %identifier for the UK time zone. So the attribute %\texttt{timezone.Europe/London.short} is for the short name for that %zone (\texttt{GMT}) and \texttt{timezone.Europe/London.shortdst} %is for the short daylight saving name for that zone (\texttt{BST}). % %\begin{itemize} %\item\dattr{timezone.\meta{zone}.short}: the \meta{value} is the %short name for the zone identified by \meta{zone} %associated with the dialect label \meta{dialect}. %\item\dattr{timezone.\meta{zone}.long}: the \meta{value} is the %long name for the zone identified by \meta{zone} %associated with the dialect label \meta{dialect}. %\item\dattr{timezone.\meta{zone}.shortdst}: the \meta{value} is the %short daylight saving name for the zone identified by \meta{zone} %associated with the dialect label \meta{dialect}. %\item\dattr{timezone.\meta{zone}.longdst}: the \meta{value} is the %long daylight saving name for the zone identified by \meta{zone} %associated with the dialect label \meta{dialect}. %\end{itemize} % %\subsubsection{Numeric} %\label{sec:attrnum} % %\begin{itemize} %\item\dattr{groupsep}: the \meta{value} is the numeric group %separator associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericGroupSep}.) %\item\dattr{decsep}: the \meta{value} is the numeric decimal %separator associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericDecimalSep}.) %\item\dattr{currencysep}: the \meta{value} is the numeric currency %separator associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericMonetarySep}.) %\item\dattr{exp}: the \meta{value} is the exponent symbol associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericExponent}.) %\item\dattr{usesgroup}: the \meta{value} (either 1 or 0) indicates if %the number group separator should be used %with the dialect label \meta{dialect}. (Used by %\ics{LocaleIfNumericUsesGroup}.) %\item\dattr{percent}: the \meta{value} is the percentage symbol associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericPercent}.) %\item\dattr{permill}: the \meta{value} is the per mill symbol associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleNumericPermill}.) %\item\dattr{decfmt}: the \meta{value} is the decimal format associated %with the dialect label \meta{dialect}. (Used by %\ics{CurrentLocaleDecimalPattern}.) %\item\dattr{intfmt}: the \meta{value} is the integer format associated %with the dialect label \meta{dialect}. (Used by %\ics{CurrentLocaleIntegerPattern}.) %\item\dattr{curfmt}: the \meta{value} is the currency format associated %with the dialect label \meta{dialect}. (Used by %\ics{CurrentLocaleCurrencyPattern}.) %\item\dattr{perfmt}: the \meta{value} is the percent format associated %with the dialect label \meta{dialect}. (Used by %\ics{CurrentLocalePercentPattern}.) %\item\dattr{currency}: the \meta{value} is the currency code associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleCurrencyLabel}.) %\item\dattr{regionalcurrency}: the \meta{value} is the regional currency code %associated with the dialect label \meta{dialect}. (Used by %\ics{LocaleCurrencyRegionalLabel}.) %\item\dattr{currencysym}: the \meta{value} is the currency symbol associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleCurrencySymbol}, if the \attrfmt{currency} %attribute isn't \texttt{XXX}.) %\item\dattr{currencytex}: the \meta{value} is the \TeX\ code %representing the currency symbol associated %with the dialect label \meta{dialect}. (Used by %\ics{LocaleCurrencyTeXSymbol}, if the \attrfmt{currency} %attribute isn't \texttt{XXX}.) %\end{itemize} % %Note that the currency information is also available through %the currency attributes \cattr{official}, \cattr{sym} and \cattr{tex}. %The dialect attribute allows for a different symbol to be %used within the context of a specific dialect. For example, %if a country has multiple scripts (such as Latin and Cyrillic) %then the dialect currency symbol can reflect a specific script, %whereas the currency \cattr{sym} attribute might be in the default %script. % % %\subsection{Region Attributes} %\label{sec:regionattr} % %The following attributes are associated with region and can be set %using %\begin{code} %\cs{LocaleSetRegionAttribute}\marg{region code}\marg{attribute}\marg{value} %\end{code} %or fetched with %\begin{code} %\cs{LocaleGetRegionAttribute}\marg{region code}\marg{attribute} %\end{code} % %\begin{itemize} %\item\rattr{currency}: the regional currency code (for %example, \texttt{IMP}). %\item\rattr{dialect}: a comma-separated list of the dialects %associated with this region. For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{fr-BE,nl-BE} %\input locale % %GB: \LocaleGetRegionAttribute{GB}{dialect}. %BE: \LocaleGetRegionAttribute{BE}{dialect}. % %\bye %\end{verbatim} %produces: GB: british. BE: belgique,flemish. %\end{itemize} % % %\subsection{Currency Attributes} %\label{sec:currencyattr} % %The following attributes are associated with currency and can be set %using %\begin{code} %\cs{LocaleSetCurrencyAttribute}\marg{code}\marg{attribute}\marg{value} %\end{code} %or fetched with %\begin{code} %\cs{LocaleGetCurrencyAttribute}\marg{code}\marg{attribute} %\end{code} %where \meta{code} is the ISO currency code or regional currency %code. % %\begin{itemize} %\item\cattr{region}: a comma-separated list of regions that %use this currency. If the regional currency code is different from %the official ISO currency code, then both codes will have this %attribute set. For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM} % %\input locale % %GBP: \LocaleGetCurrencyAttribute{GBP}{region}. %IMP: \LocaleGetCurrencyAttribute{IMP}{region}. % %\bye %\end{verbatim} %produces: GBP: GB,IM. IMP: IM. % %\item \cattr{official}: the official ISO currency code for %\meta{code}. In most cases this will be the same as \meta{code}. %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM} % %\input locale % %GBP: \LocaleGetCurrencyAttribute{GBP}{official}. %IMP: \LocaleGetCurrencyAttribute{IMP}{official}. % %\bye %\end{verbatim} %produces: GBP: GBP. IMP: GBP. % %\item\cattr{sym}: the currency symbol (using characters, not %\TeX\ commands, except for \verb|\$|) for regional currency %\meta{code}. % %\item\cattr{tex}: the currency symbol using \TeX\ code (such %as \cs{texosquerycurrencypound}) for regional currency %\meta{code}. %\end{itemize} % %\section{Patterns} %\label{sec:patterns} % %The \sty{texosquery} package provides for two types of patterns: %date-time and numeric. The date-time patterns may just display a %date, or just a time or both. They may or may not include a time %zone. The numeric patterns can be used to format integers, decimals, %scientific notation, percentages or currency. New patterns can be %defined by commands provided in \file{texosquery.tex}. The %\sty{tex-locale} package can also fetch the patterns for the document %locales so that they can be applied to data in the document %to match the current locale. % %The numeric patterns are fairly easy to use but are tricky to %define. The date-time patterns are fairly easy to define but are %tricky to use. % %\subsection{Numeric Patterns} %\label{sec:numpatterns} % %The \sty{texosquery} numeric pattern symbol commands are redefined %by \sty{tex-locale} to use the appropriate symbol from the current %locale. For example, \ics{texosquerypatfmtgroupsep} is redefined to %use \cs{CurrentLocaleNumericGroupSep}. (See the \sty{texosquery} %documentation for further details of these pattern commands.) % %You can access a numeric pattern for a particular locale by querying %one of the dialect attributes listed in \sectionref{sec:attrnum}: \dattr{intfmt} (integer pattern), %\dattr{decfmt} (decimal pattern), \dattr{curfmt} (currency pattern) or %\dattr{perfmt} (percent pattern). % %These can be accessed explicitly using %\begin{definition} %\ics{LocaleGetDialectAttribute}\marg{dialect}\marg{attribute} %\end{definition} %For example: %\begin{verbatim} %\LocaleGetDialectAttribute{british}{intfmt} %\end{verbatim} %However it's simpler to use the shortcut commands described in %\sectionref{sec:currpat}. For example: %\begin{verbatim} %\CurrentLocaleIntegerPattern %\end{verbatim} % %A pattern can be used in two ways. If it's simply used in the %document, then it just reproduces the pattern specification. For %example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\input locale % %{\tt \CurrentLocaleDecimalPattern} %\bye %\end{verbatim} %This simply produces: %\begin{quote} %\texttt{\#,\#\#\#,\#\#\#,\#\#0.\#\#\#\#\#\#\#\#\#\#} %\end{quote} %This can be used for debugging purposes to check the pattern. % %The second use is to apply the pattern to a number. This is done %with \sty{texosquery}'s \cs{texosqueryfmtnumber} command: %\begin{definition} %\ics{texosqueryfmtnumber}\marg{pattern}\marg{int part}\marg{frac %part}\marg{mantissa} %\end{definition} %where \meta{pattern} is the pattern (defined using %\cs{texosquerydefpattern} or fetched with the \app{texosquery} %application), \meta{int part} is the integer part, \meta{frac part} %is the fractional part and \meta{mantissa} is the exponent part. % %For example: %\begin{verbatim} %% arara: xetex: {shell: on} % %\def\LocaleMain{en-GB} %\input locale % %\texosqueryfmtnumber{\CurrentLocaleIntegerPattern}{12}{34567}{4} % %\texosqueryfmtnumber{\CurrentLocaleCurrencyPattern}{12345}{67}{0} % %\texosqueryfmtnumber{\CurrentLocaleDecimalPattern}{123}{4567}{2} % %\texosqueryfmtnumber{\CurrentLocalePercentPattern}{123}{4567}{2} %\bye %\end{verbatim} %This produces: %\begin{quote} %123,456 % %GBP12,345.67 % %12,345.67 % %1,234,567\% %\end{quote} %There are some shortcut commands provided, to allow for more %convenient code. % %A numeric pattern can be applied to a numeric value using %\begin{definition}[\DescribeMacro\localenumfmt] %\cs{localenumfmt}\marg{pattern}\marg{decimal} %\end{definition} %where \meta{pattern} is the pattern (as for \cs{texosqueryfmtnumber}) %and \meta{decimal} is the numeric value in the form %\meta{int}\texttt{.}\meta{frac}\texttt{E}\meta{mantissa} %(where \texttt{.} represents the decimal separator and \texttt{E} represents %the exponent separator, regardless of locale). The \texttt{.}\meta{frac} and %\texttt{E}\meta{mantissa} parts are optional. % %The \cs{localenumfmt} command splits up \meta{decimal} into the %\meta{int part}, \meta{frac part} and \meta{mantissa} required by %\cs{texosqueryfmtnumber}. It then does %\begin{code} %\meta{fmt cs}\{\cs{texosqueryfmtnumber}\marg{pattern}\marg{int part}\marg{frac part}\marg{mantissa} %\end{code} %where \meta{fmt cs} is one of: %\begin{definition}[\DescribeMacro\localenumfmtneg] %\cs{localenumfmtneg}\marg{text} %\end{definition} %if the \meta{int part} is negative, %\begin{definition}[\DescribeMacro\localenumfmtzero] %\cs{localenumfmtzero}\marg{text} %\end{definition} %if the \meta{int part}, \meta{frac part} and \meta{mantissa} are all %zero, otherwise %\begin{definition}[\DescribeMacro\localenumfmtpos] %\cs{localenumfmtpos}\marg{text} %\end{definition} %These three commands all simply default to just doing \meta{text}. % %\begin{definition}[\DescribeMacro\localeint] %\cs{localeint}\marg{value} %\end{definition} %This is equivalent to %\begin{definition} %\cs{localenumfmt}\{\cs{CurrentLocaleIntegerPattern}\}\marg{value} %\end{definition} % %\begin{definition}[\DescribeMacro\localedec] %\cs{localedec}\marg{decimal} %\end{definition} %As above but uses \cs{CurrentLocaleDecimalPattern}. % %\begin{definition}[\DescribeMacro\localecur] %\cs{localecur}\marg{decimal} %\end{definition} %As above but uses \cs{CurrentLocaleCurrencyPattern}. % %\begin{definition}[\DescribeMacro\localeper] %\cs{localeper}\marg{decimal} %\end{definition} %As above but uses \cs{CurrentLocalePercentPattern}. % %The above example can be simplified to: %\begin{verbatim} %\def\LocaleMain{en-GB} %\input locale % %\localeint{12.34567E4} % %\localecur{12345.67} % %\localedec{123.4567E2} % %\localeper{123.4567E2} %\bye %\end{verbatim} %This produces the same result as before. % %As described in \sectionref{sec:currnumsym}, the currency unit can %be switched to a symbol by redefining \cs{localecurrchoice}. For %example: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR,de-CH-1996} %\input locale % %\def\localecurrchoice#1#2#3#4{#3} % %en-GB: \localecur{12345.67} % %\selectlocale{pt-BR} %pt-BR: \localecur{12345.67} % %\selectlocale{de-CH-1996} %de-CH-1996: \localecur{12345.67} % %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: \pounds 12,345.67 % %pt-BR: R\$ 12.345,67 % %de-CH-1996: SFr. 12'345.67 %\end{quote} % %You can define your own pattern using the commands provided by %\sty{texosquery}. For example: %\begin{verbatim} %\texosquerydefpattern{\sinumpattern}{% % \sinumfmt % {\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\#\#\#\#\#\#\#\#\#}}% % {\-\#\#\#\#\#\#\#\#\0\0}% %} %\end{verbatim} %This can then be used with \cs{localenumfmt}. The \sty{texosquery} %documentation includes other examples, including a currency pattern %that shifts the sign before the currency symbol for negative %amounts: %\begin{verbatim} %\texosquerydefpattern{\curpattern}{% %\pmnumfmt %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{}}% %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{\-}}} %\end{verbatim} %(No sign is used for positive amounts.) % %Here's a complete document: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR,de-CH-1996} %\input locale % %\def\localecurrchoice#1#2#3#4{#3} % %\texosquerydefpattern{\sinumpattern}{% % \sinumfmt % {\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\#\#\#\#\#\#\#\#\#}}% % {\-\#\#\#\#\#\#\#\#\0\0}% %} % %\texosquerydefpattern{\curpattern}{% %\pmnumfmt %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{}}% %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{\-}}} % %en-GB: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. % %\selectlocale{pt-BR} %pt-BR: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. % %\selectlocale{de-CH-1996} %de-CH-1996: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. % %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: 1.2345E$-$03. \pounds 12,345.60. $-$\pounds12,345.60. %\pounds0.00. % %pt-BR: 1,2345E$-$03. R\$12.345,60. $-$R\$12.345,60. %R\$0,00. % %de-CH-1996: 1.2345E$-$03. SFr.12'345.60. $-$SFr.12'345.60. %SFr.0.00. %\end{quote} % %Here's a \LaTeX\ alternative that redefines the formatting commands %used by \cs{localenumfmt}: %\begin{verbatim} %\documentclass{article} % %\usepackage{color} %\usepackage[main={en-GB},other={pt-BR,de-CH-1996}]{tex-locale} %\setmainfont{NimbusRoman-Regular} % %\texosquerydefpattern{\sinumpattern}{% % \sinumfmt % {\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\#\#\#\#\#\#\#\#\#}}% % {\-\#\#\#\#\#\#\#\#\0\0}% %} % %\texosquerydefpattern{\curpattern}{% %\pmnumfmt %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{}}% %{\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{\-}}} % %\renewcommand*{\localenumfmtpos}[1]{\textcolor{green}{#1}} %\renewcommand*{\localenumfmtneg}[1]{\textcolor{red}{#1}} %\renewcommand*{\localenumfmtzero}[1]{\textbf{#1}} % %\begin{document} % %en-GB: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. % %\selectlocale{pt-BR} %pt-BR: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. % %\selectlocale{de-CH-1996} %de-CH-1996: %\localenumfmt{\sinumpattern}{1.2345E-3}. %\localenumfmt{\curpattern}{12345.6}. %\localenumfmt{\curpattern}{-12345.6}. %\localenumfmt{\curpattern}{0}. %\end{document} %\end{verbatim} %This produces: %\begin{quote} %en-GB: \textcolor{green}{1.2345E$-$03}. %\textcolor{green}{\pounds 12,345.60}. %\textcolor{red}{$-$\pounds12,345.60}. %\textbf{\pounds0.00}. % %pt-BR: \textcolor{green}{1,2345E$-$03}. %\textcolor{green}{R\$12.345,60}. %\textcolor{red}{$-$R\$12.345,60}. %\textbf{R\$0,00}. % %de-CH-1996: \textcolor{green}{1.2345E$-$03}. %\textcolor{green}{SFr.12'345.60}. %\textcolor{red}{$-$SFr.12'345.60}. %\textbf{SFr.0.00}. %\end{quote} % %\subsection{Date-Time Patterns} %\label{sec:datetimepat} % %In addition to providing locale-sensitive strings for the current %date-time, the \app{texosquery} application can also provide the %locale's pattern that's used to describe how the dates and times %should be formatted. Additionally, it can provide time-zone mappings %from identifying labels to locale-sensitive names. Both these things %require extra overhead and so these functions aren't on by default. % %You can enable them by defining %\begin{definition}[\DescribeMacro\LocaleIfDateTimePatternsSupported] %\cs{LocaleIfDateTimePatternsSupported}\marg{true}\marg{false} %\end{definition} %\emph{before} you input \file{tex-locale.tex}. \LaTeX\ users can use the %more convenient \pkgopt{timedata} package option: %\begin{verbatim} %\usepackage[timedata]{tex-locale} %\end{verbatim} %Plain \TeX\ users need to define %\cs{LocaleIfDateTimePatternsSupported} so that it does the \meta{true} %argument and ignores the \meta{false} argument: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} %\input locale %\end{verbatim} % %If enabled, \sty{tex-locale} will add the \texttt{-M} and \texttt{-Z} %switches to the \app{texosquery} command invocation. This will %additionally redefine \sty{texosquery}'s pattern format commands %(such as \cs{texosqueryfmtpatMMM}) to use the appropriate commands %for the current locale. For example, \cs{texosqueryfmtpatMMM}\marg{n} is %redefined to use \cs{CurrentLocaleShortMonthName}\marg{n}. (See the %\sty{texosquery} documentation for further details on these %commands.) % %If date-time patterns are supported then the current date-time data will be %stored in %\begin{definition}[\DescribeMacro\LocaleDateTimeInfo] %\cs{LocaleDateTimeInfo} %\end{definition} %This will be empty if date-time patterns aren't supported. % %The value of this command contains all the information for the current date-time provided %in a format that can easily be parsed by date or time patterns. %(This is done through \sty{texosquery}'s \ics{texosqueryfmtdatetime} %command, which is internally used by %\ics{LocaleApplyDateTimePattern}, described below.) %For example, \cs{LocaleDateTimeInfo} might be set to %\begin{verbatim} %{1}{2017}{2017}{3}{12}{4}{85}{26}{4}{7}{1}{19}{19}{7}{7}{16}{39}{136} %{{1}{0}{Europe/London}{1}} %\end{verbatim} %(Line break inserted above for clarity.) See the \sty{texosquery} %documentation for details of this syntax. % %Alternatively you can use \sty{texosquery}'s pattern generator to %create your own date-time pattern and explicitly use %\cs{texosqueryfmtdatetime}. In which case \cs{LocaleDateTimeInfo} %provides a convenient way of applying the pattern to the current %date-time. For example: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} %\def\LocaleMain{en-GB} %\input locale % %\texosquerydefpattern{\pattern}{\%3E \%1d \%3M \%4y \%2H:\%2m:\%2s \%2z} % %\ifx\LocaleDateTimeInfo\empty %\else % \expandafter\texosqueryfmtdatetime\expandafter\pattern\LocaleDateTimeInfo %\fi %\bye %\end{verbatim} %This produces: %\begin{quote} %Sun 26 Mar 2017 21:38:06 BST %\end{quote} %(assuming that was the date and time of the document build). The %textual elements (\qt{Sun}, \qt{Mar} and \qt{BST}) are obtained from %the current locale. % %If the date-time patterns are supported, you can apply a pattern to %a specific date or time using %\begin{definition}[\DescribeMacro\LocaleApplyDateTimePattern] %\cs{LocaleApplyDateTimePattern}\marg{dialect}\marg{attribute}\marg{data} %\end{definition} %This uses \sty{texosquery}'s \cs{texosqueryfmtdatetime} command to %format a date or time according to a date-time pattern (identified %by \meta{attribute}) for the locale identified by \meta{dialect}. %The \sty{texosquery} manual provides further details on this %command, but essentially the first argument of \cs{texosqueryfmtdatetime} %should be a control sequence containing the special pattern markup %and the remaining arguments are the date-time data, which are %supplied in the \meta{data} argument of \cs{LocaleApplyDateTimePattern}. % %The \ics{LocaleDateTimeInfo} command will either be empty or set to %the correct data for the current date and time. This can be used %in the \meta{data} argument. Since \cs{LocaleDateTimeInfo} might be %empty, \cs{LocaleApplyDateTimePattern} will first test for this and %not try applying the pattern in that case. (Remember that you can %also define your own custom date-time patterns, as mentioned in %\sectionref{sec:general}.) % %Note that the \meta{dialect} is used to fetch the pattern data, but %the month and day names will be obtained using the %\cs{CurrentLocale\ldots} commands described in %\sectionref{sec:currdatetime}, which may not match \meta{dialect}. %In general it's easiest to use the shortcut %\ics{CurrentLocaleApplyDateTimePattern} (\sectionref{sec:currpat}) instead to ensure the %pattern matches the current locale. % %The attributes associated with date-time patterns are listed below %(see \sectionref{sec:attrdatetime}). %\begin{itemize} %\item \dattr{fulldatefmt}: the full date format pattern (as used in %\cs{LocaleFullDate}). %\item \dattr{longdatefmt}: the long date format pattern (as used in %\cs{LocaleLongDate}). %\item \dattr{meddatefmt}: the medium date format pattern (as used in %\cs{LocaleMediumDate}). %\item \dattr{shortdatefmt}: the short date format pattern (as used in %\cs{LocaleShortDate}). %\item \dattr{fulltimefmt}: the full time format pattern (as used in %\cs{LocaleFullTime}). %\item \dattr{longtimefmt}: the long time format pattern (as used in %\cs{LocaleLongTime}). %\item \dattr{medtimefmt}: the medium time format pattern (as used in %\cs{LocaleMediumTime}). %\item \dattr{shorttimefmt}: the short time format pattern (as used in %\cs{LocaleShortTime}). %\item \dattr{fulldatetimefmt}: the full date and time format pattern. %\item \dattr{longdatetimefmt}: the long date and time format pattern. %\item \dattr{meddatetimefmt}: the medium date and time format pattern. %\item \dattr{shortdatetimefmt}: the short date and time format pattern. %\end{itemize} % %For example: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} %\def\LocaleMain{en-GB} % %\input locale % %Now: %\CurrentLocaleApplyDateTimePattern{fulldatetimefmt}{\LocaleDateTimeInfo}. %\bye %\end{verbatim} %This displays: %\begin{quote} %Now: Sunday, 26 March 2017 21:12:10 British Summer Time. %\end{quote} %However, it's simpler to just use: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} %\def\LocaleMain{en-GB} % %\input locale % %\def\localedatechoice#1#2#3#4{#1} %\def\localetimechoice#1#2#3#4{#1} % %Now: \CurrentLocaleDateTime. %\bye %\end{verbatim} %or with \LaTeX: %\begin{verbatim} %\documentclass{article} % %\usepackage[timedata,date=full,time=full,main={en-GB}]{tex-locale} % %\begin{document} %Now: \CurrentLocaleDateTime. %\end{document} %\end{verbatim} % %The date-time patterns are therefore more useful when applied to %something other that the current date-time. However, it's more %complicated to work out the data. % %For example: %\begin{verbatim} %\def\LocaleIfDateTimePatternsSupported#1#2{#1} %\def\LocaleMain{en-GB} % %\input locale % %\CurrentLocaleApplyDateTimePattern{fulldatetimefmt}% %{{1}{2017}{2017}{3}{12}{4}{85}{26}{4}{7}{1}{21}{21}{9}{9}{23}{36}{140}% %{{1}{0}{Europe/London}{1}}} %\bye %\end{verbatim} %This produces: %\begin{quote} %Sunday, 26 March 2017 21:23:36 British Summer Time. %\end{quote} % % %\section{Locale Information} %\label{sec:localedata} % %Information about each locale is fetched for each tracked dialect (the %main locale, identified by \cs{LocaleMain}, and the other locales, %identified by \cs{LocaleOther}). This information can be accessed %using the commands described below, where \meta{dialect} is a %\sty{tracklang} dialect label that identifies the locale. There are convenient commands %(\cs{CurrentLocale\ldots}) that select the appropriate command with %the label provided by the currently selected dialect. (See %\sectionref{sec:currentlocale}.) % %Most of the commands in this package are intended to be used in an %expandable context, and so will expand to nothing if the dialect isn't %recognised. % %\begin{definition}[\DescribeMacro\LocaleMainDialect] %\cs{LocaleMainDialect} %\end{definition} %This expands to the main locale's dialect label. For example with: %\begin{verbatim} %\def\LocaleMain{en-GB} %\input locale %\end{verbatim} %the main dialect is \texttt{british}. % %\begin{definition}[\DescribeMacro\LocaleMainRegion] %\cs{LocaleMainRegion} %\end{definition} %This expands to the main locale's region. For example, if the main %locale is \texttt{en-GB}, then the main region is \texttt{GB}. % %\begin{definition}[\DescribeMacro\LocaleLanguageTag] %\cs{LocaleLanguageTag}\marg{dialect} %\end{definition} %Expands to the language tag for the given dialect. For example, if %the document locales are set using: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR,fr-BE,de-CH-1996} %\input locale %\end{verbatim} %then %\begin{verbatim} %\LocaleLanguageTag{british} %\end{verbatim} %will expand to \texttt{en-GB} and %\begin{verbatim} %\LocaleLanguageTag{nswissgerman} %\end{verbatim} %will expand to \texttt{de-CH-1996}. % %\begin{definition}[\DescribeMacro\LocaleLanguageName] %\cs{LocaleLanguageName}\marg{dialect} %\end{definition} %The name of the language associated with \meta{dialect} provided in %the Java virtual machine's default language. % %\begin{definition}[\DescribeMacro\LocaleLanguageNativeName] %\cs{LocaleLanguageNativeName}\marg{dialect} %\end{definition} %The name of the language associated with \meta{dialect} provided in %that language. % %For example: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR,fr-BE} % %\input locale % %en-GB: \LocaleLanguageName{british}. %pt-BR: \LocaleLanguageName{brazilian}. %fr-BE: \LocaleLanguageName{belgique}. %\bye %\end{verbatim} %For me this produces: %\begin{quote} %en-GB: English. pt-BR: Portuguese. fr-BE: French. %\end{quote} %because my operating system's default language is English. If I %edit the \app{texosquery-jre8} bash script so that it includes %\begin{verbatim} %-Duser.language=fr %\end{verbatim} %in the \app{java} arguments, then the same document will produce: %\begin{quote} %en-GB: anglais. pt-BR: portugais. fr-BE: fran\c{c}ais. %\end{quote} %So this isn't necessarily in the same language as the main locale (or %any of the other locales tracked in the document). It's in the Java %virtual machine's default language. Compare this document with: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR,fr-BE} % %\input locale % %en-GB: \LocaleLanguageNativeName{british}. %pt-BR: \LocaleLanguageNativeName{brazilian}. %fr-BE: \LocaleLanguageNativeName{belgique}. %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: English. pt-BR: portugu\^es. fr-BE: fran\c{c}ais. %\end{quote} %So in this case each name is displayed according to its own language. % %There are similar commands for the region and variant. %\begin{definition}[\DescribeMacro\LocaleRegionName] %\cs{LocaleRegionName}\marg{dialect} %\end{definition} %The name of the region associated with \meta{dialect} provided in %the Java virtual machine's default language. This will be an empty %string if the region wasn't supplied. % %\begin{definition}[\DescribeMacro\LocaleRegionNativeName] %\cs{LocaleRegionNativeName}\marg{dialect} %\end{definition} %The name of the region associated with \meta{dialect} provided in %that language. This will be an empty string if the region wasn't supplied. % %\begin{definition}[\DescribeMacro\LocaleVariantName] %\cs{LocaleVariantName}\marg{dialect} %\end{definition} %The name of the variant associated with \meta{dialect} provided in %the Java virtual machine's default language. This will be an empty %string if a variant wasn't supplied. % %\begin{definition}[\DescribeMacro\LocaleVariantNativeName] %\cs{LocaleVariantNativeName}\marg{dialect} %\end{definition} %The name of the variant associated with \meta{dialect} provided in %that language. This will be an empty string if a variant wasn't supplied. %This may well be the same as \cs{LocaleVariantName} as the variants %are often identifiers (such as \texttt{1996} in the case of %\texttt{de-CH-1996}) that remain the same in different languages. % %You can find out if the language name, region name or variant have %been set using the commands listed below. In each case, %\meta{dialect} is again the dialect label, \meta{true} is the code %to do if the condition is true and \meta{false} is the code to do if %the condition is false. % %\begin{definition}[\DescribeMacro\LocaleIfHasLanguageName] %\cs{LocaleIfHasLanguageName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %This tests if the dialect has an associated language name. This will %typically be true. % %\begin{definition}[\DescribeMacro\LocaleIfHasRegionName] %\cs{LocaleIfHasRegionName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %This tests if the dialect has an associated region name. Some %language tags don't have regions supplied. For example: %\begin{verbatim} %\def\LocaleMain{en} %\input locale %\end{verbatim} %In this case, there's no region associated with the main locale. % %\begin{definition}[\DescribeMacro\LocaleIfHasVariantName] %\cs{LocaleIfHasVariantName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %This tests if the dialect has an associated variant name. For %example, there's no variant in \texttt{de-DE} but there is a variant %in \texttt{de-DE-1996}. % %\section{Dates and Times} %\label{sec:datetimes} % %Date and time information is fetched for each tracked dialect. %The \file{tex-locale.tex} code doesn't %modify \ics{today} (although the \file{tex-locale.sty} \LaTeX\ package %can load \sty{datetime2}, which does). Instead, the dates or times %for a specific locale can be obtained using the commands listed %below. The \meta{dialect} argument indicates the \sty{tracklang} %dialect label. See \sectionref{sec:currentlocale} for shortcut %commands that select the appropriate command with the label of the %currently selected locale. % %Dates and times are wrapped in a formatting command: %\begin{definition}[\DescribeMacro\localedatetimefmt] %\cs{localedatetimefmt}\marg{date-time text} %\end{definition} %By default this simply does its argument. For example: %\begin{verbatim} %\def\LocaleMain{en-GB} % %\input locale % %\def\localedatetimefmt#1{{\it #1}} % %Date: \LocaleFullDate{british}. % %\bye %\end{verbatim} %This displays the date in italic. The \LaTeX\ equivalent is: %\begin{verbatim} %\documentclass{article} %\usepackage[main=en-GB]{tex-locale} % %\renewcommand*{\localedatetimefmt}[1]{\textit{#1}} % %\begin{document} %Date: \LocaleFullDate{british}. %\end{document} %\end{verbatim} % %\subsection{Dates} %\label{sec:localedates} % %\begin{definition}[\DescribeMacro\LocaleFullDate] %\cs{LocaleFullDate}\marg{dialect} %\end{definition} %This displays the full date for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleLongDate] %\cs{LocaleLongDate}\marg{dialect} %\end{definition} %This displays the long date for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleMediumDate] %\cs{LocaleMediumDate}\marg{dialect} %\end{definition} %This displays the medium date for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleShortDate] %\cs{LocaleShortDate}\marg{dialect} %\end{definition} %This displays the short date for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} % %\input locale % %Full: \LocaleFullDate{british}. %Long: \LocaleLongDate{british}. %Medium: \LocaleMediumDate{british}. %Short: \LocaleShortDate{british}. %\bye %\end{verbatim} %In the above, the main locale is explicitly set by defining \cs{LocaleMain} %before loading \file{tex-locale.tex}. The \sty{tracklang} package %identifies the \texttt{en-GB} locale with the label %\texttt{british}. % %Different locales have different concepts of full, long, medium and %short dates. In most cases the short form is numeric and the full %form is textual. The medium form may be numeric or it may use an %abbreviated month name. The locale provided used by Java may also %influence the result. For example, if you are using %\app{texosquery-jre8} with \texttt{java.locale.providers} set to %\texttt{CLDR,JRE} then the above document will display (assuming %today is 2017-03-26): %\begin{quote} %Full: Sunday, 26 March 2017. Long: 26 March 2017. Medium: 26 Mar %2017. Short: 26/03/2017. %\end{quote} %However, if I instead use the Java 7 version (\file{texosquery.jar}) %which doesn't support the CLDR, then the above document will %display: %\begin{quote} %Full: Sunday, 26 March 2017. Long: 26 March 2017. Medium: %26-Mar-2017. Short: 26/03/17. %\end{quote} %The CLDR provides more extensive locale support than the JRE. In the %case of \texttt{en-GB}, the difference is minor (as shown above), %but in some cases a language may be supported in the CLDR but not in %the JRE. For example, if in the above document I change the main %locale to \texttt{cy-GB} (which maps to the \sty{tracklang dialect %label \texttt{GBwelsh}}): %\begin{verbatim} %\def\LocaleMain{cy-GB} % %\input locale % %Full: \LocaleFullDate{GBwelsh}. %Long: \LocaleLongDate{GBwelsh}. %Medium: \LocaleMediumDate{GBwelsh}. %Short: \LocaleShortDate{GBwelsh}. %\bye %\end{verbatim} %then the Java 7 version produces US English dates: %\begin{quote} %Full: Sunday, March 26, 2017. Long: March 26, 2017. Medium: Mar 26, %2017. Short: 3/26/17. %\end{quote} %This is because Welsh isn't supported by the JRE, but it is %supported by the CLDR, so the Java 8 version (\app{texosquery-jre8}) %does work (provided \texttt{java.locale.providers} is set to %\texttt{CLDR,JRE}): %\begin{quote} %Full: Dydd Sul, 26 Mawrth 2017. Long: 26 Mawrth 2017. Medium: 26 %Mawrth 2017. Short: 26/03/2017. %\end{quote} % %\subsubsection{Week Days} %\label{sec:weekdays} % %In order to be compatible with \sty{pgfcalendar} (and hence %\sty{datetime2}), the \sty{tex-locale} package uses %a zero-based indexing where 0 represents Monday, 1 represents %Tuesday, etc. If you can't remember the index for a particular day, %you can use the following commands: %\begin{definition}[\DescribeMacro\dtmMondayIndex] %\cs{dtmMondayIndex} %\end{definition} %This expands to 0, the index for Monday. % %\begin{definition}[\DescribeMacro\dtmTuesdayIndex] %\cs{dtmTuesdayIndex} %\end{definition} %This expands to 1, the index for Tuesday. % %\begin{definition}[\DescribeMacro\dtmWednesdayIndex] %\cs{dtmWednesdayIndex} %\end{definition} %This expands to 2, the index for Wednesday. % %\begin{definition}[\DescribeMacro\dtmThursdayIndex] %\cs{dtmThursdayIndex} %\end{definition} %This expands to 3, the index for Thursday. % %\begin{definition}[\DescribeMacro\dtmFridayIndex] %\cs{dtmFridayIndex} %\end{definition} %This expands to 4, the index for Friday. % %\begin{definition}[\DescribeMacro\dtmSaturdayIndex] %\cs{dtmSaturdayIndex} %\end{definition} %This expands to 5, the index for Saturday. % %\begin{definition}[\DescribeMacro\dtmSundayIndex] %\cs{dtmSundayIndex} %\end{definition} %This expands to 6, the index for Sunday. % %You can get the day of week name identified by the Monday=0 based %index for a particular dialect using %\begin{definition}[\DescribeMacro\LocaleDayName] %\cs{LocaleDayName}\marg{dialect}\marg{index} %\end{definition} %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR} % %\input locale % %en-GB: \LocaleDayName{british}{0}. %pt-BR: \LocaleDayName{brazilian}{0}. %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: Monday. pt-BR: Segunda-feira. %\end{quote} % %The abbreviated day of week name can be obtained with: %\begin{definition}[\DescribeMacro\LocaleShortDayName] %\cs{LocaleShortDayName}\marg{dialect}\marg{index} %\end{definition} %This has the same syntax as the previous command. As with the date %commands described in the \hyperref[sec:localedates]{previous %section}, the support for the given locale depends on the locale %provider used by \app{texosquery}. % %Some languages have a different form for day of week names when used in a %standalone context, such as in a column header. These can be %obtained using the commands below, \emph{but only with %\app{texosquery-jre8}}. If you are using Java 7 or earlier, these %commands will produce identical results to the analogous command %above. % %\begin{definition}[\DescribeMacro\LocaleStandaloneDayName] %\cs{LocaleStandaloneDayName}\marg{dialect}\marg{index} %\end{definition} %The same syntax as above, this produces the standalone day of week %name. The abbreviated name is produced with: %\begin{definition}[\DescribeMacro\LocaleStandaloneShortDayName] %\cs{LocaleStandaloneShortDayName}\marg{dialect}\marg{index} %\end{definition} % %The first day of the week varies according to region. In some %locales, Monday is considered the first day of the week (for %example, en-GB), but in other locales, Sunday is the first day %(for example, pt-BR). You can find out which day of the week is %considered the first day using: %\begin{definition}[\DescribeMacro\LocaleFirstDayIndex] %\cs{LocaleFirstDayIndex}\marg{dialect} %\end{definition} %This expands to an integer index identifying the day. % %For example, Monday (0) is the first day of the week in \texttt{en-GB}, %but Sunday (6) is the first day of the week in \texttt{pt-BR}. %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR} % %\input locale % %First day (en-GB): \LocaleFirstDayIndex{british}. %First day (pt-BR): \LocaleFirstDayIndex{brazilian}. % %\bye %\end{verbatim} %So the above produces: %\begin{quote} %First day (en-GB): 0. First day (pt-BR): 6. %\end{quote} % %Since it's possible that you may want to use a different indexing %system, there are commands provided to convert between them: %\begin{definition}[\DescribeMacro\LocaleDayIndexFromZeroMonToOneSun] %\cs{LocaleDayIndexFromZeroMonToOneSun}\marg{index} %\end{definition} %This converts a day index from the Monday=0 based system to the %Sunday=1 based system. For example, in Monday=0 indexing then the %index 3 represents Thursday. In the Sunday=1 based system, the index %5 represents Thursday, so %\begin{verbatim} %\LocaleDayIndexFromZeroMonToOneSun{3} %\end{verbatim} %expands to 5. % %\begin{definition}[\DescribeMacro\LocaleDayIndexFromZeroMonToOneMon] %\cs{LocaleDayIndexFromZeroMonToOneMon}\marg{index} %\end{definition} %This converts a day index from the Monday=0 (Sunday=6) based system to %the ISO-8601 Monday=1 (Sunday=7) based system. For example %\begin{verbatim} %\LocaleDayIndexFromZeroMonToOneMon{3} %\end{verbatim} %expands to 4. % %\begin{definition}[\DescribeMacro\LocaleDayIndexFromOneSunToZeroMon] %\cs{LocaleDayIndexFromOneSunToZeroMon}\marg{index} %\end{definition} %This converts a day index from the Sunday=1 based system to the %Monday=0 based system. For example %\begin{verbatim} %\LocaleDayIndexFromOneSunToZeroMon{5} %\end{verbatim} %expands to 3. (That is, it performs the reverse of %\cs{LocaleDayIndexFromZeroMonToOneSun}.) % %\begin{definition}[\DescribeMacro\LocaleDayIndexFromOneMonToZeroMon] %\cs{LocaleDayIndexFromOneMonToZeroMon}\marg{index} %\end{definition} %This converts a day index from the ISO-8601 Monday=1 (Sunday=7) based system %to the Monday=0 (Sunday=6) based system. For example %\begin{verbatim} %\LocaleDayIndexFromOneMonToZeroMon{4} %\end{verbatim} %expands to 3. (That is, it performs the reverse of %\cs{LocaleDayIndexFromZeroMonToOneMon}.) % %\begin{definition}[\DescribeMacro\LocaleDayIndexFromRegion] %\cs{LocaleDayIndexFromRegion}\marg{dialect}\marg{index} %\end{definition} %This converts the region's day of the week (starting from 1 for the %region's first day) to Monday=0 based indexing. The region is identified by %\meta{dialect}. This first uses %\cs{LocaleFirstDayIndex}\marg{dialect} to find the %1-based first day of week index for the region and then converts it %to the Monday=0 based system. An invalid \meta{index} results in %\texttt{-1}. % %For example, the \texttt{en-GB} locale has Monday as the first day %of the week. So if the \meta{index} argument is 1 %\begin{verbatim} %\LocaleDayIndexFromRegion{british}{1} %\end{verbatim} %that indicates Monday. This is then converted to 0 (using %\cs{LocaleDayIndexFromOneMonToZeroMon}). If the \meta{index} %argument is 7 %\begin{verbatim} %\LocaleDayIndexFromRegion{british}{7} %\end{verbatim} %that indicates Sunday, so this would be converted to 6. % %The \texttt{pt-BR} locale has Sunday as the first day of the week. %So if the \meta{index} argument is 2 %\begin{verbatim} %\LocaleDayIndexFromRegion{brazilian}{2} %\end{verbatim} %that indicates Monday. This is %converted to 0 (using \cs{LocaleDayIndexFromOneSunToZeroMon}). If %the \meta{index} argument is 1 %\begin{verbatim} %\LocaleDayIndexFromRegion{brazilian}{1} %\end{verbatim} %that indicates Sunday, so this would be converted to 6. % %\begin{definition}[\DescribeMacro\LocaleDayIndexToRegion] %\cs{LocaleDayIndexToRegion}\marg{dialect}\marg{index} %\end{definition} %This performs the reverse operation. In this case the \meta{index} %argument is Monday=0 based and the result is the locale's day index %(starting with 1 for the first day of the week). % %\subsubsection{Month Names} %\label{sec:monthnames} % %The month name for a given locale can be obtained using %\begin{definition}[\DescribeMacro\LocaleMonthName] %\cs{LocaleMonthName}\marg{dialect}\marg{index} %\end{definition} %where \meta{dialect} is the \sty{tracklang} dialect label that %identifies the locale and \meta{index} is an integer from 1 %(January) to 12 (December) indicating the month. % %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{pt-BR} % %\input locale % %en-GB: \LocaleMonthName{british}{1}. %pt-BR: \LocaleMonthName{brazilian}{1}. % %\bye %\end{verbatim} %produces: %\begin{quote} %en-GB: January. pt-BR: Janeiro. %\end{quote} % %The abbreviated month name can be obtained using %\begin{definition}[\DescribeMacro\LocaleShortMonthName] %\cs{LocaleShortMonthName}\marg{dialect}\marg{index} %\end{definition} %which has the same syntax as the previous command. % %Some languages have a different form for month names when used in a %standalone context, such as in a column header. These can be %obtained using the commands below, \emph{but only with %\app{texosquery-jre8}}. If you are using Java 7 or earlier, these %commands will produce identical results to the analogous command %above. % %\begin{definition}[\DescribeMacro\LocaleStandaloneMonthName] %\cs{LocaleStandaloneMonthName}\marg{dialect}\marg{index} %\end{definition} %The same syntax as above, this produces the standalone month %name. The abbreviated name is produced with: %\begin{definition}[\DescribeMacro\LocaleStandaloneShortMonthName] %\cs{LocaleStandaloneShortMonthName}\marg{dialect}\marg{index} %\end{definition} % %\subsection{Times} %\label{sec:localetimes} % %\begin{definition}[\DescribeMacro\LocaleFullTime] %\cs{LocaleFullTime}\marg{dialect} %\end{definition} %This displays the full time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleLongTime] %\cs{LocaleLongTime}\marg{dialect} %\end{definition} %This displays the long time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleMediumTime] %\cs{LocaleMediumTime}\marg{dialect} %\end{definition} %This displays the medium time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleShortTime] %\cs{LocaleShortTime}\marg{dialect} %\end{definition} %This displays the short time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %As with \hyperref[sec:localedates]{dates}, the results are %determined by the locale provider used by \app{texosquery}. %For example, the Java 8 variant (\app{texosquery-jre8}) with %\texttt{java.locale.providers} set to \texttt{CLDR,JRE} may produce %a different result to a variant of \app{texosquery} that only uses %the JRE provider. % %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} % %\input locale % %Full: \LocaleLongTime{british}. %Long: \LocaleLongTime{british}. %Medium: \LocaleMediumTime{british}. %Short: \LocaleShortTime{british}. % %\bye %\end{verbatim} %This produces: %\begin{quote} %Full: 13:43:53 BST. Long: 13:43:53 BST. Medium: 13:43:53. Short: %13:43. %\end{quote} %In this particular case there's no difference between using the CLDR %and the JRE locale providers, but note that there's no difference in %the full and long forms. % %There are also commands for the combined date and time: %\begin{definition}[\DescribeMacro\LocaleFullDateTime] %\cs{LocaleFullDateTime}\marg{dialect} %\end{definition} %This displays the full date and time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleLongDateTime] %\cs{LocaleLongDateTime}\marg{dialect} %\end{definition} %This displays the long date and time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleMediumDateTime] %\cs{LocaleMediumDateTime}\marg{dialect} %\end{definition} %This displays the medium date and time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % %\begin{definition}[\DescribeMacro\LocaleShortDateTime] %\cs{LocaleShortDateTime}\marg{dialect} %\end{definition} %This displays the short date and time for the locale identified by \meta{dialect} %as provided by \app{texosquery}. % % %\section{Numbers} %\label{sec:numbers} % %Different locales use different symbols to denote the decimal mark %or the number group separator when displaying numbers. There are %other numeric-related symbols that may also vary according to %region, such as the currency symbol, exponent, percent or per mill %signs. Since most of these are outside of the Basic Latin set, the %examples here use \XeTeX\ with a font that supports those symbols. %If you don't have that font installed, you will need to adapt the %examples accordingly. % %As with date and times, the commands describe here need the %\sty{tracklang} dialect label that identifies the required locale. %See \sectionref{sec:currentlocale} for shortcut commands that %automatically select the current locale's dialect label. % %In general, most of these commands won't need to be used explicitly %as it's easier to use a numeric pattern instead (see %\sectionref{sec:numpatterns}). % %\subsection{Numeric Symbols} %\label{sec:numsyms} % %The number group separator for a particular locale can be obtained %using: %\begin{definition}[\DescribeMacro\LocaleNumericGroupSep] %\cs{LocaleNumericGroupSep}\marg{dialect} %\end{definition} %where \meta{dialect} is the \sty{tracklang} dialect label %representing the locale. % %You can determine whether or not the locale uses a number group %separator using: %\begin{definition}[\DescribeMacro\LocaleIfNumericUsesGroup] %\cs{LocaleIfNumericUsesGroup}\marg{dialect}\marg{true %code}\marg{false code} %\end{definition} %This does \meta{true code} if the locale identified by \meta{dialect} %uses a number group separator otherwise it does \meta{false code}. % %The decimal mark is obtained using: %\begin{definition}[\DescribeMacro\LocaleNumericDecimalSep] %\cs{LocaleNumericDecimalSep}\marg{dialect} %\end{definition} % %The monetary separator is often the same as the decimal separator, %but isn't always, so there's a separate command for it: %\begin{definition}[\DescribeMacro\LocaleNumericMonetarySep] %\cs{LocaleNumericMonetarySep}\marg{dialect} %\end{definition} % %The exponent symbol is obtained using: %\begin{definition}[\DescribeMacro\LocaleNumericExponent] %\cs{LocaleNumericExponent}\marg{dialect} %\end{definition} % %The percent symbol is obtained using: %\begin{definition}[\DescribeMacro\LocaleNumericPercent] %\cs{LocaleNumericPercent}\marg{dialect} %\end{definition} %This will typically use \verb|\%| (the percent symbol \%). % %The per mill symbol is obtained using: %\begin{definition}[\DescribeMacro\LocaleNumericPermill] %\cs{LocaleNumericPermill}\marg{dialect} %\end{definition} %This will typically be a character outside the Basic Latin set, so %the document will need to support this symbol if required. % %\subsection{Currencies} %\label{sec:currencies} % %The official currency code (such as \texttt{GBP} or \texttt{USD}) is %obtained using: %\begin{definition}[\DescribeMacro\LocaleCurrencyLabel] %\cs{LocaleCurrencyLabel}\marg{dialect} %\end{definition} %This first checks if the \dattr{currency} attribute for the given %dialect is \texttt{XXX} (which denotes an unknown currency, %typically because there's no region associated with \meta{dialect}). %If the currency for \meta{dialect} is known (that is, the attribute %value isn't \texttt{XXX}), then that currency's official code is %produced. If the currency is unknown, then it will try to fallback %on the main dialect's currency code if the main dialect has an %associated region, otherwise it will fallback on the OS currency %code. % %Remember that with the language tag, you're not restricted to using %official languages for a given region. For example, if you're %writing in English in Belgium, it's valid to use \texttt{en-BE} as a %locale. For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-BE,pt-BR} % %\input locale % %en-GB: \LocaleCurrencyLabel{british}. %en-BE: \LocaleCurrencyLabel{enBE}. %pt-BR: \LocaleCurrencyLabel{brazilian}. % %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: GBP. en-BE: EUR. pt-BR: BRL. %\end{quote} % %There are a few currencies that have an unofficial currency code. %These are typically currencies pegged to another currency with a %fixed exchange rate of 1.0. The %official ISO currency code for one %region may be the code for the other currency. For example, the Isle %of Man currency is the Manx pound, which is kept in parity with %pound sterling. The currency code for \texttt{en-IM} is returned as %\texttt{GBP} by Java (since IMP has no official recognition in %ISO~4217), but \app{texosquery} recognises that this %region has an unofficial currency code \texttt{IMP}. This can be %obtained using %\begin{definition}[\DescribeMacro\LocaleCurrencyRegionalLabel] %\cs{LocaleCurrencyRegionalLabel}\marg{dialect} %\end{definition} %This command is much the same as the previous command in that it %will fallback on the main or OS currency code if not known. %The dialect attribute \dattr{regionalcurrency} is queried for the %required information. %For most regions, this command will return the same as %\cs{LocaleCurrencyLabel}. % %For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM,pt-BR} % %\input locale % %en-GB: \LocaleCurrencyRegionalLabel{british}. %en-IM: \LocaleCurrencyRegionalLabel{isleofmanenglish}. %pt-BR: \LocaleCurrencyRegionalLabel{brazilian}. % %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: GBP. en-IM: IMP. pt-BR: BRL. %\end{quote} %If I had used \cs{LocaleCurrencyLabel} instead, the \texttt{en-IM} %currency label would've been displayed as GBP. % %The currency symbol (for example, \$ or \pounds) is obtained using %\begin{definition}[\DescribeMacro\LocaleCurrencySymbol] %\cs{LocaleCurrencySymbol}\marg{dialect} %\end{definition} %Except in the case of \$ this will include symbols outside the Basic %Latin set. This means that if you use this command in your document, %you need to ensure that the document encoding has been set up before %\file{tex-locale.tex} is loaded. (The \LaTeX\ \file{tex-locale.sty} package %can automatically load \sty{fontspec} or %\sty{inputenc} \& \sty{fontenc}, if required.) As with the previous %commands, if the currency is unknown it will try to fallback on the %main or OS currency. If the \dattr{currencysym} dialect attribute %is the same as the currency code, then the \cattr{sym} currency %attribute will be used instead. % %Modifying the above example: %\begin{verbatim} %\font\nimbus="NimbusRoman-Regular" at 10pt %\nimbus % %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM,pt-BR} % %\input locale % %en-GB: \LocaleCurrencySymbol{british}. %en-IM: \LocaleCurrencySymbol{isleofmanenglish}. %pt-BR: \LocaleCurrencySymbol{brazilian}. % %\bye %\end{verbatim} %This produces: %\begin{quote} %en-GB: \pounds. en-IM: M\pounds. pt-BR: R\$. %\end{quote} %The \XeLaTeX\ equivalent is: %\begin{verbatim} %\documentclass{article} % %\usepackage[main={en-GB},other={en-IM,pt-BR}]{tex-locale} %\setmainfont{NimbusRoman-Regular} % %\begin{document} %en-GB: \LocaleCurrencySymbol{british}. %en-IM: \LocaleCurrencySymbol{isleofmanenglish}. %pt-BR: \LocaleCurrencySymbol{brazilian}. %\end{document} %\end{verbatim} % %Alternatively, you can use: %\begin{definition}[\DescribeMacro\LocaleCurrencyTeXSymbol] %\cs{LocaleCurrencyTeXSymbol}\marg{dialect} %\end{definition} %This works in the same way as the previous command, except %that it checks the \dattr{currencytex} dialect attribute. %If this attribute is the same as the currency code, then %the \cattr{tex} currency attribute is used instead. % %This command uses control sequences instead of the actual currency %character. Since both \sty{texosquery} and \sty{tex-locale} are designed %for generic \TeX\ use, \sty{texosquery} just performs some limited %tests for the existence of common command names (such as \cs{pounds} %or \cs{euro}). If it can't find an appropriate command to use, the %currency commands simply expand to a textual tag. % %For example, when \file{texosquery.tex} is input, it checks for the %existence of \cs{faGbp} and \cs{pounds}. If one of those commands %exist, then \ics{texosquerycurrencypound} is defined to that %commands, otherwise it's defined to just \qt{pound}. For the Euro %symbol (\ics{texosquerycurrencyeuro}) the code checks for %\cs{faEuro}, \cs{texteuro} and \cs{euro}. (See the \sty{texosquery} %package for more information about these currency commands.) % %The \LaTeX\ \file{tex-locale.sty} package will automatically load the %\sty{textcomp} package by default. You can switch this to another %package (for example, \sty{fontawesome}) using the \pkgopt{symbols} %package option (for example, \pkgoptfmt{symbols=fontawesome}). % %\section{Current Locale} %\label{sec:currentlocale} % %The commands described above mostly require a recognised \sty{tracklang} %dialect label in the argument to identify the locale. These labels %aren't intuitively obvious. There are some predefined dialect labels %that try to be compatible with known \sty{babel} dialects, but %neither \sty{babel} nor \sty{polyglossia} provide as much detail %about the non-language aspects of the dialect (such as the region or %variant). For example, there's no \sty{babel} or \sty{polyglossia} %setting for English in the Isle of Man (\texttt{en-IM}). Users need %to select the closest matching dialect (\texttt{british} in the case %of \texttt{en-IM}). The \sty{tracklang} package also allows an %unofficial language and region combination. %For example, a document written in English but with the regional information, %such as currencies, matching those for Belgium, should be identified %with \texttt{en-BE}. This isn't recognised as a predefined %\sty{tracklang} dialect, so \sty{tracklang} creates its own dialect %label (\texttt{enBE} in this case) when it parses this language tag. % %This makes it a bit awkward to directly use the above commands and %it's most likely that the required dialect will be the currently selected %language setting, so \file{tex-locale.tex} provides some convenient %wrapper commands, listed below. These \cs{CurrentLocale\ldots} commands are redefined every %time the locale is changed (except for \cs{CurrentLocaleDateTime}). For a document that doesn't use %\sty{babel} or \sty{polyglossia}, these commands can be reset using %\ics{selectlocale} (described on page~\pageref{pg:selectlocale}). If \file{tex-locale.tex} detects %any language hooks \cs{captions}\meta{language} (such as %\cs{captionsenglish} or \cs{captionsbritish}) then code is added to %those hooks to ensure that the locale is switched when the language %changes. % %\TeX's \ics{show} command provides a useful way of checking the %current settings. For example: %\begin{verbatim} %\def\LocaleMain{en-GB} %\def\LocaleOther{en-IM,pt-BR} % %\input locale % %\show\CurrentLocaleMonthName % %\selectlocale{en-IM} %\show\CurrentLocaleMonthName % %\selectlocale{pt-BR} %\show\CurrentLocaleMonthName % %\bye %\end{verbatim} %These cause three interruptions to the \TeX\ build, which look like %errors but are the results from each \cs{show} command. In the first %case the transcript shows: %\begin{verbatim} %> \CurrentLocaleMonthName=macro: %->\LocaleMonthName {british}. %\end{verbatim} %I haven't specifically set the locale at this point. At the end of %the \file{tex-locale.tex} code, the main locale was automatically %selected. So the current locale dialect label is \texttt{british} %and \cs{CurrentLocaleMonthName} has been defined as %\begin{verbatim} %\LocaleMonthName{british} %\end{verbatim} %Note that there's no check for \cs{languagename} or similar command %here. The dialect label is hard-coded into the definition of %\cs{CurrentLocaleMonthName}, so it's fully-expandable (unless the %month name contains any awkward non-expandable characters, which can %occur with \sty{inputenc} and non-ASCII characters). % %The next instance of \cs{show} produces the following lines in the %transcript: %\begin{verbatim} %> \CurrentLocaleMonthName=macro: %->\LocaleMonthName {isleofmanenglish}. %\end{verbatim} %The command \cs{CurrentLocaleMonthName} was redefined when %\verb|\selectlocale{en-IM}| was used. % %Similarly for the final instance of \cs{show}: %\begin{verbatim} %> \CurrentLocaleMonthName=macro: %->\LocaleMonthName {brazilian}. %\end{verbatim} % %All the commands that are redefined with each instance of \cs{selectlocale} %are listed below. Note that \cs{selectlocale} also uses %\sty{tracklang}'s \cs{SetCurrentTrackedDialect}, which also defines %a set of commands that can be used to identify information about the %current dialect. (See the \sty{tracklang} documentation for further %details.) % %\begin{definition}[\DescribeMacro\CurrentLocaleLanguageName] %\cs{CurrentLocaleLanguageName} %\end{definition} %This is a shortcut for \ics{LocaleLanguageName}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleLanguageNativeName] %\cs{CurrentLocaleLanguageNativeName} %\end{definition} %This is a shortcut for \ics{LocaleLanguageNativeName}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleRegionName] %\cs{CurrentLocaleRegionName} %\end{definition} %This is a shortcut for \ics{LocaleRegionName}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleRegionNativeName] %\cs{CurrentLocaleRegionNativeName} %\end{definition} %This is a shortcut for \ics{LocaleRegionNativeName}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleVariantName] %\cs{CurrentLocaleVariantName} %\end{definition} %This is a shortcut for \ics{LocaleVariantName}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleVariantNativeName] %\cs{CurrentLocaleVariantNativeName} %\end{definition} %This is a shortcut for \ics{LocaleRegionNativeName}\marg{dialect}. % %\subsection{Dates and Times} %\label{sec:currdatetime} % %\begin{definition}[\DescribeMacro\CurrentLocaleFirstDayIndex] %\cs{CurrentLocaleFirstDayIndex} %\end{definition} %This is a shortcut for \ics{LocaleFirstDayIndex}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleDayIndexFromRegion] %\cs{CurrentLocaleDayIndexFromRegion}\marg{index} %\end{definition} %This is a shortcut for %\ics{LocaleDayIndexFromRegion}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleDayName] %\cs{CurrentLocaleDayName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleDayName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleShortDayName] %\cs{CurrentLocaleShortDayName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleShortDayName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleStandaloneDayName] %\cs{CurrentLocaleStandaloneDayName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleStandaloneDayName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleStandaloneShortDayName] %\cs{CurrentLocaleStandaloneShortDayName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleStandaloneShortDayName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleMonthName] %\cs{CurrentLocaleMonthName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleMonthName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleShortMonthName] %\cs{CurrentLocaleShortMonthName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleShortMonthName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleStandaloneMonthName] %\cs{CurrentLocaleStandaloneMonthName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleStandaloneMonthName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleStandaloneShortMonthName] %\cs{CurrentLocaleStandaloneShortMonthName}\marg{index} %\end{definition} %This is a shortcut for \ics{LocaleStandaloneShortMonthName}\marg{dialect}\marg{index}. % %\begin{definition}[\DescribeMacro\CurrentLocaleDate] %\cs{CurrentLocaleDate} %\end{definition} %This is slightly more complicated that the above. It uses %\begin{definition}[\DescribeMacro\localedatechoice] %\cs{localedatechoice}\marg{full}\marg{long}\marg{medium}\marg{short} %\end{definition} %to determine whether to use the full date \ics{LocaleFullDate}\marg{dialect}, %the long date \ics{LocaleLongDate}\marg{dialect}, %the medium date \ics{LocaleMediumDate}\marg{dialect} or %the short date \ics{LocaleShortDate}\marg{dialect}. % %This command may be defined before \file{tex-locale.tex} is loaded or %redefined afterwards. For example, to ensure that %\cs{CurrentLocaleDate} uses the medium form: %\begin{verbatim} %\def\localedatechoice#1#2#3#4{#3} %\input locale %\end{verbatim} %\LaTeX\ users should instead use the \pkgopt{date} package option in %the \file{tex-locale.sty} package interface: %\begin{verbatim} %\usepackage[date=medium]{tex-locale} %\end{verbatim} %\LaTeX\ users can also redefine the command afterwards. For example: %\begin{verbatim} %\renewcommand*{\localedatechoice}[4]{#3} %\end{verbatim} % %There is a similar command for the time: %\begin{definition}[\DescribeMacro\CurrentLocaleTime] %\cs{CurrentLocaleTime} %\end{definition} %This uses %\begin{definition}[\DescribeMacro\localetimechoice] %\cs{localetimechoice}\marg{full}\marg{long}\marg{medium}\marg{short} %\end{definition} %to determine whether to use the full time \ics{LocaleFullTime}\marg{dialect}, %the long time \ics{LocaleLongTime}\marg{dialect}, %the medium time \ics{LocaleMediumTime}\marg{dialect} or %the short time \ics{LocaleShortTime}\marg{dialect}. As with the date choice, this command %may be defined by plain \TeX\ users before \file{tex-locale.tex} is %input. \LaTeX\ users should use the \pkgopt{time} package option %instead. In both formats, the command may be redefined after %\sty{tex-locale} has been loaded. % %There is also a command for the combined date and time: %\begin{definition}[\DescribeMacro\CurrentLocaleDateTime] %\cs{CurrentLocaleDateTime} %\end{definition} %This doesn't use the analogous \cs{LocaleFullDateTime} etc %commands, but instead is simply defined as: %\begin{code} %\cs{CurrentLocaleDate}\cs{space}\cs{CurrentLocaleTime} %\end{code} %This allows for a mix of date and time styles, reflecting %the definitions of \cs{localedatechoice} and \cs{localetimechoice}. % %If you want a specific style (ignoring \cs{localedatechoice} %and \cs{localetimechoice}), you can use the following commands: %\begin{definition}[\DescribeMacro\CurrentLocaleFullDate] %\cs{CurrentLocaleFullDate} %\end{definition} %This just uses \cs{LocaleFullDate}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleLongDate] %\cs{CurrentLocaleLongDate} %\end{definition} %This just uses \cs{LocaleLongDate}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleMediumDate] %\cs{CurrentLocaleMediumDate} %\end{definition} %This just uses \cs{LocaleMediumDate}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleShortDate] %\cs{CurrentLocaleShortDate} %\end{definition} %This just uses \cs{LocaleShortDate}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleFullTime] %\cs{CurrentLocaleFullTime} %\end{definition} %This just uses \cs{LocaleFullTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleLongTime] %\cs{CurrentLocaleLongTime} %\end{definition} %This just uses \cs{LocaleLongTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleMediumTime] %\cs{CurrentLocaleMediumTime} %\end{definition} %This just uses \cs{LocaleMediumTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleShortTime] %\cs{CurrentLocaleShortTime} %\end{definition} %This just uses \cs{LocaleShortTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleFullDateTime] %\cs{CurrentLocaleFullDateTime} %\end{definition} %This just uses \cs{LocaleFullDateTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleLongDateTime] %\cs{CurrentLocaleLongDateTime} %\end{definition} %This just uses \cs{LocaleLongDateTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleMediumDateTime] %\cs{CurrentLocaleMediumDateTime} %\end{definition} %This just uses \cs{LocaleMediumDateTime}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleShortDateTime] %\cs{CurrentLocaleShortDateTime} %\end{definition} %This just uses \cs{LocaleShortDateTime}\marg{dialect}. % % %\subsection{Numeric Symbols} %\label{sec:currnumsym} % %The currency for the current locale is similar in construct to the %current locale's date and time commands listed above. %\begin{definition}[\DescribeMacro\CurrentLocaleCurrency] %\cs{CurrentLocaleCurrency} %\end{definition} %This uses %\begin{definition}[\DescribeMacro\localecurrchoice] %\cs{localecurrchoice}\marg{label}\marg{regional}\marg{symbol}\marg{\TeX} %\end{definition} %to determine whether to use \ics{LocaleCurrencyLabel}\marg{dialect}, %\ics{LocaleCurrencyRegionalLabel}\marg{dialect}, %\ics{LocaleCurrencySymbol}\marg{dialect} or %\ics{LocaleCurrencyTeXSymbol}\marg{dialect}. %This can similarly be defined before \file{tex-locale.tex} is input or %redefined afterwards. \LaTeX\ users can use the \pkgopt{currency} %package option. % %\begin{definition}[\DescribeMacro\CurrentLocaleNumericGroupSep] %\cs{CurrentLocaleNumericGroupSep} %\end{definition} %This is a shortcut for \ics{LocaleNumericGroupSep}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleIfNumericUsesGroup] %\cs{CurrentLocaleIfNumericUsesGroup}\marg{true code}\marg{false code} %\end{definition} %This is a shortcut for %\ics{LocaleIfNumericUsesGroup}\marg{dialect}\marg{true %code}\marg{false code}. % %The next few commands have a slightly different pattern to the %shortcut control sequence name. For brevity, the shortcut command %omits the \qt{Numeric} part of the corresponding name. % %\begin{definition}[\DescribeMacro\CurrentLocaleDecimalSep] %\cs{CurrentLocaleDecimalSep} %\end{definition} %This is a shortcut for \ics{LocaleNumericDecimalSep}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleMonetarySep] %\cs{CurrentLocaleMonetarySep} %\end{definition} %This is a shortcut for \ics{LocaleNumericMonetarySep}\marg{dialect}. % %\begin{definition}[\DescribeMacro\CurrentLocaleExponent] %\cs{CurrentLocaleExponent} %\end{definition} %This is a shortcut for \ics{LocaleNumericExponent}\marg{dialect}. % %\subsection{Current Locale Patterns} %\label{sec:currpat} % %\begin{definition}[\DescribeMacro\CurrentLocaleIntegerPattern] %\cs{CurrentLocaleIntegerPattern} %\end{definition} %This is a convenient shortcut to access the integer pattern for the %current dialect. % %\begin{definition}[\DescribeMacro\CurrentLocaleDecimalPattern] %\cs{CurrentLocaleDecimalPattern} %\end{definition} %This is a convenient shortcut to access the decimal pattern for the %current dialect. % %\begin{definition}[\DescribeMacro\CurrentLocaleCurrencyPattern] %\cs{CurrentLocaleCurrencyPattern} %\end{definition} %This is a convenient shortcut to access the currency pattern for the %current dialect. % %\begin{definition}[\DescribeMacro\CurrentLocalePercentPattern] %\cs{CurrentLocalePercentPattern} %\end{definition} %This is a convenient shortcut to access the percent pattern for the %current dialect. % %\begin{definition}[\DescribeMacro\CurrentLocaleApplyDateTimePattern] %\cs{CurrentLocaleApplyDateTimePattern} %\end{definition} %This is a convenient shortcut for %\ics{LocaleApplyDateTimePattern}\marg{dialect}. % %\chapter{\texorpdfstring{\LaTeX}{LaTeX}\ Use} %\label{sec:latex} % %The \sty{tex-locale} package is loaded in \LaTeX\ with the usual %\cs{usepackage} syntax: %\begin{verbatim} %\usepackage{tex-locale} %\end{verbatim} %This does more than simply input \file{tex-locale.tex}. The options %are listed below. % %\begin{description} %\item[\pkgopt{main}=\marg{tag}] This option identifies the main locale for the %document. The value should be a valid language tag. If this option %is omitted, the main language will be obtained from the Java Runtime %Environment, which should match your operating system's default %locale. If any languages have already been tracked in your document with %\sty{tracklang} prior to loading \sty{tex-locale}, the main %language is set to the first tracked dialect. Normally you don't %need to explicitly load \sty{tracklang}. % %\item[\pkgopt{other}=\marg{list}] This option identifies other %locales required by the document. The value should be a %comma-separated list of language tags or the keyword \pkgoptfmt{locale} %to indicate the system's default locale. The value must be grouped %to protect any commas from the key=value parser. %\begin{important} %This option has a cumulative effect. %\end{important} % %\item[\pkgopt{symbols}=\marg{name}] This option identifies the %symbol package to automatically load. For example, %\pkgoptfmt{symbols=textcomp} or \pkgoptfmt{symbols=fontawesome}. If %another package is required, \sty{texosquery}'s currency symbol commands %will need to be redefined as appropriate. % %The keyword \pkgoptfmt{none} indicates that no package is required. The %default is \pkgoptfmt{symbols=none} for \XeLaTeX\ or \LuaLaTeX, %otherwise it's \pkgoptfmt{symbols=textcomp}. % %\item[\pkgopt{support}=\marg{value}] This option identifies the %language support value. Available values are: %\begin{itemize} %\item \pkgoptfmt{none}: don't load any language support package; %\item \pkgoptfmt{auto}: load \sty{polyglossia} for \XeLaTeX\ or %\LuaLaTeX, otherwise load \sty{babel}; %\item \pkgoptfmt{babel}: load \sty{babel} regardless of the \LaTeX\ %format; %\item \pkgoptfmt{polyglossia}: load \sty{polyglossia} without checking %the \LaTeX\ format (but remember that \sty{polyglossia} doesn't work %with \PDFLaTeX); %\item \pkgoptfmt{cjk}: load CJK support with either \sty{xeCJK} %(\XeLaTeX/\LuaLaTeX) or \sty{CJKutf8}. This isn't fully tested, and %there's no support for non-UTF encoding. %\end{itemize} % %\item[\pkgopt{fontenc}=\marg{value}] This option indicates whether %or not to load the \sty{fontenc} package. The value should be one %of: \pkgoptfmt{none} (don't load), \pkgoptfmt{auto} (automatically load %with the encoding determined from the language settings), or %\meta{option} (indicating the package option to pass to %\sty{fontenc}). The default is \pkgoptfmt{fontenc=auto} unless %\sty{fontenc} has already been loaded. % %This option is ignored with \XeLaTeX\ or \LuaLaTeX. % %\item[\pkgopt{inputenc}=\marg{value}] This option indicates whether %or not to load the \sty{inputenc} package. The value should be one %of: \pkgoptfmt{none} (don't load), \pkgoptfmt{auto} (automatically load %with the encoding determined from the default obtained from %\sty{texosquery}), or \meta{option} (indicating the package option %to pass to \sty{inputenc}). The default is \pkgoptfmt{inputenc=auto} %but \sty{inputenc} won't be loaded if the appropriate encoding can't %be determined. Note that loading \sty{inputenc} before the %\sty{texosquery} lookup is performed will cause a problem with %non-ASCII characters appearing in the result. % %This option is ignored with \XeLaTeX\ or \LuaLaTeX. % %\item[\pkgopt{datetime}=\meta{value}] This option indicates whether %or not to load the \sty{datetime2} package. The value may be one of: %\begin{itemize} %\item \pkgoptfmt{false}: don't load \sty{datetime2}; %\item \pkgoptfmt{iso}: load \sty{datetime2} with the package option %\pkgoptfmt{useregional=false} and sets the date-time style to \pkgoptfmt{iso}; %\item \pkgoptfmt{text}: load \sty{datetime2} with the package option %\pkgoptfmt{useregional=text}; %\item \pkgoptfmt{num} or \pkgoptfmt{numeric}: load \sty{datetime2} with the %package option \pkgoptfmt{useregional=numeric}; %\item \pkgoptfmt{locale}: don't load \sty{datetime2} and set \ics{today} %to \ics{CurrentLocaleDate}, if available. %\end{itemize} % %\item[\pkgopt{date}=\meta{value}] This option indicates the %preferred date style for \ics{CurrentLocaleDate}. The value may be %one of: \pkgoptfmt{full}, \pkgoptfmt{long}, \pkgoptfmt{medium} %\pkgoptfmt{short}. This option doesn't affect \ics{today} unless you %have used \pkgoptfmt{datetime=locale}. % %\item[\pkgopt{time}=\meta{value}] This option indicates the %preferred time style for \ics{CurrentLocaleTime}. The value may be %one of: \pkgoptfmt{full}, \pkgoptfmt{long}, \pkgoptfmt{medium} %\pkgoptfmt{short}. % %\item[\pkgopt{timedate}=\meta{boolean}] This option indicates %whether or not to support date and time patterns. (See %\sectionref{sec:datetimepat}.) % %\item[\pkgopt{currency}=\meta{value}] This option indicates the %preferred currency style for \ics{CurrentLocaleCurrency}. Available %values: \pkgoptfmt{official} (official identifier), \pkgoptfmt{unofficial} %unofficial identified, \pkgoptfmt{sym} (the symbol, which may include %non-ASCII characters) or \pkgoptfmt{tex} (use the commands provided by %\sty{texosquery}). The default is \pkgoptfmt{currency=sym} for %\XeLaTeX/\LuaLaTeX\ or \pkgoptfmt{currency=tex} otherwise. % %\end{description} % %The \sty{tex-locale} package will use \sty{texosquery} to lookup the %default language tag and encoding, and then attempt to load the %appropriate encoding and language support packages. % %For example, consider the following document: %\begin{verbatim} %\documentclass{article} %\usepackage{tex-locale} %\begin{document} %Currency: \CurrentLocaleCurrency. %\end{document} %\end{verbatim} %My default locale is \texttt{en-GB} with UTF-8 as the default file %encoding, so if I compile this document with \PDFLaTeX, then this is %essentially equivalent to: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB]{tracklang} %\usepackage[T1]{fontenc} %\usepackage[utf8]{inputenc} %\usepackage[british]{babel} %\usepackage[useregional]{datetime2} %\begin{document} %Currency: \pounds. %\end{document} %\end{verbatim} %(Other dependent packages omitted for clarity.) Whereas if I compile %the document with \XeLaTeX, then this is essentially equivalent to: %\begin{verbatim} %\documentclass{article} %\usepackage[en-GB]{tracklang} %\usepackage{fontspec} %\usepackage{polyglossia} %\setmainlanguage[variant=uk]{english} %\usepackage[useregional]{datetime2} %\begin{document} %Currency: £. %\end{document} %\end{verbatim} %If I still want to use \sty{babel}, then I can enforce this with: %\begin{verbatim} %\usepackage[support=babel]{tex-locale} %\end{verbatim} %Or if I don't want \sty{babel} or \sty{polyglossia}: %\begin{verbatim} %\usepackage[support=none]{tex-locale} %\end{verbatim} % %You can determine which language package was used with: %\begin{definition}[\DescribeMacro\LocaleSupportPackageCase] %\cs{LocaleSupportPackageCase}\marg{babel}\marg{polyglossia}\marg{neither} %\end{definition} %If either package has been loaded \ics{selectlocale}\marg{locale} %should automatically be implemented when the document language %changes, so you can the use the current locale commands described in %\sectionref{sec:currentlocale}. % %Example: %\begin{verbatim} %\usepackage[main={sr-Cyrl-RS},other={en-GB}]{tex-locale} % %\LocaleSupportPackageCase %{\newcommand{\textenglish}[1]{\foreignlanguage{british}{#1}}}% babel %{% polyglossia % \setmainfont{Liberation Serif} % \newfontfamily\cyrillicfont{Liberation Serif} %} %{\newcommand{\textenglish}[1]{#1}}% none %\end{verbatim} % %\StopEventually{% % \printindex[user] % \PrintCodeIndex % \PrintChanges %} % % %\chapter{The Code} %\iffalse % \begin{macrocode} %<*tex-locale.sty> % \end{macrocode} %\fi %\changes{1.0}{2018-08-26}{Initial release} %\section{\LaTeX\ Code (\texttt{tex-locale.sty})} % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{tex-locale}[2018/08/26 v1.0 (NLCT) localisation support] % \end{macrocode} %Make life easier by using \sty{etoolbox}: % \begin{macrocode} \RequirePackage{etoolbox} % \end{macrocode} % Also need \sty{xfor} to break out of \cs{@for} loop. % \begin{macrocode} \RequirePackage{xfor} % \end{macrocode} %Load \sty{tracklang} using package interface just in case any %languages have been passed through the document class options. %Require at least v1.3.3 since the dialect label mappings are needed %in this file. % \begin{macrocode} \RequirePackage{tracklang}[2016/11/03] % \end{macrocode} %If any languages have been tracked, set the main language to the %first tracked dialect. % \begin{macrocode} \AnyTrackedLanguages {% \ForEachTrackedDialect{\locale@this@dialect} { \ifx\LocaleMain\undefined \edef\LocaleMain{\GetTrackedLanguageTag{\locale@this@dialect}} \let\@locale@trackedmain\LocaleMain \else \ifx\LocaleOther\undefined \edef\LocaleOther{\GetTrackedLanguageTag{\locale@this@dialect}} \else \edef\LocaleOther{\LocaleOther,\GetTrackedLanguageTag{\locale@this@dialect}} \fi \fi } } {} % \end{macrocode} %Need to determine if we're using \XeLaTeX\ or \LuaLaTeX. % \begin{macrocode} \RequirePackage{ifxetex} \RequirePackage{ifluatex} % \end{macrocode} %\begin{macro}{\@locale@ifxeorlua} %Short cut to check if we're using either: % \begin{macrocode} \ifxetex \newcommand*{\@locale@ifxeorlua}[2]{#1} \else \ifluatex \newcommand*{\@locale@ifxeorlua}[2]{#1} \else \newcommand*{\@locale@ifxeorlua}[2]{#2} \fi \fi % \end{macrocode} %\end{macro} % %Need \sty{xkeyval} for key-value interface: % \begin{macrocode} \RequirePackage{xkeyval} % \end{macrocode} % %Define package options. % % Each \cs{DeclareOptionX} needs a corresponding \cs{DeclareOption} % so that it can be passed as a document class option, so define a % command that will implement both. %\begin{macro}{\@locale@declareoption} % \begin{macrocode} \newcommand*{\@locale@declareoption}[2]{% \DeclareOptionX{#1}{#2}% \DeclareOption{#1}{#2}% } % \end{macrocode} %\end{macro} % %\begin{option}{main} %This option identifies the main locale. This will %default to the operating system's locale if not set. The value %should be the language tag or the keyword \texttt{locale}. % \begin{macrocode} \define@key{tex-locale.sty}{main}{% % \end{macrocode} %If this has already been set in the earlier tracked dialect check, %move the original main to the other list. % \begin{macrocode} \ifx\@locale@trackedmain\undefined \else \ifx\LocaleOther\undefined \let\LocaleOther\@locale@trackedmain \else \edef\LocaleOther{\@locale@trackedmain,\LocaleOther}% \fi \let\@locale@trackedmain\undefined \fi \def\LocaleMain{#1}% } % \end{macrocode} %\end{option} %\begin{option}{other} %This option identifies the other locales. The value %should be a comma-separated list of language tags or the keyword %\texttt{locale}. The value must be grouped to protect any commas %from the key-value parser. Note this option has a cumulative %effect. % \begin{macrocode} \define@key{tex-locale.sty}{other}{% \ifx\LocaleOther\undefined \def\LocaleOther{#1}% \else \edef\LocaleOther{\LocaleOther,#1}% \fi } % \end{macrocode} %\end{option} %\begin{option}{symbols} %This option identifies the symbol package to automatically load. %For example, \sty{textcomp} or \texttt{fontawesome}. If another %package is required, \sty{texosquery}'s currency symbol commands %will need to be redefined as appropriate. The key word \texttt{none} %indicates that no package is required. The default is \texttt{none} %for \XeLaTeX\ or \LuaLaTeX\ and \sty{textcomp} otherwise. %\texttt{textcomp} % \begin{macrocode} \@locale@ifxeorlua{\def\@locale@symbols{none}}{\def\@locale@symbols{textcomp}} \define@key{tex-locale.sty}{symbols}{\def\@locale@symbols{#1}} % \end{macrocode} %\end{option} % %To make it easier to add extra support options, assign a numeric %value to each option so that \cs{ifcase} can be used. Recognised %values: 0 (none), 1 (auto), 2 (babel), 3 (polyglossia), 4 (cjk). %\begin{macro}{\@locale@supportopt} % \begin{macrocode} \newcount\@locale@supportopt % \end{macrocode} % The default value is auto unless a known language package has % already been loaded. % \begin{macrocode} \@ifpackageloaded{polyglossia} {\@locale@supportopt=0\relax} { \@ifpackageloaded{babel} {\@locale@supportopt=0\relax} { \@ifpackageloaded{CJK} {\@locale@supportopt=0\relax} {\@locale@supportopt=1\relax} } } % \end{macrocode} %\end{macro} % %\begin{option}{support} %This option identifies the language support package. % \begin{macrocode} \define@choicekey{tex-locale.sty}{support}% [\@locale@support@val\@locale@support@nr]% {none,auto,babel,polyglossia,cjk} {\@locale@supportopt=\@locale@support@nr\relax} % \end{macrocode} %\end{option} %\begin{option}{fontspec} %This option identifies whether or not to load \sty{fontspec} if %\XeLaTeX\ or \LuaLaTeX\ is in use. Defaults to true and is ignored %if neither \XeLaTeX\ nor \LuaLaTeX\ are in use. % \begin{macrocode} \define@boolkey{tex-locale.sty}[@locale@]{fontspec}[true]{} \@locale@ifxeorlua{\@locale@fontspectrue}{\@locale@fontspecfalse} % \end{macrocode} %\end{option} %\begin{option}{fontenc} %This option identifies whether or not to load \sty{fontenc} if %neither \XeLaTeX\ nor \LuaLaTeX\ is in use. The value should be %either \pkgoptfmt{none} (don't load) or \pkgoptfmt{auto} %(determined from the main language or script) or the option to pass to %\sty{fontenc}. If the \pkgoptfmt{auto} option is used but the %appropriate encoding can't be determined, \sty{fontenc} won't be %loaded. The default value is \pkgoptfmt{auto} unless \sty{fontenc} %has already been loaded. This option is ignored if % either \XeLaTeX\ or \LuaLaTeX\ are in use. % \begin{macrocode} \define@key{tex-locale.sty}{fontenc}{% \edef\@locale@fontenc{#1}% \ifdefstring{\@locale@fontenc}{false}{\def\@locale@fontenc{none}}{}% } \@ifpackageloaded{fontenc} {\def\@locale@fontenc{none}} {\def\@locale@fontenc{auto}} % \end{macrocode} %\end{option} %\begin{option}{inputenc} %This option identifies whether or not to load \sty{inputenc} if %neither \XeLaTeX\ nor \LuaLaTeX\ is in use. The value should be %either \pkgoptfmt{none} (don't load) or \pkgoptfmt{auto} %(determined from the locale's default encoding) or the option to pass to %\sty{inputenc}. If the \pkgoptfmt{auto} option is used but the %appropriate encoding can't be determined, \sty{inputenc} won't be %loaded. The default value is \pkgoptfmt{auto}. This option is ignored if % either \XeLaTeX\ or \LuaLaTeX\ are in use. Note that loading % \sty{inputenc} before the query is performed will cause a problem % with non-ASCII characters appearing in the result. % \begin{macrocode} \define@key{tex-locale.sty}{inputenc}{% \edef\@locale@inputenc{#1}% \ifdefstring{\@locale@inputenc}{false}{\def\@locale@inputenc{none}}{}% } \@ifpackageloaded{inputenc} {\def\@locale@inputenc{none}} {\def\@locale@inputenc{auto}} % \end{macrocode} %\end{option} % %\begin{macro}{\@locale@load@dtm} %This command is used to load \sty{datetime2}, if required, and setup the style. % \begin{macrocode} \@ifpackageloaded{datetime2} { % \end{macrocode} % User has already loaded \sty{datetime2}. Assume they have already % set their preferred style. (They would also need to have loaded % \sty{babel}\slash\sty{polyglossia} before \sty{datetime2}, which % rather reduces the point of the \sty{tex-locale} package.) % \begin{macrocode} \newcommand\@locale@load@dtm{} } { \newcommand\@locale@load@dtm{% % \end{macrocode} % First check if \sty{datetime2} is installed. If it isn't, then % default to \pkgopt[locale]{datetime2}. % \begin{macrocode} \IfFileExists{datetime2.sty}% {\@locale@load@regional@dtm}% {\@locale@set@today}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@load@regional@dtm} %Load \sty{datetime2} with regional settings. % \begin{macrocode} \newcommand\@locale@load@regional@dtm{% \localedatechoice {%full \PassOptionsToPackage{showdow}{datetime2}% \PassOptionsToPackage{useregional=text}{datetime2}% }% {%long \PassOptionsToPackage{useregional=text}{datetime2}% }% {%medium \PassOptionsToPackage{useregional=text}{datetime2}% }% {%short \PassOptionsToPackage{useregional=numeric}{datetime2}% }% \RequirePackage{datetime2}% \localedatechoice{}{}{\DTMlangsetup*{abbr}}{}% }% % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@set@today} %Redefine \cs{today}. % \begin{macrocode} \newcommand*{\@locale@set@today}{% % \end{macrocode} % If \cs{CurrentLocaleDate} is empty then the query failed, in which % case don't change \cs{today}. % \begin{macrocode} \ifdefempty\CurrentLocaleDate {}% {% \renewcommand{\today}{\CurrentLocaleDate}% \ForEachTrackedDialect{\locale@this@dialect} {% % \end{macrocode} %Add to \cs{date}\meta{lang} hook. % \begin{macrocode} \SetCurrentTrackedDialect{\locale@this@dialect}% \@TrackLangAddToHook {\renewcommand{\today}{\CurrentLocaleDate}} {date}% }% }% } % \end{macrocode} %\end{macro} % % %\begin{option}{datetime} %Provide an option to adjust the date and time settings. % \begin{macrocode} \define@choicekey{tex-locale.sty}{datetime}% [\@locale@datetime@val\@locale@datetime@nr]% {false,iso,text,num,numeric,locale} {% \ifcase\@locale@datetime@nr \def\@locale@load@dtm{}% \or \def\@locale@load@dtm{% \PassOptionsToPackage{useregional=false}{datetime2}% \RequirePackage{datetime2}% \DTMsetstyle{iso}% }% \or \def\@locale@load@dtm{% \@locale@load@regional@dtm }% \or \def\@locale@load@dtm{% \PassOptionsToPackage{useregional=numeric}{datetime2}% \RequirePackage{datetime2}% }% \or \def\@locale@load@dtm{% \PassOptionsToPackage{useregional=numeric}{datetime2}% \RequirePackage{datetime2}% }% \or \def\@locale@load@dtm{\@locale@set@today}% \fi } % \end{macrocode} %\end{option} % %\begin{option}{iso} %Shortcut for \pkgopt[iso]{datetime2}. % \begin{macrocode} \@locale@declareoption{iso}{% \def\@locale@load@dtm{% \PassOptionsToPackage{useregional=false}{datetime2}% \RequirePackage{datetime2}% \DTMsetstyle{iso}% }% } % \end{macrocode} %\end{option} % %\begin{option}{date} %Preferred date style for \cs{CurrentLocaleDate}. % \begin{macrocode} \define@choicekey{tex-locale.sty}{date}% [\@locale@date@val\@locale@date@nr]{full,long,medium,short} {% \ifcase\@locale@date@nr \def\localedatechoice##1##2##3##4{##1}% \or \def\localedatechoice##1##2##3##4{##2}% \or \def\localedatechoice##1##2##3##4{##3}% \or \def\localedatechoice##1##2##3##4{##4}% \fi } \newcommand*{\localedatechoice}[4]{#2}% % \end{macrocode} %\end{option} % %\begin{option}{time} %Preferred date style for \cs{CurrentLocaleTime}. % \begin{macrocode} \define@choicekey{tex-locale.sty}{time}% [\@locale@time@val\@locale@time@nr]{full,long,medium,short} {% \ifcase\@locale@time@nr \def\localetimechoice##1##2##3##4{##1}% \or \def\localetimechoice##1##2##3##4{##2}% \or \def\localetimechoice##1##2##3##4{##3}% \or \def\localetimechoice##1##2##3##4{##4}% \fi } \newcommand*{\localetimechoice}[4]{#3}% % \end{macrocode} %\end{option} % %\begin{option}{timedata} %Determine whether or not to use \texttt{-M} and \texttt{-Z}. % \begin{macrocode} \define@choicekey{tex-locale.sty}{timedata}% [\@locale@timedata@val\@locale@timedata@nr]{true,false}[true] {% \ifcase\@locale@timedata@nr \def\LocaleIfDateTimePatternsSupported##1##2{##1}% \or \def\LocaleIfDateTimePatternsSupported##1##2{##2}% \fi } % \end{macrocode} %\end{option} % %\begin{option}{currency} %Preferred currency style for \cs{CurrentLocaleCurrency}. % \begin{macrocode} \define@choicekey{tex-locale.sty}{currency}% [\@locale@currency@val\@locale@currency@nr]% {official,unofficial,sym,tex} {% \ifcase\@locale@currency@nr \def\localecurrchoice##1##2##3##4{##1}% \or \def\localecurrchoice##1##2##3##4{##2}% \or \def\localecurrchoice##1##2##3##4{##3}% \or \def\localecurrchoice##1##2##3##4{##4}% \fi } \@locale@ifxeorlua {\newcommand*{\localecurrchoice}[4]{#3}} {\newcommand*{\localecurrchoice}[4]{#4}} % \end{macrocode} %\end{option} % % Process package options. First process any options that have been % passed via the document class. % \begin{macrocode} \@for\CurrentOption:=\@declaredoptions\do{% \ifx\CurrentOption\@empty \else \@expandtwoargs \in@{,\CurrentOption,}{,\@classoptionslist,\@curroptions,}% \ifin@ \@use@ption \expandafter\let\csname ds@\CurrentOption\endcsname\@empty \fi \fi } % \end{macrocode} % Now process options passed to the package: % \begin{macrocode} \ProcessOptionsX % \end{macrocode} % % Check if \sty{babel} or \sty{polyglossia} have already been loaded % (user may have used \pkgopt[babel]{support} or \pkgopt[polyglossia]{support} % without realising it's already been loaded). Since % \sty{polyglossia} pretends \sty{babel} has been loaded, only % \sty{babel} test is required. % \begin{macrocode} \@ifpackageloaded{babel} {% \@locale@supportopt=0\relax } {} % \end{macrocode} % If the main language hasn't been set, define it (needed before % the generic code is input.) % \begin{macrocode} \ifx\LocaleMain\undefined \def\LocaleMain{locale} \fi \ifx\LocaleOther\undefined \def\LocaleOther{} \fi % \end{macrocode} % %\begin{macro}{\@locale@postparse@hook} %Post-parser hook. % \begin{macrocode} \newcommand*{\@locale@postparse@hook}{% \input{tex-locale-support.def}% } % \end{macrocode} %\end{macro} % %If symbol support is required, load the package now: % \begin{macrocode} \ifdefstring{\@locale@symbols}{none} {} {\RequirePackage{\@locale@symbols}} % \end{macrocode} %Load \sty{texosquery} using package interface (needs to be done %after the symbol support is loaded since \texttt{texosquery.tex} %detects some common symbol commands). % \begin{macrocode} \RequirePackage{texosquery} % \end{macrocode} %The encoding needs to be set up before the main query in case there %are any non-ASCII characters returned by the query (for example, %the currency symbol or in month or day names). % % May need to track all the listed dialects before % \texttt{tex-locale.tex} is loaded. %\begin{macro}{\@locale@trackall} % Track the main language if set. % \begin{macrocode} \newcommand\@locale@trackall{% \ifdefstring\LocaleMain{locale}% {% \ifx\LocaleOStag\empty \PackageWarning{tex-locale}{Unable to determine locale (check shell escape)}% \else \TrackLanguageTag{\LocaleOStag}% \fi }% {\TrackLanguageTag{\LocaleMain}}% % \end{macrocode} % Track the other languages. % \begin{macrocode} \@for\locale@this@dialect:=\LocaleOther\do{% \ifdefstring\locale@this@dialect{locale} {% \ifx\LocaleOStag\empty \PackageWarning{tex-locale}{Unable to determine locale (check shell escape)}% \else \TrackLanguageTag{\LocaleOStag}% \fi }% {\TrackLanguageTag{\locale@this@dialect}}% }% \let\@locale@trackall\relax } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@loadinputenc} % \begin{macrocode} \newcommand{\@locale@loadinputenc}{} % \end{macrocode} %\end{macro} % %It may be necessary to use texosquery here to determine the %language tag ("-b") and\slash or the codeset ("-C"). It makes more %sense to minimise the number of shell escapes, so try to determine %what extra information we need here. The required parameters are stored in %\cs{@locale@pre@query@params} %\begin{macro}{\@locale@pre@query@params} % \begin{macrocode} \newcommand*\@locale@pre@query@params{}% % \end{macrocode} %\end{macro} %Now we need some commands that will parse the result, depending on %the parameters. %\begin{macro}{\@locale@pre@query@parsetag} %Only the language tag ("-b") is required. The shell escape will %only return a single result. \cs{LocaleOStag} will either be set to %the language tag, if successful, or will be empty, if in dry run %mode. % \begin{macrocode} \newcommand*\@locale@pre@query@parsetag{% \ifx\LocaleStyQueryFile\undefined \TeXOSQuery{\@locale@result}{\@locale@pre@query@params}% \else \ifx\LocaleStyQueryFile\empty \TeXOSQuery{\@locale@result}{\@locale@pre@query@params}% \else \ifx\TeXOSQueryFromFile\undefined \PackageError{locale}{texosquery too old to support \string\LocaleStyQueryFile. At least v1.4 required} {You need to update your version of texosquery} \def\@locale@result{}% \else \PackageInfo{locale}{Fetching query results from `\LocaleStyQueryFile'}% \TeXOSQueryFromFile{\@locale@result}{\LocaleStyQueryFile}% \fi \fi \fi \edef\LocaleOStag{\@locale@result}% }% % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@pre@query@parsecodeset} %Only the codeset ("-C") is required. The shell escape will %only return a single result. \cs{LocaleOScodeset} will either be set to %the codeset, if successful, or will be empty, if in dry run %mode. % \begin{macrocode} \newcommand*\@locale@pre@query@parsecodeset{% \TeXOSQuery{\@locale@result}{\@locale@pre@query@params}% \edef\LocaleOScodeset{\@locale@result}% }% % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@pre@query@parsetagcodeset} %Both the language tag ("-b") and the codeset ("-C") are required. %The shell escape will return two arguments. % \begin{macrocode} \newcommand*\@locale@pre@query@parsetagcodeset{% \def\LocaleOStag{}% \def\LocaleOScodeset{}% \TeXOSQuery{\@locale@result}{\@locale@pre@query@params}% \ifx\@locale@result\@empty \else \edef\LocaleOStag{\expandafter\@firstoftwo\@locale@result}% \edef\LocaleOScodeset{\expandafter\@secondoftwo\@locale@result}% \fi }% % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@pre@query@parse} %This will be set to the appropriate command after determining what %information is actually required. % \begin{macrocode} \let\@locale@pre@query@parse\relax % \end{macrocode} %\end{macro} % %If \XeLaTeX\ or \LuaLaTeX\ is in use and the \pkgopt{fontspec} option %is on, load \sty{fontspec}. % \begin{macrocode} \@locale@ifxeorlua {% \if@locale@fontspec\RequirePackage{fontspec}\fi % \end{macrocode} %The language tag is needed if \pkgopt[auto]{support}. % \begin{macrocode} \ifnum\@locale@supportopt=1\relax \ifdefstring\LocaleMain{locale} {% \def\@locale@pre@query@params{\string-b }% \let\@locale@pre@query@parse\@locale@pre@query@parsetag }% {% \@for\locale@this@dialect:=\LocaleOther\do{% \ifdefstring\locale@this@dialect{locale} {% \def\@locale@pre@query@params{\string-b }% \let\@locale@pre@query@parse\@locale@pre@query@parsetag \@endfortrue }% {}% }% }% % \end{macrocode} %Perform the shell escape if required. % \begin{macrocode} \@locale@pre@query@parse \fi } {% % \end{macrocode} %The language tag is needed if \pkgopt[auto]{fontenc}. % \begin{macrocode} \ifdefstring{\@locale@fontenc}{auto} {% \ifdefstring\LocaleMain{locale} {% \def\@locale@pre@query@params{\string-b }% \let\@locale@pre@query@parse\@locale@pre@query@parsetag }% {% \@for\locale@this@dialect:=\LocaleOther\do{% \ifdefstring\locale@this@dialect{locale} {% \def\@locale@pre@query@params{\string-b }% \let\@locale@pre@query@parse\@locale@pre@query@parsetag \@endfortrue }% {}% }% }% }% {}% % \end{macrocode} %The codeset is needed if \pkgopt[auto]{inputenc}. %The "-C" (\texttt{-{}-codeset-lcs}) switch is used rather %than the "-cs" (\texttt{-{}-codeset}) switch to make it more %compatible with \sty{inputenc}. % \begin{macrocode} \ifdefstring{\@locale@inputenc}{auto} {% \ifx\@locale@pre@query@params\@empty \let\@locale@pre@query@parse\@locale@pre@query@parsecodeset \else \let\@locale@pre@query@parse\@locale@pre@query@parsetagcodeset \fi \edef\@locale@pre@query@params{\@locale@pre@query@params\string-C}% }% {}% % \end{macrocode} %Perform the shell escape if required. % \begin{macrocode} \@locale@pre@query@parse % \end{macrocode} % Do we need to load \sty{fontenc}? % \begin{macrocode} \ifdefstring{\@locale@fontenc}{none} {} {% \ifdefstring{\@locale@fontenc}{auto} {% % \end{macrocode} % If \pkgopt[auto]{fontenc}, set up some script to \sty{fontenc} mappings. % \begin{macrocode} \input{tex-locale-scripts-enc.def}% \@locale@trackall % \end{macrocode} % Iterate through all the dialects. % \begin{macrocode} \ForEachTrackedDialect{\locale@this@dialect}% { \edef\@locale@lang{\TrackedLanguageFromDialect{\locale@this@dialect}}% \@locale@if@langenc@map{\locale@this@dialect}% {% \edef\@locale@fontenc@opt{% \@locale@get@langenc@map{\locale@this@dialect}}% \expandafter\PassOptionsToPackage\expandafter {\@locale@fontenc@opt}{fontenc}% }% {% \@locale@if@langenc@map{\@locale@lang}% {% \edef\@locale@fontenc@opt{% \@locale@get@langenc@map{\@locale@lang}}% \expandafter\PassOptionsToPackage\expandafter {\@locale@fontenc@opt}{fontenc}% }% {% \edef\@locale@script{\GetTrackedDialectScript{\locale@this@dialect}}% \ifx\@locale@script\empty \edef\@locale@script{\TrackLangGetDefaultScript{\@locale@lang}}% \fi \@locale@if@scriptenc@map{\@locale@script}% {% \edef\@locale@fontenc@opt{% \@locale@get@scriptenc@map{\@locale@script}}% \expandafter\PassOptionsToPackage\expandafter {\@locale@fontenc@opt}{fontenc}% }% {}% }% }% }% \ifx\@locale@fontenc@opt\empty \PackageWarning{tex-locale}{Option `fontenc=auto' failed. Can't determine an appropriate font encoding for dialect(s). (Dialect list: \@tracklang@dialects.) Either set the encoding explicitly or switch to XeLaTeX% }% \else \RequirePackage{fontenc}% \fi } {% \expandafter\PassOptionsToPackage\expandafter{\@locale@fontenc}{fontenc}% \RequirePackage{fontenc}% } } % \end{macrocode} % Do we need to load \sty{inputenc}? This needs to be done before % the main \texttt{tex-locale.tex} shell escape. % \begin{macrocode} \ifdefstring{\@locale@inputenc}{none} {} {% \ifdefstring{\@locale@inputenc}{auto} {% % \end{macrocode} %If the earlier shell escape was successful, \cs{LocaleOScodeset} will be set. % \begin{macrocode} \ifx\LocaleOScodeset\empty % \end{macrocode} %Query failed. % \begin{macrocode} \PackageWarning{tex-locale}{Option `inputenc=auto' failed. (Check shell escape.) Default file encoding unavailable} \else % \end{macrocode} %If the file \cs{LocaleOScodeset}\texttt{.def} exists, then the %codeset should hopefully be valid. % \begin{macrocode} \IfFileExists{\LocaleOScodeset.def}% {% \renewcommand{\@locale@loadinputenc}{% \RequirePackage{inputenc}% \inputencoding{\LocaleOScodeset}% } \let\@locale@inputenc\LocaleOScodeset }% {% % \end{macrocode} %May have a different name. Try known encoding mappings. % \begin{macrocode} \input{tex-locale-encodings.def}% \@locale@ifhasencmap{\LocaleOScodeset} { \edef\@locale@inputenc{\@locale@getencmap\LocaleOScodeset} \renewcommand{\@locale@loadinputenc}{% \RequirePackage{inputenc}% \inputencoding{\@locale@inputenc}% } } {% \PackageWarning{tex-locale}{Option `inputenc=auto' failed. Don't know how to interpret codeset `\LocaleOScodeset'}% }% } \fi } {% \renewcommand{\@locale@loadinputenc}{% \RequirePackage{inputenc}% \inputencoding{\@locale@inputenc}% } } } } % \end{macrocode} % %\begin{macro}{\@locale@loadscripts} %Only load \sty{tracklang-scripts} if required. % \begin{macrocode} \newcommand{\@locale@loadscripts}{% \RequirePackage{tracklang-scripts}% \let\@locale@loadscripts\relax } % \end{macrocode} %\end{macro} % %The \LaTeX\ kernel provides \cs{@thirdofthree} but not %\cs{@secondofthree}. %\begin{macro}{\@secondofthree} % \begin{macrocode} \providecommand*{\@secondofthree}[3]{#2} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@ifsupportbabelorpoly} %\begin{definition} %\cs{@locale@ifsupportbabelorpoly}\marg{neither %case}\marg{babel case}\marg{polyglossia case} %\end{definition} %Should \sty{babel} or \sty{polyglossia} be loaded? Initialise to false. % \begin{macrocode} \newcommand*{\@locale@ifsupportbabelorpoly}[3]{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@ifsupportcjk} %Should \sty{CJK} be loaded? Initialise to false. % \begin{macrocode} \newcommand*{\@locale@ifsupportcjk}[2]{#2} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@ifsupportpinyin} %Should \sty{pinyin} be loaded? Initialise to false. % \begin{macrocode} \newcommand*{\@locale@ifsupportpinyin}[2]{#2} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@cjklist} %List of languages supported by \sty{CJK}. This just makes it easier to test the %language without multiple conditions. % \begin{macrocode} \newcommand*{\@locale@cjklist}{} \listadd{\@locale@cjklist}{chinese} \listadd{\@locale@cjklist}{japanese} \listadd{\@locale@cjklist}{korean} \listadd{\@locale@cjklist}{thai} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@ifcjk} %\begin{definition} %\cs{@locale@ifcjk}\marg{language}\marg{true case}\marg{false case} %\end{definition} %Check if given root language is in the CJK list. % \begin{macrocode} \newcommand*{\@locale@ifcjk}[1]{% \xifinlist{#1}{\@locale@cjklist}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@iflatinscript} %\begin{definition} %\cs{@locale@iflatinscript}\marg{dialect}\marg{true case}\marg{false case} %\end{definition} %Check if given dialect has the script explicitly set to Latn. % \begin{macrocode} \newcommand*{\@locale@iflatinscript}[1]{% \ifcsstring{@tracklang@script@#1}{Latn}% } % \end{macrocode} %\end{macro} % %Should \sty{babel} or \sty{polyglossia} be loaded? % \begin{macrocode} \ifcase\@locale@supportopt % \end{macrocode} % No support required. % \begin{macrocode} \or % \end{macrocode} % \pkgopt{auto} option. % \begin{macrocode} \@locale@trackall \ForEachTrackedDialect{\locale@this@dialect}% {% % \end{macrocode} % Get root language name. % \begin{macrocode} \edef\this@root@lang{\TrackedLanguageFromDialect{\locale@this@dialect}}% % \end{macrocode} % Is this language in the CJK list? % \begin{macrocode} \@locale@ifcjk{\this@root@lang}% { \let\@locale@ifsupportcjk\@firstoftwo % \end{macrocode} % Is pinyin needed? % \begin{macrocode} \@locale@iflatinscript{\locale@this@dialect}% {\let\@locale@ifsupportpinyin\@firstoftwo}% {} } {} % \end{macrocode} % No point checking for \sty{polyglossia} support if not using % \XeLaTeX\ or \LuaLaTeX. % \begin{macrocode} \@locale@ifxeorlua { \@locale@ifsupportbabelorpoly { % \end{macrocode} % Haven't yet determined support for \sty{babel} or \sty{polyglossia}. % Does the file \texttt{gloss-}\meta{language}\texttt{.ldf} exist? % \begin{macrocode} \IfFileExists{gloss-\this@root@lang.ldf} { \let\@locale@ifsupportbabelorpoly\@thirdofthree } { % \end{macrocode} % Does the file \meta{language}\texttt{.ldf} exist? % \begin{macrocode} \IfFileExists{\this@root@lang.ldf} {\let\@locale@ifsupportbabelorpoly\@secondofthree} {} } } % \end{macrocode} % Don't bother checking if already determined that \sty{babel} needs % to be used. % \begin{macrocode} {} { % \end{macrocode} % Already found one language supported by \sty{polyglossia}. Now % check this one. % Does the file \texttt{gloss-}\meta{language}\texttt{.ldf} exist? % \begin{macrocode} \IfFileExists{gloss-\this@root@lang.ldf} {} { % \end{macrocode} % No support for this language with \sty{polyglossia}. % Does the file \meta{language}\texttt{.ldf} exist? % \begin{macrocode} \IfFileExists{\this@root@lang.ldf} {\let\@locale@ifsupportbabelorpoly\@secondofthree} {} } } } { % \end{macrocode} % Not using \XeLaTeX\ or \LuaLaTeX\ so no \sty{polyglossia} support. % Does the file \meta{language}\texttt{.ldf} exist? % \begin{macrocode} \IfFileExists{\this@root@lang.ldf} {\let\@locale@ifsupportbabelorpoly\@secondofthree} {} } } \or % \end{macrocode} % \pkgopt{babel} option. % \begin{macrocode} \let\@locale@ifsupportbabelorpoly\@secondofthree \or % \end{macrocode} % \pkgopt{polyglossia} option. % \begin{macrocode} \let\@locale@ifsupportbabelorpoly\@thirdofthree \or % \end{macrocode} % \pkgopt{cjk} option. % \begin{macrocode} \let\@locale@currentiscjk\@secondoftwo % \end{macrocode} % Is pinyin needed? % \begin{macrocode} \ForEachTrackedDialect{\locale@this@dialect}% {% \edef\this@root@lang{\TrackedLanguageFromDialect{\locale@this@dialect}}% \@locale@ifcjk{\this@root@lang}% { \@locale@iflatinscript{\locale@this@dialect}% {\let\@locale@ifsupportpinyin\@firstoftwo}% {} } {} } % \end{macrocode} %End of case statement % \begin{macrocode} \fi % \end{macrocode} % % Does \sty{CJK} need to be loaded? % \begin{macrocode} \@locale@ifsupportcjk { % \end{macrocode} % Is UTF-8 support needed? % \begin{macrocode} \@locale@ifxeorlua { \RequirePackage{xeCJK}% } { \ifdefstring\@locale@inputenc{utf8}% {% \RequirePackage{CJKutf8}% % \end{macrocode} % \sty{CJKutf8} automatically loads % \sty{inputenc} with the \pkgopt{utf8} option. % \begin{macrocode} \renewcommand{\@locale@loadinputenc}{}% % \end{macrocode} % Need to ensure UTF-8 characters are correctly set up when the % query is made. % \begin{macrocode} \newcommand*{\localeprequery}{\begin{CJK}{UTF8}{}\makeatletter} \newcommand*{\localepostquery}{\end{CJK}} }% {% \RequirePackage{CJK}% % \end{macrocode} % Non-UTF encoding. Not implemented as I'm % not familiar with these encodings. % \begin{macrocode} \PackageWarning{tex-locale}{Unsupported encoding `\@locale@loadinputenc'}% }% } % \end{macrocode} % Load \sty{pinyin} if needed. % \begin{macrocode} \@locale@ifsupportpinyin {\RequirePackage{pinyin}}% {}% } {} % \end{macrocode} % Load \sty{inputenc} if required. % \begin{macrocode} \@locale@loadinputenc % \end{macrocode} % %\begin{macro}{\localenopolypunct} %Just does its argument (scoped) if \sty{polyglossia} hasn't been %loaded. (Made robust if \sty{polyglossia} is loaded.) % \begin{macrocode} \newcommand{\localenopolypunct}[1]{{#1}} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@nopolypunct} %Robust form used with \sty{polyglossia}. % \begin{macrocode} \newrobustcmd{\@locale@nopolypunct}[1]{% {% \@tracklang@ifundef{no\languagename @punctuation}{}% {\csname no\languagename @punctuation\endcsname}% #1% }% } % \end{macrocode} %\end{macro} % % %Load the generic code. % \begin{macrocode} \input{tex-locale} % \end{macrocode} %Load \sty{datetime2} if required: % \begin{macrocode} \@locale@load@dtm % \end{macrocode} % %\begin{macro}{\LocaleSupportPackageCase} %\begin{definition} %\cs{LocaleSupportPackageCase}\marg{babel}\marg{polyglossia}\marg{neither} %\end{definition} %Provide a user-level command to determine whether \sty{babel} or %\sty{polyglossia} was used. This doesn't test if \sty{CJK} was %loaded, which may have additionally been loaded. % \begin{macrocode} \@ifpackageloaded{polyglossia} {\newcommand{\LocaleSupportPackageCase}[3]{#2}} {% \@ifpackageloaded{babel} {\newcommand{\LocaleSupportPackageCase}[3]{#1}}% {\newcommand{\LocaleSupportPackageCase}[3]{#3}}% } % \end{macrocode} %\end{macro} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\iffalse % \begin{macrocode} %<*tex-locale.tex> % \end{macrocode} %\fi %\section{Generic Code (\texttt{tex-locale.tex})} % Does the category code of \verb|@| need changing? %\begin{macro}{\@locale@restore@at} % \begin{macrocode} \ifnum\catcode`\@=11\relax \def\@locale@restore@at{}% \else \expandafter\edef\csname @locale@restore@at\endcsname{% \noexpand\catcode`\noexpand\@=\number\catcode`\@\relax }% \catcode`\@=11\relax \fi % \end{macrocode} %\end{macro} % First check if this file has already been loaded: % \begin{macrocode} \ifx\@locale@parse@query\undefined \else \@locale@restore@at \expandafter\endinput \fi % \end{macrocode} % Version info. % \begin{macrocode} \expandafter\def\csname ver@tex-locale.tex\endcsname{2018/08/26 v1.0 (NLCT) localisation support} % \end{macrocode} % Load \styfmt{tracklang} and \styfmt{texosquery}: % \begin{macrocode} \input tracklang \input texosquery % \end{macrocode} % %\begin{macro}{\@locale@err} % \begin{macrocode} \ifx\PackageError\undefined \def\@locale@err#1#2{% \errhelp{#2}% \errmessage{tex-locale: #1}} \else \def\@locale@err#1#2{\PackageError{tex-locale}{#1}{#2}} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@warn} %Use \sty{tracklang}'s warning to allow all warnings to be switched %off at the same time. % \begin{macrocode} \def\@locale@warn{\@tracklang@pkgwarn{tex-locale}} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@info} %Information message. % \begin{macrocode} \ifx\PackageInfo\undefined \def\@locale@info#1{% {% \newlinechar=`\^^J \def\MessageBreak{^^J}% \message{^^Jtex-locale Info: #1^^J}% }% } \else \def\@locale@info#1{\PackageInfo{tex-locale}{#1}} \fi % \end{macrocode} %\end{macro} % %Check \sty{tracklang} is at least v1.3.4. % \begin{macrocode} \ifx\@tracklang@pkgwarn\undefined \@locale@err{tracklang version is too old. At least v1.3.4 required} {You need to update tracklang to at least v1.3.4}% \fi % \end{macrocode} % %Check \sty{texosquery} is at least v1.4. % \begin{macrocode} \ifx\@texosquery@argquote\undefined \@locale@err{texosquery version is too old. At least v1.4 required} {You need to update texosquery to at least v1.4}% \fi % \end{macrocode} % %\begin{macro}{\LocaleMain} %If \cs{LocaleMain} hasn't been defined, define it. This macro %stores the language tag of the document's main region or %\texttt{locale} to use the OS locale. The default is %\texttt{locale}. This is a user-level command so it can be set before loading %\file{tex-locale.tex}. % \begin{macrocode} \ifx\LocaleMain\undefined \def\LocaleMain{locale} \fi % \end{macrocode} %Sanitize just in case. % \begin{macrocode} \@tracklang@sanitize\LocaleMain % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleOther} %If \cs{LocaleOther} hasn't been defined, define it. This macro %stores a comma-separated list of language tags or %\texttt{locale} for additional regions. The default is empty. This %is a user-level command so it can be set before loading %\file{tex-locale.tex}. % \begin{macrocode} \ifx\LocaleOther\undefined \def\LocaleOther{} \else % \end{macrocode} %Sanitize just in case. % \begin{macrocode} \@tracklang@sanitize\LocaleOther \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@tag} %Command to keep track of the OS locale. This is %initialised as empty but will be set if the \sty{texosquery} call %is successful. % \begin{macrocode} \def\@locale@os@tag{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@default} %The keyword used to indicate the OS locale. % \begin{macrocode} \def\@locale@os@default{locale} % \end{macrocode} %Sanitize since it needs to be compared with \cs{LocaleMain}. % \begin{macrocode} \@tracklang@sanitize\@locale@os@default % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@unknown@currency} %Unknown currency designator. % \begin{macrocode} \def\@locale@unknown@currency{XXX} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@region} %The OS region. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@region{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@groupsep} %The OS numeric group sep. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@groupsep{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@decsep} %The OS numeric group sep. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@decsep{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@cursep} %The OS currency separator. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@cursep{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@exp} %The OS exponent symbol. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@exp{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@usesgroup} %The OS numeric uses group value. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@usesgroup{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@currencycode} %The OS currency code. Initialised as unknown code but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@currencycode{XXX} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@regionalcurrencycode} %The OS regional currency code. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@regionalcurrencycode{XXX} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@currencysym} %The OS currency symbol. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@currencysym{} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@os@currencytex} %The OS currency \TeX\ code. Initialised as empty but will be set if the %\sty{texosquery} call is successful. % \begin{macrocode} \def\@locale@os@currencytex{} % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleMainFile} %The document's main file. (The modification date is queried if not %empty.) If \cs{jobname} includes double-quotes, these need to be %stripped to avoid interfering with the shell-escape (especially in %restricted mode). % \begin{macrocode} \ifx\LocaleMainFile\undefined \edef\LocaleMainFile{\expandafter\texosquerystripquotes{\jobname}.tex} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfDateTimePatternsSupported} %The \texttt{-M} and \texttt{-Z} lookup is optional. This may be %defined before \file{texosquery.tex} is input. % \begin{macrocode} \ifx\LocaleIfDateTimePatternsSupported\undefined \def\LocaleIfDateTimePatternsSupported#1#2{#2} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\localedatetimefmt} %Allow the date/time to be wrapped in a formatting command. % \begin{macrocode} \def\localedatetimefmt#1{#1} % \end{macrocode} %\end{macro} % %\subsection{Setting Command Line Switches} % %\begin{macro}{\LocaleQueryCodesetParam} %\app{texosquery} has two different actions for obtaining the %codeset: \texttt{-{}-codeset-lcs} ("-C") and \texttt{-{}-codeset} %(-cs). The second returns the codeset name as recognised by Java. %The first returns a modified version that's closer %to the \sty{inputenc} setting. This macro defaults to using "-C" %but may be defined before this file is loaded to use "-cs" instead. %(This command isn't used by \file{locale.sty} when determining the %input encoding for \sty{inputenc}.) % \begin{macrocode} \ifx\LocaleQueryCodesetParam\undefined \edef\LocaleQueryCodesetParam{\string-C} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@query@params} %It's more efficient to have a single \sty{texosquery} call, but the %parameters need to be determined first. (Use short arg with %\cs{string} just in case the hyphen character has a special %meaning.) % \begin{macrocode} \edef\@locale@query@params{% % \end{macrocode} %Since we need to use \sty{texosquery} anyway, may as well look up %the OS information at the same time. % \begin{macrocode} \string-o \string-r \string-a % \end{macrocode} % May as well get the PDF date in case we have a TeX format that % doesn't provide \ics{pdfcreationdate}. % \begin{macrocode} \string-n % \end{macrocode} % Default locale data (requires \sty{texosquery} v1.2): % \begin{macrocode} \string-N % \end{macrocode} % May as well get the default codeset (requires \sty{texosquery} % v1.2). Note that \texttt{locale.sty} may have already found this % if the \sty{inputenc} package was automatically loaded. % \begin{macrocode} \LocaleQueryCodesetParam\space } % \end{macrocode} %The remaining arguments need to be appended programatically. % %If the date-time patterns are needed, get the full date-time %information. % \begin{macrocode} \LocaleIfDateTimePatternsSupported {% \edef\@locale@query@params{\@locale@query@params \string-M } } {} % \end{macrocode} % % May as well get the modification date of the document file since % we need to make a system call anyway, but only if % \cs{LocaleMainFile} isn't empty. % \begin{macrocode} \ifx\LocaleMainFile\empty \else \edef\@locale@query@params{\@locale@query@params \string-d \@texosquery@argquote{\LocaleMainFile} } \fi % \end{macrocode} %The \texttt{-D} switch also requires \sty{texosquery} v1.2. %First deal with the main language. % \begin{macrocode} \ifx\LocaleMain\@locale@os@default \LocaleIfDateTimePatternsSupported {% \edef\@locale@query@params{\@locale@query@params \string-D \string-Z } } { \edef\@locale@query@params{\@locale@query@params \string-D } } \else \LocaleIfDateTimePatternsSupported {% \edef\@locale@query@params{\@locale@query@params \string-D \LocaleMain\space\string-Z \LocaleMain\space } } { \edef\@locale@query@params{\@locale@query@params \string-D \LocaleMain\space } } \fi % \end{macrocode} %Iterate through the list of other languages. % \begin{macrocode} \@tracklang@for\@locale@tag:=\LocaleOther\do{% \ifx\@locale@tag\@locale@os@default \LocaleIfDateTimePatternsSupported {% \edef\@locale@query@params{\@locale@query@params \string-D \string-Z } } {% \edef\@locale@query@params{\@locale@query@params \string-D } } \else \LocaleIfDateTimePatternsSupported {% \edef\@locale@query@params{\@locale@query@params \string-D \@locale@tag\space\string-Z \@locale@tag\space } } {% \edef\@locale@query@params{\@locale@query@params \string-D \@locale@tag\space } } \fi } % \end{macrocode} %\end{macro} % %\subsection{System Call} % %\begin{macro}{\localeprequery} %Allow for a hook immediately before the query. % \begin{macrocode} \csname localeprequery\endcsname % \end{macrocode} %\end{macro} % %Now run \sty{texosquery} unless \cs{LocaleQueryFile} has been %defined, in which case use \cs{TeXOSQueryFromFile} % \begin{macrocode} \ifx\LocaleQueryFile\undefined % \end{macrocode} % No file provided. % \begin{macrocode} \TeXOSQuery{\@locale@result}{\@locale@query@params} \else \ifx\LocaleQueryFile\empty \TeXOSQuery{\@locale@result}{\@locale@query@params} \else % \end{macrocode} %\cs{TeXOSQueryFromFile} was added to \sty{texosquery} v1.4, so %check it's available. % \begin{macrocode} \ifx\TeXOSQueryFromFile\undefined \@locale@err{texosquery too old to support \string\LocaleQueryFile. At least v1.4 required} {You need to update your version of texosquery} \def\@locale@result{} \else \@locale@info{Fetching query results from `\LocaleQueryFile'}% \TeXOSQueryFromFile{\@locale@result}{\LocaleQueryFile} \fi \fi \fi % \end{macrocode} %Make the result global in case the pre and post query hooks have %introduced a local scope. % \begin{macrocode} \global\let\@locale@result\@locale@result % \end{macrocode} % %\begin{macro}{\localepostquery} %Allow for a hook immediately after the query. % \begin{macrocode} \csname localepostquery\endcsname % \end{macrocode} %\end{macro} % %If the result is empty then the query failed (\sty{texosquery} not %installed correctly or JRE not installed or shell escape not %permitted or dry run mode on). The result now needs to be parsed, %but first define some convenient commands that can be used by the %parser. % %\subsection{Attributes}\label{sec:code.attributes} %\begin{macro}{\LocaleSetAttribute} %\begin{definition} %\cs{LocaleSetAttribute}\marg{label}\marg{attribute %label}\marg{attribute value} %\end{definition} %Provide convenient way of defining attributes. The label depends on %the attribute type. For example, it could be the dialect label or %the region code. % \begin{macrocode} \def\LocaleSetAttribute#1#2#3{% \expandafter\def\csname locale@#2@#1\endcsname{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAppToAttribute} %\begin{definition} %\cs{LocaleAppToAttribute}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Append \meta{value} to this attribute value. % \begin{macrocode} \def\LocaleAppToAttribute#1#2#3{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\expandafter\expandafter\def \expandafter\expandafter\csname locale@#2@#1\expandafter\endcsname \expandafter\expandafter\expandafter{\csname locale@#2@#1\endcsname#3}% }% {\expandafter\def\csname locale@#2@#1\endcsname{#3}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAppToAttribute} %\begin{definition} %\cs{LocaleXpAppToAttribute}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %As above but expand first token of \meta{value}. % \begin{macrocode} \def\LocaleXpAppToAttribute#1#2#3{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\expandafter\expandafter\def \expandafter\expandafter\csname locale@#2@#1\expandafter\endcsname \expandafter\expandafter\expandafter{% \csname locale@#2@#1\expandafter\endcsname#3}% }% {% \expandafter\def\csname locale@#2@#1\expandafter\endcsname\expandafter{#3}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAddToAttributeList} %\begin{definition} %\cs{LocaleAddToAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleAddToAttributeList#1#2#3{% \LocaleIfHasAttribute{#1}{#2}% {% \LocaleIfInAttributeList{#1}{#2}{#3}% {}% {\LocaleAppToAttribute{#1}{#2}{,#3}}% }% {\LocaleSetAttribute{#1}{#2}{#3}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAddToAttributeList} %\begin{definition} %\cs{LocaleXpAddToAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleXpAddToAttributeList#1#2#3{% \LocaleIfHasAttribute{#1}{#2}% {% \LocaleIfXpInAttributeList{#1}{#2}{#3}% {}% {\LocaleXpAppToAttribute{#1}{#2}{\expandafter,#3}}% }% {\expandafter\def\csname locale@#2@#1\expandafter\endcsname\expandafter{#3}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localeshowattribute} %Debugging command. % \begin{macrocode} \def\localeshowattribute#1#2{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\show\csname locale@#2@#1\endcsname }% {\@locale@err{Attribute `#2' not defined for `#1'}% {\string\localeshowattribute\space was asked to show this attribute for the given attribute type, but the associated command hasn't been defined}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleProvideAttribute} %\begin{definition} %\cs{LocaleProvideAttribute}\marg{label}\marg{attribute %label}\marg{attribute value} %\end{definition} %Only set the attribute if it hasn't already been set for this label. % \begin{macrocode} \def\LocaleProvideAttribute#1#2#3{% \LocaleIfHasAttribute{#1}{#2}% {}% {\LocaleSetAttribute{#1}{#2}{#3}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLetAttribute} %\begin{definition} %\cs{LocaleLetAttribute}\marg{label}\marg{attribute %label}\marg{cs} %\end{definition} %Set the attribute value to the definition of the control sequence \meta{cs}. % \begin{macrocode} \def\LocaleLetAttribute#1#2#3{% \expandafter\let\csname locale@#2@#1\endcsname#3% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetAttributeOrDefValue} %\begin{definition} %\cs{LocaleGetAttributeOrDefValue}\marg{label}\marg{attribute label}\marg{def %value} %\end{definition} %Gets the attribute or the default value if unset. % \begin{macrocode} \def\LocaleGetAttributeOrDefValue#1#2#3{% \@tracklang@ifundef{locale@#2@#1}% {#3\@locale@undef@action{#1}{#2}}% {\csname locale@#2@#1\endcsname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetAttribute} %\begin{definition} %\cs{LocaleGetAttribute}\marg{label}\marg{attribute label} %\end{definition} % \begin{macrocode} \def\LocaleGetAttribute#1#2{% \LocaleGetAttributeOrDefValue{#1}{#2}{}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@undef@action} %Action if an undefined attribute is referenced. %Does nothing by default but may be redefined for debugging %purposes. % \begin{macrocode} \def\@locale@undef@action#1#2{} % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasAttribute} %\begin{definition} %\cs{LocaleIfHasAttribute}\marg{label}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} %Tests if the given attribute has been assigned. % \begin{macrocode} \def\LocaleIfHasAttribute#1#2#3#4{% \@tracklang@ifundef{locale@#2@#1}% {#4}% {#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleForEachInAttributeList} %\begin{definition} %\cs{LocaleForEachInAttributeList}\marg{label}\marg{attribute %label}\marg{cs}\marg{body} %\end{definition} %Where an attribute value is a comma-separated list, this iterates %over each item in that list, setting \meta{cs} to that item and %performing \meta{body}. % \begin{macrocode} \def\LocaleForEachInAttributeList#1#2#3#4{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\@tracklang@for\expandafter#3\expandafter:\expandafter =\csname locale@#2@#1\endcsname\do{#4}% }% {}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfInAttributeList} %\begin{definition} %\cs{LocaleIfInAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %Where an attribute value is a comma-separated list, this tests if %\meta{item} is in that list. % \begin{macrocode} \def\LocaleIfInAttributeList#1#2#3#4#5{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\let\expandafter\@locale@attrlist\csname locale@#2@#1\endcsname \@tracklang@ifinlist{#3}{\@locale@attrlist}{#4}{#5}% }% {#5}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfXpInAttributeList} %\begin{definition} %\cs{LocaleIfXpInAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %As above but expands the first token of \meta{item}. % \begin{macrocode} \def\LocaleIfXpInAttributeList#1#2#3#4#5{% \LocaleIfHasAttribute{#1}{#2}% {% \expandafter\let\expandafter\@locale@attrlist\csname locale@#2@#1\endcsname \expandafter\@tracklang@ifinlist\expandafter{#3}{\@locale@attrlist}{#4}{#5}% }% {#5}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasNonEmptyAttribute} %\begin{definition} %\cs{LocaleIfHasNonEmptyAttribute}\marg{label}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} %Tests if the given attribute has been assigned a non-empty value. % \begin{macrocode} \def\LocaleIfHasNonEmptyAttribute#1#2#3#4{% \@tracklang@ifundef{locale@#2@#1}% {#4}% {% \expandafter\ifx\csname locale@#2@#1\endcsname\empty #4% \else #3% \fi }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfAttributeEqCs} %\begin{definition} %\cs{LocaleIfAttributeEqCs}\marg{label}\marg{attribute %label}\marg{cs}\marg{true}\marg{false} %\end{definition} %If the attribute value is the same as the definition of the control %sequence \meta{cs} to \meta{true} otherwise do false. % \begin{macrocode} \def\LocaleIfAttributeEqCs#1#2#3#4#5{% \expandafter\ifx\csname locale@#2@#1\endcsname#3% #4% \else #5% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfAttributeEqCsName} %\begin{definition} %\cs{LocaleIfAttributeEqCsName}\marg{label}\marg{attribute %label}\marg{cs name}\marg{true}\marg{false} %\end{definition} %If the attribute value is the same as the definition of the control %sequence name \meta{cs name} to \meta{true} otherwise do false. % \begin{macrocode} \def\LocaleIfAttributeEqCsName#1#2#3#4#5{% \expandafter\ifx \csname locale@#2@#1\expandafter\endcsname \csname #3\endcsname #4% \else #5% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfAttributeEqNum} %\begin{definition} %\cs{LocaleIfAttributeEqNum}\marg{label}\marg{attribute %label}\marg{n}\marg{true}\marg{false} %\end{definition} %If the numeric attribute value is equal to \meta{n} do \meta{true} %otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfAttributeEqNum#1#2#3#4#5{% \LocaleIfHasNonEmptyAttribute{#1}{#2}% {% \expandafter\ifnum\csname locale@#2@#1\endcsname=#3 #4% \else #5% \fi }% {#5}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfSameAttributeValues} %\begin{definition} %\cs{LocaleIfSameAttributeValues}\marg{label}\marg{attribute %1}\marg{attribute 2}\marg{true}\marg{false} %\end{definition} %Tests if two different attributes for the same \meta{label} have %matching values. % \begin{macrocode} \def\LocaleIfSameAttributeValues#1#2#3#4#5{% \expandafter\ifx \csname locale@#2@#1\expandafter\endcsname \csname locale@#3@#1\endcsname #4% \else #5% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\localeshowdialectattribute} %Debugging command. % \begin{macrocode} \def\localeshowdialectattribute#1#2{% \localeshowattribute{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleSetDialectAttribute} %\begin{definition} %\cs{LocaleSetDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{attribute value} %\end{definition} %Sets dialect attribute. % \begin{macrocode} \def\LocaleSetDialectAttribute#1#2#3{% \LocaleSetAttribute{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleProvideDialectAttribute} %\begin{definition} %\cs{LocaleProvideDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{attribute value} %\end{definition} %Provides dialect attribute. % \begin{macrocode} \def\LocaleProvideDialectAttribute#1#2#3{% \LocaleProvideAttribute{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLetDialectAttribute} %\begin{definition} %\cs{LocaleLetDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{cs} %\end{definition} %Set the dialect attribute value to the definition of the control sequence \meta{cs}. % \begin{macrocode} \def\LocaleLetDialectAttribute#1#2#3{% \LocaleLetAttribute{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAppToDialectAttribute} %\begin{definition} %\cs{LocaleAppToDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{attribute value} %\end{definition} %Append to dialect attribute value. % \begin{macrocode} \def\LocaleAppToDialectAttribute#1#2#3{% \LocaleAppToAttribute{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAppToDialectAttribute} %\begin{definition} %\cs{LocaleXpAppToDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{value} %\end{definition} %Append to dialect attribute value (expand first token of %\meta{value}). % \begin{macrocode} \def\LocaleXpAppToDialectAttribute#1#2#3{% \LocaleXpAppToAttribute{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAddToDialectAttributeList} %\begin{definition} %\cs{LocaleAddToDialectAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleAddToDialectAttributeList#1#2{% \LocaleAddToAttributeList{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAddToDialectAttributeList} %\begin{definition} %\cs{LocaleXpAddToDialectAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleXpAddToDialectAttributeList#1#2{% \LocaleXpAddToAttributeList{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetDialectAttribute} %\begin{definition} %\cs{LocaleGetDialectAttribute}\marg{dialect label}\marg{attribute %label} %\end{definition} %Gets dialect attribute. % \begin{macrocode} \def\LocaleGetDialectAttribute#1#2{% \LocaleGetAttribute{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetDialectAttributeOrDefValue} %\begin{definition} %\cs{LocaleGetDialectAttributeOrDefValue}\marg{dialect label}\marg{attribute %label}\marg{def value} %\end{definition} %Gets attribute for given dialect or \meta{def value} if unset. % \begin{macrocode} \def\LocaleGetDialectAttributeOrDefValue#1#2{% \LocaleGetAttributeOrDefValue{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasDialectAttribute} %\begin{definition} %\cs{LocaleIfHasDialectAttribute}\marg{dialect label}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasDialectAttribute#1#2{% \LocaleIfHasAttribute{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleForEachInDialectAttributeList} %\begin{definition} %\cs{LocaleForEachInDialectAttributeList}\marg{label}\marg{attribute %label}\marg{cs}\marg{body} %\end{definition} %Where an attribute value is a comma-separated list, this iterates %over each item in that list, setting \meta{cs} to that item and %performing \meta{body}. % \begin{macrocode} \def\LocaleForEachInDialectAttributeList#1#2{% \LocaleForEachInAttributeList{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfInDialectAttributeList} %\begin{definition} %\cs{LocaleIfInDialectAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %Where an attribute value is a comma-separated list, this tests if %\meta{item} is in that list. % \begin{macrocode} \def\LocaleIfInDialectAttributeList#1#2{% \LocaleIfInAttributeList{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfXpInDialectAttributeList} %\begin{definition} %\cs{LocaleIfXpInDialectAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %As above but expands the first token of \meta{item}. % \begin{macrocode} \def\LocaleIfXpInDialectAttributeList#1#2{% \LocaleIfXpInAttributeList{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasDialectNonEmptyAttribute} %\begin{definition} %\cs{LocaleIfHasDialectNonEmptyAttribute}\marg{dialect label}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasDialectNonEmptyAttribute#1#2{% \LocaleIfHasNonEmptyAttribute{#1}{dialect@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfDialectAttributeEqCs} %\begin{definition} %\cs{LocaleIfDialectAttributeEqCs}\marg{dialect label}\marg{attribute %label}\marg{cs}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given dialect is the same as the definition of the control %sequence \meta{cs} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfDialectAttributeEqCs#1#2#3{% \LocaleIfAttributeEqCs{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfDialectAttributeEqCsName} %\begin{definition} %\cs{LocaleIfDialectAttributeEqCsName}\marg{dialect label}\marg{attribute %label}\marg{cs name}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given dialect is the same as the definition of the control %sequence name \meta{cs name} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfDialectAttributeEqCsName#1#2#3{% \LocaleIfAttributeEqCsName{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfDialectAttributeEqNum} %\begin{definition} %\cs{LocaleIfDialectAttributeEqNum}\marg{dialect label}\marg{attribute %label}\marg{n}\marg{true}\marg{false} %\end{definition} %If the numeric attribute value for the given dialect is equal to %the number \meta{n} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfDialectAttributeEqNum#1#2#3{% \LocaleIfAttributeEqNum{#1}{dialect@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfSameDialectAttributeValues} %\begin{definition} %\cs{LocaleIfSameDialectAttributeValues}\marg{dialect label}\marg{attribute %1}\marg{attribute 2}\marg{true}\marg{false} %\end{definition} %Tests if two different dialect attributes for the same %\meta{dialect label} have %matching values. % \begin{macrocode} \def\LocaleIfSameDialectAttributeValues#1#2#3{% \LocaleIfSameAttributeValues{#1}{dialect@#2}{dialect@#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localeshowregionattribute} %Debugging command. % \begin{macrocode} \def\localeshowregionattribute#1#2{% \localeshowattribute{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleSetRegionAttribute} %\begin{definition} %\cs{LocaleSetRegionAttribute}\marg{region code}\marg{attribute %label}\marg{attribute value} %\end{definition} %Sets region attribute. % \begin{macrocode} \def\LocaleSetRegionAttribute#1#2#3{% \LocaleSetAttribute{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleProvideRegionAttribute} %\begin{definition} %\cs{LocaleProvideRegionAttribute}\marg{region code}\marg{attribute %label}\marg{attribute value} %\end{definition} %Provides region attribute. % \begin{macrocode} \def\LocaleProvideRegionAttribute#1#2#3{% \LocaleProvideAttribute{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLetRegionAttribute} %\begin{definition} %\cs{LocaleLetRegionAttribute}\marg{region code}\marg{attribute %label}\marg{cs} %\end{definition} %Set the region attribute value to the definition of the control sequence \meta{cs}. % \begin{macrocode} \def\LocaleLetRegionAttribute#1#2#3{% \LocaleLetAttribute{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAppToRegionAttribute} %\begin{definition} %\cs{LocaleAppToRegionAttribute}\marg{region code}\marg{attribute %label}\marg{value} %\end{definition} %Append to region attribute. % \begin{macrocode} \def\LocaleAppToRegionAttribute#1#2#3{% \LocaleAppToAttribute{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAppToRegionAttribute} %\begin{definition} %\cs{LocaleXpAppToRegionAttribute}\marg{region code}\marg{attribute %label}\marg{value} %\end{definition} %Append to region attribute (expand first token of %\meta{value}). % \begin{macrocode} \def\LocaleXpAppToRegionAttribute#1#2#3{% \LocaleXpAppToAttribute{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAddToRegionAttributeList} %\begin{definition} %\cs{LocaleAddToRegionAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleAddToRegionAttributeList#1#2{% \LocaleAddToAttributeList{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAddToRegionAttributeList} %\begin{definition} %\cs{LocaleXpAddToRegionAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleXpAddToRegionAttributeList#1#2{% \LocaleXpAddToAttributeList{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetRegionAttribute} %\begin{definition} %\cs{LocaleGetRegionAttribute}\marg{region code}\marg{attribute %label} %\end{definition} %Gets region attribute. % \begin{macrocode} \def\LocaleGetRegionAttribute#1#2{% \LocaleGetAttribute{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetRegionAttributeOrDefValue} %\begin{definition} %\cs{LocaleGetRegionAttributeOrDefValue}\marg{region code}\marg{attribute %label}\marg{def value} %\end{definition} %Gets attribute for given region or \meta{def value} if unset. % \begin{macrocode} \def\LocaleGetRegionAttributeOrDefValue#1#2{% \LocaleGetAttributeOrDefValue{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasRegionAttribute} %\begin{definition} %\cs{LocaleIfHasRegionAttribute}\marg{region code}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasRegionAttribute#1#2{% \LocaleIfHasAttribute{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleForEachInRegionAttributeList} %\begin{definition} %\cs{LocaleForEachInRegionAttributeList}\marg{label}\marg{attribute %label}\marg{cs}\marg{body} %\end{definition} %Where an attribute value is a comma-separated list, this iterates %over each item in that list, setting \meta{cs} to that item and %performing \meta{body}. % \begin{macrocode} \def\LocaleForEachInRegionAttributeList#1#2{% \LocaleForEachInAttributeList{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfInRegionAttributeList} %\begin{definition} %\cs{LocaleIfInRegionAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %Where an attribute value is a comma-separated list, this tests if %\meta{item} is in that list. % \begin{macrocode} \def\LocaleIfInRegionAttributeList#1#2{% \LocaleIfInAttributeList{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfXpInRegionAttributeList} %\begin{definition} %\cs{LocaleIfXpInRegionAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %As above but expands the first token of \meta{item}. % \begin{macrocode} \def\LocaleIfXpInRegionAttributeList#1#2{% \LocaleIfXpInAttributeList{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasRegionNonEmptyAttribute} %\begin{definition} %\cs{LocaleIfHasRegionNonEmptyAttribute}\marg{region code}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasRegionNonEmptyAttribute#1#2{% \LocaleIfHasNonEmptyAttribute{#1}{region@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfRegionAttributeEqCs} %\begin{definition} %\cs{LocaleIfRegionAttributeEqCs}\marg{region code}\marg{attribute %label}\marg{cs}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given region is the same as the definition of the control %sequence \meta{cs} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfRegionAttributeEqCs#1#2#3{% \LocaleIfAttributeEqCs{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfRegionAttributeEqCsName} %\begin{definition} %\cs{LocaleIfRegionAttributeEqCsName}\marg{region code}\marg{attribute %label}\marg{cs name}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given region is the same as the definition of the control %sequence name \meta{cs name} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfRegionAttributeEqCsName#1#2#3{% \LocaleIfAttributeEqCsName{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfRegionAttributeEqNum} %\begin{definition} %\cs{LocaleIfRegionAttributeEqNum}\marg{region label}\marg{attribute %label}\marg{n}\marg{true}\marg{false} %\end{definition} %If the numeric attribute value for the given region is equal to %the number \meta{n} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfRegionAttributeEqNum#1#2#3{% \LocaleIfAttributeEqNum{#1}{region@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfSameRegionAttributeValues} %\begin{definition} %\cs{LocaleIfSameRegionAttributeValues}\marg{region code}\marg{attribute %1}\marg{attribute 2}\marg{true}\marg{false} %\end{definition} %Tests if two different region attributes for the same %\meta{region code} have matching values. % \begin{macrocode} \def\LocaleIfSameRegionAttributeValues#1#2#3{% \LocaleIfSameAttributeValues{#1}{region@#2}{region@#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localeshowcurrencyattribute} %Debugging command. % \begin{macrocode} \def\localeshowcurrencyattribute#1#2{% \localeshowattribute{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleSetCurrencyAttribute} %\begin{definition} %\cs{LocaleSetCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{attribute value} %\end{definition} %Sets currency attribute. % \begin{macrocode} \def\LocaleSetCurrencyAttribute#1#2#3{% \LocaleSetAttribute{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleProvideCurrencyAttribute} %\begin{definition} %\cs{LocaleProvideCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{attribute value} %\end{definition} %Provides currency attribute. % \begin{macrocode} \def\LocaleProvideCurrencyAttribute#1#2#3{% \LocaleProvideAttribute{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLetCurrencyAttribute} %\begin{definition} %\cs{LocaleLetCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{cs} %\end{definition} %Set the currency attribute value to the definition of the control sequence \meta{cs}. % \begin{macrocode} \def\LocaleLetCurrencyAttribute#1#2#3{% \LocaleLetAttribute{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAppToCurrencyAttribute} %\begin{definition} %\cs{LocaleAppToCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{value} %\end{definition} %Append to currency attribute value. % \begin{macrocode} \def\LocaleAppToCurrencyAttribute#1#2#3{% \LocaleAppToAttribute{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAppToCurrencyAttribute} %\begin{definition} %\cs{LocaleXpAppToCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{value} %\end{definition} %Append to currency attribute value (expand first token of %\meta{value}). % \begin{macrocode} \def\LocaleXpAppToCurrencyAttribute#1#2#3{% \LocaleXpAppToAttribute{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleAddToCurrencyAttributeList} %\begin{definition} %\cs{LocaleAddToCurrencyAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleAddToCurrencyAttributeList#1#2{% \LocaleAddToAttributeList{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleXpAddToCurrencyAttributeList} %\begin{definition} %\cs{LocaleXpAddToCurrencyAttributeList}\marg{label}\marg{attribute %label}\marg{value} %\end{definition} %Adds \meta{value} to this attribute's list (without repetition). % \begin{macrocode} \def\LocaleXpAddToCurrencyAttributeList#1#2{% \LocaleXpAddToAttributeList{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetCurrencyAttribute} %\begin{definition} %\cs{LocaleGetCurrencyAttribute}\marg{currency code}\marg{attribute %label} %\end{definition} %Gets currency attribute. % \begin{macrocode} \def\LocaleGetCurrencyAttribute#1#2{% \LocaleGetAttribute{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleGetCurrencyAttributeOrDefValue} %\begin{definition} %\cs{LocaleGetCurrencyAttributeOrDefValue}\marg{currency code}\marg{attribute %label}\marg{def value} %\end{definition} %Gets attribute for given currency or \meta{def value} if unset. % \begin{macrocode} \def\LocaleGetCurrencyAttributeOrDefValue#1#2{% \LocaleGetAttributeOrDefValue{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasCurrencyAttribute} %\begin{definition} %\cs{LocaleIfHasCurrencyAttribute}\marg{currency code}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasCurrencyAttribute#1#2{% \LocaleIfHasAttribute{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleForEachInCurrencyAttributeList} %\begin{definition} %\cs{LocaleForEachInCurrencyAttributeList}\marg{label}\marg{attribute %label}\marg{cs}\marg{body} %\end{definition} %Where an attribute value is a comma-separated list, this iterates %over each item in that list, setting \meta{cs} to that item and %performing \meta{body}. % \begin{macrocode} \def\LocaleForEachInCurrencyAttributeList#1#2{% \LocaleForEachInAttributeList{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfInCurrencyAttributeList} %\begin{definition} %\cs{LocaleIfInCurrencyAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %Where an attribute value is a comma-separated list, this tests if %\meta{item} is in that list. % \begin{macrocode} \def\LocaleIfInCurrencyAttributeList#1#2{% \LocaleIfInAttributeList{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfXpInCurrencyAttributeList} %\begin{definition} %\cs{LocaleIfXpInCurrencyAttributeList}\marg{label}\marg{attribute %label}\marg{item}\marg{true}\marg{false} %\end{definition} %As above but expands the first token of \meta{item}. % \begin{macrocode} \def\LocaleIfXpInCurrencyAttributeList#1#2{% \LocaleIfXpInAttributeList{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasCurrencyNonEmptyAttribute} %\begin{definition} %\cs{LocaleIfHasCurrencyNonEmptyAttribute}\marg{currency code}\marg{attribute %label}\marg{true}\marg{false} %\end{definition} % \begin{macrocode} \def\LocaleIfHasCurrencyNonEmptyAttribute#1#2{% \LocaleIfHasNonEmptyAttribute{#1}{currency@#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfCurrencyAttributeEqCs} %\begin{definition} %\cs{LocaleIfCurrencyAttributeEqCs}\marg{currency code}\marg{attribute %label}\marg{cs}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given currency is the same as the definition of the control %sequence \meta{cs} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfCurrencyAttributeEqCs#1#2#3{% \LocaleIfAttributeEqCs{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfCurrencyAttributeEqCsName} %\begin{definition} %\cs{LocaleIfCurrencyAttributeEqCsName}\marg{currency code}\marg{attribute %label}\marg{cs name}\marg{true}\marg{false} %\end{definition} %If the attribute value for the given currency is the same as the definition of the control %sequence name \meta{cs name} do \meta{true} otherwise do %\meta{false}. % \begin{macrocode} \def\LocaleIfCurrencyAttributeEqCsName#1#2#3{% \LocaleIfAttributeEqCsName{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfCurrencyAttributeEqNum} %\begin{definition} %\cs{LocaleIfCurrencyAttributeEqNum}\marg{currency label}\marg{attribute %label}\marg{n}\marg{true}\marg{false} %\end{definition} %If the numeric attribute value for the given currency is equal to %the number \meta{n} do \meta{true} otherwise do \meta{false}. % \begin{macrocode} \def\LocaleIfCurrencyAttributeEqNum#1#2#3{% \LocaleIfAttributeEqNum{#1}{currency@#2}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfSameCurrencyAttributeValues} %\begin{definition} %\cs{LocaleIfSameCurrencyAttributeValues}\marg{currency code}\marg{attribute %1}\marg{attribute 2}\marg{true}\marg{false} %\end{definition} %Tests if two different currency attributes for the same %\meta{currency code} have matching values. % \begin{macrocode} \def\LocaleIfSameCurrencyAttributeValues#1#2#3{% \LocaleIfSameAttributeValues{#1}{currency@#2}{currency@#3}% } % \end{macrocode} %\end{macro} % %\subsection{Parser Commands} % %Define commands that are needed to parse the result. %\begin{macro}{\@locale@parse@result} %Start parsing the result. There are more than nine arguments, so do %this in bits. The first six arguments are: OS name, OS version, OS %architecture, PDF date-time, BCP 47 tag for default locale, %the default file encoding. % \begin{macrocode} \def\@locale@parse@result#1#2#3#4#5#6{% \def\LocaleOSname{#1}% \def\LocaleOSversion{#2}% \def\LocaleOSarch{#3}% \def\LocaleNowStamp{#4}% \@locale@parse@default#5% remove outer group \def\LocaleOScodeset{#6}% % \end{macrocode} % Is date-time pattern support required? % \begin{macrocode} \LocaleIfDateTimePatternsSupported {% \let\@locale@next\@locale@parse@datetimeinfo }% {% \def\LocaleDateTimeInfo{}% % \end{macrocode} % Was a file modification date included? % \begin{macrocode} \ifx\LocaleMainFile\empty \def\LocaleFileMod{}% \let\@locale@next\@locale@parse@maindata \else \let\@locale@next\@locale@parse@filemod \fi }% \@locale@next } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datetimeinfo} % \begin{macrocode} \def\@locale@parse@datetimeinfo#1{% \def\LocaleDateTimeInfo{#1}% % \end{macrocode} % Was a file modification date included? % \begin{macrocode} \ifx\LocaleMainFile\empty \def\LocaleFileMod{}% \let\@locale@next\@locale@parse@maindata \else \let\@locale@next\@locale@parse@filemod \fi \@locale@next } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@default} %Parse the result of \texttt{-N} % \begin{macrocode} \def\@locale@parse@default#1#2#3#4#5#6#7#8#9{% \def\LocaleOStag{#1}% % \end{macrocode} %Parse (but don't track) tag. % \begin{macrocode} \@tracklang@parselangtag{#1}% % \end{macrocode} %Can now get the region code. % \begin{macrocode} \let\@locale@os@region\@TrackLangEnvTerritory \def\@locale@os@groupsep{#2}% \def\@locale@os@decsep{#3}% \def\@locale@os@exp{#4}% \def\@locale@os@usesgroup{#5}% \def\@locale@os@currencycode{#6}% \def\@locale@os@regionalcurrencycode{#7}% \def\@locale@os@currencysym{#8}% \def\@locale@os@currencytex{#9}% % \end{macrocode} %Provide currency attributes. % \begin{macrocode} \LocaleSetRegionAttribute{\@locale@os@region}{currency}{#7}% \LocaleProvideCurrencyAttribute{#7}{official}{#6}% \LocaleProvideCurrencyAttribute{#7}{sym}{#8}% \LocaleProvideCurrencyAttribute{#7}{tex}{#9}% \@locale@parse@default@cursep } % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@parse@default@cursep} % \begin{macrocode} \def\@locale@parse@default@cursep#1{% \def\@locale@os@cursep{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@filemod} % \begin{macrocode} \def\@locale@parse@filemod#1{% \def\LocaleFileMod{#1}% \@locale@parse@maindata } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@maindata} % \begin{macrocode} \def\@locale@parse@maindata#1{% \@locale@parse@maindatablock#1% remove outer group } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@maindatablock} % \begin{macrocode} \def\@locale@parse@maindatablock#1{% \@locale@parse@maindatalocaleblock#1% remove outer group \@locale@parse@dateblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@maindatalocaleblock} % \begin{macrocode} \def\@locale@parse@maindatalocaleblock#1#2#3#4#5#6#7{% \def\LocaleMain{#1}% \TrackLanguageTag{#1}% \let\LocaleMainDialect\TrackLangLastTrackedDialect \let\@locale@dialect\TrackLangLastTrackedDialect % \end{macrocode} %Get the region code if provided. % \begin{macrocode} \IfTrackedLanguageHasIsoCode{3166-1}{\@locale@dialect}% {% \edef\@locale@region{% \TrackedIsoCodeFromLanguage{3166-1}{\@locale@dialect}}% }% {\def\@locale@region{}}% \let\LocaleMainRegion\@locale@region \ifx\LocaleMainRegion\empty \else \LocaleLetRegionAttribute{\LocaleMainRegion}{dialect}{\@locale@dialect}% \fi % \end{macrocode} %Save language tag. (Provides a convenient mapping from dialect %label to tag.) % \begin{macrocode} \LocaleSetDialectAttribute{\@locale@dialect}{langtag}{#1}% % \end{macrocode} %Provide reverse mapping from tag to dialect label. % \begin{macrocode} \LocaleLetAttribute{#1}{tagtodialect}{\@locale@dialect}% % \end{macrocode} %Save display names. % \begin{macrocode} \LocaleSetDialectAttribute{\@locale@dialect}{langname}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{nativelangname}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{regionname}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{nativeregionname}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{variantname}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{nativevariantname}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@otherdatalocaleblock} % \begin{macrocode} \def\@locale@parse@otherdatalocaleblock#1#2#3#4#5#6#7{% \TrackLanguageTag{#1}% \let\@locale@dialect\TrackLangLastTrackedDialect % \end{macrocode} %Get the region code if provided. % \begin{macrocode} \IfTrackedLanguageHasIsoCode{3166-1}{\@locale@dialect}% {% \edef\@locale@region{% \TrackedIsoCodeFromLanguage{3166-1}{\@locale@dialect}}% \ifx\@locale@region\empty \else \LocaleXpAddToRegionAttributeList {\@locale@region}{dialect}{\@locale@dialect}% \fi }% {\def\@locale@region{}}% % \end{macrocode} %Save language tag. % \begin{macrocode} \LocaleSetDialectAttribute{\@locale@dialect}{langtag}{#1}% % \end{macrocode} %Provide reverse mapping from tag to dialect label. % \begin{macrocode} \LocaleLetAttribute{#1}{tagtodialect}{\@locale@dialect}% % \end{macrocode} %Save attributes. % \begin{macrocode} \LocaleSetDialectAttribute{\@locale@dialect}{langname}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{nativelangname}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{regionname}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{nativeregionname}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{variantname}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{nativevariantname}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@dateblock} % \begin{macrocode} \def\@locale@parse@dateblock#1{% \@locale@parse@dates#1% remove outer group \@locale@parse@datefmtblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@dates} % \begin{macrocode} \def\@locale@parse@dates#1#2#3#4#5{% \LocaleSetDialectAttribute{\@locale@dialect}{fulldate}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longdate}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{meddate}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortdate}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{firstday}{#5}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datefmtblock} % \begin{macrocode} \def\@locale@parse@datefmtblock#1{% \@locale@parse@datefmts#1% remove outer group \@locale@parse@timeblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datefmts} % \begin{macrocode} \def\@locale@parse@datefmts#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{fulldatefmt}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longdatefmt}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{meddatefmt}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortdatefmt}{#4}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@timeblock} % \begin{macrocode} \def\@locale@parse@timeblock#1{% \@locale@parse@times#1% remove outer group \@locale@parse@timefmtblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@times} % \begin{macrocode} \def\@locale@parse@times#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{fulltime}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longtime}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{medtime}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shorttime}{#4}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@timefmtblock} % \begin{macrocode} \def\@locale@parse@timefmtblock#1{% \@locale@parse@timefmts#1% remove outer group \@locale@parse@datetimeblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@timefmts} % \begin{macrocode} \def\@locale@parse@timefmts#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{fulltimefmt}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longtimefmt}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{medtimefmt}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shorttimefmt}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datetimeblock} % \begin{macrocode} \def\@locale@parse@datetimeblock#1{% \@locale@parse@datetimes#1% remove outer group \@locale@parse@datetimefmtblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datetimes} % \begin{macrocode} \def\@locale@parse@datetimes#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{fulldatetime}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longdatetime}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{meddatetime}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortdatetime}{#4}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datetimefmtblock} % \begin{macrocode} \def\@locale@parse@datetimefmtblock#1{% \@locale@parse@datetimefmts#1% remove outer group \@locale@parse@weekdayblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@datetimefmts} % \begin{macrocode} \def\@locale@parse@datetimefmts#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{fulldatetimefmt}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{longdatetimefmt}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{meddatetimefmt}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortdatetimefmt}{#4}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@weekdayblock} % \begin{macrocode} \def\@locale@parse@weekdayblock#1{% \@locale@parse@weekdays#1% remove outer group \@locale@parse@shortweekdayblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@weekdays} % \begin{macrocode} \def\@locale@parse@weekdays#1#2#3#4#5#6#7{% \LocaleSetDialectAttribute{\@locale@dialect}{day.0}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{day.1}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{day.2}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{day.3}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{day.4}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{day.5}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{day.6}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@shortweekdayblock} % \begin{macrocode} \def\@locale@parse@shortweekdayblock#1{% \@locale@parse@shortweekdays#1% remove outer group \@locale@parse@monthblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@shortweekdays} % \begin{macrocode} \def\@locale@parse@shortweekdays#1#2#3#4#5#6#7{% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.0}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.1}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.2}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.3}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.4}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.5}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{shortday.6}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@monthblock} % \begin{macrocode} \def\@locale@parse@monthblock#1{% \@locale@parse@months#1% remove outer group \@locale@parse@shortmonthblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@months} % \begin{macrocode} \def\@locale@parse@months#1#2#3#4#5#6#7#8#9{% \LocaleSetDialectAttribute{\@locale@dialect}{month.1}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{month.2}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{month.3}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{month.4}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{month.5}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{month.6}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{month.7}{#7}% \LocaleSetDialectAttribute{\@locale@dialect}{month.8}{#8}% \LocaleSetDialectAttribute{\@locale@dialect}{month.9}{#9}% % \end{macrocode} %Grab the remaining three arguments: % \begin{macrocode} \@locale@parse@endmonths } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@endmonths} % \begin{macrocode} \def\@locale@parse@endmonths#1#2#3{% \LocaleSetDialectAttribute{\@locale@dialect}{month.10}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{month.11}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{month.12}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@shortmonthblock} % \begin{macrocode} \def\@locale@parse@shortmonthblock#1{% \@locale@parse@shortmonths#1% remove outer group \@locale@parse@standalone@weekdayblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@shortmonths} % \begin{macrocode} \def\@locale@parse@shortmonths#1#2#3#4#5#6#7#8#9{% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.1}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.2}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.3}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.4}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.5}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.6}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.7}{#7}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.8}{#8}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.9}{#9}% % \end{macrocode} %Grab the remaining three arguments: % \begin{macrocode} \@locale@parse@endshortmonths } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@endshortmonths} % \begin{macrocode} \def\@locale@parse@endshortmonths#1#2#3{% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.10}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.11}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{shortmonth.12}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@weekdayblock} % \begin{macrocode} \def\@locale@parse@standalone@weekdayblock#1{% \@locale@parse@standalone@weekdays#1% remove outer group \@locale@parse@standalone@shortweekdayblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@weekdays} % \begin{macrocode} \def\@locale@parse@standalone@weekdays#1#2#3#4#5#6#7{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.0}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.1}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.2}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.3}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.4}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.5}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.day.6}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@shortweekdayblock} % \begin{macrocode} \def\@locale@parse@standalone@shortweekdayblock#1{% \@locale@parse@standalone@shortweekdays#1% remove outer group \@locale@parse@standalone@monthblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@shortweekdays} % \begin{macrocode} \def\@locale@parse@standalone@shortweekdays#1#2#3#4#5#6#7{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.0}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.1}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.2}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.3}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.4}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.5}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortday.6}{#7}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@monthblock} % \begin{macrocode} \def\@locale@parse@standalone@monthblock#1{% \@locale@parse@standalone@months#1% remove outer group \@locale@parse@standalone@shortmonthblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@months} % \begin{macrocode} \def\@locale@parse@standalone@months#1#2#3#4#5#6#7#8#9{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.1}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.2}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.3}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.4}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.5}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.6}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.7}{#7}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.8}{#8}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.9}{#9}% % \end{macrocode} %Grab the remaining three arguments: % \begin{macrocode} \@locale@parse@endstandalone@months } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@endstandalone@months} % \begin{macrocode} \def\@locale@parse@endstandalone@months#1#2#3{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.10}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.11}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.month.12}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@shortmonthblock} % \begin{macrocode} \def\@locale@parse@standalone@shortmonthblock#1{% \@locale@parse@standalone@shortmonths#1% remove outer group \@locale@parse@numericblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@standalone@shortmonths} % \begin{macrocode} \def\@locale@parse@standalone@shortmonths#1#2#3#4#5#6#7#8#9{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.1}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.2}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.3}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.4}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.5}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.6}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.7}{#7}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.8}{#8}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.9}{#9}% % \end{macrocode} %Grab the remaining three arguments: % \begin{macrocode} \@locale@parse@endstandalone@shortmonths } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@endstandalone@shortmonths} % \begin{macrocode} \def\@locale@parse@endstandalone@shortmonths#1#2#3{% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.10}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.11}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{standalone.shortmonth.12}{#3}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@numericblock} % \begin{macrocode} \def\@locale@parse@numericblock#1{% \@locale@parse@numeric#1% remove outer group \@locale@parse@numericfmtblock } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@numeric} % \begin{macrocode} \def\@locale@parse@numeric#1#2#3#4#5#6#7#8#9{% \LocaleSetDialectAttribute{\@locale@dialect}{groupsep}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{decsep}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{exp}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{usesgroup}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{currency}{#5}% \LocaleSetDialectAttribute{\@locale@dialect}{regionalcurrency}{#6}% \LocaleSetDialectAttribute{\@locale@dialect}{currencysym}{#7}% \LocaleSetDialectAttribute{\@locale@dialect}{currencytex}{#8}% \LocaleSetDialectAttribute{\@locale@dialect}{currencysep}{#9}% % \end{macrocode} % Set currency attributes. % \begin{macrocode} \LocaleProvideCurrencyAttribute{#6}{official}{#5}% \LocaleProvideCurrencyAttribute{#6}{sym}{#7}% \LocaleProvideCurrencyAttribute{#6}{tex}{#8}% \LocaleAddToAttributeList{currencies}{official}{#5}% \LocaleAddToAttributeList{currencies}{regional}{#6}% % \end{macrocode} %If this dialect has an associated region, map the region to the %currency code. % \begin{macrocode} \ifx\@locale@region\empty \else \LocaleProvideRegionAttribute{\@locale@region}{currency}{#6}% \LocaleXpAddToCurrencyAttributeList{#5}{region}{\@locale@region}% \LocaleIfSameDialectAttributeValues{\@locale@dialect}% {regionalcurrency}{currency}% {}% {% \LocaleXpAddToCurrencyAttributeList{#6}{region}{\@locale@region}% }% \fi % \end{macrocode} %Grab remaining arguments. % \begin{macrocode} \@locale@parse@persym } % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@parse@persym} % \begin{macrocode} \def\@locale@parse@persym#1#2{% \LocaleSetDialectAttribute{\@locale@dialect}{percent}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{permill}{#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@numericfmtblock} % \begin{macrocode} \def\@locale@parse@numericfmtblock#1{% \@locale@parse@numericfmt#1% remove outer group \LocaleIfDateTimePatternsSupported {\@locale@parse@timezones}% {\@locale@parse@otherdata}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@numericfmt} % \begin{macrocode} \def\@locale@parse@numericfmt#1#2#3#4{% \LocaleSetDialectAttribute{\@locale@dialect}{decfmt}{#1}% \LocaleSetDialectAttribute{\@locale@dialect}{intfmt}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{curfmt}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{perfmt}{#4}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@timezones} % \begin{macrocode} \def\@locale@parse@timezones#1{% \@locale@parse@timezonemap#1\relax \@locale@parse@otherdata } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@timezonemap} % \begin{macrocode} \def\@locale@parse@timezonemap#1{% \ifx\relax#1\relax \let\@locale@next\relax \else \@locale@save@timezonemap#1% \let\@locale@next\@locale@parse@timezonemap \fi \@locale@next }% % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@save@timezonemap} % \begin{macrocode} \def\@locale@save@timezonemap#1#2#3#4#5{% \LocaleSetDialectAttribute{\@locale@dialect}{timezone.#1.short}{#2}% \LocaleSetDialectAttribute{\@locale@dialect}{timezone.#1.long}{#3}% \LocaleSetDialectAttribute{\@locale@dialect}{timezone.#1.shortdst}{#4}% \LocaleSetDialectAttribute{\@locale@dialect}{timezone.#1.longdst}{#5}% \LocaleAddToAttributeList{timezone}{id}{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@otherdata} % \begin{macrocode} \def\@locale@endparse@result{} % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@parse@otherdata} % \begin{macrocode} \def\@locale@parse@otherdata#1{% \ifx\@locale@endparse@result#1\relax % \end{macrocode} %Finished. % \begin{macrocode} \let\@locale@next\relax \else \def\@locale@next{\@locale@parse@otherdata@localeblock#1}% \fi \@locale@next } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@parse@otherdata@localeblock} % \begin{macrocode} \def\@locale@parse@otherdata@localeblock#1{% \@locale@parse@otherdatalocaleblock#1% remove outer group \@locale@parse@dateblock } % \end{macrocode} %\end{macro} % % \begin{macrocode} \ifx\@locale@result\empty % \end{macrocode} %Set defaults. % \begin{macrocode} \ifTeXOSQueryDryRun \@locale@warn{Dry run mode on. No data provided by texosquery. Check TeX's shell escape status}% \else \@locale@warn{No data provided by texosquery. Check TeX's shell escape status and texosquery's setup}% \fi \def\LocaleOSname{}% \def\LocaleOSversion{}% \def\LocaleOSarch{}% \def\LocaleNowStamp{}% \def\LocaleOStag{}% \def\LocaleOScodeset{}% \def\LocaleFileMod{}% \def\LocaleMain{}% \def\LocaleMainDialect{}% \def\LocaleMainRegion{}% \def\LocaleDateTimeInfo{}% \else \expandafter\@locale@parse@result\@locale@result\@locale@endparse@result \fi % \end{macrocode} % %\subsection{Locale User Commands} % %\begin{macro}{\LocaleLanguageTag} %\begin{definition} %\cs{LocaleLanguageTag}\marg{dialect} %\end{definition} %Get the language tag of the given dialect. % \begin{macrocode} \def\LocaleLanguageTag#1{% \LocaleGetDialectAttribute{#1}{langtag}% } % \end{macrocode} %\end{macro} %\begin{macro}{\LocaleLanguageName} %\begin{definition} %\cs{LocaleLanguageName}\marg{dialect} %\end{definition} %Get the language name of the given dialect according to the OS %default language. % \begin{macrocode} \def\LocaleLanguageName#1{% \LocaleGetDialectAttribute{#1}{langname}% } % \end{macrocode} %\end{macro} %\begin{macro}{\LocaleLanguageNativeName} %\begin{definition} %\cs{LocaleLanguageNativeName}\marg{dialect} %\end{definition} %Get the language name of the given dialect according to that %dialect. % \begin{macrocode} \def\LocaleLanguageNativeName#1{% \LocaleGetDialectAttribute{#1}{nativelangname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleRegionName} %\begin{definition} %\cs{LocaleRegionName}\marg{dialect} %\end{definition} %Get the region name of the given dialect according to the OS %default language. % \begin{macrocode} \def\LocaleRegionName#1{% \LocaleGetDialectAttribute{#1}{regionname}% } % \end{macrocode} %\end{macro} %\begin{macro}{\LocaleRegionNativeName} %\begin{definition} %\cs{LocaleRegionNativeName}\marg{dialect} %\end{definition} %Get the region name of the given dialect according to that %dialect. % \begin{macrocode} \def\LocaleRegionNativeName#1{% \LocaleGetDialectAttribute{#1}{nativeregionname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleVariantName} %\begin{definition} %\cs{LocaleVariantName}\marg{dialect} %\end{definition} %Get the variant name of the given dialect according to the OS %default language. % \begin{macrocode} \def\LocaleVariantName#1{% \LocaleGetDialectAttribute{#1}{variantname}% } % \end{macrocode} %\end{macro} %\begin{macro}{\LocaleVariantNativeName} %\begin{definition} %\cs{LocaleVariantNativeName}\marg{dialect} %\end{definition} %Get the variant name of the given dialect according to that %dialect. % \begin{macrocode} \def\LocaleVariantNativeName#1{% \LocaleGetDialectAttribute{#1}{nativevariantname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleFullDate} %\begin{definition} %\cs{LocaleFullDate}\marg{dialect} %\end{definition} %Get the full date for the given dialect. % \begin{macrocode} \def\LocaleFullDate#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{fulldate}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLongDate} %\begin{definition} %\cs{LocaleLongDate}\marg{dialect} %\end{definition} %Get the long date for the given dialect. % \begin{macrocode} \def\LocaleLongDate#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{longdate}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleMediumDate} %\begin{definition} %\cs{LocaleMediumDate}\marg{dialect} %\end{definition} %Get the medium date for the given dialect. % \begin{macrocode} \def\LocaleMediumDate#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{meddate}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleShortDate} %\begin{definition} %\cs{LocaleShortDate}\marg{dialect} %\end{definition} %Get the short date for the given dialect. % \begin{macrocode} \def\LocaleShortDate#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{shortdate}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleFirstDayIndex} %\begin{definition} %\cs{LocaleFirstDayIndex}\marg{dialect} %\end{definition} %Get the index for the first day of the week for the given dialect. %This starts with 0 for Monday to be compatible with %\sty{pgfcalendar} (and \sty{datetime2} which similar does this to %be compatible with \sty{pgfcalendar}). % \begin{macrocode} \def\LocaleFirstDayIndex#1{% \LocaleGetDialectAttributeOrDefValue{#1}{firstday}{-1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmMondayIndex} % \begin{macrocode} \def\dtmMondayIndex{0} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmTuesdayIndex} % \begin{macrocode} \def\dtmTuesdayIndex{1} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmWednesdayIndex} % \begin{macrocode} \def\dtmWednesdayIndex{2} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmThursdayIndex} % \begin{macrocode} \def\dtmThursdayIndex{3} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmFridayIndex} % \begin{macrocode} \def\dtmFridayIndex{4} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmSaturdayIndex} % \begin{macrocode} \def\dtmSaturdayIndex{5} % \end{macrocode} %\end{macro} % %\begin{macro}{\dtmSundayIndex} % \begin{macrocode} \def\dtmSundayIndex{6} % \end{macrocode} %\end{macro} % %The ISO-8601 standard has day of week indexing starting with %1 for Monday. The \sty{datetime} package has day of week indexing %starting with 1 for Sunday, so provide convenient ways to convert %if necessary. %\begin{macro}{\LocaleDayIndexFromZeroMonToOneSun} %Convert from \sty{pgfcalendar}'s Monday=0 indexing to %\sty{datetime}'s Sunday=1 indexing. % \begin{macrocode} \def\LocaleDayIndexFromZeroMonToOneSun#1{% \ifcase#1 2% Monday 0 -> 2 \or 3% Tuesday 1 -> 3 \or 4% Wednesday 2 -> 4 \or 5% Thursday 3 -> 5 \or 6% Friday 4 -> 6 \or 7% Saturday 5 -> 7 \or 1% Sunday 6 -> 1 \else -1% invalid \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayIndexFromZeroMonToOneMon} %Convert from \sty{pgfcalendar}'s Monday=0 indexing to %ISO-8601's Monday=1 indexing. % \begin{macrocode} \def\LocaleDayIndexFromZeroMonToOneMon#1{% \ifcase#1 1% Monday 0 -> 1 \or 2% Tuesday 1 -> 2 \or 3% Wednesday 2 -> 3 \or 4% Thursday 3 -> 4 \or 5% Friday 4 -> 5 \or 6% Saturday 5 -> 6 \or 7% Sunday 6 -> 7 \else -1% invalid \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayIndexFromOneSunToZeroMon} %Convert from \sty{datetime}'s Sunday=1 indexing to \sty{pgfcalendar}'s %Monday=0 indexing. % \begin{macrocode} \def\LocaleDayIndexFromOneSunToZeroMon#1{% \ifcase#1 % no 0 \or 6% Sunday 1 -> 6 \or 0% Monday 2 -> 0 \or 1% Tuesday 3 -> 1 \or 2% Wednesday 4 -> 2 \or 3% Thursday 5 -> 3 \or 4% Friday 6 -> 4 \or 5% Saturday 7 -> 5 \else -1% invalid \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayIndexFromOneMonToZeroMon} %Convert from ISO-8601's Monday=1 indexing to \sty{pgfcalendar}'s %Monday=0 indexing. % \begin{macrocode} \def\LocaleDayIndexFromOneMonToZeroMon#1{% \ifcase#1 % no 0 \or 0% Monday 1 -> 0 \or 1% Tuesday 2 -> 1 \or 2% Wednesday 3 -> 2 \or 3% Thursday 4 -> 3 \or 4% Friday 5 -> 4 \or 5% Saturday 6 -> 5 \or 6% Sunday 7 -> 6 \else -1% invalid \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayIndexFromRegion} %Convert from the region's day of the week (starting from 1) %to \sty{pgfcalendar}'s 0=Monday indexing. The first argument is the %dialect label. % \begin{macrocode} \def\LocaleDayIndexFromRegion#1#2{% % \end{macrocode} %Get the region's first day of the week. % \begin{macrocode} \ifcase\LocaleFirstDayIndex{#1} % \end{macrocode} %Monday is the first day of the week. That is, the region's using 1=Monday %indexing. % \begin{macrocode} \LocaleDayIndexFromOneMonToZeroMon{#2}% \or % \end{macrocode} %Tuesday is the first day of the week. That is, the region's using %1=Tuesday indexing. (These mid-week cases are unlikely, but add %them for completeness.) % \begin{macrocode} \ifnum#2=7 % Monday 0% \else #2% \fi \or % \end{macrocode} %Wednesday is the first day of the week. That is, the region's using %1=Wednesday indexing. % \begin{macrocode} \ifcase#1 % no 0 \or 2% Wednesday 1 -> 2 \or 3% Thursday 2 -> 3 \or 4% Friday 3 -> 4 \or 5% Saturday 4 -> 5 \or 6% Sunday 5 -> 6 \or 0% Monday 6 -> 0 \or 1% Tuesday 7 -> 1 \else -1% invalid \fi \or % \end{macrocode} %Thursday is the first day of the week. That is, the region's using %1=Thursday indexing. % \begin{macrocode} \ifcase#1 % no 0 \or 3% Thursday 1 -> 3 \or 4% Friday 2 -> 4 \or 5% Saturday 3 -> 5 \or 6% Sunday 4 -> 6 \or 0% Monday 5 -> 0 \or 1% Tuesday 6 -> 1 \or 2% Wednesday 7 -> 2 \else -1% invalid \fi \or % \end{macrocode} %Friday is the first day of the week. That is, the region's using %1=Friday indexing. % \begin{macrocode} \ifcase#1 % no 0 \or 4% Friday 1 -> 4 \or 5% Saturday 2 -> 5 \or 6% Sunday 3 -> 6 \or 0% Monday 4 -> 0 \or 1% Tuesday 5 -> 1 \or 2% Wednesday 6 -> 2 \or 3% Thursday 7 -> 3 \else -1% invalid \fi \or % \end{macrocode} %Saturday is the first day of the week. That is, the region's using %1=Saturday indexing. % \begin{macrocode} \ifcase#1 % no 0 \or 5% Saturday 1 -> 5 \or 6% Sunday 2 -> 6 \or 0% Monday 3 -> 0 \or 1% Tuesday 4 -> 1 \or 2% Wednesday 5 -> 2 \or 3% Thursday 6 -> 3 \or 4% Friday 7 -> 4 \else -1% invalid \fi \or % \end{macrocode} %Sunday is the first day of the week. That is, the region's using %1=Sunday indexing. % \begin{macrocode} \LocaleDayIndexFromOneSunToZeroMon{#2}% \else #2% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayIndexToRegion} %Convert from \sty{pgfcalendar}'s 0=Monday indexing to the region's %first day of the week (starting from 1). The first argument is the %dialect label. % \begin{macrocode} \def\LocaleDayIndexToRegion#1#2{% % \end{macrocode} %Get the region's first day of the week. % \begin{macrocode} \ifcase\LocaleFirstDayIndex{#1} % \end{macrocode} %Monday is the first day of the week. That is, the region's using 1=Monday %indexing. % \begin{macrocode} \LocaleDayIndexFromZeroMonToOneMon{#2}% \or % \end{macrocode} %Tuesday is the first day of the week. That is, the region's using %1=Tuesday indexing. (These mid-week cases are unlikely, but add %them for completeness.) % \begin{macrocode} \ifnum#2=0 % Monday 7% \else #2% \fi \or % \end{macrocode} %Wednesday is the first day of the week. That is, the region's using %1=Wednesday indexing. % \begin{macrocode} \ifcase#1 6% Monday 0 -> 6 \or 7% Tuesday 1 -> 7 \or 1% Wednesday 2 -> 1 \or 2% Thursday 3 -> 2 \or 3% Friday 4 -> 3 \or 4% Saturday 5 -> 4 \or 5% Sunday 6 -> 5 \else -1% invalid \fi \or % \end{macrocode} %Thursday is the first day of the week. That is, the region's using %1=Thursday indexing. % \begin{macrocode} \ifcase#1 5% Monday 0 -> 5 \or 6% Tuesday 1 -> 6 \or 7% Wednesday 2 -> 7 \or 1% Thursday 3 -> 1 \or 2% Friday 4 -> 2 \or 3% Saturday 5 -> 3 \or 4% Sunday 6 -> 4 \else -1% invalid \fi \or % \end{macrocode} %Friday is the first day of the week. That is, the region's using %1=Friday indexing. % \begin{macrocode} \ifcase#1 4% Monday 0 -> 4 \or 5% Tuesday 1 -> 5 \or 6% Wednesday 2 -> 6 \or 7% Thursday 3 -> 7 \or 1% Friday 4 -> 1 \or 2% Saturday 5 -> 2 \or 3% Sunday 6 -> 3 \else -1% invalid \fi \or % \end{macrocode} %Saturday is the first day of the week. That is, the region's using %1=Saturday indexing. % \begin{macrocode} \ifcase#1 3% Monday 0 -> 3 \or 4% Tuesday 1 -> 4 \or 5% Wednesday 2 -> 5 \or 6% Thursday 3 -> 6 \or 7% Friday 4 -> 7 \or 1% Saturday 5 -> 1 \or 2% Sunday 6 -> 2 \else -1% invalid \fi \or % \end{macrocode} %Sunday is the first day of the week. That is, the region's using %1=Sunday indexing. % \begin{macrocode} \LocaleDayIndexFromZeroMonToOneSun{#2}% \else #2% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleFullTime} %\begin{definition} %\cs{LocaleFullTime}\marg{dialect} %\end{definition} %Get the full time for the given dialect. % \begin{macrocode} \def\LocaleFullTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{fulltime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLongTime} %\begin{definition} %\cs{LocaleLongTime}\marg{dialect} %\end{definition} %Get the long time for the given dialect. % \begin{macrocode} \def\LocaleLongTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{longtime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleMediumTime} %\begin{definition} %\cs{LocaleMediumTime}\marg{dialect} %\end{definition} %Get the medium time for the given dialect. % \begin{macrocode} \def\LocaleMediumTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{medtime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleShortTime} %\begin{definition} %\cs{LocaleShortTime}\marg{dialect} %\end{definition} %Get the short time for the given dialect. % \begin{macrocode} \def\LocaleShortTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{shorttime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleFullDateTime} %\begin{definition} %\cs{LocaleFullDateTime}\marg{dialect} %\end{definition} %Get the full date and time for the given dialect. % \begin{macrocode} \def\LocaleFullDateTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{fulldatetime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleLongDateTime} %\begin{definition} %\cs{LocaleLongDateTime}\marg{dialect} %\end{definition} %Get the long date and time for the given dialect. % \begin{macrocode} \def\LocaleLongDateTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{longdatetime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleMediumDateTime} %\begin{definition} %\cs{LocaleMediumDateTime}\marg{dialect} %\end{definition} %Get the medium date and time for the given dialect. % \begin{macrocode} \def\LocaleMediumDateTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{meddatetime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleShortDateTime} %\begin{definition} %\cs{LocaleShortDateTime}\marg{dialect} %\end{definition} %Get the short date and time for the given dialect. % \begin{macrocode} \def\LocaleShortDateTime#1{% \localedatetimefmt{\LocaleGetDialectAttribute{#1}{shortdatetime}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleDayName} %\begin{definition} %\cs{LocaleDayName}\marg{dialect}\marg{n} %\end{definition} %Gets the day of week name identified by the index \meta{n} (0 for %Monday, 1 for Tuesday, etc) in the given dialect. % \begin{macrocode} \def\LocaleDayName#1#2{% \LocaleGetDialectAttribute{#1}{day.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleShortDayName} %\begin{definition} %\cs{LocaleShortDayName}\marg{dialect}\marg{n} %\end{definition} %Gets the abbreviated day of week name identified by the index \meta{n} (0 for %Monday, 1 for Tuesday, etc) in the given dialect. % \begin{macrocode} \def\LocaleShortDayName#1#2{% \LocaleGetDialectAttribute{#1}{shortday.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleMonthName} %\begin{definition} %\cs{LocaleMonthName}\marg{dialect}\marg{n} %\end{definition} %Gets the month name identified by the index \meta{n} (1 for %January, 2 for February, etc) in the given dialect. % \begin{macrocode} \def\LocaleMonthName#1#2{% \LocaleGetDialectAttribute{#1}{month.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleShortMonthName} %\begin{definition} %\cs{LocaleShortMonthName}\marg{dialect}\marg{n} %\end{definition} %Gets the month week name identified by the index \meta{n} (1 for %January, 2 for February, etc) in the given dialect. % \begin{macrocode} \def\LocaleShortMonthName#1#2{% \LocaleGetDialectAttribute{#1}{shortmonth.\number#2}% } % \end{macrocode} %\end{macro} % %Some languages have a different form for month or week day names %used in a standalone context, such as in a column header. These are %provided with the \cs{LocaleStandalone\ldots} commands defined %below. For most languages they will be the same as the above. % %\begin{macro}{\LocaleStandaloneDayName} %\begin{definition} %\cs{LocaleStandaloneDayName}\marg{dialect}\marg{n} %\end{definition} %Gets the day of week name identified by the index \meta{n} (0 for %Monday, 1 for Tuesday, etc) in the given dialect. % \begin{macrocode} \def\LocaleStandaloneDayName#1#2{% \LocaleGetDialectAttribute{#1}{standalone.day.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleStandaloneShortDayName} %\begin{definition} %\cs{LocaleStandaloneShortDayName}\marg{dialect}\marg{n} %\end{definition} %Gets the abbreviated day of week name identified by the index \meta{n} (0 for %Monday, 1 for Tuesday, etc) in the given dialect. % \begin{macrocode} \def\LocaleStandaloneShortDayName#1#2{% \LocaleGetDialectAttribute{#1}{standalone.shortday.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleStandaloneMonthName} %\begin{definition} %\cs{LocaleStandaloneMonthName}\marg{dialect}\marg{n} %\end{definition} %Gets the month week name identified by the index \meta{n} (1 for %January, 2 for February, etc) in the given dialect. % \begin{macrocode} \def\LocaleStandaloneMonthName#1#2{% \LocaleGetDialectAttribute{#1}{standalone.month.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleStandaloneShortMonthName} %\begin{definition} %\cs{LocaleStandaloneShortMonthName}\marg{dialect}\marg{n} %\end{definition} %Gets the month week name identified by the index \meta{n} (1 for %January, 2 for February, etc) in the given dialect. % \begin{macrocode} \def\LocaleStandaloneShortMonthName#1#2{% \LocaleGetDialectAttribute{#1}{standalone.shortmonth.\number#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericGroupSep} %\begin{definition} %\cs{LocaleNumericGroupSep}\marg{dialect} %\end{definition} %Gets the numeric group separator for the given dialect. % \begin{macrocode} \def\LocaleNumericGroupSep#1{% \LocaleGetDialectAttribute{#1}{groupsep}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericDecimalSep} %\begin{definition} %\cs{LocaleNumericDecimalSep}\marg{dialect} %\end{definition} %Gets the numeric decimal separator for the given dialect. % \begin{macrocode} \def\LocaleNumericDecimalSep#1{% \LocaleGetDialectAttribute{#1}{decsep}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericMonetarySep} %\begin{definition} %\cs{LocaleNumericMonetarySep}\marg{dialect} %\end{definition} %Gets the numeric monetary separator for the given dialect. % \begin{macrocode} \def\LocaleNumericMonetarySep#1{% \LocaleGetDialectAttribute{#1}{currencysep}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericExponent} %\begin{definition} %\cs{LocaleNumericExponent}\marg{dialect} %\end{definition} %Gets the exponent symbol for the given dialect. % \begin{macrocode} \def\LocaleNumericExponent#1{% \LocaleGetDialectAttribute{#1}{exp}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleCurrencyLabel} %\begin{definition} %\cs{LocaleCurrencyLabel}\marg{dialect} %\end{definition} %Gets the currency label for the given dialect. % \begin{macrocode} \def\LocaleCurrencyLabel#1{% \LocaleIfDialectAttributeEqCs{#1}{currency}{\@locale@unknown@currency}% {% % \end{macrocode} %Unknown currency symbol. % \begin{macrocode} \ifx\LocaleMainRegion\empty \@locale@os@currencycode \else \LocaleGetDialectAttributeOrDefValue{\LocaleMainDialect}{currency}% {\@locale@os@currencycode}% \fi }% {\LocaleGetDialectAttribute{#1}{currency}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleCurrencyRegionalLabel} %\begin{definition} %\cs{LocaleCurrencyRegionalLabel}\marg{dialect} %\end{definition} %Gets the regional currency label for the given dialect. % \begin{macrocode} \def\LocaleCurrencyRegionalLabel#1{% \LocaleIfDialectAttributeEqCs{#1}{regionalcurrency}% {\@locale@unknown@currency}% {% % \end{macrocode} %Unknown currency symbol. % \begin{macrocode} \ifx\LocaleMainRegion\empty \@locale@os@regionalcurrencycode \else \LocaleGetDialectAttributeOrDefValue{\LocaleMainDialect}{regionalcurrency}% {\@locale@os@regionalcurrencycode}% \fi }% {\LocaleGetDialectAttribute{#1}{regionalcurrency}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleCurrencySymbol} %\begin{definition} %\cs{LocaleCurrencySymbol}\marg{dialect} %\end{definition} %Gets the currency symbol for the given dialect. (May have non-ASCII %characters.) % \begin{macrocode} \def\LocaleCurrencySymbol#1{% \LocaleIfDialectAttributeEqCs{#1}{currency}{\@locale@unknown@currency}% {% % \end{macrocode} %Unknown currency code. Does the main locale have a region? % \begin{macrocode} \ifx\LocaleMainRegion\empty % \end{macrocode} %No main region, try the default OS currency. % \begin{macrocode} \ifx\@locale@os@currencysym\empty \LocaleGetDialectAttribute{#1}{currencysym}% \else \@locale@os@currencysym \fi \else % \end{macrocode} %Try the main dialect attribute. % \begin{macrocode} \LocaleGetDialectAttributeOrDefValue{\LocaleMainDialect}{currencysym}% {\LocaleGetDialectAttribute{#1}{currencysym}}% \fi }% {% \LocaleIfSameDialectAttributeValues{#1}% {currency}{currencysym}% {% \LocaleGetCurrencyAttributeOrDefValue {\LocaleGetDialectAttribute{#1}{currency}}{sym}% {\LocaleGetDialectAttribute{#1}{currencysym}}% }% {% \LocaleGetDialectAttribute{#1}{currencysym}% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleCurrencyTeXSymbol} %\begin{definition} %\cs{LocaleCurrencyTeXSymbol}\marg{dialect} %\end{definition} %Gets the currency symbol for the given dialect. (May include %\sty{texosquery} currency control symbols.) % \begin{macrocode} \def\LocaleCurrencyTeXSymbol#1{% \LocaleIfDialectAttributeEqCs{#1}{currency}{\@locale@unknown@currency}% {% % \end{macrocode} %Unknown currency code. Does the main locale have a region? % \begin{macrocode} \ifx\LocaleMainRegion\empty \ifx\@locale@os@currencytex\empty \LocaleGetDialectAttribute{#1}{currencytex}% \else \@locale@os@currencytex \fi \fi }% {% \LocaleIfSameDialectAttributeValues{#1}% {currency}{currencytex}% {% \LocaleGetCurrencyAttributeOrDefValue {\LocaleGetDialectAttribute{#1}{currency}}{tex}% {\LocaleGetDialectAttribute{#1}{currencytex}}% }% {% \LocaleGetDialectAttribute{#1}{currencytex}% }% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericPercent} %\begin{definition} %\cs{LocaleNumericPercent}\marg{dialect} %\end{definition} %Gets the percent symbol for this dialect. % \begin{macrocode} \def\LocaleNumericPercent#1{% \LocaleGetDialectAttribute{#1}{percent}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleNumericPermill} %\begin{definition} %\cs{LocaleNumericPermill}\marg{dialect} %\end{definition} %Gets the permill symbol for this dialect. % \begin{macrocode} \def\LocaleNumericPermill#1{% \LocaleGetDialectAttribute{#1}{permill}% } % \end{macrocode} %\end{macro} % %\subsection{Patterns} % %\begin{macro}{\LocaleApplyDateTimePattern} %\begin{definition} %\cs{LocaleApplyDateTimePattern}\marg{dialect}\marg{attribute}\marg{date-time data} %\end{definition} % \begin{macrocode} \def\LocaleApplyDateTimePattern#1#2#3{% \LocaleIfHasDialectNonEmptyAttribute{#1}{#2}% {% % \end{macrocode} %The data might be provided with the control sequence %\cs{LocaleDateTimeInfo}, which may be empty and will need expanding. % \begin{macrocode} \ifx\empty#3\empty \@locale@warn{No date-time data for pattern (attribute `#2', dialect `#1')}% \else \localedatetimefmt {\expandafter\texosqueryfmtdatetime \csname locale@dialect@#2@#1\expandafter\endcsname#3}% \fi }% {% \@locale@warn{No date-time pattern attribute `#2' for dialect `#1'}% }% } % \end{macrocode} %\end{macro} % %If the date-time patterns are required, the name commands such as %\cs{texosqueryfmtpatMMM} need defining % \begin{macrocode} \LocaleIfDateTimePatternsSupported {% % \end{macrocode} %\begin{macro}{\texosqueryfmtpatMMM} %Short month name. % \begin{macrocode} \def\texosqueryfmtpatMMM#1{% \CurrentLocaleShortMonthName{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryfmtpatMMMM} %Full month name. % \begin{macrocode} \def\texosqueryfmtpatMMMM#1{% \CurrentLocaleMonthName{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryfmtpatLLL} %Short standalone month name. % \begin{macrocode} \def\texosqueryfmtpatLLL#1{% \CurrentLocaleStandaloneShortMonthName{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryfmtpatLLLL} %Full standalone month name. % \begin{macrocode} \def\texosqueryfmtpatLLLL#1{% \CurrentLocaleStandaloneMonthName{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryfmtpatEEE} %Short day of week name. % \begin{macrocode} \def\texosqueryfmtpatEEE#1{% \CurrentLocaleShortDayName{\LocaleDayIndexFromOneMonToZeroMon{#1}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryfmtpatEEEE} %Full day of week name. % \begin{macrocode} \def\texosqueryfmtpatEEEE#1{% \CurrentLocaleDayName{\LocaleDayIndexFromOneMonToZeroMon{#1}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerytimezonefmt} %Allow the time zone name to be wrapped in a formatting command. % \begin{macrocode} \def\texosquerytimezonefmt#1{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryshorttimezone} % \begin{macrocode} \def\texosqueryshorttimezone#1{% \texosquerytimezonefmt {\LocaleGetDialectAttribute{\CurrentTrackedDialect}{timezone.#1.short}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosqueryshortdstzone} % \begin{macrocode} \def\texosqueryshortdstzone#1{% \texosquerytimezonefmt {\LocaleGetDialectAttribute{\CurrentTrackedDialect}{timezone.#1.shortdst}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerylongtimezone} % \begin{macrocode} \def\texosquerylongtimezone#1{% \texosquerytimezonefmt {\LocaleGetDialectAttribute{\CurrentTrackedDialect}{timezone.#1.long}}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerylongdstzone} % \begin{macrocode} \def\texosquerylongdstzone#1{% \texosquerytimezonefmt {\LocaleGetDialectAttribute{\CurrentTrackedDialect}{timezone.#1.longdst}}% } % \end{macrocode} %\end{macro} %End of first argument of \cs{LocaleIfDateTimePatternsSupported}. %(Do nothing if date-time patterns not required.) % \begin{macrocode} } {} % \end{macrocode} % %Set up the \sty{texosquery} numbering commands to use the current %locale symbols. %\begin{macro}{\texosquerypatfmtgroupsep} % \begin{macrocode} \def\texosquerypatfmtgroupsep{\CurrentLocaleNumericGroupSep} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtdecsep} % \begin{macrocode} \def\texosquerypatfmtdecsep{\CurrentLocaleDecimalSep} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtcurdecsep} % \begin{macrocode} \def\texosquerypatfmtcurdecsep{\CurrentLocaleMonetarySep} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtexp} % \begin{macrocode} \def\texosquerypatfmtexp{\CurrentLocaleExponent} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtcurrencysign} % \begin{macrocode} \def\texosquerypatfmtcurrencysign{\CurrentLocaleCurrency} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtpercentsign} % \begin{macrocode} \def\texosquerypatfmtpercentsign{\CurrentLocalePercent} % \end{macrocode} %\end{macro} % %\begin{macro}{\texosquerypatfmtpermillsign} % \begin{macrocode} \def\texosquerypatfmtpermillsign{\CurrentLocalePermill} % \end{macrocode} %\end{macro} % %\subsection{Conditionals} %\begin{macro}{\LocaleIfNumericUsesGroup} %\begin{definition} %\cs{LocaleIfNumericUsesGroup}\marg{dialect}\marg{true}\marg{false} %\end{definition} %Determines if the locale uses numerical group separator. The %\texttt{usesgroup} attribute will be 1 for true and 0 for false, so %we need a numerical comparison. % \begin{macrocode} \def\LocaleIfNumericUsesGroup#1{% \LocaleIfDialectAttributeEqNum{#1}{usesgroup}{1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasLanguageName} %\begin{definition} %\cs{LocaleIfHasLanguageName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %Determines if the given dialect has a language name. % \begin{macrocode} \def\LocaleIfHasLanguageName#1{% \LocaleIfHasDialectNonEmptyAttribute{#1}{langname}% } % \end{macrocode} %\end{macro} %No need for a separate check for the native version. If it has %one, then it will have the other. % %\begin{macro}{\LocaleIfHasRegionName} %\begin{definition} %\cs{LocaleIfHasRegionName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %Determines if the given dialect has a region name. % \begin{macrocode} \def\LocaleIfHasRegionName#1{% \LocaleIfHasDialectNonEmptyAttribute{#1}{regionname}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\LocaleIfHasVariantName} %\begin{definition} %\cs{LocaleIfHasVariantName}\marg{dialect}\marg{true}\marg{false} %\end{definition} %Determines if the given dialect has a variant name. % \begin{macrocode} \def\LocaleIfHasVariantName#1{% \LocaleIfHasDialectNonEmptyAttribute{#1}{variantname}% } % \end{macrocode} %\end{macro} % %\subsection{Post-Parsing} %If this hook has been defined, use it. % \begin{macrocode} \ifx\@locale@postparse@hook\undefined \else \@locale@postparse@hook \fi % \end{macrocode} % %\subsection{Initialising Current Locale Commands} %These commands are all initialised to do nothing (except for %indexes which are initialised to \texttt{-1}), in the event that %the dry run mode is on. % \begin{macrocode} \def\CurrentLocaleLanguageName{}% \def\CurrentLocaleLanguageNativeName{}% \def\CurrentLocaleRegionName{}% \def\CurrentLocaleRegionNativeName{}% \def\CurrentLocaleVariantName{}% \def\CurrentLocaleVariantNativeName{}% \def\CurrentLocaleFirstDayIndex{-1}% \def\CurrentLocaleDayIndexFromRegion{-1}% \def\CurrentLocaleDayName{}% \def\CurrentLocaleShortDayName{}% \def\CurrentLocaleStandaloneDayName{}% \def\CurrentLocaleStandaloneShortDayName{}% \def\CurrentLocaleMonthName{}% \def\CurrentLocaleShortMonthName{}% \def\CurrentLocaleStandaloneMonthName{}% \def\CurrentLocaleStandaloneShortMonthName{}% \def\CurrentLocaleFullDate{}% \def\CurrentLocaleLongDate{}% \def\CurrentLocaleMediumDate{}% \def\CurrentLocaleShortDate{}% \def\CurrentLocaleFullTime{}% \def\CurrentLocaleLongTime{}% \def\CurrentLocaleMediumTime{}% \def\CurrentLocaleShortTime{}% \def\CurrentLocaleFullDateTime{}% \def\CurrentLocaleLongDateTime{}% \def\CurrentLocaleMediumDateTime{}% \def\CurrentLocaleShortDateTime{}% \def\CurrentLocaleDate{}% \def\CurrentLocaleTime{}% \def\CurrentLocaleCurrency{}% \def\CurrentLocaleNumericGroupSep{}% \def\CurrentLocaleIfNumericUsesGroup{}% \def\CurrentLocaleDecimalSep{}% \def\CurrentLocaleMonetarySep{}% \def\CurrentLocaleExponent{}% \def\CurrentLocalePercent{}% \def\CurrentLocalePermill{}% \def\CurrentLocaleIntegerPattern{}% \def\CurrentLocaleDecimalPattern{}% \def\CurrentLocaleCurrencyPattern{}% \def\CurrentLocalePercentPattern{}% \def\CurrentLocaleApplyDateTimePattern{}% \def\CurrentTrackedDialect{}% % \end{macrocode} % %\subsection{Switching Locale} %\begin{macro}{\@locale@select} %Used when a language is changed. The argument is the dialect label. % \begin{macrocode} \def\@locale@select#1{% \SetCurrentTrackedDialect{#1}% \def\CurrentLocaleLanguageName{\LocaleLanguageName{#1}}% \def\CurrentLocaleLanguageNativeName{\LocaleLanguageNativeName{#1}}% \def\CurrentLocaleRegionName{\LocaleRegionName{#1}}% \def\CurrentLocaleRegionNativeName{\LocaleRegionNativeName{#1}}% \def\CurrentLocaleVariantName{\LocaleVariantName{#1}}% \def\CurrentLocaleVariantNativeName{\LocaleVariantNativeName{#1}}% \def\CurrentLocaleFirstDayIndex{\LocaleFirstDayIndex{#1}}% \def\CurrentLocaleDayIndexFromRegion{\LocaleDayIndexFromRegion{#1}}% \def\CurrentLocaleDayName{\LocaleDayName{#1}}% \def\CurrentLocaleShortDayName{\LocaleShortDayName{#1}}% \def\CurrentLocaleStandaloneDayName{% \LocaleStandaloneDayName{#1}}% \def\CurrentLocaleStandaloneShortDayName{% \LocaleStandaloneShortDayName{#1}}% \def\CurrentLocaleMonthName{\LocaleMonthName{#1}}% \def\CurrentLocaleShortMonthName{\LocaleShortMonthName{#1}}% \def\CurrentLocaleStandaloneMonthName{% \LocaleStandaloneMonthName{#1}}% \def\CurrentLocaleStandaloneShortMonthName{% \LocaleStandaloneShortMonthName{#1}}% \def\CurrentLocaleFullDate{\LocaleFullDate{#1}}% \def\CurrentLocaleLongDate{\LocaleLongDate{#1}}% \def\CurrentLocaleMediumDate{\LocaleMediumDate{#1}}% \def\CurrentLocaleShortDate{\LocaleShortDate{#1}}% \def\CurrentLocaleFullTime{\LocaleFullTime{#1}}% \def\CurrentLocaleLongTime{\LocaleLongTime{#1}}% \def\CurrentLocaleMediumTime{\LocaleMediumTime{#1}}% \def\CurrentLocaleShortTime{\LocaleShortTime{#1}}% \def\CurrentLocaleFullDateTime{\LocaleFullDateTime{#1}}% \def\CurrentLocaleLongDateTime{\LocaleLongDateTime{#1}}% \def\CurrentLocaleMediumDateTime{\LocaleMediumDateTime{#1}}% \def\CurrentLocaleShortDateTime{\LocaleShortDateTime{#1}}% \def\CurrentLocaleDate{% \localedatechoice {\LocaleFullDate{#1}}% {\LocaleLongDate{#1}}% {\LocaleMediumDate{#1}}% {\LocaleShortDate{#1}}% }% \def\CurrentLocaleTime{% \localetimechoice {\LocaleFullTime{#1}}% {\LocaleLongTime{#1}}% {\LocaleMediumTime{#1}}% {\LocaleShortTime{#1}}% }% \def\CurrentLocaleCurrency{% \localecurrchoice {\LocaleCurrencyLabel{#1}}% {\LocaleCurrencyRegionalLabel{#1}}% {\LocaleCurrencySymbol{#1}}% {\LocaleCurrencyTeXSymbol{#1}}% }% \def\CurrentLocaleNumericGroupSep{% \LocaleNumericGroupSep{#1}% }% \def\CurrentLocaleIfNumericUsesGroup{% \LocaleIfNumericUsesGroup{#1}% }% \def\CurrentLocaleDecimalSep{% \LocaleNumericDecimalSep{#1}% }% \def\CurrentLocaleMonetarySep{% \LocaleNumericMonetarySep{#1}% }% \def\CurrentLocaleExponent{% \LocaleNumericExponent{#1}% }% \def\CurrentLocalePercent{% \LocaleNumericPercent{#1}% }% \def\CurrentLocalePermill{% \LocaleNumericPermill{#1}% }% \def\CurrentLocaleIntegerPattern{% \LocaleGetDialectAttribute{#1}{intfmt}% }% \def\CurrentLocaleDecimalPattern{% \LocaleGetDialectAttribute{#1}{decfmt}% }% \def\CurrentLocaleCurrencyPattern{% \LocaleGetDialectAttribute{#1}{curfmt}% }% \def\CurrentLocalePercentPattern{% \LocaleGetDialectAttribute{#1}{perfmt}% }% \def\CurrentLocaleApplyDateTimePattern{% \LocaleApplyDateTimePattern{#1}% }% } % \end{macrocode} %\end{macro} % %Provide the choice commands: %\begin{macro}{\localedatechoice} % \begin{macrocode} \ifx\localedatechoice\undefined \def\localedatechoice#1#2#3#4{#2} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\localetimechoice} % \begin{macrocode} \ifx\localetimechoice\undefined \def\localetimechoice#1#2#3#4{#3} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\localecurrchoice} % \begin{macrocode} \ifx\localecurrchoice\undefined \def\localecurrchoice#1#2#3#4{#2} \fi % \end{macrocode} %\end{macro} % %\begin{macro}{\CurrentLocaleDateTime} %Shortcut for date and time. % \begin{macrocode} \def\CurrentLocaleDateTime{\CurrentLocaleDate\space\CurrentLocaleTime} % \end{macrocode} %\end{macro} % %Provide convenient shortcut commands for formatting numbers. %These need a bit of help to split the argument on "." %and on "E". First provide a general purpose command. % %\begin{macro}{\localenumfmt} %The first argument is the pattern. The second argument is the %value. % \begin{macrocode} \def\localenumfmt#1#2{% \@locale@decfmt#2\empty.0E0\relax \ifnum\@locale@decfmt@int<0 \let\@localenum@fmt\localenumfmtneg \else \ifnum\@locale@decfmt@int=0 \ifnum\@locale@decfmt@frac=0 \ifnum\@locale@decfmt@exp=0 \let\@localenum@fmt\localenumfmtzero \else \let\@localenum@fmt\localenumfmtpos \fi \else \let\@localenum@fmt\localenumfmtpos \fi \else \let\@localenum@fmt\localenumfmtpos \fi \fi \@localenum@fmt {% \texosqueryfmtnumber{#1}% {\@locale@decfmt@int}% {\@locale@decfmt@frac}% {\@locale@decfmt@exp}% }% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localenumfmtpos} %Wrapper for positive values. % \begin{macrocode} \def\localenumfmtpos#1{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\localenumfmtneg} %Wrapper for negative values. % \begin{macrocode} \def\localenumfmtneg#1{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\localenumfmtzero} %Wrapper for zero values. % \begin{macrocode} \def\localenumfmtzero#1{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\localeint} % \begin{macrocode} \def\localeint#1{% \localenumfmt{\CurrentLocaleIntegerPattern}{#1}% } % \end{macrocode} %\end{macro} % % %\begin{macro}{\localedec} % \begin{macrocode} \def\localedec#1{% \localenumfmt{\CurrentLocaleDecimalPattern}{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localecur} % \begin{macrocode} \def\localecur#1{% \localenumfmt{\CurrentLocaleCurrencyPattern}{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\localeper} % \begin{macrocode} \def\localeper#1{% \localenumfmt{\CurrentLocalePercentPattern}{#1}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@decfmt} % \begin{macrocode} \def\@locale@decfmt#1.#2E#3\relax{% % \end{macrocode} %Allow for mantissa present but missing fractional part. % \begin{macrocode} \@locale@decfmt@split#1E\empty\relax \ifx\@locale@decfmt@exp\empty \edef\@locale@decfmt@frac{\@locale@gobbleemptytorelax#2\empty\relax}% \edef\@locale@decfmt@exp{\@locale@gobbleemptytorelax#3\empty\relax}% \else \def\@locale@decfmt@frac{0}% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@gobbleemptytorelax} %Strip everything between \cs{empty} and \cs{relax} % \begin{macrocode} \def\@locale@gobbleemptytorelax#1\empty#2\relax{#1} % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@decfmt@split} %Split on "E". (In case "E" but no "." supplied.) % \begin{macrocode} \def\@locale@decfmt@split#1E#2\empty#3\relax{% \edef\@locale@decfmt@int{\@locale@gobbleemptytorelax#1\empty\relax}% \edef\@locale@decfmt@exp{\@locale@gobbleemptytorelax#2\empty\relax}% } % \end{macrocode} %\end{macro} % %Iterate through all languages and add to caption hook. % \begin{macrocode} \ForEachTrackedDialect{\locale@this@dialect}{% \SetCurrentTrackedDialect{\locale@this@dialect}% \expandafter\@TrackLangAddToHook\expandafter {\expandafter\@locale@select\expandafter{\locale@this@dialect}} {captions}% } % \end{macrocode} % %Provide a command to select a language using the \sty{tracklang} %dialect label or the language tag. %\begin{macro}{\selectlocale} % \begin{macrocode} \def\selectlocale#1{% \ifx\selectlanguage\undefined \IfTrackedDialect{#1}% {\@locale@select{#1}}% {% \LocaleIfHasAttribute{#1}{tagtodialect} {% \edef\@locale@dialect{\LocaleGetAttribute{#1}{tagtodialect}}% \expandafter\@locale@select\expandafter{\@locale@dialect}% }% {% \ifTeXOSQueryDryRun \@locale@warn{Unknown locale `#1'}% \else \@locale@err{Unknown locale `#1'}% {The argument to \string\selectlocale\space must be either a tracklang dialect label or a tracked dialect language tag}% \fi }% }% \else % \end{macrocode} % Need to find the correct label to use in \cs{selectlanguage} % \begin{macrocode} \IfTrackedDialect{#1}% {% \@locale@select@dialect{#1}% }% {% \LocaleIfHasAttribute{#1}{tagtodialect} {\@locale@select@dialect{\LocaleGetAttribute{#1}{tagtodialect}}}% {% \ifTeXOSQueryDryRun \@locale@warn{Unknown locale `#1'}% \else \@locale@err{Unknown locale `#1'}% {The argument to \string\selectlocale\space must be either a tracklang dialect label or a tracked dialect language tag}% \fi }% }% \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@select@dialect} %Select language from \sty{tracklang} dialect label. % \begin{macrocode} \def\@locale@select@dialect#1{% \IfTrackedDialectHasMapping{#1}% {\edef\@locale@dialect{\GetTrackedDialectToMapping{#1}}}% {\edef\@locale@dialect{#1}}% % \end{macrocode} % Is there a date hook available? (Match the check used by % \cs{selectlanguage}.) % \begin{macrocode} \@tracklang@ifundef{date\@locale@dialect}% {% % \end{macrocode} % Try the root language. % \begin{macrocode} \edef\@locale@dialect{\TrackedLanguageFromDialect{#1}}% % \end{macrocode} % Is there a date hook available? % \begin{macrocode} \@tracklang@ifundef{date\@locale@dialect}% {% \@locale@warn{Can't determine correct label for \string\selectlanguage\space from tracklang dialect `#1'}% \SetCurrentTrackedDialect{#1}% }% {\expandafter\selectlanguage\expandafter{\@locale@dialect}}% }% {\expandafter\selectlanguage\expandafter{\@locale@dialect}}% } % \end{macrocode} %\end{macro} % %Select the main locale (but don't try any language change %as this might upset \sty{polyglossia} if the fonts haven't been set %yet), so use the internal %\cs{@locale@select}. % \begin{macrocode} \ifx\LocaleMainDialect\empty \else \expandafter\@locale@select\expandafter{\LocaleMainDialect} \fi % \end{macrocode} % %Restore category code for \texttt{@} if necessary. % \begin{macrocode} \@locale@restore@at % \end{macrocode} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\iffalse % \begin{macrocode} %<*tex-locale-scripts-enc.def> % \end{macrocode} %\fi %\section{Scripts to \styfmt{fontenc} mappings %(\texttt{tex-locale-scripts-enc.def})} %\label{sec:locale-scripts-enc.def} %Provides mappings from scripts to font encodings. Not all %supported. This file is only loaded if the \pkgopt[auto]{fontenc} %option is used. The \texttt{@} character is assumed to have %category code when this file is input. %\begin{macro}{\@locale@scriptenc@map} %Maps ISO 15924 script label to \LaTeX\ font encoding name. % \begin{macrocode} \def\@locale@scriptenc@map#1#2{% \@tracklang@namedef{@locale@scriptenc@map@#1}{#2}% } % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@get@scriptenc@map} %Get the mapping. % \begin{macrocode} \def\@locale@get@scriptenc@map#1{% \@tracklang@ifundef{@locale@scriptenc@map@#1}% {}% {\csname @locale@scriptenc@map@#1\endcsname}% } % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@if@scriptenc@map} %Test if there's a script mapping. % \begin{macrocode} \def\@locale@if@scriptenc@map#1#2#3{% \@tracklang@ifundef{@locale@scriptenc@map@#1}% {#3}% false {#2}% true } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@langenc@map} %Maps tracklang language or dialect labels to \LaTeX\ font encoding name. % \begin{macrocode} \def\@locale@langenc@map#1#2{% \@tracklang@namedef{@locale@langenc@map@#1}{#2}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@if@langenc@map} %Test if there's a lang mapping. % \begin{macrocode} \def\@locale@if@langenc@map#1#2#3{% \@tracklang@ifundef{@locale@langenc@map@#1}% {#3}% false {#2}% true } % \end{macrocode} %\end{macro} % %\begin{macro}{\@locale@get@langenc@map} %Get the mapping. % \begin{macrocode} \def\@locale@get@langenc@map#1{% \@tracklang@ifundef{@locale@langenc@map@#1}% {}% {\csname @locale@langenc@map@#1\endcsname}% } % \end{macrocode} %\end{macro} % %Define mappings. Only a few currently supported. It's better to use %\sty{fontspec} instead of \sty{fontenc} for non-Latin scripts. % % Scripts first. % \begin{macrocode} \@locale@scriptenc@map{Latn}{T1} \@locale@scriptenc@map{Latf}{T1} \@locale@scriptenc@map{Latg}{T1} \@locale@scriptenc@map{Cyrl}{T2A,T2B,T2C} % \end{macrocode} %Now languages or dialect labels: % \begin{macrocode} \@locale@langenc@map{vietnamese}{T5} \@locale@langenc@map{polish}{OT4} \@locale@langenc@map{armenian}{OT6} \@locale@langenc@map{greek}{LGR} % \end{macrocode} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\iffalse % \begin{macrocode} %<*tex-locale-encodings.def> % \end{macrocode} %\fi %\section{texosquery to \styfmt{inputenc} mappings %(\texttt{tex-locale-encodings.def})} %Encoding mappings. %\begin{macro}{\@locale@newencmap} % \begin{macrocode} \def\@locale@newencmap#1#2{% \@tracklang@namedef{@locale@encmap@#1}{#2}} % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@ifhasencmap} % \begin{macrocode} \def\@locale@ifhasencmap#1#2#3{% \@tracklang@ifundef{@locale@encmap@#1}{#3}{#2}} % \end{macrocode} %\end{macro} %\begin{macro}{\@locale@getencmap} % \begin{macrocode} \def\@locale@getencmap#1{% \@tracklang@nameuse{@locale@encmap@#1}} % \end{macrocode} %\end{macro} % \begin{macrocode} \@locale@newencmap{iso88591}{latin1} \@locale@newencmap{iso88592}{latin2} \@locale@newencmap{iso88593}{latin3} \@locale@newencmap{iso88594}{latin4} \@locale@newencmap{iso88595}{latin5} \@locale@newencmap{iso88599}{latin9} \@locale@newencmap{windows1250}{cp1250} \@locale@newencmap{windows1252}{cp1252} \@locale@newencmap{windows1257}{cp1257} \@locale@newencmap{ibm850}{cp850} \@locale@newencmap{ibm852}{cp852} \@locale@newencmap{ibm437}{cp437} \@locale@newencmap{ibm865}{cp865} \@locale@newencmap{usascii}{ascii} \@locale@newencmap{xmaccentraleurope}{macce} % \end{macrocode} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\iffalse % \begin{macrocode} %<*tex-locale-support.def> % \end{macrocode} %\fi %\section{Language Support Setup} %The language support setup performed in \cs{@locale@postparse@hook}. %Load \sty{babel} or \sty{polyglossia}. % \begin{macrocode} \@locale@ifsupportbabelorpoly {} {% % \end{macrocode} %(\sty{babel} support.) %Set up some extra mappings that aren't in \sty{tracklang} version %1.3. There's no intuitive way of testing if a dialect label is %provided by \sty{babel}. There's only a test for the root language %by checking for the existence of the ldf file, so these are known %\sty{babel} options. This means that if there isn't a mapping, the %root language will be used instead. % \begin{macrocode} \def\@locale@providemap#1#2{% \IfTrackedDialectHasMapping{#1}% {}% {\SetTrackedDialectLabelMap{#1}{#2}}% }% \@locale@providemap{bahasa}{bahasa}% \@locale@providemap{indonesian}{indonesian}% \@locale@providemap{indon}{indon}% \@locale@providemap{bahasam}{bahasam}% \@locale@providemap{malay}{malay}% \@locale@providemap{melayu}{melayu}% \@locale@providemap{USenglish}{USenglish}% \@locale@providemap{american}{american}% \@locale@providemap{UKenglish}{UKenglish}% \@locale@providemap{british}{british}% \@locale@providemap{canadian}{canadian}% \@locale@providemap{australian}{australian}% \@locale@providemap{newzealand}{newzealand}% \@locale@providemap{francais}{francais}% \@locale@providemap{canadien}{canadien}% \@locale@providemap{acadian}{acadian}% \@locale@providemap{austrian}{austrian}% \@locale@providemap{germanb}{germanb}% \@locale@providemap{ngerman}{ngerman}% \@locale@providemap{naustrian}{naustrian}% \@locale@providemap{nswissgerman}{nswissgerman}% \@locale@providemap{swissgerman}{swissgerman}% \@locale@providemap{polutonikogreek}{greek}% \@locale@providemap{nynorsk}{nynorsk}% \@locale@providemap{portuguese}{portuguese}% \@locale@providemap{brazilian}{brazilian}% \@locale@providemap{brazil}{brazil}% % \end{macrocode} %Work out how to pass the options since we may need to convert a %\sty{tracklang} dialect label to a recognised \sty{babel} label. % \begin{macrocode} \def\@locale@bbl@options{}% \ForEachTrackedDialect{\this@dialect}% {% \edef\this@root@lang{% \TrackedLanguageFromDialect{\this@dialect}}% % \end{macrocode} %Is there a language file? % \begin{macrocode} \IfFileExists{\this@root@lang.ldf} {% % \end{macrocode} %Check for Serbian, since we need to know the script. % \begin{macrocode} \ifdefstring{\this@root@lang}{serbian}% {% \@locale@loadscripts \IfTrackedDialectIsScriptCs{\this@dialect}% {\TrackLangScriptLatn}% {\def\locale@bbl@dialect{serbian}}% {\def\locale@bbl@dialect{serbianc}}% }% {% \IfFileExists{\this@dialect.ldf}% {% \let\locale@bbl@dialect\this@dialect }% {% % \end{macrocode} %Do we have a mapping for this dialect label? % \begin{macrocode} \IfTrackedDialectHasMapping{\this@dialect}% {% \edef\locale@bbl@dialect{% \GetTrackedDialectToMapping{\this@dialect}}% }% {% \let\locale@bbl@dialect\this@root@lang }% }% }% \SetTrackedDialectLabelMap{\this@dialect}{\locale@bbl@dialect}% \ifx\this@dialect\LocaleMainDialect \ifx\@locale@bbl@options\empty \edef\@locale@bbl@options{main=\locale@bbl@dialect}% \else \edef\@locale@bbl@options{\@locale@bbl@options,% main=\locale@bbl@dialect}% \fi \else \ifx\@locale@bbl@options\empty \edef\@locale@bbl@options{\locale@bbl@dialect}% \else \edef\@locale@bbl@options{\@locale@bbl@options,% \locale@bbl@dialect}% \fi \fi }% {}% }% \ifx\@locale@bbl@options\@empty \ifTeXOSQueryDryRun \@locale@err{Can't determine `babel' package options\MessageBreak (texosquery's dry run mode is on)}{} \else \@locale@err{Can't determine `babel' package options (perhaps the shell escape failed, check `\jobname.log')}{} \fi \else \expandafter\PassOptionsToPackage\expandafter {\@locale@bbl@options}{babel} \RequirePackage{babel}% \fi }% {% % \end{macrocode} % (\sty{polyglossia} support). % \begin{macrocode} % \end{macrocode} % Need a way of mapping scripts, regions and variants to known % \sty{polyglossia} keys. A lot of these variants aren't official % BCP 47 tags. % \begin{macrocode} \def\@set@locale@poly@map@script#1#2#3{% \@tracklang@namedef{@local@poly@map@script@#1@#2}{#3}% } \def\@if@locale@poly@map@script#1#2#3#4{% \@tracklang@ifundef{@local@poly@map@script@#1@#2}{#4}{#3}% } \def\@get@locale@poly@map@script#1#2{% \@tracklang@nameuse{@local@poly@map@script@#1@#2}% } \def\@set@locale@poly@map@region#1#2#3{% \@tracklang@namedef{@local@poly@map@region@#1@#2}{#3}% } \def\@if@locale@poly@map@region#1#2#3#4{% \@tracklang@ifundef{@local@poly@map@region@#1@#2}{#4}{#3}% } \def\@get@locale@poly@map@region#1#2{% \@tracklang@nameuse{@local@poly@map@region@#1@#2}% } \def\@set@locale@poly@map@variant#1#2#3{% \@tracklang@namedef{@local@poly@map@variant@#1@#2}{#3}% } \def\@if@locale@poly@map@variant#1#2#3#4{% \@tracklang@ifundef{@local@poly@map@variant@#1@#2}{#4}{#3}% } \def\@get@locale@poly@map@variant#1#2{% \@tracklang@nameuse{@local@poly@map@variant@#1@#2}% } \def\@set@locale@poly@map@sublang#1#2#3{% \@tracklang@namedef{@local@poly@map@sublang@#1@#2}{#3}% } \def\@if@locale@poly@map@sublang#1#2#3#4{% \@tracklang@ifundef{@local@poly@map@sublang@#1@#2}{#4}{#3}% } \def\@get@locale@poly@map@sublang#1#2{% \@tracklang@nameuse{@local@poly@map@sublang@#1@#2}% } \@set@locale@poly@map@region{arabic}{IQ}{locale=mashriq} \@set@locale@poly@map@region{arabic}{SY}{locale=mashriq} \@set@locale@poly@map@region{arabic}{JO}{locale=mashriq} \@set@locale@poly@map@region{arabic}{LB}{locale=mashriq} \@set@locale@poly@map@region{arabic}{PS}{locale=mashriq} \@set@locale@poly@map@region{arabic}{LY}{locale=libya} \@set@locale@poly@map@region{arabic}{DZ}{locale=algeria} \@set@locale@poly@map@region{arabic}{TN}{locale=tunisia} \@set@locale@poly@map@region{arabic}{MA}{locale=morocco} \@set@locale@poly@map@region{arabic}{MR}{locale=mauritania} \@set@locale@poly@map@variant{arabic}{islamic}{calendar=islamic} \@set@locale@poly@map@variant{arabic}{maghrib}{numerals=maghrib} \@set@locale@poly@map@variant{arabic}{abjad}{abjadjimnotail} \@set@locale@poly@map@variant{bengali}{western}{numerals=Western} \@set@locale@poly@map@variant{bengali}{devanagari}{numerals=Devanagari} \@set@locale@poly@map@variant{bengali}{bengali}{numerals=Bengali} \@set@locale@poly@map@region{english}{US}{variant=us} \@set@locale@poly@map@region{english}{GB}{variant=uk} \@set@locale@poly@map@region{english}{AU}{variant=australian} \@set@locale@poly@map@region{english}{NZ}{variant=newzealand} \@set@locale@poly@map@variant{farsi}{western}{numerals=western} \@set@locale@poly@map@variant{farsi}{eastern}{numerals=eastern} \@set@locale@poly@map@region{german}{DE}{variant=german} \@set@locale@poly@map@region{german}{AU}{variant=austrian} \@set@locale@poly@map@region{german}{CH}{variant=swiss} \@set@locale@poly@map@variant{german}{1996}{spelling=new} \@set@locale@poly@map@variant{german}{1901}{spelling=old} \@set@locale@poly@map@script{german}{Latf}{script=fraktur} \@set@locale@poly@map@variant{greek}{monoton}{variant=monotonic} \@set@locale@poly@map@variant{greek}{polyton}{variant=polytonic} \@set@locale@poly@map@variant{greek}{ancient}{variant=ancient} \@set@locale@poly@map@variant{greek}{arabic}{numerals=arabic} \@set@locale@poly@map@variant{hebrew}{arabic}{numerals=arabic} \@set@locale@poly@map@variant{hebrew}{gregorian}{calendar=gregorian} \@set@locale@poly@map@variant{hindi}{western}{numerals=Western} \@set@locale@poly@map@variant{hindi}{devanagari}{numerals=Devanagari} \@set@locale@poly@map@variant{latin}{classic}{variant=classic} \@set@locale@poly@map@variant{latin}{modern}{variant=modern} \@set@locale@poly@map@variant{latin}{medieval}{variant=medieval} \@set@locale@poly@map@sublang{russian}{orv}{spelling=old} \@set@locale@poly@map@variant{russian}{luna1918}{spelling=new} \@set@locale@poly@map@script{serbian}{Latn}{script=Latin} \@set@locale@poly@map@script{serbian}{Cyrl}{script=Cyrillic} \@set@locale@poly@map@variant{syriac}{western}{numerals=western} \@set@locale@poly@map@variant{syriac}{eastern}{numerals=eastern} % \end{macrocode} % Load polyglossia. % \begin{macrocode} \RequirePackage{polyglossia} \ForEachTrackedDialect{\this@dialect}% {% \edef\this@root@lang{% \TrackedLanguageFromDialect{\this@dialect}}% \edef\this@sublang{% \GetTrackedDialectSubLang{\this@dialect}}% \edef\this@region{% \TrackedIsoCodeFromLanguage{3166-1}{\this@dialect}}% \edef\this@script{% \GetTrackedDialectScript{\this@dialect}}% \edef\this@variant{% \GetTrackedDialectVariant{\this@dialect}}% % \end{macrocode} % Try to determine the options. Check the script mappings. % \begin{macrocode} \def\@locale@poly@options{}% \ifx\this@script\empty \else \@if@locale@poly@map@script{\this@root@lang}{\this@script}% {% \edef\@locale@poly@options{% \@get@locale@poly@map@script {\this@root@lang}{\this@script}}% }% {}% \fi % \end{macrocode} % Check the region mappings. % \begin{macrocode} \ifx\this@region\empty \else \@if@locale@poly@map@region{\this@root@lang}{\this@region}% {% \ifx\@locale@poly@options\empty \edef\@locale@poly@options{% \@get@locale@poly@map@region{\this@root@lang}{\this@region}}% \else \edef\@locale@poly@options{\@locale@poly@options,% \@get@locale@poly@map@region{\this@root@lang}{\this@region}}% \fi }% {}% \fi % \end{macrocode} % Check the sub-language mappings. % \begin{macrocode} \ifx\this@sublang\empty \else \@if@locale@poly@map@sublang{\this@root@lang}{\this@sublang}% {% \ifx\@locale@poly@options\empty \edef\@locale@poly@options{% \@get@locale@poly@map@sublang {\this@root@lang}{\this@sublang}}% \else \edef\@locale@poly@options{\@locale@poly@options,% \@get@locale@poly@map@sublang {\this@root@lang}{\this@sublang}}% \fi }% {}% \fi % \end{macrocode} % Check the variant mappings. % \begin{macrocode} \ifx\this@subvariant\empty \else \@if@locale@poly@map@variant{\this@root@lang}{\this@variant}% {% \ifx\@locale@poly@options\empty \edef\@locale@poly@options{% \@get@locale@poly@map@variant {\this@root@lang}{\this@variant}}% \else \edef\@locale@poly@options{\@locale@poly@options,% \@get@locale@poly@map@variant {\this@root@lang}{\this@variant}}% \fi }% {}% \fi % \end{macrocode} % Set the language using either \cs{setmainlanguage} or % \cs{setotherlanguage}. % \begin{macrocode} \ifx\this@dialect\LocaleMainDialect \edef\@locale@tmp{\noexpand\setmainlanguage [\@locale@poly@options]{\this@root@lang}}% \else \edef\@locale@tmp{\noexpand\setotherlanguage [\@locale@poly@options]{\this@root@lang}}% \fi \@locale@tmp }% % \end{macrocode} %Redefine command to temporarily switch off punctuation %adjustments. For example, when formatting the date or time. % \begin{macrocode} \def\localenopolypunct{\@locale@nopolypunct}% } % \end{macrocode} %\iffalse % \begin{macrocode} % % \end{macrocode} %\fi %\Finale \endinput