diff options
author | Karl Berry <karl@freefriends.org> | 2018-08-27 21:41:07 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2018-08-27 21:41:07 +0000 |
commit | d6f57515b98d2736c1e094a7df0623d0ffd7120a (patch) | |
tree | 5d5706d9d7ddec135b39decdc4d6f9c2493475a6 /Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx | |
parent | f1c2e4e8b45c0e7bbdaca6e345c187375d024f6a (diff) |
tex-locale (27aug18)
git-svn-id: svn://tug.org/texlive/trunk@48500 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx | 9082 |
1 files changed, 9082 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx b/Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx new file mode 100644 index 00000000000..839c8834c0d --- /dev/null +++ b/Master/texmf-dist/source/latex/tex-locale/tex-locale.dtx @@ -0,0 +1,9082 @@ +%\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 \~} +%</package> +%\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} +%</driver> +%\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} +%</tex-locale.sty> +% \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} +%</tex-locale.tex> +% \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} +%</tex-locale-scripts-enc.def> +% \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} +%</tex-locale-encodings.def> +% \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} +%</tex-locale-support.def> +% \end{macrocode} +%\fi +%\Finale +\endinput |