summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/support/texosquery/texosquery.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/support/texosquery/texosquery.dtx')
-rw-r--r--Master/texmf-dist/source/support/texosquery/texosquery.dtx7429
1 files changed, 7145 insertions, 284 deletions
diff --git a/Master/texmf-dist/source/support/texosquery/texosquery.dtx b/Master/texmf-dist/source/support/texosquery/texosquery.dtx
index feda90f8680..a532e96c577 100644
--- a/Master/texmf-dist/source/support/texosquery/texosquery.dtx
+++ b/Master/texmf-dist/source/support/texosquery/texosquery.dtx
@@ -19,39 +19,98 @@
%\fi
% \iffalse
% Doc-Source file
-% Copyright (C) 2016 Nicola Talbot, all rights reserved.
+% Copyright (C) 2017 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\documentclass{ltxdoc}
\usepackage[T1]{fontenc}
+\usepackage[utf8]{inputenc}
+\usepackage{etoolbox}
+\usepackage{textcomp}
\usepackage{tgtermes}
+\usepackage{upquote}
\usepackage{metalogo}
\usepackage[colorlinks,hyperindex=false]{hyperref}
+\usepackage[abbreviations,nomain,nonumberlist,nogroupskip]{glossaries-extra}
-\CheckSum{269}
+\makeglossaries
+
+\makeatletter% doc.sty interferes with upquote.sty
+\def\@verbatim{\trivlist \item[]\if@minipage\else\vskip\parskip\fi
+ \leftskip\@totalleftmargin\rightskip\z@
+ \parindent\z@\parfillskip\@flushglue\parskip\z@
+ \@@par
+ \@tempswafalse
+ \def\par{\if@tempswa\hbox{}\fi\@tempswatrue\@@par
+ \penalty\interlinepenalty
+ \check@percent}%
+ \obeylines
+ \@noligs
+ \let\do\@makeother \dospecials}
+
+\renewcommand{\meta@font@select}{\rmfamily\itshape}
+\makeatother
+
+\CheckSum{3260}
\RecordChanges
\PageIndex
\CodelineNumbered
-\IndexPrologue{}
+\IndexPrologue{\clearpage\phantomsection\section*{Index}\markboth{Index}{Index}%
+\addcontentsline{toc}{section}{Index}}
+\setcounter{IndexColumns}{2}
\renewcommand*{\usage}[1]{\hyperpage{#1}}
\renewcommand*{\main}[1]{\hyperpage{#1}}
+\newcommand*{\qt}[1]{``#1''}
+\newcommand*{\sty}[1]{\textsf{#1}}
+\newcommand*{\app}[1]{\texttt{#1}}
+\newcommand*{\file}[1]{\texttt{#1}}
+\providecommand*{\eTeX}{e\TeX}
+
\newcommand*{\shortargfmt}[1]{\texttt{-#1}}
\newcommand*{\longargfmt}[1]{\texttt{-{}-#1}}
\newcommand*{\shortarg}[1]{\shortargfmt{#1}%
- \index{texosquery options=\texttt{texosquery} options>#1=\protect\shortargfmt{-#1}|hyperpage}}
+ \index{texosquery options=\app{texosquery} options>#1=\protect\shortargfmt{-#1}|hyperpage}}
\newcommand*{\longarg}[1]{\longargfmt{#1}%
- \index{texosquery options=\texttt{texosquery} options>#1=\protect\longargfmt{#1}|hyperpage}}
+ \index{texosquery options=\app{texosquery} options>#1=\protect\longargfmt{#1}|hyperpage}}
\newenvironment{important}
{\begin{quote}\textbf{Important Note:}}
{\end{quote}}
+\newenvironment{definition}
+ {\begin{flushleft}\ttfamily}
+ {\end{flushleft}}
+
+\setcounter{secnumdepth}{2}
+
+\pdfstringdefDisableCommands{\renewcommand\meta[1]{#1}}
+
+\glssetcategoryattribute{abbreviation}{nohyperfirst}{true}
+
+\setabbreviationstyle[noexpand]{short}
+\newabbreviation[category=noexpand]{IETF}{IETF}{Internet Engineering Task Force}
+\newabbreviation[category=noexpand]{BCP}{BCP}{Best Common Practice}
+\newabbreviation[category=noexpand]{POSIX}{POSIX}{Portable Operating
+System Interface}
+\newabbreviation[category=noexpand]{CTAN}{CTAN}{Comprehensive \TeX\
+Archive Network}
+\newabbreviation[category=noexpand]{UTF}{UTF}{Unicode Transformation
+Format}
+\newabbreviation[category=noexpand]{ASCII}{ASCII}{American Standard
+Code for Information Interchange}
+\newabbreviation[category=noexpand]{ISO}{ISO}{International
+Organization for Standardization}
+
+\newabbreviation{OS}{OS}{operating system}
+\newabbreviation{JRE}{JRE}{Java Runtime Environment}
+\newabbreviation{CLDR}{CLDR}{Unicode Consortium's Common Locale Data Repository}
+
\begin{document}
\DocInput{texosquery.dtx}
\end{document}
@@ -64,204 +123,1604 @@
%\author{Nicola L. C. Talbot\\
%\href{http://www.dickimaw-books.com/}{\nolinkurl{dickimaw-books.com}}
%\and Paulo Cereda}
-%\date{2016-07-14 (v1.1)}
+%\date{2017-03-23 (v1.2)}
%\maketitle
%
%\begin{abstract}
-%\texttt{texosquery.jar} is a cross-platform Java application
-%to query certain OS information designed for use in \TeX's
-%shell escape mechanism.
-%The accompanying \TeX\ code provides a simple interface to the
-%\texttt{texosquery} Java application, which may be skipped
-%if you want to explicitly use \cs{input} (but take
-%care of any special characters appearing in the result).
+%The \sty{texosquery} bundle provides the \app{texosquery.jar} application (and
+%variations \app{texosquery-jre8.jar} and \app{texosquery-jre5.jar})
+%This is a cross-platform Java application to query certain
+%\gls{OS} and locale information. The application is
+%specifically designed for use within \TeX's shell escape mechanism,
+%through the \cs{TeXOSQuery} command provided by the \sty{texosquery} package
+%(\file{texosquery.tex} and \file{texosquery.sty}).
+%
+%The \cs{TeXOSQuery} command performs more than a simple piped input as it
+%first changes category codes of various problematic characters and locally
+%defines some short control sequences that are used in the application's result.
+%These commands aren't defined outside of \cs{TeXOSQuery}, so a
+%direct piped input may cause undefined control sequences. If you
+%really want to use this direct method rather than using
+%\cs{TeXOSQuery}, then you will need to run \app{texosquery} in
+%backward compatibility mode~0 or~1 (using \texttt{\longarg{compatible} 1}).
+%The first two versions of \app{texosquery} didn't use those short
+%commands.
%\end{abstract}
%
%\begin{important}
%You will need \TeX's shell escape enabled,
-%and you will also need the Java Runtime Environment (JRE)
-%installed to use \texttt{texosquery}.
+%and you will also need the \gls{JRE} installed.
%\end{important}
%
-%If you want to rebuild the application, instructions for
-%compiling the source code (including the code for this document)
-%are in the accompanying \texttt{README.md} file.
+%There are three variations of the \app{texosquery} application provided:
+%\begin{itemize}
+%\item \file{texosquery.jar}: requires at least Java~7, has medium locale
+%support, obeys \texttt{openin\_any} but has additional
+%restrictions imposed for security reasons (no listings outside the
+%current working directory path);
+%\item \file{texosquery-jre8.jar}: requires at least Java~8, has best locale
+%support, obeys \texttt{openin\_any} but has additional
+%restrictions imposed for security reasons (no listings outside the
+%current working directory path);
+%\item \file{texosquery-jre5.jar}: requires at least Java~5, has poor locale
+%support (language scripts not recognised), doesn't have the walk
+%action, obeys \texttt{openin\_any} but doesn't have the extra restrictions of the
+%Java 7 and 8 versions for the listing functions. Note that Java~5 and~6
+%are deprecated. Old deprecated versions are considered a security
+%risk.
+%\end{itemize}
+%The default is \file{texosquery.jar}. Throughout this document
+%\app{texosquery} is used to reference the application, regardless
+%which of these three jar files you've chosen to use. See
+%section~\ref{sec:setup} for further details.
+%
+%The aim of the original version of \app{texosquery} was to provide
+%a way of accessing the operating system's locale information.
+%Version 1.3 of the \sty{tracklang} package provides
+%\cs{TrackLangQueryEnv} which uses \app{kpsewhich} to query the
+%appropriate locale environment variable (such as \verb|$LANG|
+%or \verb|LC_ALL|). Unfortunately this doesn't work under Windows as
+%the locale information there is stored in the registry. The Lua
+%\texttt{os.setlocale(nil)} function can simply return \texttt{C} or
+%\texttt{POSIX}, which isn't helpful from \sty{tracklang}'s point of
+%view. Although Java has its drawbacks, it's one of the most
+%ubiquitous platform-independent methods to obtain this information.
+%Since it seemed overkill to write a Java application that simply
+%returned the locale, I decided to add a few extra functions that
+%might be of use, but accessing locale information was, and still
+%is, the primary purpose of this application.
+%
+%Although the \gls{POSIX} environment variables, such as
+%\verb|$LC_ALL|, are easy to read with \app{kpsewhich}, these days
+%the \gls{IETF} \gls{BCP}~47 language tag is the more appropriate way
+%of identifying a locale, so version 1.2 has added the \longarg{bcp47}
+%function to support this. The \sty{tracklang} package has similarly added
+%\cs{TrackLanguageTag}\marg{IETF tag}.
+%
+%The \sty{locale} package occasionally referenced in this document
+%is still under development at the time of writing. The
+%\longarg{numeric}, \longarg{locale-data}, \longarg{date-time} and
+%\longarg{time-zones} options are designed to
+%interface with the \sty{locale} package, so although
+%\sty{texosquery} and \sty{locale} will be distributed separately,
+%version 1.2 of \app{texosquery} is being
+%developed alongside version 1.0 of the \sty{locale} package.
+%The aim of the \sty{locale} package is to use both \sty{tracklang}
+%and \sty{texosquery} to automatically set up the document language.
+%For example, in the following \LaTeX\ document
+%\begin{verbatim}
+%\documentclass{article}
+%\usepackage{locale}
+%\begin{document}
+%Language: \CurrentLocaleLanguageNativeName.
+%Region: \CurrentLocaleRegionNativeName.
+%Today: \CurrentLocaleDate. (Compare with \today.)
+%Time: \CurrentLocaleTime.
+%Currency Symbol: \CurrentLocaleCurrency
+%Integer:
+%\texosqueryfmtnumber{\CurrentLocaleIntegerPattern}{123456}{0}{0}
+%Decimal:
+%\texosqueryfmtnumber{\CurrentLocaleDecimalPattern}{123456}{78}{0}
+%Percentage:
+%\texosqueryfmtnumber{\CurrentLocalePercentPattern}{0}{65}{0}
+%Currency:
+%\texosqueryfmtnumber{\CurrentLocaleCurrencyPattern}{1234567}{0}{0}
+%\end{document}
+%\end{verbatim}
+%the \sty{locale} package will automatically:
+%\begin{itemize}
+%\item load the \sty{textcomp} package for currency symbols (package
+%option \texttt{symbols=fontawesome} will use \sty{fontawesome}
+%instead);
+%\item if \XeLaTeX\ or \LuaLaTeX:
+% \begin{itemize}
+% \item load \sty{fontspec} (unless option \texttt{fontspec=false}
+% is used);
+% \item load \sty{polyglossia} and use \cs{setmainlanguage}
+% with options that can be determined from the language tag
+% (use package option \texttt{support=babel} to use \sty{babel}
+% regardless of the \LaTeX\ format);
+% \end{itemize}
+% otherwise:
+% \begin{itemize}
+% \item load \sty{inputenc} (default file encoding obtained from
+% \app{texosquery}'s \longarg{codeset-lcs} action);
+% \item load \sty{fontenc} (font encoding obtained using
+% \sty{tracklang} to query the language script);
+% \item load \sty{babel} with the appropriate language label (use
+% \texttt{support=none} to prevent this);
+% \end{itemize}
+%\item load \sty{datetime2} with the \texttt{useregional=text}
+%option (use \texttt{datetime2=false} to prevent this).
+%\end{itemize}
+%
+%The generic \texttt{locale.tex} code doesn't load the above packages, but can
+%still obtain information about the locale:
+%\begin{verbatim}
+%\input locale
+
+%Language: \CurrentLocaleLanguageNativeName.
+%Region: \CurrentLocaleRegionNativeName.
+%Today: \CurrentLocaleDate. (Compare with \today.)
+%Time: \CurrentLocaleTime.
+%Currency Symbol: \CurrentLocaleCurrency
+%Integer:
+%\texosqueryfmtnumber{\CurrentLocaleIntegerPattern}{123456}{0}{0}
+%Decimal:
+%\texosqueryfmtnumber{\CurrentLocaleDecimalPattern}{123456}{78}{0}
+%Percentage:
+%\texosqueryfmtnumber{\CurrentLocalePercentPattern}{0}{65}{0}
+%Currency:
+%\texosqueryfmtnumber{\CurrentLocaleCurrencyPattern}{1234567}{0}{0}
+%\bye
+%\end{verbatim}
%
+%So that's the reasoning behind the new v1.2 actions. Hopefully the
+%new \sty{locale} package will be uploaded to \gls{CTAN} shortly after the
+%new version of \sty{texosquery}.
+%
+%\clearpage
%\tableofcontents
+%\clearpage
%
%\section{texosquery.jar: the Java application}
-%The \texttt{texosquery} Java command line application looks up
+%The \app{texosquery} Java command line application looks up
%certain system information that may be of use in \TeX\
-%documents. All this information can easily be obtained using
+%documents. This information can be obtained using
%native commands, but the Java application allows an
-%OS-independent approach with results that can easily be
+%\gls{OS}-independent approach with results that can easily be
%captured by \TeX's shell-escape without having to strip
-%formatting information.
+%formatting information. It also uses control sequence markup to indicate
+%whether characters should be interpreted literally (such as in file names) or
+%if they should obey their current category code (such as
+%punctuation occurring in textual information) or if they should be
+%interpreted in some other way (such as pattern markup). This markup
+%is expanded by \cs{TeXOSQuery} when it performs the piped shell
+%escape.
%
%\begin{important}
-%\texttt{texosquery} provides read-only actions, and I don't
+%\app{texosquery} provides read-only actions, and I don't
%intend adding any actions that modify system settings or files.
%\end{important}
%
-%Since the application is designed to work with \TeX, each
-%function will display the result on a single line without
-%formatting. (For multiple results, each line is grouped
-%from v1.1.) A blank line (or empty group) will be displayed
-%if the information isn't available. A forward slash is always
-%used as a directory divider, regardless of the operating
-%system, so the result can be used, for example, in \cs{input} or
-%\cs{includegraphics}.
+%Since the application is designed to work with \TeX\ (through
+%\cs{TeXOSQuery} defined in \file{texosquery.tex}) each action (indicated
+%by a command line switch) will display the result on a single line.
+%For multiple results, each line is grouped. A blank line (or empty group)
+%will be displayed if the information isn't available or is prohibited.
+%A forward slash (\cs{fslh}) is always used as a directory divider,
+%regardless of the operating system, so the result can be used, for example,
+%in \cs{input} or \cs{includegraphics}.
+%
+%For example, I have a 64-bit Linux operating system installed on my
+%computer, so I could use \app{uname} in a bash terminal:
+%\begin{verbatim}
+%uname -o -r
+%\end{verbatim}
+%which (for me) produces:
+%\begin{verbatim}
+%4.1.13-100.fc21.x86_64 GNU/Linux
+%\end{verbatim}
+%I could also run \app{texosquery} directly from the bash terminal:
+%\begin{verbatim}
+%texosquery -o -r
+%\end{verbatim}
+%which produces the rather more cryptic:
+%\begin{verbatim}
+%{Linux}
+%{4\fdot 1\fdot 13\fhyn 100\fdot fc21\fdot x86\fusc 64}
+%\end{verbatim}
+%However \app{texosquery} isn't intended for this direct use. It's
+%intended for use with \cs{TeXOSQuery} provided by
+%\file{texosquery.tex}. Here's a plain \TeX\ document:
+%\begin{verbatim}
+%\input texosquery
+%\TeXOSQuery{\result}{-o -r}
+%\def\parseresult#1#2{OS Name: {\tt #1}. OS Version: {\tt #2}.}
+%\ifx\result\empty
+% Query failed!
+%\else
+% \expandafter\parseresult\result
+%\fi
+%\bye
+%\end{verbatim}
+%The markup commands, such as \cs{fusc}, are now converted to
+%literal characters with category code 12 (\qt{other}), so the
+%underscore isn't a problem. This document is now also platform independent
+%(as long as \app{texosquery} and a recent version of the \gls{JRE} are
+%installed). Unlike \app{uname}, \app{texosquery} also obeys the order of the
+%command line switches, which makes it easier to define the helper
+%command (\cs{parseresult} in the above) that processes the result.
+%
+%\subsection{Installation and Setup}
+%\label{sec:setup}
+%
+%Installation is best done through your \TeX\ package manager.
+%However if for some reason you need to install this package
+%manually the instructions are below. If you install through your
+%package manager, Windows users will probably find that the
+%\file{.jar} files have been converted to \file{.exe} (with the
+%\file{.bat} files omitted) and Unix-like users may find that the
+%bash scripts are missing the \file{.sh} extension (these are actually
+%symbolic links to the distributed \file{.sh} files). See
+%section~\ref{sec:setuptest} to test that the package has been
+%successfully installed.
+%
+%Even if you use your \TeX\ distribution's package manager to
+%install this package, you may still need to edit the
+%\file{texosquery.cfg} file (see step~\ref{itm:cfg} below). If you don't have write permission for
+%this file you can copy it to \meta{TEXMFHOME}\file{/tex/generic/texosquery/}
+%(that directory path may need to be created if it doesn't already
+%exist). You can find the correct value of \meta{TEXMFHOME} using
+%\begin{verbatim}
+%kpsewhich -var-value=TEXMFHOME
+%\end{verbatim}
+%You can find where the package manager has put \file{texosquery.cfg} using
+%\begin{verbatim}
+%kpsewhich texosquery.cfg
+%\end{verbatim}
+%
+%This bundle contains the following files:
+%\begin{itemize}
+%\item \file{texosquery.dtx}
+%
+%The DTX file contains the source code for this
+%document, and also the files:
+%\begin{itemize}
+%\item\file{texosquery.tex} (generic \TeX\ code)
+%\item\file{texosquery.sty} (\LaTeX\ package wrapper)
+%\item\file{texosquery.cfg} (configuration file)
+%\end{itemize}
+%The bash scripts (which will need the extensions removed):
+%\begin{itemize}
+%\item\file{texosquery-jre8.sh}
+%\item\file{texosquery.sh}
+%\item\file{texosquery-jre5.sh}
+%\end{itemize}
+%Windows batch files (which will need the extensions changed to
+%\file{.bat})
+%\begin{itemize}
+%\item\file{texosquery-jre8.batch}
+%\item\file{texosquery.batch}
+%\item\file{texosquery-jre5.batch}
+%\end{itemize}
+%
+%\item \file{texosquery.ins} The driver file used to extract all the
+%above files contained in \file{texosquery.dtx}.
+%
+%\item The three different versions of the \app{texosquery}
+%application: \file{texosquery-jre8.jar}, \file{texosquery.jar} and
+%\file{texosquery-jre5.jar}. The source code for these is contained in
+%the \file{java} sub-directory.
+%
+%\item \file{texosquery.pdf} This PDF document.
+%\item \file{README.md} The README file in markdown format.
+%\item \file{CHANGES} Lists major changes for each version.
+%\end{itemize}
+%
+%To install manually (\meta{TEXMF} indicates the TEXMF directory):
+%\begin{enumerate}
+%\item Run
+%\begin{verbatim}
+%tex texosquery.ins
+%\end{verbatim}
+%to extract the \file{.tex}, \file{.sty}, \file{.cfg}, \file{.sh}
+%and \file{.batch} files.
+%
+%\begin{description}
+%\item[Windows] Change the extension of the \file{.batch} files to
+%\file{.bat} (\TeX\ on Windows prohibits the creation of \file{.bat}
+%files). Move the \file{.bat} files to somewhere on
+%your system's path. (You may omit the \file{.bat} files you don't
+%need.) The \file{.sh} files may be deleted.
+%
+%\item[Unix-like] Make the \file{.sh} files executable:
+%\begin{verbatim}
+%chmod u+x texosquery*.sh
+%\end{verbatim}
+%Move the \file{.sh} files to somewhere on your path \emph{without} the
+%\file{.sh} extension. (If the \file{.sh} extension is retained, you
+%will have to edit the \file{texosquery.cfg} file to include it.)
+%For example (if \verb|~/bin| is included in \verb|$PATH|):
+%\begin{verbatim}
+%mv texosquery-jre8.sh ~/bin/texosquery-jre8
+%\end{verbatim}
+%(You may omit the \file{.sh} files you don't need.)
+%The \file{.batch} files may be deleted.
+%\end{description}
+%
+%\item Move \file{texosquery.tex} to
+%\meta{TEXMF}\file{/tex/generic/texosquery/}
+%
+%\item\label{itm:cfg} Edit \file{texosquery.cfg} so that \cs{TeXOSInvokerName} is
+%defined to the application of your choice. For example, if you have
+%Java 8 installed:
+%\begin{verbatim}
+%\def\TeXOSInvokerName{texosquery-jre8}
+%\end{verbatim}
+%Or if you only have Java 5 or 6 installed:
+%\begin{verbatim}
+%\def\TeXOSInvokerName{texosquery-jre5}
+%\end{verbatim}
+%You can find out your Java version by running the following in your
+%command prompt or terminal:
+%\begin{verbatim}
+%java -version
+%\end{verbatim}
+%If the version number starts with \texttt{1.8} then you have Java 8
+%installed, if it starts with \texttt{1.7} then you have Java 7,
+%etc.
+%
+%\item Move \file{texosquery.cfg} to
+%\meta{TEXMF}\file{/tex/generic/texosquery/}
+%\item Move \file{texosquery.sty} to
+%\meta{TEXMF}\file{/tex/latex/texosquery/}
+%\item Move the \file{.jar} files to
+%\meta{TEXMF}\file{/scripts/texosquery/}
+%\end{enumerate}
+%
+%\subsection{Installation Test}
+%\label{sec:setuptest}
+%
+%To test the installation:
+%\begin{enumerate}
+%\item In the
+%\href{http://www.dickimaw-books.com/latex/novices/html/terminal.html}{command
+%prompt or terminal} do:
+%\begin{verbatim}
+%texosquery -b
+%\end{verbatim}
+%(Replace \texttt{texosquery} with the command that matches the value
+%of \cs{TeXOSInvokerName} in the \hyperref[itm:cfg]{\file{texosquery.cfg} file}
+%described in section~\ref{sec:setup}.)
+%The above command should display the system's
+%default locale. For me, this simply displays the line:
+%\begin{verbatim}
+%en-GB
+%\end{verbatim}
+%If you get an \texttt{Unknown option
+%\textquotesingle-b\textquotesingle} error, then your \gls{OS} is
+%picking up an old version of \app{texosquery}. Check the version
+%number with the \shortarg{v} switch.
+%\begin{verbatim}
+%texosquery -v
+%\end{verbatim}
+%If you get a \qt{command not found} or \qt{bad command or file name} error,
+%then recheck the installation steps in section~\ref{sec:setup} and
+%make sure that the executable file has been placed on your system's
+%path.
+%
+%If this test is successful, try the next step.
+%\item Create the following plain \TeX\ document called \file{test.tex}:
+%\begin{verbatim}
+%\input texosquery
+%\TeXOSQuery{\result}{-b}\result
+%\bye
+%\end{verbatim}
+%and compile using:
+%\begin{verbatim}
+%pdftex --shell-escape test
+%\end{verbatim}
+%
+%Alternatively, create the follow \LaTeX\ document called
+%\file{test.tex}:
+%\begin{verbatim}
+%\documentclass{article}
+%\usepackage{texosquery}
+%\begin{document}
+%\TeXOSQuery{\result}{-b}\result
+%\end{document}
+%\end{verbatim}
+%and compile using:
+%\begin{verbatim}
+%pdflatex --shell-escape test
+%\end{verbatim}
+%
+%In both cases, the resulting PDF file \file{test.pdf} should show the default
+%locale. If not check the transcript \file{test.log} which should
+%include something like \verb"(|texosquery -b)" or \verb"(|texosquery-jre8 -b)"
+%etc. If it simply has the line:
+%\begin{verbatim}
+%TeXOSQuery: texosquery -b
+%\end{verbatim}
+%(or similar) then the dry run mode was on, which means the shell escape wasn't
+%used. Check that the \longarg{shell-escape} switch was used when
+%calling \app{pdftex} or \app{pdflatex}.
+%
+%If you are using \app{texosquery} or \app{texosquery-jre8} and your
+%chosen application has been added to the restricted list, make sure
+%that the line
+%\begin{verbatim}
+%\TeXOSQueryAllowRestricted
+%\end{verbatim}
+%hasn't been commented out in the \file{texosquery.cfg} file and try
+%the above example documents in restricted mode. (Note that
+%\app{texosquery-jre5} should not be added to the restricted list as
+%Java 5 and 6 are now deprecated and considered security risks, so
+%the above command should be commented out in the
+%\file{texosquery.cfg} file if \cs{TeXOSInvokerName} has been set to
+%\app{texosquery-jre5}.)
+%\end{enumerate}
%
+%\subsection{Accessing file information}
+%\label{sec:fileaccess}
%If an input file name is required (for example, with the
%\longargfmt{pdfdate} argument described below) then the file may be in
%the current working directory, relative to the current directory
%(with forward slash \texttt{/} as the directory divider), an absolute path
%(again with forward slash) or on \TeX's path (in
-%which case, \texttt{kpsewhich} is used to locate it).
+%which case, \app{kpsewhich} is used to locate it). As from version
+%1.2, \app{texosquery} honours the \texttt{openin\_any} attribute set in the
+%\file{texmf.cnf} configuration file. This value is fetched using
+%\begin{verbatim}
+%kpsewhich -var-value=openin_any
+%\end{verbatim}
+%(You can find the configuration files using \texttt{kpsewhich -a
+%texmf.cnf}) For example, suppose the file \file{/tmp/.test}
+%exists. If the \texttt{openin\_any} attribute is set to \qt{\texttt{a}}
+%(any file), then (assuming the operating system allows read-access
+%to that file) the \app{texosquery} file-reading operations will
+%be permitted. For example
+%\begin{verbatim}
+%texosquery --pdfdate /tmp/.test
+%\end{verbatim}
+%will return the file modification date in PDF date-time format. However, if
+%\texttt{openin\_any} is set to \qt{\texttt{r}} (restricted), the read
+%access will be denied because the file is considered hidden so an
+%empty result is returned. Similarly, if \texttt{openin\_any} is set
+%to \qt{\texttt{p}} (paranoid), the read access will be denied again
+%because the file is hidden but also because the file has an
+%absolute path that isn't under \texttt{\$TEXMFOUTPUT} (assuming
+%that environment variable hasn't been set to \file{/tmp}).
+%
+%\subsection{Return Values}
+%\label{sec:returnvalues}
+%The return values may include literal text where special characters
+%need to have their category code changed to 12 (for example, file names)
+%but the return values may also include \TeX\ code that needs to be
+%processed by \TeX, either during the shell escape or deferred for
+%later (such as date-time or numeric patterns). This means that the
+%result from the shell escape can't be automatically detokenized.
+%
+%Therefore, as from version 1.2, the return values include short
+%control sequences that are locally defined by \cs{TeXOSQuery} and
+%so are only valid within that command's scope. For example,
+%\cs{fcln} expands to a colon (\texttt{:}) with category code 12
+%whereas \cs{tcln} expands to a colon according to its current
+%meaning. Note that this has changed from earlier versions which
+%simply returned the actual characters, which may or may not have
+%had the category code set to 12 at the start of \cs{TeXOSQuery}. To
+%reproduce the original behaviour, use the compatibility mode
+%(\longarg{compatible}) with the level set to 0 or 1.
+%For the full list of shortcut commands, see the
+%definition of \hyperlink{enableshortcs}{\cs{@texosquery@enableshortcs}}.
+%
+%The output produced by the \app{texosquery} application
+%will be returned using the system's default input
+%encoding. (For example, \gls{UTF}-8.) You will need to ensure that your \TeX\
+%document uses the same encoding if you want to typeset any of the
+%results that may contain non-ASCII characters. You can determine
+%the default encoding with \texttt{texosquery \shortarg{C}}, which is
+%formatted to match the options used by the \sty{inputenc} package.
+%(For example, \texttt{uft8} for \gls*{UTF}-8.)
+%
+%To test the file encoding rerun the plain \TeX\ or \LaTeX\ test
+%file in section~\ref{sec:setuptest} with
+%\shortarg{N} instead of \shortarg{b}. Most currency symbols are
+%outside the ASCII set, so this should return a non-ASCII character.
+%If you happen to have \$ as your currency,
+%then try \texttt{en-GB} or \texttt{en-IE} which have \pounds\ and
+%\texteuro, respectively. \LaTeX\ users may need to load
+%\sty{inputenc} and \sty{fontenc}. \XeLaTeX\ and \LuaLaTeX\ users may need to load
+%\sty{fontspec}.
%
-%Command line invocation:
-%\begin{flushleft}\ttfamily
-%texosquery \meta{action} ...
-%\end{flushleft}
-%Available actions (at least one required):
+%You can change the default encoding by invoking the Java Virtual
+%Machine with the option \texttt{-Dfile.encoding=}\meta{codeset}.
+%For example, bash users can modify the \file{texosquery} (or
+%\file{texosquery.sh}) script to set the encoding to \gls*{UTF}-8 as follows:
+%\begin{verbatim}
+%#!/bin/sh
+%
+%jarpath=`kpsewhich --progname=texosquery --format=texmfscripts texosquery.jar`
+%java -Dfile.encoding=UTF-8 -jar "$jarpath" "$@"
+%\end{verbatim}
+%Similarly for the corresponding \file{.bat} file for Windows users.
+%
+%If the script file can't be modified or you have only \file{.exe}
+%instead of \file{.jar} files then you can set the
+%\href{https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#tooloptions}{\texttt{JAVA\_TOOL\_OPTIONS} environment variable}.
+%For example:
+%\begin{verbatim}
+%declare -x JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
+%\end{verbatim}
+%Note that, unlike the edit to the bash or \file{.bat} file, this will
+%affect all your Java applications.
+%
+%\subsection{Locales}
+%\label{sec:locales}
+%The options that have a locale identifier as an argument need the
+%identifier formatted as a \emph{regular}
+%\href{https://tools.ietf.org/html/bcp47}{IETF BCP 47 language tag} that uses
+%hyphens as separators. \gls{POSIX} style locales (with underscores
+%replaced by hyphens, for example \texttt{fr-BE.utf8@euro})
+%are only used as a return value in the \longarg{locale} and
+%\longarg{locale-lcs} options.
+%
+%\href{http://www.oracle.com/technetwork/java/javase/java8locales-2095355.html}{\textbf{Not
+%all locales are supported by Java.}}
+%For example, Irish is supported but Scottish and Welsh aren't supported by
+%the \gls{JRE}. The \gls{CLDR} can be accessed with Java~8, but
+%\href{http://openjdk.java.net/jeps/252}{the CLDR isn't
+%enabled by default}. It can be turned on using the system property
+%\texttt{java.locale.providers}, which may provide additional
+%support. For example, although Welsh isn't supported by the JRE,
+%it is supported with the \gls{CLDR}, so both Java~8 and the CLDR
+%locale provider are required for that language. The proposed
+%Java~9 should have the CLDR enabled by default.
+%
+%The bash script \file{texosquery-jre8} (or \file{texosquery-jre8.sh})
+%automatically sets \texttt{java.locale.providers} to \texttt{CLDR,JRE}.
+%Alternatively, the \texttt{JAVA\_TOOL\_OPTIONS} environment variable
+%can be set to
+%\begin{verbatim}
+%-Djava.locale.providers=CLDR,JRE
+%\end{verbatim}
+%which will enable it for all installed Java applications.
+%If you need to set multiple options, these can be combined
+%in the value of \texttt{JAVA\_TOOL\_OPTIONS}.
+%For example
+%\begin{verbatim}
+%-Djava.locale.providers=CLDR,JRE -Dfile.encoding=UTF-8
+%\end{verbatim}
+%
+%You may find that the results are different depending on the data
+%provider. For example with \texttt{java.locale.providers} set to
+%\texttt{JRE,CLDR} then
+%\begin{verbatim}
+%texosquery -D en-GB
+%\end{verbatim}
+%displays the long date in the form \qt{06 November 2016} and the
+%medium date in the form \qt{06-Nov-2016}, but with the ordering
+%reversed to \texttt{CLDR,JRE} (so that the \gls{CLDR} is queried first)
+%then the long date is now in the form \qt{6 November 2016} and the
+%medium date is in the form \qt{6 Nov 2016}.
+%
+%Note that \app{texosquery} can only access locale information
+%provided by Java. For example, Java currently doesn't
+%provide any methods to access telephone codes.
+%
+%\subsection{Command line invocation}
+%The syntax for the command line invocation of \app{texosquery}
+%is:
+%\begin{definition}
+%texosquery \oarg{options} \meta{action} ...
+%\end{definition}
+%The syntax for \app{texosquery-jre8} is exactly the same except
+%for the application name:
+%\begin{definition}
+%texosquery-jre8 \oarg{options} \meta{action} ...
+%\end{definition}
+%Similarly for \app{texosquery-jre5}. (Bash users may need the
+%\file{.sh} extension if it wasn't removed from the script name
+%during the \hyperref[sec:setup]{installation setup}.) Available actions are
+%described below. At least one action is required.
+%
+%Available options (must come before actions):
%\begin{description}
-%\item[\shortarg{L} or \longarg{locale}] Display the locale
-%information in the form
-%\begin{flushleft}\ttfamily
+%\item[\shortarg{h} or \longarg{help} or \shortarg{help}] Displays help message and
+%exits.
+%\item[\shortarg{v} or \longarg{version} or \shortarg{version}] Displays version
+%information and exits.
+%\item[\longarg{nodebug}] No debugging information. Only command
+%line syntax errors are written to STDERR. (Default.)
+%\item[\longarg{debug} \oarg{n} or \shortarg{debug} \oarg{n}] Set the debugging level, where
+%\meta{n} is a non-negative integer.
+%If \meta{n} is omitted, 3 is assumed. If \meta{n} is 0, then
+%debugging information is suppressed (equivalent to
+%\longarg{nodebug}). If \meta{n} $\geq 1$, error messages are
+%written to STDERR. If \meta{n} $\geq 2$, any exceptions encountered
+%will additionally write the stack trace to STDERR. If \meta{n}
+%$\geq 3$ non-error informational messages are included.
+%\item[\longarg{compatible} \meta{n} or \shortarg{compat} \meta{n}]
+%Set the compatibility mode.
+%The argument should be either a non-negative integer (0 for version
+%1.0, 1 for version 1.1, etc) or the keyword \texttt{latest} to
+%indicate the latest version (default). Note that the compatibility
+%mode only affects the available actions and the display style of the
+%result, and does not change security features. For example, the check for the
+%\texttt{openin\_any} setting was only introduced to version 1.2, but this
+%is still checked even if the compatibility mode is set to 0 or 1.
+%\end{description}
+%
+%If multiple actions are given, they will be processed in the
+%order specified in the command line invocation. Each result will
+%be displayed on a separate line. As from v1.1, if there are
+%multiple actions, each result will be grouped. This makes it easier
+%to process the results in \TeX. For example:
+%\begin{verbatim}
+%texosquery -l
+%\end{verbatim}
+%This just produces (for me):
+%\begin{verbatim}
+%en\fhyn GB\fdot utf8
+%\end{verbatim}
+%(which expands to \texttt{en-GB.utf8} when used with \cs{TeXOSQuery}) whereas
+%\begin{verbatim}
+%texosquery -l -o
+%\end{verbatim}
+%produces:
+%\begin{verbatim}
+%{en\fhyn GB\fdot utf8}
+%{Linux}
+%\end{verbatim}
+%To reproduce the v1.0 display use \longarg{compatible}\texttt{ 0}.
+%(This will also explicitly use the punctuation characters rather
+%than replacing them with the control sequence markup, such as
+%\cs{fhyn} or \cs{fdot}.)
+%
+%Note that unavailable information will produce an empty group.
+%For example (assuming \file{nofile} doesn't exist or doesn't have
+%read access):
+%\begin{verbatim}
+%texosquery -l -d nofile
+%\end{verbatim}
+%produces:
+%\begin{verbatim}
+%{en\fhyn GB\fdot utf8}
+%{}
+%\end{verbatim}
+%whereas
+%\begin{verbatim}
+%texosquery -d nofile
+%\end{verbatim}
+%just displays an empty line.
+%
+%If you're puzzled as to why an empty line has been returned, try
+%rerunning the command with \longarg{debug} for further information.
+%Available actions are listed below.
+%
+%\subsubsection{Action \shortarg{b} or \longarg{bcp47}}
+%(New to version 1.2.) This action displays the \gls{BCP}~47 language tag.
+%For example, my locale is \texttt{en-GB} (English in the United
+%Kingdom), so
+%\begin{verbatim}
+%texosquery -b
+%\end{verbatim}
+%Simply returns:
+%\begin{verbatim}
+%en\fhyn GB
+%\end{verbatim}
+%(which expands to \texttt{en-GB} with \cs{TeXOSQuery})
+%whereas a user whose default locale is set to Swiss German with the
+%new orthography would get:
+%\begin{verbatim}
+%de\fhyn CH\fhyn 1996
+%\end{verbatim}
+%(which expands to \texttt{de-CH-1996} with \cs{TeXOSQuery}).
+%
+%\subsubsection{Action \shortarg{L} or \longarg{locale}}
+%
+%This action displays the locale information in the \gls{POSIX} form
+%\begin{definition}
%\meta{lang}-\meta{region}.\meta{codeset}@\meta{modifier}
-%\end{flushleft}
-%where \meta{lang} is the ISO code for the language (e.g.\
+%\end{definition}
+%where \meta{lang} is the \gls{ISO} code for the language (e.g.\
%\texttt{en}),
%\meta{region} is the ISO code for the region (e.g.\ \texttt{GB}),
%\meta{codeset} is the default code set (e.g.\ \texttt{UTF-8})
% and \meta{modifier} is the modifier. Elements may be omitted
% if unavailable. For example, \texttt{en-GB.UTF-8} has the
% \meta{modifier} omitted, and \texttt{en} has all but the language
-% omitted.
-%\item[\shortarg{l} or \longarg{locale-lcs}] As the above but the
-%codeset (if present) is converted to lower case and any hyphens are
-%stripped. For example, if \longargfmt{locale} returns
-%\texttt{en-GB.UTF-8}, then \longargfmt{locale-lcs} would return
-%\texttt{en-GB.utf8}.
-%\item[\shortarg{c} or \longarg{cwd}] Displays the current working
-%directory.
-%\item[\shortarg{m} or \longarg{userhome}] Displays the user's home
-%directory.
-%\item[\shortarg{t} or \longarg{tmpdir}] Displays the temporary
-%directory.
-%\item[\shortarg{o} or \longarg{osname}] Displays the operating
-%system name.
-%\item[\shortarg{r} or \longarg{osversion}] Displays the operating
-%system version.
-%\item[\shortarg{a} or \longarg{osarch}] Displays the operating
-%system architecture.
-%\item[\shortarg{n} or \longarg{pdfnow}] Displays the current
-% date and time in PDF format. For example
+% omitted. As above, the punctuation characters will actually be
+% returned using the control sequences \cs{fhyn} (hyphen), \cs{fdot}
+% (dot) and \cs{fatc} (at).
+%
+%\subsubsection{Action \shortarg{l} or \longarg{locale-lcs}}
+%
+%This action is similar to \longarg{locale}, but the codeset is converted to
+%lower case and any hyphens are stripped. For example, if \longargfmt{locale}
+%returns \texttt{en-GB.UTF-8}, then \longargfmt{locale-lcs} would return
+%\texttt{en-GB.utf8}. As above, the punctuation characters will actually be
+% returned using the control sequences \cs{fhyn} (hyphen), \cs{fdot}
+% (dot) and \cs{fatc} (at).
+%
+%\subsubsection{Action \shortarg{C} or \longarg{codeset-lcs}}
+%
+%(New to version 1.2.)
+%This action returns just the codeset converted to lower case with hyphens
+%stripped. For example, my default file encoding is \gls{UTF}-8, so
%\begin{verbatim}
-%D:20160704131006+01'00'
+%texosquery -C
%\end{verbatim}
-%Note that some, but not all, \TeX\ formats provide
+%returns
+%\begin{verbatim}
+%utf8
+%\end{verbatim}
+%This action is used by the \sty{locale} package to determine the
+%option to use when it needs to automatically load the
+%\sty{inputenc} package.
+%
+%\subsubsection{Action \shortarg{o} or \longarg{osname}}
+%
+%This action displays the operating system name. For example, for me this
+%produces:
+%\begin{verbatim}
+%Linux
+%\end{verbatim}
+%
+%\subsubsection{Action \shortarg{r} or \longarg{osversion}}
+%
+%This action displays the operating system version. For example, for me this
+%produces:
+%\begin{verbatim}
+%4\fdot 1\fdot 13\fhyn 100\fdot fc21\fdot x86\fusc 64
+%\end{verbatim}
+%(which expands to \texttt{4.1.13-100.fc21.x86\_64} when used with
+%\cs{TeXOSQuery}).
+%
+%\subsubsection{Action \shortarg{a} or \longarg{osarch}}
+%
+%This action displays the operating system architecture. For example, for me
+%this produces:
+%\begin{verbatim}
+%amd64
+%\end{verbatim}
+%
+%\subsubsection{Action \shortarg{M} or \longarg{date-time}}
+%(New to version 1.2.)
+%This action displays all the current date time data in a format
+%suitable for use in \cs{texosqueryfmtdatetime}. (See
+%section~\ref{sec:applydatetimepatterns}.)
+%
+%\subsubsection{Action \shortarg{Z} \oarg{locale} or
+%\longarg{time-zones} \oarg{locale}}
+%(New to version 1.2.)
+%This action displays all of the time zone mappings
+%for the given locale (or the default if \meta{locale} is omitted) in the format
+%\begin{definition}
+%\{\marg{id$_1$}\marg{short name}\marg{long
+%name}\marg{dst short name}\marg{dst long name}\}\ldots
+%\{\marg{id$_{n}$}\marg{short name}\marg{long
+%name}\marg{dst short name}\marg{dst long name}\}
+%\end{definition}
+%The \meta{id} is the unique label used by Java to identify the time
+%zone (such as \texttt{Europe/London}) as used in the time zone
+%information returned by \shortarg{M} (\longarg{date-time}).
+%
+%\subsubsection{Action \shortarg{n} or \longarg{pdfnow}}
+%
+%This action displays the current date and time in PDF format. For example
+%\begin{verbatim}
+%\pdfd \fcln 20160704131006\fpls 01\fapo 00\fapo
+%\end{verbatim}
+%This uses the shorthand tags \cs{pdfd}, \cs{fcln}, \cs{fpls} and
+%\cs{fapo} that
+%are locally redefined by
+%\cs{TeXOSQuery} to produce a \texttt{D}, a colon (\texttt{:}), a
+%plus sign (\texttt{+}) and an apostrophe (\texttt{\textquotesingle})
+%with the category code set to 12 to make it consistent with
+%\cs{pdfcreationdate}. This also allows
+%for situations where the punctuation characters have been made
+%active (for example, through \sty{babel}).
+%
+%Some, but not all, \TeX\ formats provide
%\cs{pdfcreationdate}, which is more efficient than using the shell
%escape, but this can be used
%as a fallback method for those that don't (for example, \XeTeX).
-%\item[\shortarg{d} \meta{file} or \longarg{pdfdate} \meta{file}]
-% Displays the last modified time stamp of the given file in PDF format or a blank line
+%
+%Note that versions 1.0 and 1.1 didn't use \cs{pdfd} etc but simply used
+%the actual characters. For example:
+%\begin{verbatim}
+%D:20160704131006+01'00'
+%\end{verbatim}
+%If you want to reproduce this format, use \longarg{compatible}
+%with the level set to 0 or 1.
+%
+%\subsubsection{Action \shortarg{d} \meta{file} or \longarg{pdfdate}
+%\meta{file}}
+%
+%This action displays the last modified time stamp of the given file in PDF format or a blank line
% if the file doesn't exist or the file permissions prohibit this
% action.
%Again some, but not all, \TeX\ formats provide
%\cs{pdffilemoddate}\marg{file}, which is more efficient than using
%the shell escape.
-%\item[\shortarg{s} \meta{file} or \longarg{filesize} \meta{file}]
-% Displays the size in bytes of the given file or a blank line
-% if the file doesn't exist or the file permissions prohibit this
-% action.
-%Some, but not all, \TeX\ formats provide
+%
+%As with \longarg{pdfnow} this now uses \cs{pdfd} etc which are converted
+%by \cs{TeXOSQuery} to characters with the category code set to 12.
+%
+%This action obeys the \texttt{openin\_any} setting, so if access to
+%\meta{file} is forbidden by this setting, the result will be empty.
+%
+%\subsubsection{Action \shortarg{s} \meta{file} or \longarg{filesize}
+%\meta{file}}
+%
+%This action displays the size in bytes of the given file or an
+%empty string if the file doesn't exist or the file permissions prohibit this
+%action. Some, but not all, \TeX\ formats provide
%\cs{pdffilesize}\marg{file}, which is more efficient than using
%the shell escape.
-%\item[\shortarg{i} \meta{sep} \meta{dir} or \longarg{list}
-%\meta{sep} \meta{dir}]
-%List all files in the given directory with the output on a single
+%
+%This action obeys the \texttt{openin\_any} setting, so if access to
+%\meta{file} is forbidden by this setting, the result will be empty.
+%
+%\subsubsection{Action \shortarg{c} or \longarg{cwd}}
+%
+%This action displays the current working directory. This obeys the
+%\texttt{openin\_any} setting, so this action will return an empty
+%string if this file information is forbidden by that setting.
+%
+%\subsubsection{Action \shortarg{m} or \longarg{userhome}}
+%
+%This action displays the user's home directory. This obeys the
+%\texttt{openin\_any} setting, so this action will return an empty
+%string if this file information is forbidden by that setting.
+%
+%\subsubsection{Action \shortarg{t} or \longarg{tmpdir}}
+%
+%This action displays the temporary directory. This obeys the
+%\texttt{openin\_any} setting, so this action will return an empty
+%string if this file information is forbidden by that setting.
+%
+%\subsubsection{Action \shortarg{i} \meta{sep} \meta{dir} \oarg{sort} or \longarg{list}
+%\meta{sep} \meta{dir} \oarg{sort}}
+%
+%This action lists all files in the given directory with the output on a single
%line using \meta{sep} as the separator between entries. Note that
%the list doesn't include the full path, just the file names.
-%\item[\shortarg{f} \meta{sep} \meta{regex} \meta{dir} or
-%\longarg{filterlist} \meta{sep} \meta{regex} \meta{dir}]
-%Like the above but only lists those files whose name matches the
-%regular expression given in \meta{regex}. Note that this tests for a
-%complete match on the file name (not including path). For example,
+%
+%\begin{important}
+%As from v1.2, new restrictions have been placed on the value of \meta{dir}
+%for security reasons. For all three applications,
+%\app{texosquery-jre8}, \app{texosquery} and \app{texosquery-jre5},
+%the \texttt{openin\_any} setting is checked. If read access to
+%\meta{dir} is forbidden by the \texttt{openin\_any} setting, then
+%this action returns an empty string. \emph{Additionally},
+%regardless of \texttt{openin\_any}, the more restrictive
+%applications, \app{texosquery-jre8} and \app{texosquery}, prohibit a
+%value of \meta{dir} that's outside the current working directory
+%path (e.g.\ \texttt{..}) or that has no parent directory (e.g.\ \texttt{/}).
+%Both \app{texosquery-jre8} and \app{texosquery} check the
+%\emph{canonical path} of \meta{dir}, so if \meta{dir} is a symbolic
+%link, the target path is checked.
+%
+%This is a security feature to prevent
+%any malicious code that might try to recursively list the contents
+%of the entire filing system, which would hog resources, or that
+%might try to discover files outside the current working directory. An
+%exception is made for \app{texosquery-jre5} since that application
+%is already considered insecure (due to Java 5 and 6 being
+%deprecated), so if you really need \meta{dir} as, say \texttt{..} (the
+%parent directory) or \texttt{/} (the root directory), you can use
+%\app{texosquery-jre5} (by redefining \cs{TeXOSInvokerName} before
+%using \cs{TeXOSQuery}) although this isn't recommended. It will
+%still obey the \texttt{openin\_any} setting, so the listing still
+%won't work with \app{texosquery-jre5} if the \texttt{openin\_any}
+%setting is set to \texttt{p} (paranoid).
+%\end{important}
+%
+%As from version 1.2, there is now an optional argument \meta{sort},
+%which indicates how the returned list should be sorted. If omitted
+%\texttt{default} is assumed. Available values of \meta{sort}:
+%\begin{description}
+%\item[\texttt{default}] Use the default order. This is typically in
+%alphabetical order, but depends on the operating system or
+%\gls{JRE}.
+%\item[\texttt{date-ascending}] Order by file modified date from
+%oldest to newest. This option has synonyms \texttt{date} and
+%\texttt{date-asc}.
+%\item[\texttt{date-descending}] Order by file modified date from
+%newest to oldest. You may use the shorter \texttt{date-des}
+%value instead.
+%\item[\texttt{size-ascending}] Order by file size from
+%smallest to largest. This option has synonyms \texttt{size} and
+%\texttt{size-asc}.
+%\item[\texttt{size-descending}] Order by file size from
+%largest to smallest. You may use the shorter \texttt{size-des}
+%value instead.
+%\item[\texttt{name-ascending}] Order by file name (case-sensitive)
+%alphabetically. This option has synonyms \texttt{name} and
+%\texttt{name-asc}.
+%\item[\texttt{name-descending}] Order by file name (case-sensitive)
+%in reverse alphabetic order. You may use the shorter
+%\texttt{name-des} value instead.
+%\item[\texttt{iname-ascending}] Order by file name (case-insensitive)
+%alphabetically. This option has synonyms \texttt{iname} and
+%\texttt{iname-asc}.
+%\item[\texttt{iname-descending}] Order by file name (case-insensitive)
+%in reverse alphabetic order. You may use the shorter
+%\texttt{iname-des} value instead.
+%\item[\texttt{ext-ascending}] Order by file extension (case-sensitive)
+%alphabetically. If files have the same extension, they are ordered
+%by name. This option has synonyms \texttt{ext} and
+%\texttt{ext-asc}.
+%\item[\texttt{ext-descending}] Order by file extension (case-sensitive)
+%in reverse alphabetic order. If files have the same extension, they are
+%ordered by name (reverse alphabetic order). You may use the shorter
+%\texttt{ext-des} value instead.
+%\end{description}
+%
+%This action obeys the \texttt{openin\_any} setting for all the
+%listed files as well as for the directory \meta{dir}, so if access to
+%a file in the directory is forbidden, the file will be omitted from
+%the list. (This action is equivalent to the following with
+%\meta{regex} set to \texttt{.*} to match all files.)
+%
+%If you want to excluded hidden dot files (where they aren't
+%automatically excluded by \texttt{openin\_any}), use the
+%\longarg{filterlist} action described below with \meta{regex} set
+%to \verb|[^\.].*|. (Remember that you'll need to use \cs{string}
+%when using the shell escape, as noted below.)
+%
+%\begin{important}
+%Unlike most of the return values the \meta{sep} part here isn't
+%escaped, so take care if \meta{sep} contains any commands. For
+%example, if you want to use \verb|\\| as the separator, you'll need
+%to use \verb|\string\noexpand\string\\| in the \meta{sep} part
+%within \cs{TeXOSQuery}.
+%\end{important}
+%
+%For example:
+%\begin{verbatim}
+%\TeXOSQueryFileList{\result}{\string\noexpand\string\\}{.}
+%\end{verbatim}
+%calls (through the shell escape):
+%\begin{verbatim}
+%texosquery -i '\noexpand\\' '.'
+%\end{verbatim}
+%(the two \cs{string} commands have detokenized their arguments)
+%so \app{texosquery} uses \verb|\noexpand\\| as the separator in the
+%returned list, but this list is expanded as it's read in. However
+%\cs{noexpand} prevents the \verb|\\| from being expanded, so the
+%separator becomes just \verb|\\| which may be (re)defined before the
+%resulting list is processed.
+%
+%Note that \cs{TeXOSQueryFileList} automatically adds the single
+%quotes around the arguments. If \cs{TeXOSQuery} is used explicitly,
+%these quotes would need to be added as appropriate.
+%
+%\subsubsection{Action \shortarg{id} \meta{sep} \meta{dir}
+%\oarg{sort} or \longarg{list-dir}
+%\meta{sep} \meta{dir} \oarg{sort}}
+%
+%This action is like \longarg{list} but only includes sub-directories
+%of \meta{dir}. The caveats and security notes for \longarg{list} also apply
+%here.
+%
+%\subsubsection{Action \shortarg{ir} \meta{sep} \meta{dir}
+%\oarg{sort} or \longarg{list-regular}
+%\meta{sep} \meta{dir} \oarg{sort}}
+%
+%This action is like \longarg{list} but only includes regular files.
+%The caveats and security notes for \longarg{list} also apply here.
+%
+%\subsubsection{Action \shortarg{f} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort} or \longarg{filterlist} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort}}
+%
+%This action is like \longarg{list} but only lists those files whose name
+%matches the
+%\href{http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html}{regular expression} given in \meta{regex}. Note that
+%since this uses Java's \texttt{String.matches} method this tests for a
+%\emph{complete} match on the file name (not including directory path). For example,
%if \meta{regexp} is \texttt{foo.*}, it will only match files whose
%name starts with \texttt{foo} (for example, \texttt{foobar} will
-%match but \texttt{barfoo} won't).
-%\item[\shortarg{u} \meta{file} or \longarg{uri} \meta{file}]
-%Displays the URI of the given file or a blank line if the file
-%doesn't exist or the file permissions prohibit this action.
-%Note that this may include in a percent character in the result. The \TeX\
-%command \cs{TeXOSQuery} protects against this by changing the
-%category code, but if you explicitly call \texttt{texosquery}
-%using the shell escape, you'll need to be careful of this.
-%\item[\shortarg{p} \meta{file} or \longarg{path} \meta{file}]
-%Displays the canonical path of the given file or a blank line if
-%the file doesn't exist or the file permissions prohibit this
-%action.
-%\item[\shortarg{e} \meta{file} or \longarg{dirname} \meta{file}]
+%match but \texttt{barfoo} won't). Use \texttt{.*foo.*} to match all
+%files that contain \texttt{foo} in the name (so \texttt{foobar} and
+%\texttt{barfoo} will both match).
+%
+%\begin{important}
+%You can't have an empty regular expression. You can use the regular
+%expression \texttt{.*} to match all files (which is what
+%\longarg{list} does).
+%\end{important}
+%
+%As from version 1.2, this action now has an optional argument
+%\meta{sort}, which indicates how to sort the returned list. The
+%available values for \meta{sort} are the same as for
+%\longarg{list}, described above.
+%
+%The caveats and security notes for \longarg{list} also apply here.
+%
+%\subsubsection{Action \shortarg{fd} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort} or \longarg{filterlist-dir} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort}}
+%
+%This action is like \longarg{filterlist} but only includes
+%sub-directories of \meta{dir}.
+%
+%The caveats and security notes for \longarg{list} also apply here.
+%
+%\subsubsection{Action \shortarg{fr} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort} or \longarg{filterlist-regular} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort}}
+%
+%This action is like \longarg{filterlist} but only includes
+%regular files.
+%
+%The caveats and security notes for \longarg{list} also apply here.
+%
+%\subsubsection{Action \shortarg{w} \meta{sep} \meta{regex} \meta{dir}
+%\oarg{sort} or \longarg{walk}
+%\meta{sep} \meta{regex} \meta{dir} \oarg{sort}}
+%
+%(New to version 1.2. Not available with \app{texosquery-jre5}.)
+%
+%This action starts from the directory \meta{dir} \emph{which must
+%be on the current working directory's path} and returns a list
+%separated by \meta{sep} of all the regular files whose basename matches
+%the regular expression \meta{regex} (as for the filtered file
+%listings described above), recursively descending
+%sub-directories. Any files or sub-directories that are hidden, unreadable
+%or symbolic links are skipped. The list is sorted
+%according to \meta{sort}, which is as for the file listing actions
+%described above. Note that \meta{dir} is first converted to its
+%canonical path, so if \meta{dir} is a symbolic link, the
+%security check will test if the \emph{target} path is on the
+%current working directory path.
+%
+%As with the above file listings, the separator \meta{sep} isn't
+%escaped so take care if \meta{sep} contains any commands. The
+%resulting list will consist of paths relative to \meta{dir}.
+%
+%\begin{important}
+%This action requires at least Java 7 so it's not available with
+%\file{texosquery-jre5.jar}.
+%\end{important}
+%
+%\subsubsection{Action \shortarg{u} \meta{file} or \longarg{uri}
+%\meta{file}}
+%
+%This action displays the URI of the given file or an empty string if the file
+%doesn't exist or if the file permissions or the
+%\texttt{openin\_any} setting prohibit read access.
+%
+%\subsubsection{Action \shortarg{p} \meta{file} or \longarg{path}
+%\meta{file}}
+%
+%This action displays the canonical path of the given file or an
+%empty string if the file doesn't exist or if the file permissions
+%or the \texttt{openin\_any} setting prohibit this action.
+%
+%\subsubsection{Action \shortarg{e} \meta{file} or \longarg{dirname}
+%\meta{file}}
+%
%(New to v1.1.)
-%Displays the canonical path of the given file's parent (that is, the
-%directory containing \meta{file}) or a blank line if
-%the file doesn't exist or the file permissions prohibit this
+%This action displays the canonical path of the given file's parent (that is, the
+%directory containing \meta{file}) or an empty string if
+%the file doesn't exist or if the file permissions or the
+%\texttt{openin\_any} setting prohibits this
%action. Note that this is different to the Unix-like
-%\texttt{dirname} command, which will return a relative path if
+%\app{dirname} command, which will return a relative path if
%\meta{file} isn't an absolute path.
-%\item[\shortarg{h} or \longarg{help}] Displays help message and
-%exits.
-%\item[\shortarg{v} or \longarg{version}] Displays version
-%information and exits.
-%\end{description}
%
-%If multiple options are given, they will be processed in the
-%order specified in the command line invocation. Each result will
-%be displayed on a separate line. As from v1.1, if there are
-%multiple actions, each result will be grouped. This makes it easier
-%to process the results in \TeX. For example:
+%\subsubsection{Action \shortarg{N} \oarg{language tag} or \longarg{numeric}
+%\oarg{language tag}}
+%
+%(New to v1.2.) This action displays:
+%\begin{definition}
+%\marg{locale tag}\marg{group sep}\marg{decimal sep}\marg{exp
+%sep}\marg{use group}\marg{currency code}\marg{regional currency
+%code}\marg{currency sym}\marg{\TeX\ currency}\marg{currency sep}
+%\end{definition}
+%for the \meta{language tag} given in the optional argument. If omitted, the
+%default locale is assumed. The returned values are:
+%\begin{itemize}
+%\item \meta{tag} the language tag.
+%\item \meta{group sep} the numeric group separator.
+%\item \meta{decimal sep} the decimal separator.
+%\item \meta{exp sep} the exponent separator.
+%\item \meta{use group} \texttt{1} if the locale uses number
+%grouping otherwise \texttt{0}.
+%\item \meta{currency code} the ISO 4217 currency code.
+%\item \meta{regional currency code} either the ISO 4217 currency
+%code or an unofficial code. The only unofficial codes returned are:
+%GGP (Guernsey pound), JEP (Jersey pound), IMP (Isle of Man
+%pound), KID (Kiribati dollar) and TVD (Tuvaluan dollar).
+%\item \meta{currency sym} the currency symbol. (This may sometimes be
+%the same as \meta{currency code}.) Non-ASCII characters will be
+%marked up with \cs{twrp} (see below).
+%\item \meta{\TeX\ currency} the currency symbol using \TeX\ code
+%provided by \sty{texosquery}.
+%This is obtained by substituting known Unicode
+%currency symbols occurring in \meta{currency sym} with
+%\cs{texosquerycurrency}\marg{xxx}, which expands to the control
+%sequence given by the name \texttt{texosquerycurrency}\meta{xxx}.
+%These commands are defined in \file{texosquery.tex}. Since there are no generic \TeX\ commands
+%available for all these symbols (except \$), these commands will need to be
+%redefined as appropriate but are provided in the event that there's
+%no UTF-8 support. There is a limited check for some known currency
+%commands, such as \cs{texteuro} or \cs{euro}, but if an appropriate
+%currency command can't be found, the
+%\cs{texosquerycurrency}\meta{xxx} commands will be defined to
+%simply the currency label (usually the same as the \meta{xxx}
+%part).
+%
+%\item \meta{currency sep} the currency decimal separator.
+%\end{itemize}
+%The language tag should conform to \gls{IETF} \gls{BCP}~47. See
+%\url{http://docs.oracle.com/javase/8/docs/api/java/util/Locale.html}
+%for further details. If you are using \app{texosquery-jre5},
+%only the language, region and variant elements will be recognised
+%since the language tag support was introduced in Java~7.
+%
+%For example:
%\begin{verbatim}
-%texosquery -l
+%texosquery -N en-GB
%\end{verbatim}
-%This just produces (for me):
+%produces
%\begin{verbatim}
-%en-GB.utf8
+%{en-GB}{,}{.}{E}{1}{GBP}{GBP}{\twrp{£}}{\texosquerycurrency{pound}}{.}
%\end{verbatim}
-%whereas
+%The \cs{twrp} command is used by \app{texosquery} to markup a
+%non-\gls{ASCII} character. This command is one of the shorthands only
+%defined within \cs{TeXOSQuery}. In this case it's a shortcut for
+%the command \cs{texosquerynonasciiwrap}. By default this just does its
+%argument, but it may be redefined to perform some other action such
+%as converting from one encoding to another.
+%
+%In most cases the \meta{regional currency code} will be the same
+%as \meta{currency} code. A few non-ambiguous unofficial codes
+%are known by \app{texosquery} and may be used if the country code
+%is recognised. For example,
%\begin{verbatim}
-%texosquery -l -n
+%texosquery -N en-IM
%\end{verbatim}
-%produces:
+%produces
%\begin{verbatim}
-%{en-GB.utf8}
-%{D:20160714112732+01'00'}
+%{en-IM}{,}{.}{E}{1}{GBP}{IMP}{M\twrp{£}}{M\texosquerycurrency{pound}}{.}
%\end{verbatim}
-%Note that unavailable information will produce an empty group.
-%For example (assuming \texttt{nofile} doesn't exist):
+%
+%If Java doesn't support the given locale, the currency code will
+%appear as \texttt{XXX} with the symbol \textcurrency\ (generic
+%currency sign).
+%
+%\begin{important}
+%This option and the following (\longarg{locale-data}) are best used
+%with \XeTeX\ or \LuaTeX\ to deal with the non-\gls{ASCII} characters.
+%Make sure the file encoding used by Java matches the \TeX\ file.
+%\end{important}
+%
+%(See section~\ref{sec:locales} for the difference in locale
+%providers.)
+%
+%\subsubsection{Action \shortarg{D} \oarg{language tag} or
+%\longarg{locale-data} \oarg{language tag}}
+%
+%(New to v1.2.) This action provides more
+%extensive information than \longarg{numeric}.
+%The result has nested groups to assist parsing.
+%Again the \meta{language tag} may be omitted. For example,
%\begin{verbatim}
-%texosquery -l -d nofile -n
+%texosquery --locale-data
%\end{verbatim}
-%produces:
+%For the default locale or
%\begin{verbatim}
-%{en-GB.utf8}
-%{}
-%{D:20160714112732+01'00'}
+%texosquery --locale-data en-GB
%\end{verbatim}
-%whereas
+%for the locale identified by \texttt{en-GB}.
+%As with all the other actions, the result is written to STDOUT on a
+%single line. Its overall length and the use of the shortcut
+%commands used by \app{texosquery} to markup certain elements mean
+%that it's not particularly human-readable, but it's designed to be
+%easy for \TeX\ to interpret. The information is returned in the
+%following format:
+%\begin{definition}
+%\marg{locale block}\marg{current date block}\marg{date pattern
+%block}\marg{current time block}\allowbreak\marg{time pattern
+%block}\marg{current date time block}\marg{date time pattern block}\marg{days
+%of the week block}\marg{abbreviated dates of the week
+%block}\marg{month names block}\marg{abbreviated month names
+%block}\marg{standalone days of the week block}\marg{abbreviated
+%standalone days of the week block}\marg{standalone month names
+%block}\marg{abbreviated standalone month names block}\marg{numeric
+%block}\marg{numeric patterns block}
+%\end{definition}
+%There may seem to be some repetition here with the month and week
+%day names, but with \app{texosquery-jre8}, the second set are the
+%standalone version (for example, for a column header). In some
+%languages, these may be different from the names used in the date
+%format. Since this is new to Java 8, it's not supported in
+%\file{texosquery.jar} or \file{texosquery-jre5.jar} and they simply reproduce
+%the non-standalone names.
+%
+%The information supplied with this option is quite complex,
+%but it's used by the \sty{locale} package to set up all the
+%required information for each locale used in the document.
+%Any non-\gls{ASCII} characters are marked up with \cs{twrp},
+%which is locally defined by \cs{TeXOSQuery} to expand to
+%\cs{texosquerynonasciiwrap}. This may be redefined to deal with the
+%characters if necessary. For example, if the character needs to be
+%converted from one encoding to another.
+%
+%The blocks are:
+%\begin{description}
+%\item \meta{locale block}
+%
+%The locale information in the form:
+%\begin{definition}
+%\marg{tag}\marg{language name}\marg{locale language
+%name}\marg{region name}\marg{locale region name}\marg{variant
+%name}\marg{locale variant name}
+%\end{definition}
+%The \meta{tag} is the language tag (the same format as \longarg{bcp47}).
+%
+%The \meta{language name} is the language name in the operating
+%system's default locale.
+%
+%The \meta{locale language name} is the language name in
+%the locale's language.
+%
+%For example, my locale is \texttt{en-GB}, so if I use
%\begin{verbatim}
-%texosquery -d nofile
+%texosquery -D en-GB
%\end{verbatim}
-%just displays an empty line.
+%then both \meta{language name} and \meta{locale language name} will
+%be \texttt{English}, but if I use:
+%\begin{verbatim}
+%texosquery -D fr-GB
+%\end{verbatim}
+%then \meta{language name} will be \texttt{French} and the \meta{locale
+%language name} will be \texttt{fran\cs{twrp}\char`\{\c{c}\char`\}ais} (note the non-ASCII
+%character has been marked up). The locale tag \verb|fr-GB|
+%indicates that I'm writing in French but I'm in the United Kingdom
+%(so the currency should be GBP).
+%
+%The \meta{region name} is the region's name in the operating
+%system's default language.
+%
+%The \meta{locale region name} is the region's name in the locale's language.
+%
+%So for me with \texttt{-D en-GB} I get
+%\verb|United\tspc Kingdom| for both \meta{region name} and
+%\meta{locale region name}. This illustrates another of the
+%shorthand commands that \app{texosquery} uses that's only locally
+%defined within \cs{TeXOSQuery}. In this case, \cs{tspc} just expands
+%to a space. This is used to avoid accidentally discarding any
+%intentional spaces that might follow a command name or any
+%intentional consecutive spaces.
+%
+%If, however, I use \texttt{-D fr-GB} I still get
+%\verb|United\tspc Kingdom| in \meta{region name}, but \meta{locale
+%region name} is now \verb|Royaume-Uni|.
+%
+%The \meta{variant name} is the language's variant. For example,
+%with \verb|de-CH-1996| (Swiss German using the new orthography),
+%the variant is 1996. There's no variant in \verb|en-GB| so this
+%value is empty for me.
+%
+%The \meta{locale variant name} is the variant in the locale's
+%language. In the case of \verb|de-CH-1996| this is still 1996.
+%
+%\item \meta{current date block}
+%
+%This returns the current date in four different formats and also an
+%integer that indicates the first day of the week in the given
+%locale:
+%\begin{definition}
+%\marg{full date}\marg{long date}\marg{medium date}\marg{short
+%date}\marg{first day}
+%\end{definition}
+%The actual date formats depend on the locale. For example, with
+%\texttt{en-GB} the \meta{full date} is (assuming today is
+%2016-11-08):
+%\begin{verbatim}
+%Tuesday,\tspc 8\tspc November\tspc 2016
+%\end{verbatim}
+%(Tuesday, 8 November 2016).
+%The \meta{long date} is
+%\begin{verbatim}
+%08\tspc November\tspc 2016
+%\end{verbatim}
+%(08 November 2016).
+%The \meta{medium date} is
+%\begin{verbatim}
+%08\thyn Nov\thyn 2016
+%\end{verbatim}
+%(08-Nov-2016).
+%The \meta{short date} is
+%\begin{verbatim}
+%08\tslh 11\tslh 16
+%\end{verbatim}
+%(08/11/2016).
+%Note that there's a difference between using the \gls{CLDR} locale data
+%and the JRE data. If I'm using the Java~7 compatible
+%\app{texosquery.jar} which only uses JRE locale data, then I get
+%the above results, but if I use \file{texosquery-jre8.sh} which
+%sets \texttt{java.locale.providers} to \texttt{CLDR,JRE} then I get
+%a slightly different result. The \meta{long date} is
+%\begin{verbatim}
+%8\tspc November\tspc 2016
+%\end{verbatim}
+%(8 November 2016)
+%and the \meta{medium date} is
+%\begin{verbatim}
+%8\tspc Nov\tspc 2016
+%\end{verbatim}
+%(8 Nov 2016).
+%The \meta{medium date} may be numeric or may be an abbreviated
+%form of \meta{long date}, depending on the language and the locale
+%provider. Some languages aren't supported by \gls{JRE} but are supported
+%by \gls{CLDR}. (Some aren't supported by either, but there's a
+%chance that those languages will eventually be added to the CLDR.)
+%For example, if I use \texttt{-D cy-GB} with the JRE as the locale
+%provider I just get the \texttt{en-GB} dates, but if I use the CLDR
+%provider I get Welsh dates.
+%
+%Note that the proposed Java~9 should automatically use the CLDR as
+%the locale provider, which is being increasingly adopted by
+%applications as a common data repository.
+%
+%The first day of the week index is zero-based starting with Monday.
+%This is done in order to be compatible with \sty{pgfcalendar}. For
+%example, with \texttt{-D en-GB} \meta{first day} is 0 (Monday), but
+%with \texttt{pt-BR} \meta{first day} is 6 (Sunday). The
+%\sty{locale} package provides a way of converting the index to
+%Monday=1 or Sunday=1 indexing.
+%
+%\item \meta{date pattern block}
+%
+%The pattern used to format the full date, long date, medium
+%date and short date. This is in the form:
+%
+%\marg{full pattern}\marg{long pattern}\marg{medium
+%pattern}\marg{short pattern}
+%
+%Each pattern uses shorthand mark-up that's only locally defined
+%within \cs{TeXOSQuery}. These short commands are expanded to longer
+%commands provided by \file{texosquery.tex} to avoid name clashing
+%with other packages. When used directly in the document text, these
+%expand to reproduce the pattern.
+%
+%For example, with \texttt{-D en-GB} I get the following
+%pattern for the short date:
+%\begin{verbatim}
+%\patdtf{2}{d}\tslh \patdtf{2}{M}\tslh \patdtf{2}{y}
+%\end{verbatim}
+%When parsed by \cs{TeXOSQuery}, this is internally converted to
+%\begin{verbatim}
+%\texosquerydtf{2}{d}/\texosquerydtf{2}{M}/\texosquerydtf{2}{y}
+%\end{verbatim}
+%But default this simply expands to \texttt{dd/MM/yy} but may be
+%used in the first argument of \cs{texosqueryfmtdatetime}. See
+%sections~\ref{sec:patternformats} and \ref{sec:applydatetimepatterns} for
+%further details.
+%
+%\item \meta{current time block}
+%
+%The current time provided in various formats suitable to the
+%given locale:
+%\begin{definition}
+%\marg{full time}\marg{long time}\marg{medium time}\marg{short time}
+%\end{definition}
+%As with the current date, the actual format depends on the locale
+%and the locale provider. For example, with \texttt{en-GB} I get:
+%\begin{verbatim}
+%{15:59:41\tspc o\csq clock\tspc GMT}{15:59:41\tspc GMT}{15:59:41}{15:59}
+%\end{verbatim}
+%with the \gls{JRE}. If I switch to \gls{CLDR} (\file{texosquery-jre8.sh}) I get:
+%\begin{verbatim}
+%{16:00:51\tspc Greenwich\tspc Mean\tspc Time}{16:00:51\tspc GMT}{16:00:51}{16:00}
+%\end{verbatim}
+%
+%\item \meta{time pattern block}
+%
+%The pattern used to format the full time, long time, medium
+%time and short time.
+%
+%\marg{full time pattern}\marg{long time pattern}\marg{medium time
+%pattern}\marg{short time pattern}
+%
+%Again, when used with \cs{TeXOSQuery}, the short commands, such as
+%\cs{patdtf}, are internally converted.
+%They're not defined outside that scope.
+%
+%\item \meta{current date time block}
+%
+%The current date and time provided in various formats suitable to the
+%given locale:
+%\begin{definition}
+%\marg{full date time}\marg{long date time}\marg{medium date
+%time}\marg{short date time}
+%\end{definition}
+%This may simply be the date and time from above separated by
+%a space.
+%
+%\item \meta{date time pattern block}
+%
+%The pattern used to format the full date time, long date time, medium
+%date time and short date time. This may simply be the date and
+%time patterns from above separated by a space.
+%\begin{definition}
+%\marg{full date time pattern}\marg{long date time
+%pattern}\marg{medium date time pattern}\marg{short date time pattern}
+%\end{definition}
+%
+%\item \meta{days of the week block}
+%
+%The week day names (starting with Monday for consistency with
+%\sty{pgfcalendar}) in the locale's language. Non-\gls{ASCII} characters are marked up with
+%\cs{twrp}.
+%\begin{definition}
+%\marg{Monday}\marg{Tuesday}\marg{Wednesday}\marg{Thursday}\marg{Friday}\marg{Saturday}\marg{Sunday}
+%\end{definition}
+%\item \meta{abbreviated days of the week block}
+%
+%As above, but abbreviated.
+%
+%\item \meta{month names block}
+%
+%The month names.
+%
+%\item \meta{abbreviated month names block}
+%
+%The abbreviated month names.
+%
+%\item \meta{standalone days of the week block}
+%
+%The week day names when used in a standalone context (for example, a
+%column header). This may be the same as the earlier \meta{days of
+%the week block} (and will be the same for \file{texosquery.jar} and
+%\file{texosquery-jre5.jar}). The standalone support was
+%introduced to Java~8.
+%
+%\item \meta{abbreviated standalone days of the week block}
+%
+%As above, but abbreviated.
+%
+%\item \meta{standalone month names block}
+%
+%The month names when used in a standalone context (for example, a
+%column header). This may be the same as the earlier \meta{month
+%names block} (and will be the same for \file{texosquery.jar} and
+%\file{texosquery-jre5.jar}). The standalone support was
+%introduced to Java~8.
+%
+%\item \meta{abbreviated standalone month names block}
+%
+%As above but abbreviated.
+%
+%\item \meta{numeric block}
+%
+%The numeric data similar to \longarg{numeric} but it's
+%missing the \meta{tag} (which is provided in the earlier
+%\meta{locale block}) and there are two extra items:
+%\begin{definition}
+%\marg{group sep}\marg{decimal sep}\marg{exp
+%sep}\marg{use group}\marg{currency code}\marg{regional currency
+%code}\marg{currency sym}\marg{currency tex}\marg{currency sep}
+%\marg{percent sym}\marg{per mill sym}
+%\end{definition}
+%See above for the elements that are also provided in
+%\longarg{numeric}. The additional elements are \meta{percent sym}
+%and \meta{per mill sym}, which are the percent and
+%per-mill symbols, respectively. The percent symbol \verb|%| has its
+%category code changed to 12 by \cs{TeXOSQuery}. As with other
+%non-ASCII characters, the per-mill symbol will be marked up with
+%\cs{twrp}.
+%
+%\item \meta{numeric patterns block}
+%
+%The patterns used to format decimals, integers, currency and
+%percentages.
+%\begin{definition}
+%\marg{decimal pattern}\marg{integer pattern}\marg{currency
+%pattern}\marg{percentages pattern}
+%\end{definition}
+%As with the date and time patterns, when used with \cs{TeXOSQuery}, the
+%short commands, such as \cs{patdgt}, are internally converted.
+%They're not defined outside that scope.
+%
+%If a pattern is used directly in the text, it will expand to the
+%original pattern padded to ten digits. (Eleven digit integers are outside
+%\TeX's maximum number range.)
+%
+%Any of these numeric patterns may be used in the first argument of
+%the low-level user command \cs{texosqueryfmtnumber} described in
+%section~\ref{sec:applynumpatterns}. This command uses the following
+%macros:
+%\begin{definition}
+%\cs{texosquerypatfmtcurrencysign}
+%\end{definition}
+%The currency sign (defaults to \verb|\$|). For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the \marg{currency sym} or
+%\marg{currency tex} elements.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtgroupsep}
+%\end{definition}
+%The group separator (defaults to \verb|,|). For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{group sep} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtdecsep}
+%\end{definition}
+%The decimal separator (defaults to \verb|.|). For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{dec sep} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtcurdecsep}
+%\end{definition}
+%The monetary decimal separator (defaults to \verb|.|). For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{currency sep} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtexp}
+%\end{definition}
+%The exponent sign (defaults to \texttt{E}). For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{exp sep} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtpercentsign}
+%\end{definition}
+%The percent symbol. For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{percent sym} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtpermillsign}
+%\end{definition}
+%The per-mill symbol. For example, when parsing the previous
+%\meta{numeric block}, this command can be redefined to the
+%\marg{per-mill sym} element.
+%
+%\begin{definition}
+%\cs{texosquerypatfmticurrencysign}
+%\end{definition}
+%The international currency sign. This is defined as \texttt{¤} by
+%default, unless the command \cs{textcurrency} has been defined, in
+%which case that's used instead. If the UTF-8 character ¤ is
+%available and \cs{textcurrency} hasn't been defined before
+%\sty{texosquery} was input, then you will need to redefine this
+%command as appropriate.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtminus}
+%\end{definition}
+%The minus sign.
+%
+%\begin{definition}
+%\cs{texosquerypatfmtplus}
+%\end{definition}
+%The plus sign.
+%
+%\end{description}
%
%\section{texosquery.tex: generic \TeX\ code}
-%You can run \texttt{texosquery} directly from \TeX's shell escape.
+%\label{sec:tex}
+%You can run \app{texosquery} directly from \TeX's shell escape.
%For example:
%\begin{verbatim}
%\input|"texosquery --locale"
%\end{verbatim}
-%However, \texttt{texosquery.tex} provides generic \TeX\ code to do
-%this for you and store the result in a control sequence.
+%However, \app{texosquery} uses markup commands in some of
+%the results which need to be defined first. The file
+%\file{texosquery.tex} provides generic \TeX\ code to do
+%this for you and stores the result in a control sequence.
%
%Plain \TeX\ users can input this file through the usual \cs{input}
%method:
@@ -281,58 +1740,74 @@
%The commands described below are all fragile.
%\end{important}
%
-%The basic command to run \texttt{texosquery} and capture its output
+%The basic command to run \app{texosquery} and capture its output
%in a control sequence is:
%\DescribeMacro\TeXOSQuery
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQuery}\marg{cs}\marg{args}
-%\end{flushleft}
+%\end{definition}
%where \meta{cs} is the control sequence in which to store the
%result and \meta{args} are the command line arguments to pass to
-%\texttt{texosquery}. This first locally changes the category code
-%of some problematic characters that may appear in the result.
-%The only special characters that aren't changed are the backslash
-%\verb|\|, curly braces \verb|{| and \verb|}|, and hash \verb|#|.
-%(\texttt{texosquery.jar} will replace \verb|#| with \verb|\#| in places
-%where it might possibly occur in the result, but in general it's
-%best to avoid these characters in file names.)
-%
-%There are some short cut commands for convenience, described below.
-%If any of these commands cause an error message in the form:
+%\app{texosquery}. This first locally changes the category code
+%of some problematic characters and defines the short markup
+%commands that \app{texosquery} uses to identify characters that
+%need to be interpreted literally (for example, in file names).
+%These commands will automatically be expanded by \cs{TeXOSQuery}
+%when the result is input. For example
%\begin{verbatim}
-%I can't find file `|texosquery'.
+%texosquery -n
%\end{verbatim}
-%then check that you have the shell escape on. If the error
-%persists with the shell escape enabled
-%(and not restricted), check that \texttt{texosquery} is on
-%your system's path. To do this, open a command prompt or terminal and
-%type \texttt{texosquery}. If it isn't installed correctly, there will be a
-%message like:
+%produces
%\begin{verbatim}
-%`texosquery' is not recognised
+%\pdfd \fcln 20161129221559\fpls 00\fapo 00\fapo
%\end{verbatim}
-%or
+%but when used with
%\begin{verbatim}
-%texosquery: command not found
+%\TeXOSQuery{\result}{texosquery -n}
%\end{verbatim}
-%If this happens, check the installation. (Instructions are
-%in the accompanying \texttt{README.md} file.)
+%the \cs{result} command will be set to
+%\begin{verbatim}
+%D:20161129221559+00'00'
+%\end{verbatim}
+%where the characters \texttt{D} \text{:} \texttt{+} and
+%\texttt{\textquotesingle} all have category code 12 (other).
%
-%Dry run mode is determined by the conditional
-%\DescribeMacro\ifTeXOSQueryDryRun
+%If the command failed, \meta{cs} will be set to empty. It's best to
+%always test for success after using \cs{TeXOSQuery} (or one of the
+%shortcut commands described below). For example:
%\begin{verbatim}
-%\ifTeXOSQueryDryRun
+%\TeXOSQuery{\result}{-b}
+%\ifx\result\empty
+% Failed!
+%\else
+% Result: \result.
+%\fi
%\end{verbatim}
-%If true, the shell escape won't be used and the requested command
-%invocation will be printed in the transcript file prefixed with
+%
+%Failure can occur because the dry run mode was on, or it can occur
+%if the query was denied (for example, forbidden file access),
+%or if there's a syntax error in the system call. As from
+%version 1.2, \app{texosquery} checks the \texttt{openin\_any}
+%setting, which may forbid read access. Java's security manager
+%or the filing system may also forbid read access.
+%
+%To determine the cause of the error, first inspect the log file to
+%check if the shell escape was used. In the above example, if
+%the shell escape was permitted, then the log file should include
%\begin{verbatim}
-%TeXOSQuery:
+%(|texosquery -b)
%\end{verbatim}
-%(the control sequence \meta{cs} will be set to empty).
-%This conditional will automatically be switched on unless
-%\cs{shellescape} or \cs{pdfshellescape} is 1. (If
-%\texttt{texosquery.jar} is later allowed on the restricted list,
-%newer versions may change this default.)
+%Copy and paste the system call (\verb|texosquery -b| in
+%the above case) into your
+%\href{http://www.dickimaw-books.com/latex/novices/html/terminal.html}{command
+%prompt or terminal} and insert
+%the \longarg{debug} switch at the start of the argument list. For
+%example:
+%\begin{verbatim}
+%texosquery --debug -b
+%\end{verbatim}
+%This should help determine whether it's a syntax error or a query forbidden
+%by the operating system.
%
%If multiple queries are required, it's more efficient to
%perform them all in one go. For example:
@@ -351,118 +1826,297 @@
%\end{verbatim}
%(Make sure you have at least v1.1 for this to work correctly.)
%
+%\begin{important}
+%Take care of characters that have a special meaning to your shell.
+%For example, bash interprets \verb|#| as a comment. For example, if
+%you have a file called \texttt{image\#1.png}, then you can't simply
+%do
+%\begin{verbatim}
+%\TeXOSQuery{\result}{-p image#1.png}
+%\end{verbatim}
+%since bash will pass this as
+%\begin{verbatim}
+%texosquery.sh -p image
+%\end{verbatim}
+%(The \verb|#1.png| part is treated as a comment.) Nor can you do
+%\begin{verbatim}
+%\TeXOSQuery{\result}{-p image\#1.png}
+%\end{verbatim}
+%as \TeX\ will replace the \verb|\#| with \verb|#| when passing the
+%command invocation to the shell. The only way to deal with this
+%situation is to do
+%\begin{verbatim}
+%\TeXOSQuery{\result}{-p image\string\#1.png}
+%\end{verbatim}
+%to protect the \verb|#| character from both \TeX\ and the shell.
+%\end{important}
+%
+%Dry run mode is determined by the conditional
+%\DescribeMacro\ifTeXOSQueryDryRun
+%\begin{verbatim}
+%\ifTeXOSQueryDryRun
+%\end{verbatim}
+%If true, the shell escape won't be used and the requested command
+%invocation will be printed in the transcript file prefixed with
+%\begin{verbatim}
+%TeXOSQuery:
+%\end{verbatim}
+%(the control sequence \meta{cs} will be set to empty).
+%
+%\begin{important}
+%Remember that a query can still fail even if the dry run mode is
+%off.
+%\end{important}
+%
+%Note that if you switch off the dry run mode when the
+%shell escape setting forbids the execution of \app{texosquery},
+%then you'll get the rather annoying error:
+%\begin{verbatim}
+%runpopen command not allowed: texosquery
+%
+%! I can't find file `"|texosquery -b"'.
+%\TeXOSQueryInvoker ...TeXOSInvokerName \space #1"
+%
+%\TeXOSQuery ...noexpand #1{\TeXOSQueryInvoker {#2}
+% }}\x \fi
+%l.5 \TeXOSQuery{\result}{-b}
+% ^^M
+%(Press Enter to retry, or Control-D to exit)
+%\end{verbatim}
+%By default, the dry run mode is only switched off if the
+%unrestricted shell escape mode is on (detected through
+%\cs{shellescape} or \cs{pdfshellescape}).
+%
+%If \app{texosquery} is added to the restricted list, you can add
+%\begin{verbatim}
+%\TeXOSQueryAllowRestricted
+%\end{verbatim}
+%to the \file{texosquery.cfg} file. (This command can't be used
+%outside of that file.)
+%
+%If you get the above error, then:
+%\begin{itemize}
+%\item make sure you don't have
+%\cs{TeXOSQueryAllowRestricted} in your \file{texosquery.cfg}
+%file;
+%\item make sure you run \TeX\ with the shell escape enabled;
+%\item check the definition of \cs{TeXOSInvokerName};
+%\item try using the application directly from the command prompt or
+%terminal. For example, in the above message, the bit between
+%\texttt{\textasciigrave\textquotedbl\textbar} and
+%\texttt{\textquotedbl\textquotesingle} (that is, \texttt{texosquery-jre8 -b})
+%shows the attempted system call. Copy and paste it directly
+%into your operating system's
+%\href{http://www.dickimaw-books.com/latex/novices/html/terminal.html}{command
+%prompt or terminal} and to check the application has been installed
+%correctly.
+%\end{itemize}
+%
+%\DescribeMacro\TeXOSInvokerName
+%The \cs{TeXOSQuery} command uses \cs{TeXOSInvokerName} to reference the
+%application name. This defaults to \app{texosquery} but needs to be
+%redefined to reflect the particular system call that's required.
+%For example, \texttt{texosquery.sh} (Unix-like with Java~7) or
+%\texttt{texosquery-jre8} (Windows with Java~8). This redefinition
+%can be done in the configuration file \file{texosquery.cfg} for a
+%system-wide setting. See section~\ref{sec:setup} for further
+%details.
+%
+%\begin{important}
+%Some of the shortcut commands listed below require extra arguments after the
+%relevant switch. These are automatically enclosed in single-quotes
+%to protect any spaces. If the argument actually contains any single-quote
+%characters, make sure you use \verb|\string\'| to prevent
+%interference.
+%
+%Since a file name reference may need to be obtained from \cs{jobname},
+%which sometimes includes double-quotes, the first double-quote pair
+%found is stripped in file name arguments. Any other double-quotes
+%will need to be protected in the same manner as single-quotes
+%(but this shouldn't be an issue if you use a safe file naming scheme).
+%All paths should use a forward slash for the directory divider.
+%\end{important}
+%
+%\subsection{Locale}
%The locale (\shortarg{l} or \longarg{locale-lcs}) information can be
%obtained using:
%\DescribeMacro\TeXOSQueryLocale
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryLocale}\marg{cs}
-%\end{flushleft}
+%\end{definition}
%Note that this uses the lower case codeset form, which has a better
-%chance of matching the encoding names used by the \texttt{inputenc}
+%chance of matching the encoding names used by the \sty{inputenc}
%package. If you want the unprocessed codeset name, you can do:
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQuery}\marg{cs}\{\shortarg{L}\}
-%\end{flushleft}
+%\end{definition}
+%If you just want the codeset in the same form as
+%\longarg{locale-lcs} you can do:
+%\begin{definition}
+%\cs{TeXOSQuery}\marg{cs}\{\shortarg{C}\}
+%\end{definition}
%
-%The current working directory (\shortarg{c} or \longarg{cwd}) can
-%be obtained using:
-%\DescribeMacro\TeXOSQueryCwd
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryCwd}\marg{cs}
-%\end{flushleft}
+%The \gls{IETF} \gls{BCP}~47 language tag (\shortarg{b} or \longarg{bcp47})
+%can be obtained using:
+%\DescribeMacro\TeXOSQueryLangTag
+%\begin{definition}
+%\cs{TeXOSQueryLangTag}\marg{cs}
+%\end{definition}
%
-%The home directory (\shortarg{m} or \longarg{userhome}) can
-%be obtained using:
-%\DescribeMacro\TeXOSQueryHome
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryHome}\marg{cs}
-%\end{flushleft}
+%The numeric separators and currency symbols (\shortarg{N} or
+%\longarg{numeric}) can be obtained using
+%\DescribeMacro\TeXOSQueryNumeric
+%\begin{definition}
+%\cs{TeXOSQueryNumeric}\marg{cs}\marg{locale}
+%\end{definition}
+%The \meta{locale} should be a valid language tag or may be empty
+%for the system's default locale. Similarly for the command below.
%
-%The temporary directory (\shortarg{t} or \longarg{tmpdir}) can
-%be obtained using:
-%\DescribeMacro\TeXOSQueryTmpDir
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryTmpDir}\marg{cs}
-%\end{flushleft}
+%All the locale data (\shortarg{D} or \longarg{locale-data}) can be
+%obtained using
+%\DescribeMacro\TeXOSQueryLocaleData
+%\begin{definition}
+%\cs{TeXOSQueryLocaleData}\marg{cs}\marg{locale}
+%\end{definition}
%
+%\subsection{Operating System Information}
%The OS name (\shortarg{o} or \longarg{osname}) can
%be obtained using:
%\DescribeMacro\TeXOSQueryName
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryName}\marg{cs}
-%\end{flushleft}
+%\end{definition}
%
%The OS version (\shortarg{r} or \longarg{osversion}) can
%be obtained using:
%\DescribeMacro\TeXOSQueryVersion
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryVersion}\marg{cs}
-%\end{flushleft}
+%\end{definition}
%
%The OS architecture (\shortarg{a} or \longarg{osarch}) can
%be obtained using:
%\DescribeMacro\TeXOSQueryArch
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryArch}\marg{cs}
-%\end{flushleft}
+%\end{definition}
+%
+%\subsection{Dates and Times}
+%The current date and time information (\shortarg{M} or
+%\longarg{date-time}) can be obtained using:
+%\DescribeMacro\TeXOSQueryDateTime
+%\begin{definition}
+%\cs{TeXOSQueryDateTime}\marg{cs}
+%\end{definition}
+%Example usage:
+%\begin{verbatim}
+%\texosquerydefpattern{\pattern}{\%2d/\%2M/\%4y \%2H:\%2m:\%2s}
+%
+%\TeXOSQueryDateTime{\datetimedata}
+%
+%\ifx\datetimedata\empty
+% Query Failed!
+%\else
+% \expandafter\texosqueryfmtdatetime\expandafter\pattern\datetimedata
+%\fi
+%\end{verbatim}
+%Note that commands such as \cs{texosqueryfmtpatMMM} will need to be
+%defined to produce textual elements. See
+%sections~\ref{sec:patternformats} and \ref{sec:applydatetimepatterns} for
+%further details.
+%
+%The time zone mappings (\shortarg{Z} or
+%\longarg{time-zones}) can be obtained using:
+%\DescribeMacro\TeXOSQueryTimeZones
+%\begin{definition}
+%\cs{TeXOSQueryTimeZones}\marg{cs}\marg{locale}
+%\end{definition}
+%Leave \meta{locale} empty if the default locale is required.
%
%The current date-time stamp in PDF format (\shortarg{n} or
%\longarg{pdfnow}) can be obtained using:
%\DescribeMacro\TeXOSQueryNow
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryNow}\marg{cs}
-%\end{flushleft}
+%\end{definition}
%This is provided for the benefit of users who don't have
%\cs{pdfcreationdate} defined by their \TeX\ format (for example,
-%\XeTeX). As from v1.1, this ensures that the initial \texttt{D} has
-%category code 12 (which won't happen if \cs{TeXOSQuery} is used
-%explicitly).
-%
-%\begin{important}
-%The remaining commands all require extra arguments after the
-%relevant switch. These are automatically enclosed in single-quotes
-%to protect any spaces. If the argument actually contains any single-quote
-%characters, make sure you use \verb|\string\'| to prevent
-%interference. \emph{However, in general it's a very bad idea to use
-%quotes as part of a file name (rather than using them as
-%delimiters).}
-%Since the file name may need to be obtained from \cs{jobname},
-%which sometimes includes double-quotes, the first double-quote pair
-%found is stripped in file name arguments. Any other double-quotes
-%will need to be protected in the same manner as single-quotes
-%(but, again, this shouldn't be an issue if you use a safe
-%file naming scheme). Any paths should use a
-%forward slash for the directory divider.
-%\end{important}
+%\XeTeX).
%
%The modification date-time stamp in PDF format for a file
%(\shortarg{d} or \longarg{pdfdate}) can be obtained using:
%\DescribeMacro\TeXOSQueryFileDate
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryFileDate}\marg{cs}\marg{filename}
-%\end{flushleft}
+%\end{definition}
%where \meta{filename} is the name of the file.
%This is provided for the benefit of users who don't have
-%\cs{pdffilemoddate} defined by their \TeX\ format. As from v1.1,
-%this ensures that the initial \texttt{D} has category code 12 (which
-%won't happen if \cs{TeXOSQuery} is used explicitly).
+%\cs{pdffilemoddate} defined by their \TeX\ format.
+%
+%\subsection{File Operations}
+%The current working directory (\shortarg{c} or \longarg{cwd}) can
+%be obtained using:
+%\DescribeMacro\TeXOSQueryCwd
+%\begin{definition}
+%\cs{TeXOSQueryCwd}\marg{cs}
+%\end{definition}
+%
+%The home directory (\shortarg{m} or \longarg{userhome}) can
+%be obtained using:
+%\DescribeMacro\TeXOSQueryHome
+%\begin{definition}
+%\cs{TeXOSQueryHome}\marg{cs}
+%\end{definition}
+%
+%The temporary directory (\shortarg{t} or \longarg{tmpdir}) can
+%be obtained using:
+%\DescribeMacro\TeXOSQueryTmpDir
+%\begin{definition}
+%\cs{TeXOSQueryTmpDir}\marg{cs}
+%\end{definition}
%
%The size in bytes of a file
%(\shortarg{s} or \longarg{filesize}) can be obtained using:
%\DescribeMacro\TeXOSQueryFileSize
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryFileSize}\marg{cs}\marg{filename}
-%\end{flushleft}
+%\end{definition}
%where \meta{filename} is the name of the file.
%This is provided for the benefit of users who don't have
%\cs{pdffilesize} defined by their \TeX\ format.
%
+%The URI of a file
+%(\shortarg{u} or \longarg{uri}) can be obtained using:
+%\DescribeMacro\TeXOSQueryFileURI
+%\begin{definition}
+%\cs{TeXOSQueryFileURI}\marg{cs}\marg{filename}
+%\end{definition}
+%where \meta{filename} is the name of the file.
+%(Any percent symbols \verb|%| contained in the URI will have
+%their category code set to 12.)
+%
+%The canonical path of a file
+%(\shortarg{p} or \longarg{path}) can be obtained using:
+%\DescribeMacro\TeXOSQueryFilePath
+%\begin{definition}
+%\cs{TeXOSQueryFilePath}\marg{cs}\marg{filename}
+%\end{definition}
+%where \meta{filename} is the name of the file.
+%
+%The canonical path of a file's parent
+%(\shortarg{e} or \longarg{dirname}) can be obtained using:
+%\DescribeMacro\TeXOSQueryDirName
+%\begin{definition}
+%\cs{TeXOSQueryDirName}\marg{cs}\marg{filename}
+%\end{definition}
+%where \meta{filename} is the name of the file.
+%
%The list of files in a given directory
%(\shortarg{i} or \longarg{list}) can be obtained using:
%\DescribeMacro\TeXOSQueryFileList
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryFileList}\marg{cs}\marg{sep}\marg{dir}
-%\end{flushleft}
+%\end{definition}
%where \meta{sep} is the separator and \meta{dir} is the directory name.
%For example:
%\begin{verbatim}
@@ -471,12 +2125,23 @@
%will store a comma-separated list of all the files contained in the
%current directory in the control sequence \cs{result}.
%
+%To omit directories (\shortarg{ir} or \longarg{list-regular}):
+%\DescribeMacro\TeXOSQueryRegularFileList
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileList}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%To omit regular files (\shortarg{id} or \longarg{list-dir}):
+%\DescribeMacro\TeXOSQuerySubDirFileList
+%\begin{definition}
+%\cs{TeXOSQuerySubDirList}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%
%A filtered list of files in a given directory
%(\shortarg{f} or \longarg{filterlist}) can be obtained using:
%\DescribeMacro\TeXOSQueryFilterFileList
-%\begin{flushleft}\ttfamily
+%\begin{definition}
%\cs{TeXOSQueryFilterFileList}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
-%\end{flushleft}
+%\end{definition}
%where \meta{regex} is a regular expression. \emph{Take care of any backslashes
%in the regular expression!}
%For example, to list only those files that have an extension:
@@ -484,42 +2149,406 @@
%\TeXOSQueryFilterFileList{\result}{,}{.+\string\..*}{.}
%\end{verbatim}
%Note the use of \verb|\string\.| to ensure that \cs{.} isn't
-%interpreted as a command. Another example, list only \texttt{.png}
-%and \texttt{.jpg} files in the directory called \texttt{images}:
+%interpreted as a command. Another example, list only \file{.png}
+%and \file{.jpg} files in the directory called \file{images}:
%\begin{verbatim}
%\TeXOSQueryFilterFileList{\result}{,}{.+\string\.(jpg|png)}{images}
%\end{verbatim}
%
-%The URI of a file
-%(\shortarg{u} or \longarg{uri}) can be obtained using:
-%\DescribeMacro\TeXOSQueryFileURI
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryFileURI}\marg{cs}\marg{filename}
-%\end{flushleft}
-%where \meta{filename} is the name of the file.
-%(Any percent symbols \verb|%| contained in the URI will have
-%their category code set to 12.)
+%\begin{important}
+%Unlike most of the return values the \meta{sep} part here isn't
+%escaped, so take care if \meta{sep} contains any commands. For
+%example, if you want to use \verb|\\| as the separator, you'll need
+%to use \verb|\string\noexpand\string\\| in the \meta{sep} part.
+%\begin{verbatim}
+%\TeXOSQueryFilterFileList{\result}{\string\noexpand\string\\}{.*\string\.tex}{.}
+%\end{verbatim}
+%\end{important}
%
-%The canonical path of a file
-%(\shortarg{p} or \longarg{path}) can be obtained using:
-%\DescribeMacro\TeXOSQueryFilePath
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryFilePath}\marg{cs}\marg{filename}
-%\end{flushleft}
-%where \meta{filename} is the name of the file.
+%If you want the list sorted, you can use the following which set
+%the optional \meta{sort} argument.
%
-%The canonical path of a file's parent
-%(\shortarg{e} or \longarg{dirname}) can be obtained using:
-%\DescribeMacro\TeXOSQueryDirName
-%\begin{flushleft}\ttfamily
-%\cs{TeXOSQueryDirName}\marg{cs}\marg{filename}
-%\end{flushleft}
-%where \meta{filename} is the name of the file.
+%Order by last modified date starting with the oldest (\texttt{date-ascending}):
+%\DescribeMacro\TeXOSQueryFileListDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryFileListDateAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListDateAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListDateAsc
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListDateAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListDateAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or for the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListDateAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or for the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListDateAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by last modified date starting with the newest (\texttt{date-descending}):
+%\DescribeMacro\TeXOSQueryFileListDateDes
+%\begin{definition}
+%\cs{TeXOSQueryFileListDateDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListDateDes
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListDateDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListDateDes
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListDateDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListDateDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListDateDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListDateDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListDateDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListDateDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListDateDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file size starting with the smallest (\texttt{size-ascending}):
+%\DescribeMacro\TeXOSQueryFileListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryFileListSizeAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListSizeAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListSizeAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListSizeAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListSizeAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListSizeAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file size starting with the largest (\texttt{size-descending}):
+%\DescribeMacro\TeXOSQueryFileListSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryFileListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListSizeDes
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListSizeDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%
+%Order by file name in alphabetical order (\texttt{name-ascending}):
+%\DescribeMacro\TeXOSQueryFileListNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryFileListNameAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListNameAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListNameAsc
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListNameAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListNameAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListNameAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListNameAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file name in reverse alphabetical order (\texttt{name-descending}):
+%\DescribeMacro\TeXOSQueryFileListNameDes
+%\begin{definition}
+%\cs{TeXOSQueryFileListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListNameDes
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListNameDes
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListNameDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListNameDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListNameDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListNameDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%
+%Order by file name in case-insensitive alphabetical order
+%(\texttt{iname-ascending}):
+%\DescribeMacro\TeXOSQueryFileListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryFileListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file name in reverse case-insensitive alphabetical order
+%(\texttt{iname-descending}):
+%\DescribeMacro\TeXOSQueryFileListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryFileListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file extension in alphabetical order (\texttt{ext-ascending}):
+%\DescribeMacro\TeXOSQueryFileListExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryFileListExtAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListExtAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListExtAsc
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListExtAsc}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListExtAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListExtAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListExtAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%Order by file extension in reverse alphabetical order (\texttt{ext-descending}):
+%\DescribeMacro\TeXOSQueryFileListExtDes
+%\begin{definition}
+%\cs{TeXOSQueryFileListExtDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the regular files only list:
+%\DescribeMacro\TeXOSQueryRegularFileListExtDes
+%\begin{definition}
+%\cs{TeXOSQueryRegularFileListExtDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or the sub-directories only list:
+%\DescribeMacro\TeXOSQuerySubDirListExtDes
+%\begin{definition}
+%\cs{TeXOSQuerySubDirListExtDes}\marg{cs}\marg{sep}\marg{dir}
+%\end{definition}
+%or for the filtered list:
+%\DescribeMacro\TeXOSQueryFilterFileListExtDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterFileListExtDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered regular files only list:
+%\DescribeMacro\TeXOSQueryFilterRegularFileListExtDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterRegularFileListExtDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or the filtered sub-directories only list:
+%\DescribeMacro\TeXOSQueryFilterSubDirListExtDes
+%\begin{definition}
+%\cs{TeXOSQueryFilterSubDirListExtDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%A recursive filtered list of regular files starting from a given directory
+%on the current working path
+%(\shortarg{w} or \longarg{alk}) can be obtained using:
+%\DescribeMacro\TeXOSQueryWalk
+%\begin{definition}
+%\cs{TeXOSQueryWalk}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%where \meta{regex} is as for the filtered listings described above.
+%
+%To sort according to last modified date:
+%\DescribeMacro\TeXOSQueryWalkDateAsc
+%\begin{definition}
+%\cs{TeXOSQueryWalkDateAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or in reverse order:
+%\DescribeMacro\TeXOSQueryWalkDateDes
+%\begin{definition}
+%\cs{TeXOSQueryWalkDateDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%To sort according to file size:
+%\DescribeMacro\TeXOSQueryWalkSizeAsc
+%\begin{definition}
+%\cs{TeXOSQueryWalkSizeAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or in reverse order:
+%\DescribeMacro\TeXOSQueryWalkSizeDes
+%\begin{definition}
+%\cs{TeXOSQueryWalkSizeDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
%
-%\StopEventually{\phantomsection
+%To sort according to path name (case-sensitive):
+%\DescribeMacro\TeXOSQueryWalkNameAsc
+%\begin{definition}
+%\cs{TeXOSQueryWalkNameAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or in reverse order:
+%\DescribeMacro\TeXOSQueryWalkNameDes
+%\begin{definition}
+%\cs{TeXOSQueryWalkNameDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%To sort according to path name (case-insensitive):
+%\DescribeMacro\TeXOSQueryWalkNameIgnoreCaseAsc
+%\begin{definition}
+%\cs{TeXOSQueryWalkNameIgnoreCaseAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or in reverse order:
+%\DescribeMacro\TeXOSQueryWalkNameIgnoreCaseDes
+%\begin{definition}
+%\cs{TeXOSQueryWalkNameIgnoreCaseDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%To sort according to file extension:
+%\DescribeMacro\TeXOSQueryWalkExtAsc
+%\begin{definition}
+%\cs{TeXOSQueryWalkExtAsc}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%or in reverse order:
+%\DescribeMacro\TeXOSQueryWalkExtDes
+%\begin{definition}
+%\cs{TeXOSQueryWalkExtDes}\marg{cs}\marg{sep}\marg{regex}\marg{dir}
+%\end{definition}
+%
+%\setcounter{secnumdepth}{3}
+%\StopEventually{\clearpage\printabbreviations
+%\clearpage\phantomsection
%\addcontentsline{toc}{section}{Change History}%
%\PrintChanges
-%\addcontentsline{toc}{section}{\indexname}%
%\PrintIndex
%}
%
@@ -544,14 +2573,91 @@
% \end{macrocode}
% Check if already loaded.
% \begin{macrocode}
-\ifx\TeXOSQuery\undefined
-\else
+\ifx\TeXOSQuery\undefined \else
\@texosquery@restore@at
\expandafter\endinput
\fi
% \end{macrocode}
+% Version info.
+% \begin{macrocode}
+\expandafter\def\csname ver@texosquery.tex\endcsname{2017/03/23 v1.2 (NLCT)}
+% \end{macrocode}
+%
+%\begin{macro}{\@texosquery@warn}
+%\changes{1.2}{2017-03-23}{added check for tracklang's warning command}
+%Generate warning message. Use \sty{tracklang}'s warning if
+%available (so that the warnings can be disabled for both packages
+%at the same time).
+% \begin{macrocode}
+\ifx\@tracklang@pkgwarn\undefined
+ \ifx\PackageWarning\undefined
+ \def\@texosquery@warn#1{%
+ {%
+ \newlinechar=`\^^J
+ \def\MessageBreak{^^J}%
+ \message{^^Jtexosquery Warning: #1 on line \the\inputlineno.^^J}%
+ }%
+ }
+ \else
+ \def\@texosquery@warn#1{%
+ \PackageWarning{texosquery}{#1}%
+ }
+ \fi
+\else
+ \def\@texosquery@warn#1{%
+ \@tracklang@pkgwarn{texosquery}{#1}%
+ }
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@err}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\PackageError\undefined
+ \def\@texosquery@err#1#2{%
+ \errhelp{#2}%
+ \errmessage{texosquery: #1}}
+\else
+ \def\@texosquery@err#1#2{\PackageError{texosquery}{#1}{#2}}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@ifundef}
+%This is defined in the same way as \sty{tracklang}'s
+%\cs{@tracklang@ifundef}. (Can't assume \sty{tracklang} has been
+%loaded.)
+% \begin{macrocode}
+\long\def\@texosquery@ifundef#1#2#3{%
+ \ifcsname#1\endcsname
+ \expandafter\ifx\csname #1\endcsname\relax
+ #2%
+ \else
+ #3%
+ \fi
+ \else
+ \expandafter\ifx\csname #1\endcsname\relax
+ #2%
+ \else
+ #3%
+ \fi
+ \fi
+}
+\ifx\ifcsname\undefined
+ \long\def\@texosquery@ifundef#1#2#3{%
+ \expandafter\ifx\csname #1\endcsname\relax
+ #2%
+ \else
+ #3%
+ \fi
+ }
+\fi
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\TeXOSInvokerName}
-%The name of the \texttt{texosquery} application.
+%The name of the \app{texosquery} application.
% \begin{macrocode}
\def\TeXOSInvokerName{texosquery}
% \end{macrocode}
@@ -571,32 +2677,899 @@
%
%\begin{macro}{\ifTeXOSQueryDryRun}
%Provide a dry-run mode.
-%\changes{1.1}{2016-07-14}{dry run mode only false by default if with
-%unrestricted mode}
+%\changes{1.1}{2016-07-14}{dry run mode only false by default if
+%used in unrestricted mode}
+% \begin{macrocode}
+\newif\ifTeXOSQueryDryRun \TeXOSQueryDryRuntrue
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryAllowRestricted}
+%\changes{1.2}{2017-03-23}{new}
+%The default behaviour only switches off the dry-run mode if the
+%shell escape is unrestricted. The configuration file may override
+%this with \cs{TeXOSQueryAllowRestricted}, which will allow
+%the dry run mode to be switched off if restricted mode is detected.
+% \begin{macrocode}
+\def\TeXOSQueryAllowRestricted{%
+ \def\@texosquery@allowrestricted##1##2{##1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryDenyRestricted}
+%\changes{1.2}{2017-03-23}{new}
+%Switch it off.
+% \begin{macrocode}
+\def\TeXOSQueryDenyRestricted{%
+ \def\@texosquery@allowrestricted##1##2{##2}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@allowrestricted}
+%\changes{1.2}{2017-03-23}{new}
+%Initialise to prevent shell escape in restricted mode.
% \begin{macrocode}
-\newif\ifTeXOSQueryDryRun
-\TeXOSQueryDryRuntrue
+\def\@texosquery@allowrestricted#1#2{#2}%
% \end{macrocode}
%\end{macro}
%
-%If shell escape is unrestricted, automatically switch off dry-run mode.
+%Load the configuration file if it exists.
+%\changes{1.2}{2017-03-23}{added texosquery.cfg}
+% \begin{macrocode}
+\openin0=texosquery.cfg \ifeof0\relax \else
+ \closein0\relax
+ \begingroup
+ \newlinechar=`\^^J
+ \message{^^JTeXOSQuery: reading configuration file^^J}%
+ \endgroup
+ \input texosquery.cfg
+\fi
+% \end{macrocode}
+%Disable cfg-only commands:
+% \begin{macrocode}
+\def\TeXOSQueryAllowRestricted{%
+ \@texosquery@warn{\string\TeXOSQueryAllowRestricted\space
+ ignored (only allowed in texosquery.cfg)}%
+}
+\def\TeXOSQueryDenyRestricted{%
+ \@texosquery@warn{\string\TeXOSQueryDenyRestricted\space
+ ignored (only allowed in texosquery.cfg)}%
+}
+% \end{macrocode}
+%
+%If shell escape is unrestricted, automatically switch off dry-run
+%mode, unless the cfg file has allowed it.
% \begin{macrocode}
\ifx\shellescape\undefined
\ifx\pdfshellescape\undefined
\else
\ifnum\pdfshellescape=1\relax
\TeXOSQueryDryRunfalse
+ \else
+ \@texosquery@allowrestricted
+ {%
+ \ifnum\pdfshellescape=2\relax
+ \TeXOSQueryDryRunfalse
+ \fi
+ }
+ {}
\fi
\fi
\else
\ifnum\shellescape=1\relax
\TeXOSQueryDryRunfalse
+ \else
+ \@texosquery@allowrestricted
+ {%
+ \ifnum\shellescape=2\relax
+ \TeXOSQueryDryRunfalse
+ \fi
+ }
+ {}
+ \fi
+\fi
+% \end{macrocode}
+%
+%\begin{macro}{\@texosquery@edef}
+%Need to provide some protection (if available) against non-ASCII characters
+%that have been made active by \sty{inputenc} when reading in the
+%results of the shell escape. This command may be defined before loading
+%\sty{texosquery}, otherwise it's set to \cs{protected@edef}, if
+%defined, or \cs{edef}.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\@texosquery@edef\undefined
+ \ifx\protected@edef\undefined
+ \let\@texosquery@edef\edef
+ \else
+ \let\@texosquery@edef\protected@edef
\fi
\fi
% \end{macrocode}
+%\end{macro}
+%
+%Provide some utility commands. (Can't use \cs{@gobble} etc, as we
+%may not be using \LaTeX.)
+%\begin{macro}{\@texosquery@gobble}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@gobble#1{}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\@texosquery@firstofone}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@firstofone#1{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%The results obtained from \app{texosquery} may be file names for
+%use in commands like \cs{input} or \cs{includegraphics} or they may
+%be text that needs typesetting (such as month names) or they may be
+%date-time patterns or numeric patterns or they may be PDF date-time
+%strings, which may need to have the category code of the initial
+%\qt{D} set to 12 for parsing commands that include this character
+%in the argument syntax.
+%
+%This means that we need to take special characters into account,
+%but the way they are dealt with vary according to context. For
+%example, \verb|#| needs to have the category code set to 12 if it's
+%part of a file name. If an image file is called, say,
+%\verb|test_imagefile#.png| then the following doesn't work:
+%\begin{verbatim}
+%\includegraphics{test\_imagefile\#}
+%\end{verbatim}
+%It needs to be
+%\begin{verbatim}
+%\includegraphics{test\string_imagefile\string#}
+%\end{verbatim}
+%or
+%\begin{verbatim}
+%\includegraphics{\detokenize{test_imagefile#}}
+%\end{verbatim}
+%The first two versions of \sty{texosquery} try to deal with this by
+%simply changing the category code of \verb|_| to 12 and getting
+%\app{texosquery} to replace all instances of \verb|#| with
+%\verb|\#|. This hash substitution doesn't work with the above image
+%example so version 1.2 introduced a new command that
+%\app{texosquery} could use instead of \verb|\#| that expands to
+%\verb|\string#|. This now solves the problem for file names that
+%are obtained through \app{texosquery}, but \app{texosquery} doesn't
+%solely return file names. It also returns text that needs
+%typesetting and it also returns numeric patterns, which in their
+%raw form include \verb|#| as a digit identifier.
+%
+%This means that we can't simply detokenize the result from
+%\app{texosquery}. Instead \app{texosquery} replaces problematic
+%characters with control sequences \emph{according to context}.
+%For example, \cs{texosqueryhash} is used in a file name context,
+%\cs{texosquerytexthash} is used in a textual context and
+%\cs{texosquerypatdigitnozero} in a numeric pattern context.
+%
+%These long control sequence names clutter the results when testing
+%the application directly in a terminal, so the Java code uses short
+%forms that are locally defined by \cs{TeXOSQuery} to expand to the
+%longer forms.
+%
+%\begin{macro}{\texosquerynonasciiwrap}
+%\changes{1.2}{2017-03-23}{new}
+%Allow a way to deal with non-ASCII characters returned by
+%\app{texosquery}. \cs{TeXOSQuery} locally defines \cs{twrp}
+%to this command. By default this just does its argument
+%but may be redefined. For example, if the document uses a different
+%file encoding to Java, then this command might need to be redefined
+%to perform the appropriate conversion.
+% \begin{macrocode}
+\def\texosquerynonasciiwrap#1{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerynonasciidetokwrap}
+%\changes{1.2}{2017-03-23}{new}
+%We also need to allow for non-ASCII characters in file names. In
+%this case the argument needs detokenizing. With \eTeX, we can
+%simply use \cs{detokenize} but we need to allow for plain
+%non-extended \TeX, so check for the existence of \cs{detokenize}
+%first.
+% \begin{macrocode}
+\ifx\detokenize\undefined
+% \end{macrocode}
+%This won't work for characters consisting of multiple octets,
+%but if users want UTF-8 support then they really need \eTeX\ at the
+%very least (but ideally \XeTeX\ or \LuaTeX).
+% \begin{macrocode}
+ \def\texosquerynonasciidetokwrap#1{\string#1}
+\else
+ \def\texosquerynonasciidetokwrap#1{\detokenize{#1}}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%Now define commands used in \cs{TeXOSQuery} for various escaped characters.
+%The literal versions are for file names. The textual versions are
+%for use within the document text. For completeness, all the ASCII
+%punctuation characters have both a literal and textual version.
+%This helps to protect against \sty{babel} shorthands etc.
+%
+%\begin{macro}{\texosquerybackslash}
+%\changes{1.2}{2017-03-23}{new}
+%Literal backslash.
+% \begin{macrocode}
+\edef\texosquerybackslash{\expandafter\@texosquery@gobble\string\\}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextbackslash}
+%\changes{1.2}{2017-03-23}{new}
+%Textual backslash.
+% \begin{macrocode}
+\ifx\textbackslash\undefined
+ \def\texosquerytextbackslash{\texosquerybackslash}
+\else
+ \def\texosquerytextbackslash{\noexpand\textbackslash}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryleftbrace}
+%\changes{1.2}{2017-03-23}{new}
+%Literal left brace.
+% \begin{macrocode}
+\edef\texosqueryleftbrace{\expandafter\@texosquery@gobble\string\{}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextleftbrace}
+%\changes{1.2}{2017-03-23}{new}
+%Textual left brace.
+% \begin{macrocode}
+\def\texosquerytextleftbrace{\{}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryrightbrace}
+%\changes{1.2}{2017-03-23}{new}
+%Literal right brace.
+% \begin{macrocode}
+\edef\texosqueryrightbrace{\expandafter\@texosquery@gobble\string\}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextrightbrace}
+%\changes{1.2}{2017-03-23}{new}
+%Textual right brace.
+% \begin{macrocode}
+\def\texosquerytextrightbrace{\}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryhash}
+%\changes{1.2}{2017-03-23}{new}
+%Literal hash.
+% \begin{macrocode}
+\edef\texosqueryhash{\expandafter\@texosquery@gobble\string\#}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytexthash}
+%\changes{1.2}{2017-03-23}{new}
+%Textual hash.
+% \begin{macrocode}
+\def\texosquerytexthash{\#}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryunderscore}
+%\changes{1.2}{2017-03-23}{new}
+%Literal underscore.
+% \begin{macrocode}
+\edef\texosqueryunderscore{\expandafter\@texosquery@gobble\string\_}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextunderscore}
+%\changes{1.2}{2017-03-23}{new}
+%Textual underscore.
+% \begin{macrocode}
+\def\texosquerytextunderscore{\_}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerybacktick}
+%\changes{1.2}{2017-03-23}{new}
+%Literal grave.
+% \begin{macrocode}
+\edef\texosquerybacktick{\string`}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextbacktick}
+%\changes{1.2}{2017-03-23}{new}
+%Textual open quote.
+% \begin{macrocode}
+\def\texosquerytextbacktick{`}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryclosequote}
+%\changes{1.2}{2017-03-23}{new}
+%Literal apostrophe.
+% \begin{macrocode}
+\edef\texosqueryclosequote{\string'}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextclosequote}
+%\changes{1.2}{2017-03-23}{new}
+%Textual apostrophe / single closing quote.
+% \begin{macrocode}
+\def\texosquerytextclosequote{'}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerydoublequote}
+%\changes{1.2}{2017-03-23}{new}
+%Literal double-quote.
+% \begin{macrocode}
+\edef\texosquerydoublequote{\string"}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextdoublequote}
+%\changes{1.2}{2017-03-23}{new}
+%Textual double-quote.
+% \begin{macrocode}
+\def\texosquerytextdoublequote{"}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycolon}
+%\changes{1.2}{2017-03-23}{new}
+%Literal colon.
+% \begin{macrocode}
+\edef\texosquerycolon{\string:}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextcolon}
+%\changes{1.2}{2017-03-23}{new}
+%Textual colon.
+% \begin{macrocode}
+\def\texosquerytextcolon{:}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerysemicolon}
+%\changes{1.2}{2017-03-23}{new}
+%Literal semi-colon.
+% \begin{macrocode}
+\edef\texosquerysemicolon{\string;}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextsemicolon}
+%\changes{1.2}{2017-03-23}{new}
+%Textual semi-colon.
+% \begin{macrocode}
+\def\texosquerytextsemicolon{;}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryequals}
+%\changes{1.2}{2017-03-23}{new}
+%Literal equals.
+% \begin{macrocode}
+\edef\texosqueryequals{\string=}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextequals}
+%\changes{1.2}{2017-03-23}{new}
+%Textual equals.
+% \begin{macrocode}
+\def\texosquerytextequals{=}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryslash}
+%\changes{1.2}{2017-03-23}{new}
+%Literal slash.
+% \begin{macrocode}
+\edef\texosqueryslash{\string/}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextslash}
+%\changes{1.2}{2017-03-23}{new}
+%Textual slash.
+% \begin{macrocode}
+\def\texosquerytextslash{/}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryhyphen}
+%\changes{1.2}{2017-03-23}{new}
+%Literal hyphen.
+% \begin{macrocode}
+\edef\texosqueryhyphen{\string-}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytexthyphen}
+%\changes{1.2}{2017-03-23}{new}
+%Textual hyphen.
+% \begin{macrocode}
+\def\texosquerytexthyphen{-}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryplus}
+%\changes{1.2}{2017-03-23}{new}
+%Literal plus.
+% \begin{macrocode}
+\edef\texosqueryplus{\string+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextplus}
+%\changes{1.2}{2017-03-23}{new}
+%Textual plus.
+% \begin{macrocode}
+\def\texosquerytextplus{+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryperiod}
+%\changes{1.2}{2017-03-23}{new}
+%Literal period.
+% \begin{macrocode}
+\edef\texosqueryperiod{\string.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextperiod}
+%\changes{1.2}{2017-03-23}{new}
+%Textual period.
+% \begin{macrocode}
+\def\texosquerytextperiod{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycomma}
+%\changes{1.2}{2017-03-23}{new}
+%Literal comma.
+% \begin{macrocode}
+\edef\texosquerycomma{\string,}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextcomma}
+%\changes{1.2}{2017-03-23}{new}
+%Textual comma.
+% \begin{macrocode}
+\def\texosquerytextcomma{,}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryopenparen}
+%\changes{1.2}{2017-03-23}{new}
+%Literal open bracket.
+% \begin{macrocode}
+\edef\texosqueryopenparen{\string(}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextopenparen}
+%\changes{1.2}{2017-03-23}{new}
+%Textual open bracket.
+% \begin{macrocode}
+\def\texosquerytextopenparen{(}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycloseparen}
+%\changes{1.2}{2017-03-23}{new}
+%Literal close bracket.
+% \begin{macrocode}
+\edef\texosquerycloseparen{\string)}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextcloseparen}
+%\changes{1.2}{2017-03-23}{new}
+%Textual close bracket.
+% \begin{macrocode}
+\def\texosquerytextcloseparen{)}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryopensq}
+%\changes{1.2}{2017-03-23}{new}
+%Literal open square bracket.
+% \begin{macrocode}
+\edef\texosqueryopensq{\string[}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextopensq}
+%\changes{1.2}{2017-03-23}{new}
+%Textual open square bracket.
+% \begin{macrocode}
+\def\texosquerytextopensq{[}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryclosesq}
+%\changes{1.2}{2017-03-23}{new}
+%Literal close square bracket.
+% \begin{macrocode}
+\edef\texosqueryclosesq{\string]}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextclosesq}
+%\changes{1.2}{2017-03-23}{new}
+%Textual close square bracket.
+% \begin{macrocode}
+\def\texosquerytextclosesq{]}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryasterisk}
+%\changes{1.2}{2017-03-23}{new}
+%Literal asterisk.
+% \begin{macrocode}
+\edef\texosqueryasterisk{\string*}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextasterisk}
+%\changes{1.2}{2017-03-23}{new}
+%Textual asterisk.
+% \begin{macrocode}
+\def\texosquerytextasterisk{*}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryatchar}
+%\changes{1.2}{2017-03-23}{new}
+%Literal at character.
+% \begin{macrocode}
+\edef\texosqueryatchar{\string @}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextatchar}
+%\changes{1.2}{2017-03-23}{new}
+%Textual at character.
+% \begin{macrocode}
+\def\texosquerytextatchar{@}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerybar}
+%\changes{1.2}{2017-03-23}{new}
+%Literal bar.
+% \begin{macrocode}
+\edef\texosquerybar{\string|}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextbar}
+%\changes{1.2}{2017-03-23}{new}
+%Textual bar.
+% \begin{macrocode}
+\ifx\undefined\textbar
+ \def\texosquerytextbar{|}
+\else
+ \def\texosquerytextbar{\ifmmode|\else\textbar\fi}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerylessthan}
+%\changes{1.2}{2017-03-23}{new}
+%Literal less than.
+% \begin{macrocode}
+\edef\texosquerylessthan{\string<}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextlessthan}
+%\changes{1.2}{2017-03-23}{new}
+%Textual less than.
+% \begin{macrocode}
+\ifx\undefined\textless
+ \def\texosquerytextlessthan{<}
+\else
+ \def\texosquerytextlessthan{\ifmmode<\else\textless\fi}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerygreaterthan}
+%\changes{1.2}{2017-03-23}{new}
+%Literal greater than.
+% \begin{macrocode}
+\edef\texosquerygreaterthan{\string>}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextgreaterthan}
+%\changes{1.2}{2017-03-23}{new}
+%Textual greater than.
+% \begin{macrocode}
+\ifx\undefined\textgreater
+ \def\texosquerytextgreaterthan{>}
+\else
+ \def\texosquerytextgreaterthan{\ifmmode<\else\textgreater\fi}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytilde}
+%\changes{1.2}{2017-03-23}{new}
+%Literal tilde.
+% \begin{macrocode}
+\edef\texosquerytilde{\string~}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytexttilde}
+%\changes{1.2}{2017-03-23}{new}
+%Textual tilde.
+% \begin{macrocode}
+\ifx\textasciitilde\undefined
+ \def\texosquerytexttilde{\string~}
+\else
+ \def\texosquerytexttilde{\textasciitilde}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycircum}
+%\changes{1.2}{2017-03-23}{new}
+%Literal circumflex.
+% \begin{macrocode}
+\edef\texosquerycircum{\string^}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextcircum}
+%\changes{1.2}{2017-03-23}{new}
+%Textual circumflex.
+% \begin{macrocode}
+\ifx\textasciicircum\undefined
+ \def\texosquerytextcircum{\string^}
+\else
+ \def\texosquerytextcircum{\textasciicircum}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryampersand}
+%\changes{1.2}{2017-03-23}{new}
+%Literal ampersand.
+% \begin{macrocode}
+\edef\texosqueryampersand{\string&}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextampersand}
+%\changes{1.2}{2017-03-23}{new}
+%Textual ampersand.
+% \begin{macrocode}
+\def\texosquerytextampersand{\&}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerydollar}
+%\changes{1.2}{2017-03-23}{new}
+%Literal dollar. (This could just be defined as \verb|\string$|, but
+%that plays havoc with the syntax highlighting!)
+% \begin{macrocode}
+\edef\texosquerydollar{\expandafter\@texosquery@gobble\string\$}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextdollar}
+%\changes{1.2}{2017-03-23}{new}
+%Textual dollar.
+% \begin{macrocode}
+\def\texosquerytextdollar{\$}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypercent}
+%\changes{1.2}{2017-03-23}{new}
+%Literal percent.
+% \begin{macrocode}
+\edef\texosquerypercent{\expandafter\@texosquery@gobble\string\%}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextpercent}
+%\changes{1.2}{2017-03-23}{new}
+%Textual percent.
+% \begin{macrocode}
+\def\texosquerytextpercent{\%}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryexclam}
+%\changes{1.2}{2017-03-23}{new}
+%Literal exclamation.
+% \begin{macrocode}
+\edef\texosqueryexclam{\string!}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextexclam}
+%\changes{1.2}{2017-03-23}{new}
+%Textual exclamation.
+% \begin{macrocode}
+\def\texosquerytextexclam{!}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryquestion}
+%\changes{1.2}{2017-03-23}{new}
+%Literal question mark.
+% \begin{macrocode}
+\edef\texosqueryquestion{\string?}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextquestion}
+%\changes{1.2}{2017-03-23}{new}
+%Textual question mark.
+% \begin{macrocode}
+\def\texosquerytextquestion{?}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\texosqueryliteralspace}
+%\changes{1.2}{2017-03-23}{new}
+%Literal space.
+% \begin{macrocode}
+\edef\texosqueryliteralspace{\expandafter\string\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytextspace}
+%\changes{1.2}{2017-03-23}{new}
+%Textual space. (Don't allow it to expand while it's being fetched
+%from \cs{texosquery} just in case it disappears.)
+% \begin{macrocode}
+\def\texosquerytextspace{\noexpand\space}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@D}
+%\changes{1.2}{2017-03-23}{new}
+%The \verb|D| identifier in PDF date-time formats need to have
+%category code 12. This is only used by methods that return results
+%in the form:
+%
+%\verb|D:|\meta{YYYY}\meta{MM}\marg{DD}\meta{HH}\meta{mm}\meta{ss}\meta{TZh}\verb|'|\meta{TZm}\verb|'|
+% \begin{macrocode}
+\edef\@texosquery@D{\string D}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@enableshortcs}
+%\changes{1.2}{2017-03-23}{new}
+%\hypertarget{enableshortcs}{Enable shortcut commands.}
+% \begin{macrocode}
+\def\@texosquery@enableshortcs{%
+% \end{macrocode}
+%Thesre are for the date-time and numeric patterns.
+% \begin{macrocode}
+ \def\patdtf{\noexpand\texosquerydtf}%
+ \def\patpmnumfmt{\noexpand\texosquerypatplusminus}%
+ \def\patnumfmt{\noexpand\texosquerypatnum}%
+ \def\patsinumfmt{\noexpand\texosquerypatsinum}%
+ \def\patdecfmt{\noexpand\texosquerypatdec}%
+ \def\patpcur{\noexpand\texosquerypatprefixcurrency}%
+ \def\patpicur{\noexpand\texosquerypatprefixicurrency}%
+ \def\patscur{\noexpand\texosquerypatsuffixcurrency}%
+ \def\patsicur{\noexpand\texosquerypatsuffixicurrency}%
+ \def\patstr{\noexpand\texosquerypatstr}%
+ \def\patapo{\noexpand\texosquerypatquote}%
+ \def\patdgt{\noexpand\texosquerypatdigit}%
+ \def\patdgtnz{\noexpand\texosquerypatdigitnozero}%
+ \def\patmsg{\noexpand\texosquerypatminus}%
+ \def\patngp{\noexpand\texosquerypatgroupsep}%
+ \def\patppct{\noexpand\texosquerypatprefixpercent}%
+ \def\patspct{\noexpand\texosquerypatsuffixpercent}%
+ \def\patppml{\noexpand\texosquerypatprefixpermill}%
+ \def\patspml{\noexpand\texosquerypatsuffixpermill}%
+% \end{macrocode}
+%Hook to adjust the processing of non-ASCII characters.
+% \begin{macrocode}
+ \def\twrp{\texosquerynonasciiwrap}%
+ \def\fwrp{\texosquerynonasciidetokwrap}%
+% \end{macrocode}
+%Locally redefine some more commands that may occur in
+%\app{texosquery}'s return value (via the \texttt{escapeSpChars}
+%method in \file{TeXOSQuery.java}). The \texttt{t} prefix indicates
+%textual commands and the \texttt{f} prefix indicates literal
+%characters, for example, in file names.
+% \begin{macrocode}
+ \let\fbks\texosquerybackslash
+ \let\tbks\texosquerytextbackslash
+ \let\flbr\texosqueryleftbrace
+ \let\tlbr\texosquerytextleftbrace
+ \let\frbr\texosqueryrightbrace
+ \let\trbr\texosquerytextrightbrace
+ \let\fhsh\texosqueryhash
+ \let\thsh\texosquerytexthash
+ \let\fusc\texosqueryunderscore
+ \let\tusc\texosquerytextunderscore
+ \let\fgrv\texosquerybacktick
+ \let\tgrv\texosquerytextbacktick
+ \let\fapo\texosqueryclosequote
+ \let\tapo\texosquerytextclosequote
+ \let\fdqt\texosquerydoublequote
+ \let\tdqt\texosquerytextdoublequote
+ \let\fspc\texosqueryliteralspace
+ \let\tspc\texosquerytextspace
+ \let\fcln\texosquerycolon
+ \let\tcln\texosquerytextcolon
+ \let\fscl\texosquerysemicolon
+ \let\tscl\texosquerytextsemicolon
+ \let\feql\texosqueryequals
+ \let\teql\texosquerytextequals
+ \let\fhyn\texosqueryhyphen
+ \let\thyn\texosquerytexthyphen
+ \let\fpls\texosqueryplus
+ \let\tpls\texosquerytextplus
+ \let\ftld\texosquerytilde
+ \let\ttld\texosquerytexttilde
+ \let\fcir\texosquerycircum
+ \let\tcir\texosquerytextcircum
+ \let\famp\texosqueryampersand
+ \let\tamp\texosquerytextampersand
+ \let\fslh\texosqueryslash
+ \let\tslh\texosquerytextslash
+ \let\fpct\texosquerypercent
+ \let\tpct\texosquerytextpercent
+ \let\fexc\texosqueryexclam
+ \let\texc\texosquerytextexclam
+ \let\fque\texosqueryquestion
+ \let\tque\texosquerytextquestion
+ \let\fles\texosquerylessthan
+ \let\tles\texosquerytextlessthan
+ \let\fgre\texosquerygreaterthan
+ \let\tgre\texosquerytextgreaterthan
+ \let\fdol\texosquerydollar
+ \let\tdol\texosquerytextdollar
+ \let\fdot\texosqueryperiod
+ \let\tdot\texosquerytextperiod
+ \let\fcom\texosquerycomma
+ \let\tcom\texosquerytextcomma
+ \let\fopb\texosqueryopenparen
+ \let\topb\texosquerytextopenparen
+ \let\fclb\texosquerycloseparen
+ \let\tclb\texosquerytextcloseparen
+ \let\fosb\texosqueryopensq
+ \let\tosb\texosquerytextopensq
+ \let\fcsb\texosqueryclosesq
+ \let\tcsb\texosquerytextclosesq
+ \let\fast\texosqueryasterisk
+ \let\tast\texosquerytextasterisk
+ \let\fatc\texosqueryatchar
+ \let\tatc\texosquerytextatchar
+ \let\pdfd\@texosquery@D
+}
+% \end{macrocode}
+%\end{macro}
%
%\begin{macro}{\TeXOSQuery}
-%Use \texttt{texosquery} with the option given in the second
+%Use \app{texosquery} with the option given in the second
%argument and store the result in control sequence given in the
%first argument.
% \begin{macrocode}
@@ -611,10 +3584,15 @@
\begingroup
\endlinechar=-1\relax
% \end{macrocode}
-%Just in case the result contains any awkward characters that have
-%some special meaning to \TeX. (Can't really protect against hash,
-%backslash or curly braces, but they're unlikely to occur unless
-%the user has a very wacky and inappropriate file naming scheme.)
+%Locally redefine short commands used by \app{texosquery}
+% \begin{macrocode}
+ \@texosquery@enableshortcs
+% \end{macrocode}
+%Change the category code of some potentially awkward characters.
+%(This should no longer be an issue with the new commands that
+%are now used in the returned text, but \app{texosquery} might be run with the
+%backward compatibility mode on, so this is
+%still needed just in case.)
% \begin{macrocode}
\catcode`\-=12\relax
\catcode`\_=12\relax
@@ -622,20 +3600,376 @@
\catcode`\~=12\relax
\catcode`\$=12\relax
\catcode`\&=12\relax
- \catcode`\"=12\relax
- \catcode`\'=12\relax
\catcode`\.=12\relax
\catcode`\/=12\relax
\catcode`\:=12\relax
+ \catcode`\"=12\relax
+ \catcode`\'=12\relax
\catcode`\;=12\relax
\catcode`\%=12\relax
\everyeof{\noexpand}\relax
- \edef\x{\endgroup\def\noexpand#1{\TeXOSQueryInvoker{#2}}}\x
+ \@texosquery@edef\x{\endgroup\def\noexpand#1{\TeXOSQueryInvoker{#2}}}\x
\fi
}
% \end{macrocode}
%\end{macro}
%
+%\subsubsection{Currency}
+%The \meta{\TeX\ currency} element of \longarg{numeric} and
+%\longarg{locale-data} identifies the currency symbol using
+%\begin{definition}
+%\cs{texosquerycurrency}\marg{label}
+%\end{definition}
+%which simply expands to the appropriate command.
+%\begin{macro}{\texosquerycurrency}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrency#1{%
+ \expandafter\noexpand\csname texosquerycurrency#1\endcsname
+}
+% \end{macrocode}
+%\end{macro}
+%
+%Provide the currency commands that may be returned
+%\app{texosquery} (on expansion of \cs{texosquerycurrency}).
+%Most of these will need redefining as there's no appropriate
+%generic code to use as a default.
+%The \sty{fontawesome} package has the most support for currency
+%symbols, so these are checked first.
+%\begin{macro}{\texosquerycurrencydollar}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faDollar\undefined
+ \def\texosquerycurrencydollar{\$}
+\else
+ \def\texosquerycurrencydollar{\faDollar}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencycent}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textcent\undefined
+ \def\texosquerycurrencycent{cent}
+\else
+ \def\texosquerycurrencycent{\textcent}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencypound}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faGbp\undefined
+ \ifx\pounds\undefined
+ \def\texosquerycurrencypound{pound}
+ \else
+ \def\texosquerycurrencypound{\pounds}
+ \fi
+\else
+ \def\texosquerycurrencypound{\faGbp}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencysign}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textcurrency\undefined
+ \def\texosquerycurrencysign{currency-sign}
+\else
+ \def\texosquerycurrencysign{\textcurrency}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyyen}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faYen\undefined
+ \ifx\textyen\undefined
+ \def\texosquerycurrencyyen{yen}
+ \else
+ \def\texosquerycurrencyyen{\textyen}
+ \fi
+\else
+ \def\texosquerycurrencyyen{\faYen}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyecu}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyecu{ecu}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencycolon}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencycolon{colon}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencycruzeiro}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencycruzeiro{cruzeiro}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyfranc}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyfranc{franc}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencylira}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textlira\undefined
+ \def\texosquerycurrencylira{lira}
+\else
+ \def\texosquerycurrencylira{\textlira}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencymill}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencymill{mill}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencynaira}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textnaira\undefined
+ \def\texosquerycurrencynaira{naira}
+\else
+ \def\texosquerycurrencynaira{\textnaira}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencypeseta}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencypeseta{peseta}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyrupee}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faRupee\undefined
+ \def\texosquerycurrencyrupee{rupee}
+\else
+ \def\texosquerycurrencyrupee{\faRupee}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencywon}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faWon\undefined
+ \ifx\textwon\undefined
+ \def\texosquerycurrencywon{won}
+ \else
+ \def\texosquerycurrencywon{\textwon}
+ \fi
+\else
+ \def\texosquerycurrencywon{\faWon}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencynewsheqel}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faSheqel\undefined
+ \def\texosquerycurrencynewsheqel{newsheqel}
+\else
+ \def\texosquerycurrencynewsheqel{\faSheqel}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencydong}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textdong\undefined
+ \def\texosquerycurrencydong{dong}
+\else
+ \def\texosquerycurrencydong{\textdong}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyeuro}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faEuro\undefined
+ \ifx\texteuro\undefined
+ \ifx\euro\undefined
+ \def\texosquerycurrencyeuro{euro}
+ \else
+ \def\texosquerycurrencyeuro{\euro}
+ \fi
+ \else
+ \def\texosquerycurrencyeuro{\texteuro}
+ \fi
+\else
+ \def\texosquerycurrencyeuro{\faEuro}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencykip}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencykip{kip}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencytugrik}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencytugrik{tugrik}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencydrachma}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencydrachma{drachma}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencygermanpenny}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencygermanpenny{german-penny}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencypeso}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textpeso\undefined
+ \def\texosquerycurrencypeso{peso}
+\else
+ \def\texosquerycurrencypeso{\textpeso}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyguarani}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textguarani\undefined
+ \def\texosquerycurrencyguarani{guarani}
+\else
+ \def\texosquerycurrencyguarani{\textguarani}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyaustral}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyaustral{austral}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyhryvnia}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyhryvnia{hryvnia}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencycedi}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\textcolonmonetary\undefined
+ \def\texosquerycurrencycedi{cedi}
+\else
+ \def\texosquerycurrencycedi{\textcolonmonetary}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencylivretournois}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencylivretournois{livre-tournois}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyspesmilo}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyspesmilo{spesmilo}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencytenge}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencytenge{tenge}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyrupee}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencyrupee{rupee}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyturkishlira}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faTurkishLira\undefined
+ \def\texosquerycurrencyturkishlira{turkish-lira}
+\else
+ \def\texosquerycurrencyturkishlira{\faTurkishLira}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencynordicmark}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencynordicmark{nordic-mark}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencymanat}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerycurrencymanat{manat}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerycurrencyruble}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\ifx\faRuble\undefined
+ \def\texosquerycurrencyruble{ruble}
+\else
+ \def\texosquerycurrencyruble{\faRuble}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\subsubsection{Shortcut Commands}
%Now for some convenient shortcuts so the user doesn't have to
%remember the command line options. \cs{string} is used in
%case the hyphen character has been made active.
@@ -647,6 +3981,37 @@
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\TeXOSQueryLangTag}
+%Query the language tag and store the result in the control sequence
+%provided in the argument.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\TeXOSQueryLangTag#1{\TeXOSQuery{#1}{\string-b}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryNumeric}
+%Query the numeric settings for the locale given in the second
+%argument and store the result in the control sequence
+%provided in the argument. Leave the second argument empty for the
+%default locale.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\TeXOSQueryNumeric#1#2{\TeXOSQuery{#1}{\string-N #2}}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryLocaleData}
+%Query the data for the locale given in the second
+%argument and store the result in the control sequence
+%provided in the argument. Leave the second argument empty for the
+%default locale.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\TeXOSQueryLocaleData#1#2{\TeXOSQuery{#1}{\string-D #2}}
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\TeXOSQueryCwd}
%Query the current working directory.
% \begin{macrocode}
@@ -689,18 +4054,36 @@
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\TeXOSQueryDateTime}
+%\changes{1.2}{2017-03-23}{new}
+%Query the current date and time.
+% \begin{macrocode}
+\def\TeXOSQueryDateTime#1{%
+ \TeXOSQuery{#1}{\string-M}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryTimeZones}
+%\changes{1.2}{2017-03-23}{new}
+%Query the current time zone mappings. Leave the second argument
+%empty for the default locale.
+% \begin{macrocode}
+\def\TeXOSQueryTimeZones#1#2{%
+ \TeXOSQuery{#1}{\string-Z #2}%
+}
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\TeXOSQueryNow}
%\changes{1.1}{2016-07-14}{changed catcode of D to 12}
%Query the current time stamp.
% \begin{macrocode}
\def\TeXOSQueryNow#1{%
% \end{macrocode}
-% The \texttt{D} needs category code 12. (Don't need to worry about
-% \texttt{Z} as \texttt{texosquery.jar} uses \texttt{+00'00'} for
-% UTC+0.) This change can't be done with the other catcode changes
-% in \cs{TeXOSQuery}, as this is only appropriate for the PDF dates.
-% Save and restore the catcode rather than fiddle around with
-% scoping.
+% The \texttt{D} needs category code 12 just in case
+% \app{texosquery} is running in a backward compatibility mode that
+% doesn't use \cs{pdfd}.
% \begin{macrocode}
\edef\@texosquery@restore@D{%
\noexpand\catcode`\noexpand\D=\the\catcode`\D\relax}%
@@ -733,6 +4116,11 @@
%Query the time stamp of the file given in the second argument.
% \begin{macrocode}
\def\TeXOSQueryFileDate#1#2{%
+% \end{macrocode}
+% The \texttt{D} needs category code 12 just in case
+% \app{texosquery} is running in a backward compatibility mode that
+% doesn't use \cs{pdfd}.
+% \begin{macrocode}
\edef\@texosquery@restore@D{%
\noexpand\catcode`\noexpand\D=\the\catcode`\D\relax}%
\catcode`\D=12\relax
@@ -750,13 +4138,354 @@
% \end{macrocode}
%\end{macro}
%
+%\begin{macro}{\@texosquery@filelist}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@filelist#1#2#3#4#5{\TeXOSQuery{#1}{%
+ \string#2 \string'#3\string'
+ \string'\texosquerystripquotes{#4}\string' #5}}
+% \end{macrocode}
+%\end{macro}
+%
%\begin{macro}{\TeXOSQueryFileList}
%List all files in the directory given in the third argument,
%separated by the second argument.
% \begin{macrocode}
-\def\TeXOSQueryFileList#1#2#3{\TeXOSQuery{#1}{%
- \string-i \string'#2\string'
- \string'\texosquerystripquotes{#3}\string'}}
+\def\TeXOSQueryFileList#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date.
+% \begin{macrocode}
+\def\TeXOSQueryFileListDateAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFileListDateDes#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by size.
+% \begin{macrocode}
+\def\TeXOSQueryFileListSizeAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFileListSizeDes#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by name.
+% \begin{macrocode}
+\def\TeXOSQueryFileListNameAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFileListNameDes#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by case-insensitive name.
+% \begin{macrocode}
+\def\TeXOSQueryFileListNameIgnoreCaseAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by case-insensitive name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFileListNameIgnoreCaseDes#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by extension.
+% \begin{macrocode}
+\def\TeXOSQueryFileListExtAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFileListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFileListExtDes#1#2#3{%
+ \@texosquery@filelist{#1}{-i}{#2}{#3}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileList}
+%List all regular files.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileList#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirList}
+%List all sub-directories.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirList#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by date.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListDateAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by date.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListDateAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListDateDes#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by date in descending order.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListDateDes#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by size.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListSizeAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by size.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListSizeAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListSizeDes#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by size in descending order.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListSizeDes#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file name.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListNameAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by file name.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListNameAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListNameDes#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by name in descending order.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListNameDes#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file case-insensitive name.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListNameIgnoreCaseAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by file case-insensitive name.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListNameIgnoreCaseAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file case-insensitive name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListNameIgnoreCaseDes#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by case-insensitive name in descending order.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListNameIgnoreCaseDes#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file extension.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListExtAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by file extension.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListExtAsc#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryRegularFileListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all regular files sorted by file extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryRegularFileListExtDes#1#2#3{%
+ \@texosquery@filelist{#1}{-ir}{#2}{#3}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQuerySubDirListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%List all sub-directories sorted by extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQuerySubDirListExtDes#1#2#3{%
+ \@texosquery@filelist{#1}{-id}{#2}{#3}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\@texosquery@filterfilelist}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@filterfilelist#1#2#3#4#5#6{%
+ \TeXOSQuery{#1}%
+ {%
+ \string#2 \string'#3\string' \string'#4\string'
+ \string'\texosquerystripquotes{#5}\string' #6%
+ }%
+}
% \end{macrocode}
%\end{macro}
%
@@ -766,9 +4495,455 @@
%expression used to filter the list. \emph{Take care of backslashes
%in the regular expression!}
% \begin{macrocode}
-\def\TeXOSQueryFilterFileList#1#2#3#4{\TeXOSQuery{#1}{%
- \string-f \string'#2\string' \string'#3\string'
- \string'\texosquerystripquotes{#4}\string'}}
+\def\TeXOSQueryFilterFileList#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListDateAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListDateDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by size.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListSizeAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListSizeDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListNameAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListNameDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name (case-insensitive).
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListNameIgnoreCaseAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by name in descending order (case-insensitive).
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListNameIgnoreCaseDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file extension.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListExtAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterFileListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterFileListExtDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-f}{#2}{#3}{#4}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileList}
+%Filtered list or regular files.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileList#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirList}
+%Filtered list of sub-directories.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirList#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file date.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListDateAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file date.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListDateAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListDateDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListDateDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file size.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListSizeAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file size.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListSizeAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListSizeDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListSizeDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file name.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListNameAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file name.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListNameAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListNameDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListNameDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by case-insensitive file name.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListNameIgnoreCaseAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by case-insensitive file name.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListNameIgnoreCaseAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by case-insensitive file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListNameIgnoreCaseDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by case-insensitive file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListNameIgnoreCaseDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file extension. (Added for
+%completeness as directories don't tend to have extensions.)
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListExtAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file extension.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListExtAsc#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterSubDirListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of sub-directories by file extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterSubDirListExtDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fd}{#2}{#3}{#4}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryFilterRegularFileListExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%Filtered sort of regular files by file extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryFilterRegularFileListExtDes#1#2#3#4{%
+ \@texosquery@filterfilelist{#1}{-fr}{#2}{#3}{#4}{ext\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@walk}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@walk#1#2#3#4#5{%
+ \TeXOSQuery{#1}%
+ {%
+ \string-w \string'#2\string' \string'#3\string'
+ \string'\texosquerystripquotes{#4}\string' #5%
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalk}
+%\changes{1.2}{2017-03-23}{new}
+%Recursive filtered listing of regular files.
+% \begin{macrocode}
+\def\TeXOSQueryWalk#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkDateAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date.
+% \begin{macrocode}
+\def\TeXOSQueryWalkDateAsc#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{date}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkDateDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by date in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryWalkDateDes#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{date\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkSizeAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file size.
+% \begin{macrocode}
+\def\TeXOSQueryWalkSizeAsc#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{size}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkSizeDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file size in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryWalkSizeDes#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{size\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkNameAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name.
+% \begin{macrocode}
+\def\TeXOSQueryWalkNameAsc#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{name}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkNameDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryWalkNameDes#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{name\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkNameIgnoreCaseAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name (case-insensitive).
+% \begin{macrocode}
+\def\TeXOSQueryWalkNameIgnoreCaseAsc#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{iname}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkNameIgnoreCaseDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file name (case-insensitive) in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryWalkNameIgnoreCaseDes#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{iname\string-des}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkExtAsc}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file extension.
+% \begin{macrocode}
+\def\TeXOSQueryWalkExtAsc#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{ext}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\TeXOSQueryWalkExtDes}
+%\changes{1.2}{2017-03-23}{new}
+%As above, but sort by file extension in descending order.
+% \begin{macrocode}
+\def\TeXOSQueryWalkExtDes#1#2#3#4{%
+ \@texosquery@walk{#1}{#2}{#3}{#4}{ext\string-des}%
+}
% \end{macrocode}
%\end{macro}
%
@@ -798,6 +4973,2550 @@
% \end{macrocode}
%\end{macro}
%
+%\subsubsection{Pattern Formats}
+%\label{sec:patternformats}
+%There are two basic types of patterns: date/time or numeric.
+%A pattern is stored in a control sequence using custom markup
+%that's easier for \TeX\ to parse than it would be to parse
+%strings in the form \verb|YYYY-MM| or \verb|#,##0|. This internal
+%pattern format can be obtained through capturing the output
+%of \app{texosquery}'s \shortarg{D} action, but patterns can also be
+%constructed using
+%\begin{definition}
+%\cs{texosquerydefpattern}\marg{cs}\marg{pattern specs}
+%\end{definition}
+%The pattern is stored in \meta{cs}. The \meta{pattern specs} depend
+%on whether a date-time or numeric pattern is required.
+%For a date-time pattern, each date/time element is identified
+%using
+%\begin{definition}
+%\cs{texosquerydtf}\marg{n}\marg{identifier}
+%\end{definition}
+%where \meta{identifier} identifies the element type (such as
+%\verb|M| for month or \verb|s| for seconds) and \meta{n}
+%indicates how the element should be formatted, where \meta{n}
+%is an integer from 1 to 4. For example if \meta{n} is 2
+%and \meta{identifier} is \verb|M|, then this indicates the
+%\verb|MM| format, which produces a two-digit number.
+%
+%Since it's rather cumbersome to keep typing \cs{texosquerydtf}
+%and it can make for rather hard to read code,
+%\cs{texosquerydefpattern} locally redefines \verb|\%| to expand to
+%\cs{texosquerydtf}. This means that if you do, for example:
+%\begin{verbatim}
+%\texosquerydefpattern{\pattern}{\%2d/\%2M/\%4y}
+%\end{verbatim}
+%then \cs{pattern} is defined to
+%\begin{verbatim}
+%\texosquerydtf 2d/\texosquerydtf 2M/\texosquerydtf 4y
+%\end{verbatim}
+%When simply used within the document, this just expands to the
+%pattern format. For example:
+%\begin{verbatim}
+%Pattern: \pattern.
+%\end{verbatim}
+%will display \qt{Pattern: dd/MM/yyyy} in the PDF. However,
+%when used with \cs{texosqueryfmtdatetime}, the definition
+%of \cs{texosquerydtf} changes to reproduce the required
+%date/time element.
+%
+%For example:
+%\begin{verbatim}
+%\texosquerydefpattern{\pattern}{\%2d/\%2M/\%4y \%2H:\%2m:\%2s \%2Z}
+%
+%Pattern: \pattern.
+%
+%\TeXOSQueryDateTime{\datetimedata}
+%
+%\ifx\datetimedata\empty
+% Query Failed!
+%\else
+% \expandafter\texosqueryfmtdatetime\expandafter\pattern\datetimedata
+%\fi
+%\end{verbatim}
+%
+%The numeric patterns are rather more complicated. The
+%\meta{pattern specs} now needs to use the following formats:
+%
+%\begin{definition}
+%\cs{texosquerypatnum}\marg{+ve/-ve numeric pattern}
+%\end{definition}
+%This is a numeric pattern applied to a number regardless of
+%whether the number is positive or negative. (If negative, the
+%minus sign is automatically inserted.) This is rather a long
+%and cumbersome command to type, so \cs{texosquerydefpattern}
+%locally defines \cs{numfmt} to expand to it.
+%
+%\begin{definition}
+%\cs{texosquerypatplusminus}\marg{+ve numeric pattern}\marg{-ve numeric
+%pattern}
+%\end{definition}
+%This provides a pattern \meta{+ve numeric pattern} to use if the
+%number is positive and a patter \meta{-ve numeric pattern} to use
+%if the number is negative. Again \cs{texosquerydefpattern}
+%locally defines a shortcut, \cs{pmnumfmt}, to expand to this
+%command.
+%
+%\begin{definition}
+%\cs{texosquerypatsinum}\marg{decimal pattern}\marg{mantissa
+%pattern}
+%\end{definition}
+%This provides a pattern to use for SI numbers where \meta{decimal
+%pattern} is a pattern for the decimal number part (before the
+%exponent symbol) and \meta{mantissa} is the pattern for the integer
+%part in the mantissa (after the exponent symbol).
+%The locally defined shortcut is \cs{sinumfmt}. The \meta{decimal
+%pattern} will typically be in the form:
+%\begin{definition}
+%\cs{texosquerypatdec}\marg{integer pattern}\marg{fraction pattern}
+%\end{definition}
+%This indicates a decimal pattern where the \meta{integer pattern}
+%is applied to the part before the decimal separator and
+%\meta{fraction pattern} is applied to the part after the separator. The shortcut is \cs{decfmt}.
+%
+%\begin{definition}
+%\cs{texosquerypatprefixcurrency}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a currency pattern with a prefixed currency symbol where \meta{text} is inserted
+%before the currency symbol. The shortcut is \cs{pcur}.
+%The \meta{decimal pattern} will typically use
+%\cs{texosquerypatdec}\marg{int}\meta{frac}. (Similarly for the
+%following.)
+%
+%\begin{definition}
+%\cs{texosquerypatprefixicurrency}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates an international currency pattern with a prefixed
+%international currency symbol where \meta{text} is inserted
+%before the symbol. The shortcut is \cs{picur}.
+%
+%\begin{definition}
+%\cs{texosquerypatsuffixcurrency}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a currency pattern with a suffixed international
+%currency symbol where \meta{text} is inserted
+%after the currency symbol. The shortcut is \cs{scur}.
+%
+%\begin{definition}
+%\cs{texosquerypatsuffixicurrency}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates an international currency pattern with a suffixed
+%international currency symbol where \meta{text} is inserted
+%after the symbol. The shortcut is \cs{sicur}.
+%
+%\begin{definition}
+%\cs{texosquerypatprefixpercent}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a percentage pattern with a prefixed percent symbol where \meta{text} is inserted
+%before the symbol. The shortcut is \cs{ppct}.
+%
+%\begin{definition}
+%\cs{texosquerypatsuffixpercent}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a percentage pattern with a suffixed percent symbol where \meta{text} is inserted
+%after the symbol. The shortcut is \cs{spct}.
+%
+%\begin{definition}
+%\cs{texosquerypatprefixpermill}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a per-mill pattern with a prefixed per-mill symbol where \meta{text} is inserted
+%before the symbol. The shortcut is \cs{ppml}.
+%
+%\begin{definition}
+%\cs{texosquerypatsuffixpermill}\marg{decimal pattern}\marg{text}
+%\end{definition}
+%This indicates a per-mill pattern with a suffixed per-mill symbol where \meta{text} is inserted
+%after the symbol. The shortcut is \cs{spml}.
+%
+%\begin{important}
+%The integer parts \meta{integer part}, \meta{fraction part}
+%and \meta{mantissa} must have \emph{exactly} ten digit identifiers.
+%(\TeX\ can't reach 11 digit numbers.)
+%\end{important}
+%
+%There are two types of digit identifiers:
+%\begin{definition}
+%\cs{texosquerypatdigit}
+%\end{definition}
+%This indicates a digit that must be displayed, even if it's not
+%significant (for example a leading zero). The shortcut command is \verb|\0| (backslash zero).
+%
+%\begin{definition}
+%\cs{texosquerypatdigitnozero}
+%\end{definition}
+%This indicates a digit that should only be displayed if it's
+%significant. (For example, if it's a leading zero, it's not shown.)
+%The shortcut command is \verb|\#| (backslash hash).
+%
+%The number group separator can be inserted using
+%\begin{definition}
+%\cs{texosquerypatgroupsep}
+%\end{definition}
+%The shortcut command is \verb|\,| (backslash comma).
+%
+%The sign can be inserted using
+%\begin{definition}
+%\cs{texosquerypatminus}
+%\end{definition}
+%This ensures the sign is displayed even if the number is positive.
+%The shortcut command is \verb|\-| (backslash hyphen).
+%
+%Here's an example of a decimal pattern:
+%\begin{verbatim}
+%\texosquerydefpattern{\numpattern}{%
+% \numfmt{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\#\#\#\#\#\#\#\#\#}}}
+%\end{verbatim}
+%The pattern can be applied to a number using \cs{texosqueryfmtnumber}:
+%\begin{verbatim}
+%\texosqueryfmtnumber{\numpattern}{123}{4567}{2}
+%\end{verbatim}
+%which produces: 12,345.67 (the group and decimal separators can be
+%redefined as appropriate).
+%
+%Here's an example of a scientific number:
+%\begin{verbatim}
+%\texosquerydefpattern{\sinumpattern}{%
+% \sinumfmt
+% {\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\#\#\#\#\#\#\#\#\#}}%
+% {\-\#\#\#\#\#\#\#\#\0\0}%
+%}
+%\end{verbatim}
+%The pattern can be applied to a number:
+%\begin{verbatim}
+%\texosqueryfmtnumber{\sinumpattern}{1}{234567}{3}
+%\end{verbatim}
+%which produces: 1.234567E+03
+%
+%Here's an integer pattern:
+%\begin{verbatim}
+%\texosquerydefpattern{\intpattern}{%
+% \patnumfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}}
+%\end{verbatim}
+%The pattern applied to a number:
+%\begin{verbatim}
+%\texosqueryfmtnumber{\intpattern}{123}{4567}{2}
+%\end{verbatim}
+%which produces: 12,345 (the fractional part has been omitted).
+%
+%Here's a currency pattern that applies a different format for
+%positive and negative numbers:
+%\begin{verbatim}
+%\texosquerydefpattern{\curpattern}{%
+% \pmnumfmt
+% {\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{}}%
+% {\pcur{\decfmt{\#\,\#\#\#\,\#\#\#\,\#\#\0}{\0\0\#\#\#\#\#\#\#\#}}{\-}}}
+%\end{verbatim}
+%This uses the \meta{text} part of \cs{pcur} to insert the sign
+%before the currency symbol (but only for negative values).
+%\begin{verbatim}
+%\texosqueryfmtnumber{\curpattern}{-1234567}{0}{0}
+%\end{verbatim}
+%This produces: $-$\$12,345,678.00 (again the symbol and separators
+%can be redefined as appropriate).
+%
+%Here's an example of a percentage pattern:
+%\begin{verbatim}
+%\texosquerydefpattern{\pcpattern}{%
+% \numfmt{\spct{\#\,\#\#\#\,\#\#\#\,\#\#\0}{}}}
+%\end{verbatim}
+%The pattern can similarly be applied to a number using
+%\cs{texosqueryfmtnumber}.
+%
+%\begin{macro}{\texosquerydtf}
+%\changes{1.2}{2017-03-23}{new}
+%Date/time format placeholder. The second argument is the
+%placeholder character and the first argument is the number of
+%occurrences of that character in the placeholder. The default
+%definition just converts it back to pattern format used by
+%Java's
+%\href{http://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html}{SimpleDateFormat
+%class}. The pattern interprets $\ge4$ as a single case, so this
+%will only produce a maximum of four characters.
+% \begin{macrocode}
+\def\texosquerydtf#1#2{%
+ \ifcase#1
+ \or
+ #2%
+ \or
+ #2#2%
+ \or
+ #2#2#2%
+ \else
+ #2#2#2#2%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%The following commands are used to display the pattern in the
+%document text to reproduce the pattern string recognised by Java.
+%This is provided for debugging to check the pattern. In most cases
+%the pattern will be applied to a number rather than simply
+%displayed.
+%
+%\begin{macro}{\texosquerypatstr}
+%\changes{1.2}{2017-03-23}{new}
+%Quoted string contained in number format.
+% \begin{macrocode}
+\def\texosquerypatstr#1{'#1'}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatquote}
+%\changes{1.2}{2017-03-23}{new}
+%Literal quote contained in number format.
+% \begin{macrocode}
+\def\texosquerypatquote{''}
+% \end{macrocode}
+%\end{macro}
+%Number format place holders.
+%\begin{macro}{\texosquerypatplusminus}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatplusminus#1#2{#1;#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatnum}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatnum#1{#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatsinum}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatsinum#1#2{#1E#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatdec}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatdec#1#2{#1.#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatprefixcurrency}
+%\changes{1.2}{2017-03-23}{new}
+%First argument is a number, the second is optional text before the
+%currency symbol. This will require UTF-8 support otherwise it will
+%need redefining as appropriate. (Similarly for the other currency
+%commands and for the per-mill commands.)
+% \begin{macrocode}
+\def\texosquerypatprefixcurrency#1#2{#2¤#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatprefixicurrency}
+%\changes{1.2}{2017-03-23}{new}
+%As above but use international currency symbol.
+% \begin{macrocode}
+\def\texosquerypatprefixicurrency#1#2{#2¤¤#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatsuffixcurrency}
+%\changes{1.2}{2017-03-23}{new}
+%First argument is a number, the second is optional text after the
+%currency symbol.
+% \begin{macrocode}
+\def\texosquerypatsuffixcurrency#1#2{#1¤#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatsuffixicurrency}
+%\changes{1.2}{2017-03-23}{new}
+%As above but use international currency symbol.
+% \begin{macrocode}
+\def\texosquerypatsuffixicurrency#1#2{#1¤¤#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatdigit}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatdigit{0}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatdigitnozero}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatdigitnozero{\#}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatminus}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatminus{-}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatgroupsep}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatgroupsep{,}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatprefixpercent}
+%\changes{1.2}{2017-03-23}{new}
+%The first argument is the value, the second argument is optional
+%text before the percent symbol.
+% \begin{macrocode}
+\def\texosquerypatprefixpercent#1#2{#2\%#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatsuffixpercent}
+%\changes{1.2}{2017-03-23}{new}
+%The first argument is the value, the second argument is optional
+%text after the percent symbol.
+% \begin{macrocode}
+\def\texosquerypatsuffixpercent#1#2{#1\%#2}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatprefixpermill}
+%\changes{1.2}{2017-03-23}{new}
+%The first argument is the value, the second argument is optional
+%text before the per-mill symbol.
+% \begin{macrocode}
+\def\texosquerypatprefixpermill#1#2{#2‰#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatsuffixpermill}
+%\changes{1.2}{2017-03-23}{new}
+%The first argument is the value, the second argument is optional
+%text after the per-mill symbol.
+% \begin{macrocode}
+\def\texosquerypatsuffixpermill#1#2{#1‰#2}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@pattern@shortcuts}
+%Provide much shorter cuts for the convenience of directly defining
+%patterns with \cs{texosquerydefpattern}.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@pattern@shortcuts{%
+ \def\%{\noexpand\texosquerydtf}%
+ \def\0{\noexpand\texosquerypatdigit}%
+ \def\#{\noexpand\texosquerypatdigitnozero}%
+ \def\-{\noexpand\texosquerypatminus}%
+ \def\,{\noexpand\texosquerypatgroupsep}%
+ \def\numfmt{\noexpand\texosquerypatnum}%
+ \def\pmnumfmt{\noexpand\texosquerypatplusminus}%
+ \def\sinumfmt{\noexpand\texosquerypatsinum}%
+ \def\decfmt{\noexpand\texosquerypatdec}%
+ \def\pcur{\noexpand\texosquerypatprefixcurrency}%
+ \def\picur{\noexpand\texosquerypatprefixicurrency}%
+ \def\scur{\noexpand\texosquerypatsuffixcurrency}%
+ \def\sicur{\noexpand\texosquerypatsuffixicurrency}%
+ \def\ppct{\noexpand\texosquerypatprefixpercent}%
+ \def\spct{\noexpand\texosquerypatsuffixpercent}%
+ \def\ppml{\noexpand\texosquerypatprefixpermill}%
+ \def\spml{\noexpand\texosquerypatsuffixpermill}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerydefpattern}
+%Define a new pattern using the shortcut markup. The first argument
+%is the name of the control sequence in which to store the pattern
+%provided in the second argument. Be careful of any fragile commands
+%within the second argument. They will need protecting!
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerydefpattern#1#2{%
+ \begingroup
+ \@texosquery@pattern@shortcuts
+ \@texosquery@edef\x{\endgroup\def\noexpand#1{#2}}\x
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\subsubsection{Applying Date-Time Patterns}
+%\label{sec:applydatetimepatterns}
+%In order to apply date-time patterns, we need all the information about the
+%date or time we're trying to format.
+%\begin{enumerate}
+%\item Era needed by the \texttt{G} designator. Java
+%identifies the era by an integer (0 = BC and 1 = AD).
+%\item Era text (e.g. AD) can be supplied by a macro.
+%\item Year needed by the \texttt{y} designator.
+%\item Week year needed by the \texttt{Y} designator.
+%\item Month in year needed by the \texttt{M} or \texttt{L}
+%designators.
+%\item Month name needed by the \texttt{M} or \texttt{L}
+%designators. This can be provided as macros that convert the month
+%number to the name. Four macros are needed: short, full, standalone
+%short and standalone full.
+%\item Week in year needed by the \texttt{w} designator.
+%\item Week in month needed by the \texttt{W} designator.
+%\item Day in year needed by the \texttt{D} designator.
+%\item Day in month needed by the \texttt{d} designator.
+%\item Day of week in month needed by the \texttt{F} designator.
+%\item Day name in week needed by the \texttt{E} designator.
+%This can be provided as a macros that accepts the day of week
+%number. The full form is needed for 4 letter patterns otherwise a
+%short form.
+%\item Day number of week (1 = Monday, 7 = Sunday) needed by the
+%\texttt{u} designator. This means that
+%the above day of week name macros needs to use Monday=1 base indexing.
+%This means that \cs{pgfcalendarweekdayname} can't be used directly.
+%\item AM/PM identifier needed by the \texttt{a}
+%designator. Assume 0 = AM and 1 = PM to match Java.
+%\item AM/PM text can be provided by a macro.
+%\item Hour of the day (0-23) needed by the \texttt{H}
+%designator.
+%\item Hour in day (1-24) needed by the \texttt{k}
+%designator.
+%\item Hour in am/pm (0-11) needed by the \texttt{K} designator.
+%\item Hour in am/pm (1-12) needed by the \texttt{h} designator.
+%\item Minute in hour needed by the \texttt{m} designator.
+%\item Second in minute needed by the \texttt{s} designator.
+%\item Millisecond needed by the \texttt{S} designator.
+%\item Time zone needed by the \texttt{z}, \texttt{Z} and \texttt{X}
+%designators. This will require macros for converting the time zone
+%to each of those formats.
+%\end{enumerate}
+%Supply a general utility command that has enough arguments to pass
+%all the above information. A higher level user command can then be
+%provided that determines all the arguments to provide an easier
+%interface.
+%
+%The arguments need to be the pattern followed by
+%\marg{era id}\marg{year}\marg{week year}\marg{month}\marg{week in
+%year}\marg{week in month}\marg{day in year}\marg{day in month}\marg{day of
+%week in month}\marg{day number of week}\marg{am/pm id}\marg{hour of day
+%(H)}\marg{hour in day (k)}\marg{hour in am/pm (K)}\marg{hour in
+%am/pm (h)}\marg{minute in hour}\marg{second in minute}\marg{millisecond}\marg{time zone}
+%The arguments must all be integers except for the time zone which
+%must be in the form
+%\marg{TZh}\marg{TZm}\marg{id}\marg{dst flag}. These are the time zone hour and
+%min offsets, time zone ID and daylight saving flag (1 if daylight
+%saving in effect otherwise 0). These arguments can all be
+%obtained using the \longarg{date-time} / \shortarg{M} action.
+%
+%We'll need some helper macros to get around the nine argument
+%maximum limit.
+%
+%\begin{macro}{\texosqueryfmtdatetime}
+%\changes{1.2}{2017-03-23}{new}
+%The general utility command to format a pattern. The first argument
+%is the pattern. After that are the date-time data arguments.
+% \begin{macrocode}
+\def\texosqueryfmtdatetime#1{%
+ \def\@texosquery@fmt@dt@pattern{#1}%
+ \@texosquery@fmt@getera
+}
+% \end{macrocode}
+%\end{macro}
+%
+%All the remaining arguments except for the time zone must be
+%integers. These are padded using \cs{@texosquery@paddigits}.
+%
+%\begin{macro}{\@texosquery@fmt@getera}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getera#1{%
+ \edef\@texosquery@fmt@G{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getyear
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getyear}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getyear#1{%
+ \edef\@texosquery@fmt@y{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getweekyear
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getweekyear}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getweekyear#1{%
+ \edef\@texosquery@fmt@Y{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getmonth
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getmonth}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getmonth#1{%
+ \edef\@texosquery@fmt@M{\@texosquery@paddigits{#1}}%
+ \let\@texosquery@fmt@L\@texosquery@fmt@M
+ \@texosquery@fmt@getweekinyear
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getweekinyear}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getweekinyear#1{%
+ \edef\@texosquery@fmt@w{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getweekinmonth
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getweekinmonth}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getweekinmonth#1{%
+ \edef\@texosquery@fmt@W{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getdayinyear
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getdayinyear}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getdayinyear#1{%
+ \edef\@texosquery@fmt@D{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getdayinmonth
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getdayinmonth}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getdayinmonth#1{%
+ \edef\@texosquery@fmt@d{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getdayofweekinmonth
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getdayofweekinmonth}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getdayofweekinmonth#1{%
+ \edef\@texosquery@fmt@F{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getdaynumberofweek
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getdaynumberofweek}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getdaynumberofweek#1{%
+ \edef\@texosquery@fmt@u{\@texosquery@paddigits{#1}}%
+ \let\@texosquery@fmt@E\@texosquery@fmt@u
+ \@texosquery@fmt@getampm
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getampm}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getampm#1{%
+ \edef\@texosquery@fmt@a{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@gethourindayH
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@gethourindayH}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@gethourindayH#1{%
+ \edef\@texosquery@fmt@H{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@gethourindayk
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@gethourindayk}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@gethourindayk#1{%
+ \edef\@texosquery@fmt@k{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@gethourinampmK
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@gethourinampmK}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@gethourinampmK#1{%
+ \edef\@texosquery@fmt@K{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@gethourinampmh
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@gethourinampmh}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@gethourinampmh#1{%
+ \edef\@texosquery@fmt@h{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getminute
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getminute}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getminute#1{%
+ \edef\@texosquery@fmt@m{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getsecond
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getsecond}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getsecond#1{%
+ \edef\@texosquery@fmt@s{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@getmillisecond
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@getmillisecond}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@getmillisecond#1{%
+ \edef\@texosquery@fmt@S{\@texosquery@paddigits{#1}}%
+ \@texosquery@fmt@gettimezone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@gettimezone}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@gettimezone#1{%
+ \def\@texosquery@fmt@Z{#1}%
+ \def\@texosquery@fmt@z{#1}%
+ \def\@texosquery@fmt@X{#1}%
+% \end{macrocode}
+%All data now supplied. Temporarily redefine pattern markup and
+%process the pattern.
+% \begin{macrocode}
+ \begingroup
+ \@texosquery@setup@dtpattern
+ \@texosquery@fmt@dt@pattern
+ \endgroup
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@setup@dtpattern}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@setup@dtpattern{%
+ \let\texosquerydtf\@texosquery@fmt@dtf
+ \let\texosquerypatstr\texosquerypatfmtstr
+ \let\texosquerypatquote\texosquerypatfmtquote
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@paddigits@pos}
+%\changes{1.2}{2017-03-23}{new}
+%Pad positive number to 10 digits. \TeX\ can't reach 11 digits, so this is
+%the maximum representation.
+% \begin{macrocode}
+\def\@texosquery@paddigits@pos#1{%
+ \ifnum#1<10
+ 000000000\number#1
+ \else
+ \ifnum#1<100
+ 00000000\number#1
+ \else
+ \ifnum#1<1000
+ 0000000\number#1
+ \else
+ \ifnum#1<10000
+ 000000\number#1
+ \else
+ \ifnum#1<100000
+ 00000\number#1
+ \else
+ \ifnum#1<1000000
+ 0000\number#1
+ \else
+ \ifnum#1<10000000
+ 000\number#1
+ \else
+ \ifnum#1<100000000
+ 00\number#1
+ \else
+ \ifnum#1<1000000000
+ 0\number#1
+ \else
+ \number#1
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@paddigits}
+%\changes{1.2}{2017-03-23}{new}
+%This will expand to 11 characters (sign followed by 10 digits).
+% \begin{macrocode}
+\def\@texosquery@paddigits#1{%
+ \ifnum#1<0
+% \end{macrocode}
+%Move the minus sign outside.
+% \begin{macrocode}
+ -\expandafter\@texosquery@paddigits@pos\expandafter
+ {\@texosquery@gobble#1}%
+ \else
+ +\@texosquery@paddigits@pos{#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@paddigits@trailing}
+%\changes{1.2}{2017-03-23}{new}
+%Pad trailing zeros.
+% \begin{macrocode}
+\def\@texosquery@paddigits@trailing#1{%
+ \expandafter\@texosquery@tenoften@then@gobble
+ #10000000000\@texosquery@end@tenoften
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@tenoften@then@gobble}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@tenoften@then@gobble#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6#7#8#9%
+ \@texosquery@lastoften@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@lastoften@gobble}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@lastoften@gobble#1#2\@texosquery@end@tenoften{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%Provide commands to select certain digits. (Sign not included.)
+%
+%\begin{macro}{\@texosquery@firstoften}
+%\changes{1.2}{2017-03-23}{new}
+%First of ten.
+% \begin{macrocode}
+\def\@texosquery@firstoften#1#2#3#4#5#6#7#8#9{%
+ #1%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@secondoften}
+%\changes{1.2}{2017-03-23}{new}
+%Second of ten.
+% \begin{macrocode}
+\def\@texosquery@secondoften#1#2#3#4#5#6#7#8#9{%
+ #2%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@thirdoften}
+%\changes{1.2}{2017-03-23}{new}
+%Third of ten.
+% \begin{macrocode}
+\def\@texosquery@thirdoften#1#2#3#4#5#6#7#8#9{%
+ #3%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fourthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Fourth of ten.
+% \begin{macrocode}
+\def\@texosquery@fourthoften#1#2#3#4#5#6#7#8#9{%
+ #4%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fifthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Fifth of ten.
+% \begin{macrocode}
+\def\@texosquery@fifthoften#1#2#3#4#5#6#7#8#9{%
+ #5%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@sixthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Sixth of ten.
+% \begin{macrocode}
+\def\@texosquery@sixthoften#1#2#3#4#5#6#7#8#9{%
+ #6%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@seventhoften}
+%\changes{1.2}{2017-03-23}{new}
+%Seventh of ten.
+% \begin{macrocode}
+\def\@texosquery@seventhoften#1#2#3#4#5#6#7#8#9{%
+ #7%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@eighthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Eighth of ten.
+% \begin{macrocode}
+\def\@texosquery@eighthoften#1#2#3#4#5#6#7#8#9{%
+ #8%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@ninthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Ninth of ten.
+% \begin{macrocode}
+\def\@texosquery@ninthoften#1#2#3#4#5#6#7#8#9{%
+ #9%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@tenthoften}
+%\changes{1.2}{2017-03-23}{new}
+%Tenth of ten.
+% \begin{macrocode}
+\def\@texosquery@tenthoften#1#2#3#4#5#6#7#8#9{%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%Now macros to select first $n$ of ten.
+%
+%\begin{macro}{@texosquery@firsttwooften}
+%\changes{1.2}{2017-03-23}{new}
+%First two of ten.
+% \begin{macrocode}
+\def\@texosquery@firsttwooften#1#2#3#4#5#6#7#8#9{%
+ #1#2%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstthreeoften}
+%\changes{1.2}{2017-03-23}{new}
+%First three of ten.
+% \begin{macrocode}
+\def\@texosquery@firstthreeoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstfouroften}
+%\changes{1.2}{2017-03-23}{new}
+%First four of ten.
+% \begin{macrocode}
+\def\@texosquery@firstfouroften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstfiveoften}
+%\changes{1.2}{2017-03-23}{new}
+%First five of ten.
+% \begin{macrocode}
+\def\@texosquery@firstfiveoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstsixoften}
+%\changes{1.2}{2017-03-23}{new}
+%First six of ten.
+% \begin{macrocode}
+\def\@texosquery@firstsixoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstsevenoften}
+%\changes{1.2}{2017-03-23}{new}
+%First seven of ten.
+% \begin{macrocode}
+\def\@texosquery@firstsevenoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6#7%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firsteightoften}
+%\changes{1.2}{2017-03-23}{new}
+%First eight of ten.
+% \begin{macrocode}
+\def\@texosquery@firsteightoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6#7#8%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@firstnineoften}
+%\changes{1.2}{2017-03-23}{new}
+%First nine of ten.
+% \begin{macrocode}
+\def\@texosquery@firstnineoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6#7#8#9%
+% \end{macrocode}
+%Grab tenth argument and discard.
+% \begin{macrocode}
+ \@texosquery@gobble
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@alltenoften}
+%\changes{1.2}{2017-03-23}{new}
+%All ten.
+% \begin{macrocode}
+\def\@texosquery@alltenoften#1#2#3#4#5#6#7#8#9{%
+ #1#2#3#4#5#6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%Select last $n$ of ten.
+%
+%\begin{macro}{@texosquery@lasttwooften}
+%\changes{1.2}{2017-03-23}{new}
+%Last two of ten.
+% \begin{macrocode}
+\def\@texosquery@lasttwooften#1#2#3#4#5#6#7#8#9{%
+ #9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastthreeoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last three of ten.
+% \begin{macrocode}
+\def\@texosquery@lastthreeoften#1#2#3#4#5#6#7#8#9{%
+ #8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastfouroften}
+%\changes{1.2}{2017-03-23}{new}
+%Last four of ten.
+% \begin{macrocode}
+\def\@texosquery@lastfouroften#1#2#3#4#5#6#7#8#9{%
+ #7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastfiveoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last five of ten.
+% \begin{macrocode}
+\def\@texosquery@lastfiveoften#1#2#3#4#5#6#7#8#9{%
+ #6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastsixoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last six of ten.
+% \begin{macrocode}
+\def\@texosquery@lastsixoften#1#2#3#4#5#6#7#8#9{%
+ #5#6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastsevenoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last seven of ten.
+% \begin{macrocode}
+\def\@texosquery@lastsevenoften#1#2#3#4#5#6#7#8#9{%
+ #4#5#6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lasteightoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last eight of ten.
+% \begin{macrocode}
+\def\@texosquery@lasteightoften#1#2#3#4#5#6#7#8#9{%
+ #3#4#5#6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{@texosquery@lastnineoften}
+%\changes{1.2}{2017-03-23}{new}
+%Last nine of ten.
+% \begin{macrocode}
+\def\@texosquery@lastnineoften#1#2#3#4#5#6#7#8#9{%
+ #2#3#4#5#6#7#8#9%
+ \@texosquery@firstofone
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmtminus}
+%\changes{1.2}{2017-03-23}{new}
+%Minus symbol for use in date-time patterns.
+% \begin{macrocode}
+\def\@texosquery@fmtminus{\texosquerypatfmtminus}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmtplus}
+%\changes{1.2}{2017-03-23}{new}
+%Plus symbol for use in date-time patterns. Omit by default.
+% \begin{macrocode}
+\def\@texosquery@fmtplus{}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmtsign}
+%\changes{1.2}{2017-03-23}{new}
+%Plus or minus sign for use in date-time patterns.
+% \begin{macrocode}
+\def\@texosquery@fmtsign#1{%
+ \ifx#1+\@texosquery@fmtplus\else\@texosquery@fmtminus\fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@atleastonedigit}
+%\changes{1.2}{2017-03-23}{new}
+%At least one digit with leading zeros removed.
+% \begin{macrocode}
+\def\@texosquery@atleastonedigit#1{%
+ \ifnum#1<0
+ \@texosquery@fmtminus\number-#1
+ \else
+ \number#1
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@atleastfourdigits}
+%\changes{1.2}{2017-03-23}{new}
+%At least four digits, possible padded with zeros to make up four. The first
+%argument is the sign, then follow the ten digits.
+% \begin{macrocode}
+\def\@texosquery@atleastfourdigits#1{%
+ \@texosquery@at@leastfourdigits#1\@texosquery@end@atleastfourdigits
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@at@leastfourdigits}
+%\changes{1.2}{2017-03-23}{new}
+%At least four digits, possible padded with zeros to make up four. The first
+%argument is the sign, then follow the ten digits.
+% \begin{macrocode}
+\def\@texosquery@at@leastfourdigits#1#2\@texosquery@end@atleastfourdigits{%
+ \@texosquery@fmtsign{#1}%
+ \ifnum#2<1000
+ \@texosquery@lastfouroften#2%
+ \else
+ \number#2
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@threedigitsexactly}
+%\changes{1.2}{2017-03-23}{new}
+%Exactly three digits.
+% \begin{macrocode}
+\def\@texosquery@threedigitsexactly#1{%
+ \@texosquery@threedigits@exactly#1\@texosquery@threedigits@exactly
+}%
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@threedigits@exactly}
+%\changes{1.2}{2017-03-23}{new}
+%Exactly three digits.
+% \begin{macrocode}
+\def\@texosquery@threedigits@exactly#1#2\@texosquery@threedigits@exactly{%
+ \@texosquery@fmtsign{#1}%
+ \@texosquery@lastthreeoften#2%
+}%
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@twodigitsexactly}
+%\changes{1.2}{2017-03-23}{new}
+%Exactly two digits.
+% \begin{macrocode}
+\def\@texosquery@twodigitsexactly#1{%
+ \@texosquery@twodigits@exactly#1\@texosquery@twodigits@exactly
+}%
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@twodigits@exactly}
+%\changes{1.2}{2017-03-23}{new}
+%Exactly two digits.
+% \begin{macrocode}
+\def\@texosquery@twodigits@exactly#1#2\@texosquery@twodigits@exactly{%
+ \@texosquery@fmtsign{#1}%
+ \@texosquery@lasttwooften#2%
+}%
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fmt@dtf}
+%\changes{1.2}{2017-03-23}{new}
+%\begin{definition}
+%\cs{@texosquery@fmt@dtf}\marg{n}\marg{designator}
+%\end{definition}
+%
+%When formatting a date-time pattern \cs{texosquerydtf} will
+%temporarily be redefined to this command. This command indicates
+%the format obtained by \meta{n} instances of \meta{designator}.
+%For example, \verb|{2}{M}| indicates the format \texttt{MM}. This
+%command tests for \cs{texosqueryfmtpat}\meta{format}, which should
+%take a single argument. If defined, that's used, otherwise use one
+%of the numeric commands defined above. The \sty{locale} package
+%defines \cs{texosqueryfmtpatMMM} and so on to use the locale's month names
+%etc.
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fmt@dtf#1#2{%
+ \@texosquery@ifundef{@texosquery@fmt@#2}%
+ {\@texosquery@warn{Unknown date-time pattern designator `#2'}}%
+ {%
+ \ifcase#1
+ \or
+ \@texosquery@ifundef{texosqueryfmtpat#2}%
+ {%
+ \expandafter\expandafter\expandafter
+ \@texosquery@atleastonedigit
+ \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ {%
+ \csname texosqueryfmtpat#2\expandafter\expandafter\expandafter\endcsname
+ \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ \or
+ \@texosquery@ifundef{texosqueryfmtpat#2#2}%
+ {%
+ \expandafter\expandafter\expandafter
+ \@texosquery@twodigitsexactly
+ \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ {%
+ \csname texosqueryfmtpat#2#2\expandafter\expandafter\expandafter
+ \endcsname \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ \or
+ \@texosquery@ifundef{texosqueryfmtpat#2#2#2}%
+ {%
+ \expandafter\expandafter\expandafter
+ \@texosquery@threedigitsexactly
+ \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ {%
+ \csname texosqueryfmtpat#2#2#2\expandafter\expandafter\expandafter
+ \endcsname \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ \else
+ \@texosquery@ifundef{texosqueryfmtpat#2#2#2#2}%
+ {%
+ \expandafter\expandafter\expandafter
+ \@texosquery@atleastfourdigits
+ \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ {%
+ \csname texosqueryfmtpat#2#2#2#2\expandafter\expandafter\expandafter
+ \endcsname \expandafter\expandafter\expandafter
+ {\csname @texosquery@fmt@#2\endcsname}%
+ }%
+ \fi
+ }%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%Provide default commands for the time zone designators, since the
+%time zone isn't supplied as a single integer.
+%
+%\begin{macro}{\texosqueryfmttimezonehr}
+%\changes{1.2}{2017-03-23}{new}
+%Allow for \verb|-0| so append 1 to hour in test.
+% \begin{macrocode}
+\def\texosqueryfmttimezonehr#1{%
+ \ifnum#11<0\@texosquery@fmtminus
+ \ifnum#1>-10 0\fi\number-#1
+ \else
+ +\ifnum#1<10 0\fi\number#1
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmttimezonenumhr}
+%\changes{1.2}{2017-03-23}{new}
+%Like the above, but don't zero-pad or prefix with plus sign.
+% \begin{macrocode}
+\def\texosqueryfmttimezonenumhr#1{%
+ \ifnum#11<0\@texosquery@fmtminus
+ \number-#1
+ \else
+ \number#1
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmttimezonemin}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosqueryfmttimezonemin#1{%
+ \ifnum#1<10 0\fi\number#1
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@firstoffour}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@firstoffour#1#2#3#4{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@secondoffour}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@secondoffour#1#2#3#4{#2}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@thirdoffour}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@thirdoffour#1#2#3#4{#3}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@fourthoffour}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@fourthoffour#1#2#3#4{#4}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryshorttimezone}
+%\changes{1.2}{2017-03-23}{new}
+%Maps id to short time zone display name. This will need redefining
+%as appropriate. The default simply expands to the ID.
+%Mappings can be obtained for a particular locale using the
+%\shortarg{Z} or \longarg{time-zones} action.
+% \begin{macrocode}
+\def\texosqueryshorttimezone#1{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryshortdstzone}
+%\changes{1.2}{2017-03-23}{new}
+%Maps id to short daylight saving time zone display name. This will need redefining
+%as appropriate. The default simply expands to the ID followed by
+%(DST).
+% \begin{macrocode}
+\def\texosqueryshortdstzone#1{#1 (DST)}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerylongtimezone}
+%\changes{1.2}{2017-03-23}{new}
+%Maps id to long time zone display name. This will need redefining
+%as appropriate. The default simply expands to the ID.
+% \begin{macrocode}
+\def\texosquerylongtimezone#1{#1}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerylongdstzone}
+%\changes{1.2}{2017-03-23}{new}
+%Maps id to long daylight saving time zone display name. This will need redefining
+%as appropriate. The default simply expands to the ID followed by
+%(DST).
+% \begin{macrocode}
+\def\texosquerylongdstzone#1{#1 (DST)}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerytimesep}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerytimesep{:}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatz}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{z} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatz#1{%
+ \expandafter\ifnum\@texosquery@fourthoffour#1=0
+ \expandafter\texosqueryshorttimezone\expandafter{\@texosquery@thirdoffour#1}%
+ \else
+ \expandafter\texosqueryshortdstzone\expandafter{\@texosquery@thirdoffour#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatzz}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{zz} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatzz#1{%
+ \expandafter\ifnum\@texosquery@fourthoffour#1=0
+ \expandafter\texosqueryshorttimezone\expandafter{\@texosquery@thirdoffour#1}%
+ \else
+ \expandafter\texosqueryshortdstzone\expandafter{\@texosquery@thirdoffour#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatzzz}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{zzz} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatzzz#1{%
+ \expandafter\ifnum\@texosquery@fourthoffour#1=0
+ \expandafter\texosquerylongtimezone\expandafter{\@texosquery@thirdoffour#1}%
+ \else
+ \expandafter\texosquerylongdstzone\expandafter{\@texosquery@thirdoffour#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatzzzz}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{zzzz} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatzzzz#1{%
+ \expandafter\ifnum\@texosquery@fourthoffour#1=0
+ \expandafter\texosquerylongtimezone\expandafter{\@texosquery@thirdoffour#1}%
+ \else
+ \expandafter\texosquerylongdstzone\expandafter{\@texosquery@thirdoffour#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatZ}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{Z} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatZ#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatZZ}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{ZZ} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatZZ#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatZZZ}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{ZZZ} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatZZZ#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatZZZZ}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{ZZZZ} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatZZZZ#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatX}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{X} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatX#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \texosquerytimesep
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatXX}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{XX} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatXX#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \texosquerytimesep
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatXXX}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{XXX} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatXXX#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \texosquerytimesep
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatXXXX}
+%\changes{1.2}{2017-03-23}{new}
+%Default time zone format for \texttt{XXXX} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatXXXX#1{%
+ \expandafter\texosqueryfmttimezonehr\expandafter
+ {\@texosquery@firstoffour#1}%
+ \texosquerytimesep
+ \expandafter\texosqueryfmttimezonemin\expandafter
+ {\@texosquery@secondoffour#1}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpata}
+%\changes{1.2}{2017-03-23}{new}
+%Default am/pm designator for the \texttt{a} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpata#1{%
+ \ifnum#1=0 AM\else PM\fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpataa}
+%\changes{1.2}{2017-03-23}{new}
+%Default am/pm for the \texttt{aa} designator. Just make it the same
+%as the \texttt{a} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpataa{\texosqueryfmtpata}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpataaa}
+%\changes{1.2}{2017-03-23}{new}
+%Default am/pm for the \texttt{aaa} designator. Just make it the same
+%as the \texttt{a} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpataaa{\texosqueryfmtpata}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpataaaa}
+%\changes{1.2}{2017-03-23}{new}
+%Default am/pm for the \texttt{aaaa} designator. Just make it the same
+%as the \texttt{a} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpataaaa{\texosqueryfmtpata}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatG}
+%\changes{1.2}{2017-03-23}{new}
+%Default era designator for the \texttt{G} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatG#1{%
+ \ifnum#1=1 AD\else BC\fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatGG}
+%\changes{1.2}{2017-03-23}{new}
+%Default era for the \texttt{GG} designator. Just make it the same
+%as the \texttt{G} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatGG{\texosqueryfmtpatG}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatGGG}
+%\changes{1.2}{2017-03-23}{new}
+%Default era for the \texttt{GGG} designator. Just make it the same
+%as the \texttt{G} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatGGG{\texosqueryfmtpatG}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosqueryfmtpatGGGG}
+%\changes{1.2}{2017-03-23}{new}
+%Default era for the \texttt{GGGG} designator. Just make it the same
+%as the \texttt{G} designator.
+% \begin{macrocode}
+\def\texosqueryfmtpatGGGG{\texosqueryfmtpatG}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\subsubsection{Applying Numeric Patterns}
+%\label{sec:applynumpatterns}
+%
+%\begin{macro}{\texosqueryfmtnumber}
+%\changes{1.2}{2017-03-23}{new}
+%\begin{definition}
+%\cs{texosqueryfmtnumber}\marg{pattern}\marg{int}\marg{frac}\marg{mantissa}
+%\end{definition}
+%General purpose low-level number formatting command. The first argument
+%\meta{pattern} is the pattern. The other arguments are unformatted integers
+%and must be present and not exceed 10 digits each. The \meta{frac} part must
+%not start with a sign. The minus sign should go at the start of
+%\meta{int} for negative numbers. The plus sign is
+%optional for positive \meta{int} or \meta{mantissa} and not
+%permitted in \meta{frac}. The arguments may each be the actual numerical
+%value or be a single control sequence whose replacement text is
+%the value. Avoid anything more complicated than that.
+%
+%This package doesn't provide a higher level command that can split a number
+%into integer, fractional and mantissa parts.
+% \begin{macrocode}
+\def\texosqueryfmtnumber#1#2#3#4{%
+ \begingroup
+ \let\texosquerypatstr\texosquerypatfmtstr
+ \let\texosquerypatquote\texosquerypatfmtquote
+ \let\texosquerypatplusminus\texosquerypatfmt@plusminus
+ \let\texosquerypatnum\texosquerypatfmt@num
+ \let\texosquerypatsinum\texosquerypatfmt@sinum
+ \let\texosquerypatdec\texosquerypatfmt@dec
+ \let\texosquerypatprefixcurrency\texosquery@patfmt@prefixcurrency
+ \let\texosquerypatprefixicurrency\texosquery@patfmt@prefixicurrency
+ \let\texosquerypatsuffixcurrency\texosquery@patfmt@suffixcurrency
+ \let\texosquerypatsuffixicurrency\texosquery@patfmt@suffixicurrency
+ \let\texosquerypatdigit\texosquerypatfmt@digit
+ \let\texosquerypatdigitnozero\texosquerypatfmt@digitnozero
+ \let\texosquerypatgroupsep\texosquerypatfmt@groupsep
+ \let\texosquerypatprefixpercent\texosquery@patfmt@prefixpercent
+ \let\texosquerypatsuffixpercent\texosquery@patfmt@suffixpercent
+ \let\texosquerypatprefixpermill\texosquery@patfmt@prefixpermill
+ \let\texosquerypatsuffixpermill\texosquery@patfmt@suffixpermill
+ \let\texosquerypatminus\@texosquerypat@numfmt@sign
+ \let\texosquerypatfmt@decsep\texosquerypatfmtdecsep
+% \end{macrocode}
+%Allow for negative zero in the \meta{int} part. To avoid overflow,
+%first check for 0 and then append 1 to the number to
+%catch \verb|-0|.
+% \begin{macrocode}
+ \edef\@texosquery@sgn{%
+ \ifnum#2=0
+ \expandafter\ifnum#21<0 -\else+\fi
+ \else
+ \ifnum#2<0 -\else+\fi
+ \fi
+ }%
+% \end{macrocode}
+%Allow for arguments passed as control sequences that expand to a
+%number.
+% \begin{macrocode}
+ \edef\@texosquery@int{\expandafter\@texosquery@paddigits
+ \expandafter{\number#2}}%
+ \let\@texosquery@si@int\@texosquery@int
+% \end{macrocode}
+%Can't use \cs{number} here as we'll lose any leading zeros.
+% \begin{macrocode}
+ \edef\@texosquery@frac{\expandafter\@texosquery@paddigits@trailing
+ \expandafter{#3}}%
+ \let\@texosquery@si@frac\@texosquery@frac
+ \edef\@texosquery@mantissa{\expandafter\@texosquery@paddigits
+ \expandafter{\number#4}}%
+% \end{macrocode}
+%Is the mantissa non-zero?
+% \begin{macrocode}
+ \ifnum#4=0\relax
+ \else
+ \expandafter\ifx\@texosquery@sgn-%
+ \edef\@texosquery@int{\expandafter
+ \@texosquery@paddigits@pos\expandafter{\number-#2}}%
+ \else
+ \edef\@texosquery@int{\@texosquery@paddigits@pos{#2}}%
+ \fi
+% \end{macrocode}
+%Shift.
+% \begin{macrocode}
+ \ifnum#4<0
+ \expandafter\@texosquery@neg@shift\expandafter{\number-#4}%
+ \else
+ \@texosquery@pos@shift{#4}%
+ \fi
+ \expandafter\ifx\@texosquery@sgn-%
+ \edef\@texosquery@int{\expandafter\@texosquery@paddigits
+ \expandafter{\number-\@texosquery@int}}%
+ \else
+ \edef\@texosquery@int{\expandafter\@texosquery@paddigits
+ \expandafter{\number\@texosquery@int}}%
+ \fi
+ \edef\@texosquery@frac{\@texosquery@paddigits@trailing{\@texosquery@frac}}%
+ \fi
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@int}%
+ \let\@texosquery@zerodigit\@texosquery@zerodigit@leading
+ \expandafter\ifx\@texosquery@sgn-%
+ \let\@texosquery@currentsign\texosquerypatfmtminus
+ \else
+ \let\@texosquery@currentsign\texosquerypatfmtplus
+ \fi
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ #1%
+ \endgroup
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@digitindex}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\newcount\@texosquery@digitindex
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\if@texosquery@digitfound}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\newif\if@texosquery@digitfound
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@pos@shift}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@pos@shift#1{%
+ \ifcase#1
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastnineoften\@texosquery@int
+ \expandafter\@texosquery@firstoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastnineoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lasteightoften\@texosquery@int
+ \expandafter\@texosquery@firsttwooften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lasteightoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastsevenoften\@texosquery@int
+ \expandafter\@texosquery@firstthreeoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastsevenoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastsixoften\@texosquery@int
+ \expandafter\@texosquery@firstfouroften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastsixoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastfiveoften\@texosquery@int
+ \expandafter\@texosquery@firstfiveoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastfiveoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastfouroften\@texosquery@int
+ \expandafter\@texosquery@firstsixoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastfouroften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lastthreeoften\@texosquery@int
+ \expandafter\@texosquery@firstsevenoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastthreeoften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@lasttwooften\@texosquery@int
+ \expandafter\@texosquery@firsteightoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lasttwooften\@texosquery@frac
+ }%
+ \or
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@tenthoften\@texosquery@int
+ \expandafter\@texosquery@firstnineoften\@texosquery@frac}%
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@tenthoften\@texosquery@frac
+ }%
+ \or
+ \let\@texosquery@int\@texosquery@frac
+ \edef\@texosquery@frac{0}%
+% \end{macrocode}
+%Anything larger will require scientific notation. Hopefully the
+%pattern supports this.
+% \begin{macrocode}
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@neg@shift}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@neg@shift#1{%
+ \ifcase#1
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastoneoften\@texosquery@int
+ \expandafter\@texosquery@firstnineoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstnineoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lasttwooften\@texosquery@int
+ \expandafter\@texosquery@firsteightoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firsteightoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastthreeoften\@texosquery@int
+ \expandafter\@texosquery@firstsevenoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstsevenoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastfouroften\@texosquery@int
+ \expandafter\@texosquery@firstsixoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstsixoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastfiveoften\@texosquery@int
+ \expandafter\@texosquery@firstfiveoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstfiveoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastsixoften\@texosquery@int
+ \expandafter\@texosquery@firstfouroften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstfouroften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastsevenoften\@texosquery@int
+ \expandafter\@texosquery@firstthreeoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstthreeoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lasteightoften\@texosquery@int
+ \expandafter\@texosquery@firsttwooften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firsttwooften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{%
+ \expandafter\@texosquery@lastnineoften\@texosquery@int
+ \expandafter\@texosquery@firstoften\@texosquery@frac
+ }%
+ \edef\@texosquery@int{%
+ \expandafter\@texosquery@firstoften\@texosquery@int
+ }%
+ \or
+ \edef\@texosquery@frac{\@texosquery@int\@texosquery@frac}%
+ \edef\@texosquery@int{0}%
+% \end{macrocode}
+%Anything beyond this will require scientific notation. Hopefully the
+%pattern supports it.
+% \begin{macrocode}
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquerypat@numfmt@sign}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquerypat@numfmt@sign{%
+ \@texosquery@currentsign
+ \let\@texosquery@currentsign\empty
+}
+% \end{macrocode}
+%\end{macro}
+%
+%
+%\begin{macro}{\texosquerypatfmtstr}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmtstr#1{#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtquote}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmtquote{'}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmt@plusminus}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@plusminus#1#2{%
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@int}%
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ \expandafter\ifx\@texosquery@sgn-%
+ #2%
+ \ifnum\@texosquery@digitindex=10
+ \else
+ \@texosquery@invalidpattern{#2}%
+ \fi
+ \else
+ #1%
+ \ifnum\@texosquery@digitindex=10
+ \else
+ \@texosquery@invalidpattern{#1}%
+ \fi
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmt@num}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@num#1{#1}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtexp}
+%\changes{1.2}{2017-03-23}{new}
+%Exponent symbol. Change as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtexp{E}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmt@sinum}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@sinum#1#2{%
+ \let\@texosquery@int\@texosquery@si@int
+ \let\@texosquery@frac\@texosquery@si@frac
+ \let\@texosquery@current\@texosquery@int
+ #1%
+ \texosquerypatfmtexp
+ {\let\@texosquery@zerodigit\@texosquery@zerodigit@leading
+ \ifnum\@texosquery@mantissa<0\relax
+ \let\@texosquery@currentsign\texosquerypatfmtminus
+ \else
+ \let\@texosquery@currentsign\texosquerypatfmtplus
+ \fi
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@mantissa}%
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ #2}}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtdecsep}
+%\changes{1.2}{2017-03-23}{new}
+%Decimal separator. Change as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtdecsep{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmtcurdecsep}
+%\changes{1.2}{2017-03-23}{new}
+%Currency decimal separator. Change as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtcurdecsep{.}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmt@dec}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@dec#1#2{%
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@int}%
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ \let\@texosquery@zerodigit\@texosquery@zerodigit@leading
+ #1%
+ \ifnum\@texosquery@digitindex=10
+ \else
+ \@texosquery@invalidpattern{#1}%
+ \fi
+ \texosquerypatfmt@decsep
+ \let\@texosquery@current\@texosquery@frac
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ \let\@texosquery@zerodigit\@texosquery@zerodigit@trailing
+ \let\@texosquery@currentsign\empty
+ #2%
+ \ifnum\@texosquery@digitindex=10
+ \else
+ \@texosquery@invalidpattern{#2}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtint}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmtint#1{%
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@int}%
+ \@texosquery@digitindex=0\relax
+ \@texosquery@digitfoundfalse
+ \let\@texosquery@zerodigit\@texosquery@zerodigit@leading
+ #1%
+ \ifnum\@texosquery@digitindex=10
+ \else
+ \@texosquery@invalidpattern{#1}%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@setpatdisplay}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@setpatdisplay{%
+ \def\texosquerypatstr##1{'##1'}%
+ \def\texosquerypatquote{''}%
+ \def\texosquerypatplusminus##1##2{##1;##2}%
+ \def\texosquerypatnum##1{##1}%
+ \def\texosquerypatsinum##1##2{##1E##2}%
+ \def\texosquerypatdec##1##2{##1.##2}%
+ \def\texosquerypatprefixcurrency##1##2{##2¤##1}%
+ \def\texosquerypatprefixicurrency##1##2{##2¤¤##1}%
+ \def\texosquerypatsuffixcurrency##1##2{##1¤##2}%
+ \def\texosquerypatsuffixicurrency##1##2{##1¤¤##2}%
+ \def\texosquerypatdigit{0}%
+ \def\texosquerypatdigitnozero{\#}%
+ \def\texosquerypatminus{-}%
+ \def\texosquerypatgroupsep{,}%
+ \def\texosquerypatprefixpercent##1##2{##2\%##1}%
+ \def\texosquerypatsuffixpercent##1##2{##1\%##2}%
+ \def\texosquerypatprefixpermill##1##2{##2‰##1}%
+ \def\texosquerypatsuffixpermill##1##2{##1‰##2}%
+ \def\texosquerypatfmt@decsep{.}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@invalidpattern}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@invalidpattern#1{%
+ \begingroup
+ \@texosquery@setpatdisplay
+ \@texosquery@err{10 digit specifiers expected in
+ numeric pattern #1. Found \number\@texosquery@digitindex}%
+ {Each integer element of a numeric pattern must have exactly
+ 10 digit specifiers (0 or \#)}%
+ \endgroup
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmtcurrencysign}
+%\changes{1.2}{2017-03-23}{new}
+%Currency symbol. Redefine as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtcurrencysign{\$}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmticurrencysign}
+%\changes{1.2}{2017-03-23}{new}
+%International currency symbol. There's no generic fallback that's
+%independent of the input encoding, so this uses a UTF-8 character
+%on the assumption that if \cs{textcurrency} isn't available (for
+%example, through \sty{textcomp}, then the user may be using \XeTeX\
+%or \LuaTeX). If this isn't the case, and there's no UTF-8 support,
+%then this command will need to be redefined as appropriate.
+% \begin{macrocode}
+\ifx\textcurrency\undefined
+ \def\texosquerypatfmticurrencysign{¤}
+\else
+ \def\texosquerypatfmticurrencysign{\textcurrency}
+\fi
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquery@patfmt@prefixcurrency}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@prefixcurrency#1#2{%
+ \let\texosquerypatfmt@decsep\texosquerypatfmtcurdecsep
+ #2\texosquerypatfmtcurrencysign#1%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@prefixicurrency}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@prefixicurrency#1#2{%
+ \let\texosquerypatfmt@decsep\texosquerypatfmtcurdecsep
+ #2\texosquerypatfmticurrencysign#1%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@suffixcurrency}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@suffixcurrency#1#2{%
+ \let\texosquerypatfmt@decsep\texosquerypatfmtcurdecsep
+ #1\texosquerypatfmtcurrencysign#2%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@suffixicurrency}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@suffixicurrency#1#2{%
+ \let\texosquerypatfmt@decsep\texosquerypatfmtcurdecsep
+ #1\texosquerypatfmticurrencysign#2%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmt@digit}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@digit{%
+ \advance\@texosquery@digitindex by 1\relax
+ \if@texosquery@digitfound
+ \else
+ \ifx\@texosquery@currentsign\texosquerypatfmtminus
+ \texosquerypatfmtminus
+ \let\@texosquery@currentsign\empty
+ \fi
+ \fi
+ \@texosquery@digitfoundtrue
+ \ifcase\@texosquery@digitindex
+ \or
+ \expandafter\@texosquery@firstoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@secondoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@thirdoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@fourthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@fifthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@sixthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@seventhoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@eighthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@ninthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@tenthoften\@texosquery@current
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmt@digitnozero}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@digitnozero{%
+ \advance\@texosquery@digitindex by 1\relax
+ \edef\@texosquery@digit{%
+ \ifcase\@texosquery@digitindex
+ 0%
+ \or
+ \expandafter\@texosquery@firstoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@secondoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@thirdoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@fourthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@fifthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@sixthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@seventhoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@eighthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@ninthoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@tenthoften\@texosquery@current
+ \else
+ 0%
+ \fi
+ }%
+ \ifnum\@texosquery@digit=0\relax
+ \@texosquery@zerodigit
+ \else
+ \if@texosquery@digitfound
+ \else
+ \ifx\@texosquery@currentsign\texosquerypatfmtminus
+ \texosquerypatfmtminus
+ \let\@texosquery@currentsign\empty
+ \fi
+ \fi
+ \@texosquery@digitfoundtrue
+ \@texosquery@digit
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@zerodigit@leading}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@zerodigit@leading{%
+ \edef\@texosquery@digit{%
+ \ifcase\@texosquery@digitindex
+ 0%
+ \or
+ \expandafter\@texosquery@firstoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firsttwooften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstthreeoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstfouroften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstfiveoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstsixoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstsevenoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firsteightoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@firstnineoften\@texosquery@current
+ \or
+ \@texosquery@current
+ \else
+ 0%
+ \fi
+ }%
+ \ifnum\@texosquery@digit>0\relax
+ \if@texosquery@digitfound
+ \else
+ \ifx\texosquerypatminus\texosquerypatfmtminus
+ \texosquerypatfmtminus
+ \fi
+ \fi
+ \@texosquery@digitfoundtrue
+ 0%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@zerodigit@trailing}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@zerodigit@trailing{%
+ \edef\@texosquery@digit{%
+ \ifcase\@texosquery@digitindex
+ 0%
+ \or
+ \@texosquery@current
+ \or
+ \expandafter\@texosquery@lastnineoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lasteightoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lastsevenoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lastsixoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lastfiveoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lastfouroften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lastthreeoften\@texosquery@current
+ \or
+ \expandafter\@texosquery@lasttwooften\@texosquery@current
+ \or
+ \expandafter\@texosquery@tenthoften\@texosquery@current
+ \else
+ 0%
+ \fi
+ }%
+ \ifnum\@texosquery@digit>0\relax
+ \if@texosquery@digitfound
+ \else
+ \ifx\texosquerypatminus\texosquerypatfmtminus
+ \texosquerypatfmtminus
+ \fi
+ \fi
+ \@texosquery@digitfoundtrue
+ 0%
+ \fi
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmtminus}
+%\changes{1.2}{2017-03-23}{new}
+%Formatted minus sign. Redefined as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtminus{\ifmmode-\else$-$\fi}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtplus}
+%\changes{1.2}{2017-03-23}{new}
+%Formatted plus sign. Redefined as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtplus{\ifmmode+\else$+$\fi}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmtgroupsep}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmtgroupsep{,}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquerypatfmt@groupsep}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquerypatfmt@groupsep{%
+ \if@texosquery@digitfound\texosquerypatfmtgroupsep\fi}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmtpercentsign}
+%\changes{1.2}{2017-03-23}{new}
+%Percent sign used in number format.
+% \begin{macrocode}
+\def\texosquerypatfmtpercentsign{\%}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquerypatfmtpermillsign}
+%\changes{1.2}{2017-03-23}{new}
+%Per-mill sign used in number format. Redefine as appropriate.
+% \begin{macrocode}
+\def\texosquerypatfmtpermillsign{‰}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\@texosquery@adjust@per}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\@texosquery@adjust@per#1{%
+ \@texosquery@pos@shift{#1}%
+ \edef\@texosquery@int{\expandafter\@texosquery@paddigits
+ \expandafter{\number\@texosquery@int}}%
+ \edef\@texosquery@frac{\@texosquery@paddigits@trailing{\@texosquery@frac}}%
+ \edef\@texosquery@current{\expandafter\@texosquery@gobble\@texosquery@int}%
+}
+% \end{macrocode}
+%\end{macro}
+%
+%\begin{macro}{\texosquery@patfmt@prefixpercent}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@prefixpercent#1#2{%
+ \@texosquery@adjust@per{2}%
+ #2\texosquerypatfmtpercentsign#1%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@suffixpercent}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@suffixpercent#1#2{%
+ \@texosquery@adjust@per{2}%
+ #1\texosquerypatfmtpercentsign#2%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@prefixpermill}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@prefixpermill#1#2{%
+ \@texosquery@adjust@per{3}%
+ #2\texosquerypatfmtpermillsign#1%
+}
+% \end{macrocode}
+%\end{macro}
+%\begin{macro}{\texosquery@patfmt@suffixpermill}
+%\changes{1.2}{2017-03-23}{new}
+% \begin{macrocode}
+\def\texosquery@patfmt@suffixpermill#1#2{%
+ \@texosquery@adjust@per{3}%
+ #1\texosquerypatfmtpermillsign#2%
+}
+% \end{macrocode}
+%\end{macro}
+%
%All done.
%Restore the category code of \texttt{@}:
% \begin{macrocode}
@@ -810,7 +7529,7 @@
%\fi
%
%\subsection{\LaTeX\ Code}
-%This is just a simple wrapper for \texttt{texosquery.tex}
+%This is just a simple wrapper for \file{texosquery.tex}
%so that it can be loaded using \LaTeX's standard \cs{usepackage}
%method.
%\iffalse
@@ -821,18 +7540,160 @@
%Identify package:
% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{texosquery}[2016/07/14 v1.1 (NLCT)]
+\ProvidesPackage{texosquery}[2017/03/23 v1.2 (NLCT)]
% \end{macrocode}
-%Load \texttt{texosquery.tex}:
+%Load \file{texosquery.tex}:
% \begin{macrocode}
\input{texosquery}
% \end{macrocode}
-%That's it!
%\iffalse
% \begin{macrocode}
%</texosquery.sty>
% \end{macrocode}
%\fi
%
+%\subsection{Configuration File (\file{texosquery.cfg})}
+%The configuration file. This will need to be edited as appropriate
+%to the system.
+%\iffalse
+% \begin{macrocode}
+%<*texosquery.cfg>
+% \end{macrocode}
+%\fi
+% \begin{macrocode}
+ %If this configuration file is added to TeX's path, it can
+ %be used to set up the texosquery defaults for the installation.
+
+ %Default application (must be installed on the operating system's
+ %path). Change as appropriate. Available options:
+ % * texosquery-jre8 (at least Java 8 required)
+ % * texosquery (at least Java 7 required)
+ % * texosquery-jre5 (at least Java 5 required)
+ %(bash users need to check that the .sh extension has been removed
+ %from the bash scripts, or add the extension to the invoker name.)
+\def\TeXOSInvokerName{texosquery}
+
+ % If the invoker name given above is on the restricted list,
+ % allow it to be run in restricted mode:
+ %\TeXOSQueryAllowRestricted
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery.cfg>
+% \end{macrocode}
+%\fi
+%\subsection{Bash Scripts}
+%These are the bash scripts for Unix-like systems.
+%The first line
+%\begin{verbatim}
+%#!/bin/sh
+%\end{verbatim}
+%is added when the files are extracted by \file{texosquery.ins}
+%(since \verb|\nopreamble| automatically inserts a blank line at the
+%start of the file).
+%\iffalse
+% \begin{macrocode}
+%<*texosquery.sh>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery.sh}}
+% \begin{macrocode}
+jarpath=`kpsewhich --progname=texosquery --format=texmfscripts texosquery.jar`
+java -jar "$jarpath" "$@"
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery.sh>
+% \end{macrocode}
+%\fi
+%
+%\iffalse
+% \begin{macrocode}
+%<*texosquery-jre8.sh>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery-jre8.sh}}
+% \begin{macrocode}
+jarpath=`kpsewhich --progname=texosquery --format=texmfscripts texosquery-jre8.jar`
+java -Djava.locale.providers=CLDR,JRE -jar "$jarpath" "$@"
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery-jre8.sh>
+% \end{macrocode}
+%\fi
+%
+%\iffalse
+% \begin{macrocode}
+%<*texosquery-jre5.sh>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery-jre5.sh}}
+% \begin{macrocode}
+jarpath=`kpsewhich --progname=texosquery --format=texmfscripts texosquery-jre5.jar`
+java -jar "$jarpath" "$@"
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery-jre5.sh>
+% \end{macrocode}
+%\fi
+%
+%\subsection{Windows Batch Scripts}
+%These are the batch scripts for Windows. \TeX\ on Windows doesn't
+%allow the creation of \file{.bat} files, so \file{.ins} file
+%creates these with the extension \file{.batch} which will need to
+%be changed to \file{.bat} after extraction.
+%\iffalse
+% \begin{macrocode}
+%<*texosquery.bat>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery.bat}}
+% \begin{macrocode}
+@ECHO OFF
+FOR /F %%I IN ('kpsewhich --progname=texosquery --format=texmfscripts texosquery.jar') DO SET JARPATH=%%I
+java -jar "%JARPATH%" %*
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery.bat>
+% \end{macrocode}
+%\fi
+%
+%\iffalse
+% \begin{macrocode}
+%<*texosquery-jre8.bat>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery-jre8.bat}}
+% \begin{macrocode}
+@ECHO OFF
+FOR /F %%I IN ('kpsewhich --progname=texosquery --format=texmfscripts texosquery-jre8.jar') DO SET JARPATH=%%I
+java -Djava.locale.providers=CLDR,JRE -jar "%JARPATH%" %*
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery-jre8.bat>
+% \end{macrocode}
+%\fi
+%
+%\iffalse
+% \begin{macrocode}
+%<*texosquery-jre5.bat>
+% \end{macrocode}
+%\fi
+%\subsubsection{\file{texosquery-jre5.bat}}
+% \begin{macrocode}
+@ECHO OFF
+FOR /F %%I IN ('kpsewhich --progname=texosquery --format=texmfscripts texosquery-jre5.jar') DO SET JARPATH=%%I
+java -jar "%JARPATH%" %*
+% \end{macrocode}
+%\iffalse
+% \begin{macrocode}
+%</texosquery-jre5.bat>
+% \end{macrocode}
+%\fi
+%
%\Finale
\endinput