From dfe6d6910cb767db961732ceac8f3481683aba08 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 28 Jun 2020 21:29:20 +0000 Subject: pdftexcmds (28jun20) git-svn-id: svn://tug.org/texlive/trunk@55692 c570f23f-e606-0410-a88d-b1316a301751 --- .../source/generic/pdftexcmds/pdftexcmds.dtx | 2243 +++++++++++++++++++ .../source/latex/pdftexcmds/pdftexcmds.dtx | 2264 -------------------- 2 files changed, 2243 insertions(+), 2264 deletions(-) create mode 100644 Master/texmf-dist/source/generic/pdftexcmds/pdftexcmds.dtx delete mode 100644 Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx (limited to 'Master/texmf-dist/source') diff --git a/Master/texmf-dist/source/generic/pdftexcmds/pdftexcmds.dtx b/Master/texmf-dist/source/generic/pdftexcmds/pdftexcmds.dtx new file mode 100644 index 00000000000..e39a5799df4 --- /dev/null +++ b/Master/texmf-dist/source/generic/pdftexcmds/pdftexcmds.dtx @@ -0,0 +1,2243 @@ +% \iffalse meta-comment +% +% File: pdftexcmds.dtx +% Version: 2020-06-27 v0.33 +% Info: Utility functions of pdfTeX for LuaTeX +% +% Copyright (C) +% 2007, 2009-2011 Heiko Oberdiek +% 2016-2020 Oberdiek Package Support Group +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3c of this license or (at your option) any later +% version. This version of this license is in +% https://www.latex-project.org/lppl/lppl-1-3c.txt +% and the latest version of this license is in +% https://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of +% LaTeX version 2005/12/01 or later. +% +% This work has the LPPL maintenance status "maintained". +% +% The Current Maintainers of this work are +% Heiko Oberdiek and the Oberdiek Package Support Group +% https://github.com/ho-tex/pdftexcmds/issues +% +% The Base Interpreter refers to any `TeX-Format', +% because some files are installed in TDS:tex/generic//. +% +% This work consists of the main source file pdftexcmds.dtx +% and the derived files +% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv, +% pdftexcmds.bib, pdftexcmds-test1.tex, pdftexcmds-test2.tex, +% pdftexcmds-test-shell.tex, pdftexcmds-test-escape.tex, +% pdftexcmds.lua. +% +% Distribution: +% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.dtx +% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.pdf +% +% Unpacking: +% (a) If pdftexcmds.ins is present: +% tex pdftexcmds.ins +% (b) Without pdftexcmds.ins: +% tex pdftexcmds.dtx +% (c) If you insist on using LaTeX +% latex \let\install=y\input{pdftexcmds.dtx} +% (quote the arguments according to the demands of your shell) +% +% Documentation: +% (a) If pdftexcmds.drv is present: +% latex pdftexcmds.drv +% (b) Without pdftexcmds.drv: +% latex pdftexcmds.dtx; ... +% The class ltxdoc loads the configuration file ltxdoc.cfg +% if available. Here you can specify further options, e.g. +% use A4 as paper format: +% \PassOptionsToClass{a4paper}{article} +% +% Programm calls to get the documentation (example): +% pdflatex pdftexcmds.dtx +% bibtex pdftexcmds.aux +% makeindex -s gind.ist pdftexcmds.idx +% pdflatex pdftexcmds.dtx +% makeindex -s gind.ist pdftexcmds.idx +% pdflatex pdftexcmds.dtx +% +% Installation: +% TDS:tex/generic/pdftexcmds/pdftexcmds.sty +% TDS:tex/generic/pdftexcmds/pdftexcmds.lua +% TDS:doc/latex/pdftexcmds/pdftexcmds.pdf +% TDS:source/latex/pdftexcmds/pdftexcmds.dtx +% +%<*ignore> +\begingroup + \catcode123=1 % + \catcode125=2 % + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter + \ifx\csname processbatchFile\endcsname\relax\else1\fi + \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +% +%<*install> +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation} +\Msg{* Package: pdftexcmds 2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO)} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\let\MetaPrefix\relax +\preamble + +This is a generated file. + +Project: pdftexcmds +Version: 2020-06-27 v0.33 + +Copyright (C) + 2007, 2009-2011 Heiko Oberdiek + 2016-2019 Oberdiek Package Support Group + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3c of this license or (at your option) any later +version. This version of this license is in + https://www.latex-project.org/lppl/lppl-1-3c.txt +and the latest version of this license is in + https://www.latex-project.org/lppl.txt +and version 1.3 or later is part of all distributions of +LaTeX version 2005/12/01 or later. + +This work has the LPPL maintenance status "maintained". + +The Current Maintainers of this work are +Heiko Oberdiek and the Oberdiek Package Support Group +https://github.com/ho-tex/pdftexcmds/issues + + +The Base Interpreter refers to any `TeX-Format', +because some files are installed in TDS:tex/generic//. + +This work consists of the main source file pdftexcmds.dtx +and the derived files + pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv, + pdftexcmds.lua. + +\endpreamble +\let\MetaPrefix\DoubleperCent + +\generate{% + \file{pdftexcmds.ins}{\from{pdftexcmds.dtx}{install}}% + \file{pdftexcmds.drv}{\from{pdftexcmds.dtx}{driver}}% + \nopreamble + \nopostamble + \file{pdftexcmds.bib}{\from{pdftexcmds.dtx}{bib}}% + \usepreamble\defaultpreamble + \usepostamble\defaultpostamble + \usedir{tex/generic/pdftexcmds}% + \file{pdftexcmds.sty}{\from{pdftexcmds.dtx}{package}}% +% \usedir{doc/latex/pdftexcmds/test}% +% \file{pdftexcmds-test1.tex}{\from{pdftexcmds.dtx}{test1}}% +% \file{pdftexcmds-test2.tex}{\from{pdftexcmds.dtx}{test2}}% +% \file{pdftexcmds-test-shell.tex}{\from{pdftexcmds.dtx}{test-shell}}% +% \file{pdftexcmds-test-escape.tex}{\from{pdftexcmds.dtx}{test-escape}}% +} +\def\MetaPrefix{-- } +\def\defaultpostamble{% + \MetaPrefix^^J% + \MetaPrefix\space End of File `\outFileName'.% +} +\def\currentpostamble{\defaultpostamble}% +\generate{% + \usedir{tex/generic/pdftexcmds}% + \file{pdftexcmds.lua}{\from{pdftexcmds.dtx}{lua}}% +} + +\catcode32=13\relax% active space +\let =\space% +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* pdftexcmds.sty} +\Msg{* pdftexcmds.lua} +\Msg{*} +\Msg{* To produce the documentation run the file `pdftexcmds.drv'} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +% +%<*bib> +@online{AndyThomas:Analog, + author={Thomas, Andy}, + title={Analog of {\texttt{\csname textbackslash\endcsname}pdfelapsedtime} for + {\hologo{LuaTeX}} and {\hologo{XeTeX}}}, + url={http://tex.stackexchange.com/a/32531}, + urldate={2011-11-29}, +} +% +%<*ignore> +\fi +% +%<*driver> +\NeedsTeXFormat{LaTeX2e} +\ProvidesFile{pdftexcmds.drv}% + [2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO)]% +\documentclass{ltxdoc} +\usepackage{holtxdoc}[2011/11/22] +\usepackage{paralist} +\usepackage{csquotes} +\usepackage[ + backend=biber, + alldates=iso, +]{biblatex}[2011/11/13] +\addbibresource{oberdiek-source.bib} +\addbibresource{pdftexcmds.bib} +\begin{document} + \DocInput{pdftexcmds.dtx}% +\end{document} +% +% \fi +% +% +% +% \GetFileInfo{pdftexcmds.drv} +% +% \title{The \xpackage{pdftexcmds} package} +% \date{2020-06-27 v0.33} +% \author{Heiko Oberdiek\thanks +% {Please report any issues at \url{https://github.com/ho-tex/pdftexcmds/issues}}} +% +% \maketitle +% +% \begin{abstract} +% \hologo{LuaTeX} provides most of the commands of \hologo{pdfTeX} 1.40. However +% a number of utility functions are removed. This package tries to fill +% the gap and implements some of the missing primitive using Lua. +% \end{abstract} +% +% \tableofcontents +% +% \def\csi#1{\texttt{\textbackslash\textit{#1}}} +% +% \section{Documentation} +% +% Some primitives of \hologo{pdfTeX} \cite{pdftex-manual} +% are not defined by \hologo{LuaTeX} \cite{luatex-manual}. +% This package implements macro based solutions using Lua code +% for the following missing \hologo{pdfTeX} primitives; +% \begin{compactitem} +% \item \cs{pdfstrcmp} +% \item \cs{pdfunescapehex} +% \item \cs{pdfescapehex} +% \item \cs{pdfescapename} +% \item \cs{pdfescapestring} +% \item \cs{pdffilesize} +% \item \cs{pdffilemoddate} +% \item \cs{pdffiledump} +% \item \cs{pdfmdfivesum} +% \item \cs{pdfresettimer} +% \item \cs{pdfelapsedtime} +% \item |\immediate\write18| +% \end{compactitem} +% The original names of the primitives cannot be used: +% \begin{itemize} +% \item +% The syntax for their arguments cannot easily +% simulated by macros. The primitives using key words +% such as |file| (\cs{pdfmdfivesum}) or |offset| and |length| +% (\cs{pdffiledump}) and uses \meta{general text} for the other +% arguments. Using token registers assignments, \meta{general text} could +% be catched. However, the simulated primitives are expandable +% and register assignments would destroy this important property. +% (\meta{general text} allows something like |\expandafter\bgroup ...}|.) +% \item +% The original primitives can be expanded using one expansion step. +% The new macros need two expansion steps because of the additional +% macro expansion. Example: +% \begin{quote} +% |\expandafter\foo\pdffilemoddate{file}|\\ +% vs.\\ +% |\expandafter\expandafter\expandafter|\\ +% |\foo\pdf@filemoddate{file}| +% \end{quote} +% \end{itemize} +% +% \hologo{LuaTeX} isn't stable yet and thus the status of this package is +% \emph{experimental}. Feedback is welcome. +% +% \subsection{General principles} +% +% \begin{description} +% \item[Naming convention:] +% Usually this package defines a macro |\pdf@|\meta{cmd} if +% \hologo{pdfTeX} provides |\pdf|\meta{cmd}. +% \item[Arguments:] The order of arguments in |\pdf@|\meta{cmd} +% is the same as for the corresponding primitive of \hologo{pdfTeX}. +% The arguments are ordinary undelimited \hologo{TeX} arguments, +% no \meta{general text} and without additional keywords. +% \item[Expandibility:] +% The macro |\pdf@|\meta{cmd} is expandable if the +% corresponding \hologo{pdfTeX} primitive has this property. +% Exact two expansion steps are necessary (first is the macro +% expansion) except for \cs{pdf@primitive} and \cs{pdf@ifprimitive}. +% The latter ones are not macros, but have the direct meaning of the +% primitive. +% \item[Without \hologo{LuaTeX}:] +% The macros |\pdf@|\meta{cmd} are mapped to the commands +% of \hologo{pdfTeX} if they are available. Otherwise they are undefined. +% \item[Availability:] +% The macros that the packages provides are undefined, if +% the necessary primitives are not found and cannot be +% implemented by Lua. +% \end{description} +% +% \subsection{Macros} +% +% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} +% +% \begin{declcs}{pdf@strcmp} \M{stringA} \M{stringB} +% \end{declcs} +% Same as |\pdfstrcmp{|\meta{stringA}|}{|\meta{stringB}|}|. +% +% \begin{declcs}{pdf@unescapehex} \M{string} +% \end{declcs} +% Same as |\pdfunescapehex{|\meta{string}|}|. +% The argument is a byte string given in hexadecimal notation. +% The result are character tokens from 0 until 255 with +% catcode 12 and the space with catcode 10. +% +% \begin{declcs}{pdf@escapehex} \M{string}\\ +% \cs{pdf@escapestring} \M{string}\\ +% \cs{pdf@escapename} \M{string} +% \end{declcs} +% Same as the primitives of \hologo{pdfTeX}. However \hologo{pdfTeX} does not +% know about characters with codes 256 and larger. Thus the +% string is treated as byte string, characters with more than +% eight bits are ignored. +% +% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} +% +% \begin{declcs}{pdf@filesize} \M{filename} +% \end{declcs} +% Same as |\pdffilesize{|\meta{filename}|}|. +% +% \begin{declcs}{pdf@filemoddate} \M{filename} +% \end{declcs} +% Same as |\pdffilemoddate{|\meta{filename}|}|. +% +% \begin{declcs}{pdf@filedump} \M{offset} \M{length} \M{filename} +% \end{declcs} +% Same as |\pdffiledump offset| \meta{offset} |length| \meta{length} +% |{|\meta{filename}|}|. Both \meta{offset} and \meta{length} must +% not be empty, but must be a valid \hologo{TeX} number. +% +% \begin{declcs}{pdf@mdfivesum} \M{string} +% \end{declcs} +% Same as |\pdfmdfivesum{|\meta{string}|}|. Keyword |file| is supported +% by macro \cs{pdf@filemdfivesum}. +% +% \begin{declcs}{pdf@filemdfivesum} \M{filename} +% \end{declcs} +% Same as |\pdfmdfivesum file{|\meta{filename}|}|. +% +% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} +% +% The timekeeping macros are based on Andy Thomas' work \cite{AndyThomas:Analog}. +% +% \begin{declcs}{pdf@resettimer} +% \end{declcs} +% Same as \cs{pdfresettimer}, it resets the internal timer. +% +% \begin{declcs}{pdf@elapsedtime} +% \end{declcs} +% Same as \cs{pdfelapsedtime}. It behaves like a read-only integer. +% For printing purposes it can be prefixed by \cs{the} or \cs{number}. +% It measures the time in scaled seconds (seconds multiplied with 65536) +% since the latest call of \cs{pdf@resettimer} or start of +% program/package. The resolution, the shortest time interval that +% can be measured, depends on the program and system. +% \begin{itemize} +% \item \hologo{pdfTeX} with |gettimeofday|: $\ge$ 1/65536\,s +% \item \hologo{pdfTeX} with |ftime|: $\ge$ 1\,ms +% \item \hologo{pdfTeX} with |time|: $\ge$ 1\,s +% \item \hologo{LuaTeX}: $\ge$ 10\,ms\\ +% (|os.clock()| returns a float number with two decimal digits in +% \hologo{LuaTeX} beta-0.70.1-2011061416 (rev 4277)). +% \end{itemize} +% +% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}} +% +% \begin{declcs}{pdf@draftmode} +% \end{declcs} +% If the \TeX\ compiler knows \cs{pdfdraftmode} or \cs{draftmode} +% (\hologo{pdfTeX}, +% \hologo{LuaTeX}), then \cs{pdf@draftmode} returns, whether +% this mode is enabled. The result is an implicit number: +% one means the draft mode is available and enabled. +% If the value is zero, then the mode is not active or +% \cs{pdfdraftmode} is not available. +% An explicit number is yielded by \cs{number}\cs{pdf@draftmode}. +% The macro cannot +% be used to change the mode, see \cs{pdf@setdraftmode}. +% +% \begin{declcs}{pdf@ifdraftmode} \M{true} \M{false} +% \end{declcs} +% If \cs{pdfdraftmode} is available and enabled, \meta{true} is +% called, otherwise \meta{false} is executed. +% +% \begin{declcs}{pdf@setdraftmode} \M{value} +% \end{declcs} +% Macro \cs{pdf@setdraftmode} expects the number zero or one as +% \meta{value}. Zero deactivates the mode and one enables the draft mode. +% The macro does not have an effect, if the feature \cs{pdfdraftmode} is not +% available. +% +% \begin{declcs}{pdf@shellescape} +% \end{declcs} +% Same as |\pdfshellescape|. It is or expands to |1| if external +% commands can be executed and |0| otherwise. In \hologo{pdfTeX} external +% commands must be enabled first by command line option or +% configuration option. In \hologo{LuaTeX} option |--safer| disables +% the execution of external commands. +% +% In \hologo{LuaTeX} before 0.68.0 \cs{pdf@shellescape} is not +% available due to a bug in |os.execute()|. The argumentless form +% crashes in some circumstances with segmentation fault. +% (It is fixed in version 0.68.0 or revision 4167 of \hologo{LuaTeX}. +% and packported to some version of 0.67.0). +% +% Hints for usage: +% \begin{itemize} +% \item Before its use \cs{pdf@shellescape} should be tested, +% whether it is available. Example with package \xpackage{ltxcmds} +% (loaded by package \xpackage{pdftexcmds}): +%\begin{quote} +%\begin{verbatim} +%\ltx@IfUndefined{pdf@shellescape}{% +% % \pdf@shellescape is undefined +%}{% +% % \pdf@shellescape is available +%} +%\end{verbatim} +%\end{quote} +% Use \cs{ltx@ifundefined} in expandable contexts. +% \item \cs{pdf@shellescape} might be a numerical constant, +% expands to the primitive, or expands to a plain number. +% Therefore use it in contexts where these differences does not matter. +% \item Use in comparisons, e.g.: +% \begin{quote} +% |\ifnum\pdf@shellescape=0 ...| +% \end{quote} +% \item Print the number: |\number\pdf@shellescape| +% \end{itemize} +% +% \begin{declcs}{pdf@system} \M{cmdline} +% \end{declcs} +% It is a wrapper for |\immediate\write18| in \hologo{pdfTeX} or +% |os.execute| in \hologo{LuaTeX}. +% +% In theory |os.execute| +% returns a status number. But its meaning is quite +% undefined. Are there some reliable properties? +% Does it make sense to provide an user interface to +% this status exit code? +% +% \begin{declcs}{pdf@primitive} \csi{cmd} +% \end{declcs} +% Same as \cs{pdfprimitive} in \hologo{pdfTeX} or \hologo{LuaTeX}. +% In \hologo{XeTeX} the +% primitive is called \cs{primitive}. Despite the current definition +% of the command \csi{cmd}, it's meaning as primitive is used. +% +% \begin{declcs}{pdf@ifprimitive} \csi{cmd} +% \end{declcs} +% Same as \cs{ifpdfprimitive} in \hologo{pdfTeX} or +% \hologo{LuaTeX}. \hologo{XeTeX} calls +% it \cs{ifprimitive}. It is a switch that checks if the command +% \csi{cmd} has it's primitive meaning. +% +% \subsubsection{Additional macro: \cs{pdf@isprimitive}} +% +% \begin{declcs}{pdf@isprimitive} \csi{cmd1} \csi{cmd2} \M{true} \M{false} +% \end{declcs} +% If \csi{cmd1} has the primitive meaning given by the primitive name +% of \csi{cmd2}, then the argument \meta{true} is executed, otherwise +% \meta{false}. The macro \cs{pdf@isprimitive} is expandable. +% Internally it checks the result of \cs{meaning} and is therefore +% available for all \hologo{TeX} variants, even the original \hologo{TeX}. +% Example with \hologo{LaTeX}: +%\begin{quote} +%\begin{verbatim} +%\makeatletter +%\pdf@isprimitive{@@input}{input}{% +% \typeout{\string\@@input\space is original\string\input}% +%}{% +% \typeout{Oops, \string\@@input\space is not the % +% original\string\input}% +%} +%\end{verbatim} +%\end{quote} +% +% \subsubsection{Experimental} +% +% \begin{declcs}{pdf@unescapehexnative} \M{string}\\ +% \cs{pdf@escapehexnative} \M{string}\\ +% \cs{pdf@escapenamenative} \M{string}\\ +% \cs{pdf@mdfivesumnative} \M{string} +% \end{declcs} +% The variants without |native| in the macro name are supposed to +% be compatible with \hologo{pdfTeX}. However characters with more than +% eight bits are not supported and are ignored. If \hologo{LuaTeX} is +% running, then its UTF-8 coded strings are used. Thus the full +% unicode character range is supported. However the result +% differs from \hologo{pdfTeX} for characters with eight or more bits. +% +% \begin{declcs}{pdf@pipe} \M{cmdline} +% \end{declcs} +% It calls \meta{cmdline} and returns the output of the external +% program in the usual manner as byte string (catcode 12, space with +% catcode 10). The Lua documentation says, that the used |io.popen| +% may not be available on all platforms. Then macro \cs{pdf@pipe} +% is undefined. +% +% \StopEventually{ +% } +% +% \section{Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \subsection{Reload check and package identification} +% Reload check, especially if the package is not used with \LaTeX. +% \begin{macrocode} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode35=6 % # + \catcode39=12 % ' + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode58=12 % : + \catcode64=11 % @ + \catcode123=1 % { + \catcode125=2 % } + \expandafter\let\expandafter\x\csname ver@pdftexcmds.sty\endcsname + \ifx\x\relax % plain-TeX, first loading + \else + \def\empty{}% + \ifx\x\empty % LaTeX, first loading, + % variable is initialized, but \ProvidesPackage not yet seen + \else + \expandafter\ifx\csname PackageInfo\endcsname\relax + \def\x#1#2{% + \immediate\write-1{Package #1 Info: #2.}% + }% + \else + \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% + \fi + \x{pdftexcmds}{The package is already loaded}% + \aftergroup\endinput + \fi + \fi +\endgroup% +% \end{macrocode} +% Package identification: +% \begin{macrocode} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode35=6 % # + \catcode39=12 % ' + \catcode40=12 % ( + \catcode41=12 % ) + \catcode44=12 % , + \catcode45=12 % - + \catcode46=12 % . + \catcode47=12 % / + \catcode58=12 % : + \catcode64=11 % @ + \catcode91=12 % [ + \catcode93=12 % ] + \catcode123=1 % { + \catcode125=2 % } + \expandafter\ifx\csname ProvidesPackage\endcsname\relax + \def\x#1#2#3[#4]{\endgroup + \immediate\write-1{Package: #3 #4}% + \xdef#1{#4}% + }% + \else + \def\x#1#2[#3]{\endgroup + #2[{#3}]% + \ifx#1\@undefined + \xdef#1{#3}% + \fi + \ifx#1\relax + \xdef#1{#3}% + \fi + }% + \fi +\expandafter\x\csname ver@pdftexcmds.sty\endcsname +\ProvidesPackage{pdftexcmds}% + [2020-06-27 v0.33 Utility functions of pdfTeX for LuaTeX (HO)]% +% \end{macrocode} +% +% \subsection{Catcodes} +% +% \begin{macrocode} +\begingroup\catcode61\catcode48\catcode32=10\relax% + \catcode13=5 % ^^M + \endlinechar=13 % + \catcode123=1 % { + \catcode125=2 % } + \catcode64=11 % @ + \def\x{\endgroup + \expandafter\edef\csname pdftexcmds@AtEnd\endcsname{% + \endlinechar=\the\endlinechar\relax + \catcode13=\the\catcode13\relax + \catcode32=\the\catcode32\relax + \catcode35=\the\catcode35\relax + \catcode61=\the\catcode61\relax + \catcode64=\the\catcode64\relax + \catcode123=\the\catcode123\relax + \catcode125=\the\catcode125\relax + }% + }% +\x\catcode61\catcode48\catcode32=10\relax% +\catcode13=5 % ^^M +\endlinechar=13 % +\catcode35=6 % # +\catcode64=11 % @ +\catcode123=1 % { +\catcode125=2 % } +\def\TMP@EnsureCode#1#2{% + \edef\pdftexcmds@AtEnd{% + \pdftexcmds@AtEnd + \catcode#1=\the\catcode#1\relax + }% + \catcode#1=#2\relax +} +\TMP@EnsureCode{0}{12}% +\TMP@EnsureCode{1}{12}% +\TMP@EnsureCode{2}{12}% +\TMP@EnsureCode{10}{12}% ^^J +\TMP@EnsureCode{33}{12}% ! +\TMP@EnsureCode{34}{12}% " +\TMP@EnsureCode{38}{4}% & +\TMP@EnsureCode{39}{12}% ' +\TMP@EnsureCode{40}{12}% ( +\TMP@EnsureCode{41}{12}% ) +\TMP@EnsureCode{42}{12}% * +\TMP@EnsureCode{43}{12}% + +\TMP@EnsureCode{44}{12}% , +\TMP@EnsureCode{45}{12}% - +\TMP@EnsureCode{46}{12}% . +\TMP@EnsureCode{47}{12}% / +\TMP@EnsureCode{58}{12}% : +\TMP@EnsureCode{60}{12}% < +\TMP@EnsureCode{62}{12}% > +\TMP@EnsureCode{91}{12}% [ +\TMP@EnsureCode{93}{12}% ] +\TMP@EnsureCode{94}{7}% ^ (superscript) +\TMP@EnsureCode{95}{12}% _ (other) +\TMP@EnsureCode{96}{12}% ` +\TMP@EnsureCode{126}{12}% ~ (other) +\edef\pdftexcmds@AtEnd{% + \pdftexcmds@AtEnd + \escapechar=\number\escapechar\relax + \noexpand\endinput +} +\escapechar=92 % +% \end{macrocode} +% +% \subsection{Load packages} +% +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname RequirePackage\endcsname\relax + \def\TMP@RequirePackage#1[#2]{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname ver@#1.sty\endcsname\relax + \input #1.sty\relax + \fi + }% + \TMP@RequirePackage{infwarerr}[2007/09/09]% + \TMP@RequirePackage{iftex}[2019/11/07]%% + \TMP@RequirePackage{ltxcmds}[2010/12/02]% +\else + \RequirePackage{infwarerr}[2007/09/09]% + \RequirePackage{iftex}[2019/11/07]% + \RequirePackage{ltxcmds}[2010/12/02]% +\fi +% \end{macrocode} +% +% \subsection{Without \hologo{LuaTeX}} +% +% \begin{macrocode} +\ifluatex + \ifcsname catcodetable@string\endcsname\else\input{ltluatex}\fi +\else + \def\pdftexcmds@nopdftex{% + \let\pdftexcmds@nopdftex\relax + }% + \def\pdftexcmds@temp#1{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname + \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax + \pdftexcmds@nopdftex + \else + \expandafter\def\csname pdf@#1\expandafter\endcsname + \expandafter{% + \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname + }% + \fi + }% + \pdftexcmds@temp{strcmp}% + \pdftexcmds@temp{escapehex}% + \let\pdf@escapehexnative\pdf@escapehex + \pdftexcmds@temp{unescapehex}% + \let\pdf@unescapehexnative\pdf@unescapehex + \pdftexcmds@temp{escapestring}% + \pdftexcmds@temp{escapename}% + \pdftexcmds@temp{filesize}% + \pdftexcmds@temp{filemoddate}% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdfshellescape\endcsname\relax + \pdftexcmds@nopdftex + \ltx@IfUndefined{pdftexversion}{% + }{% + \ifnum\pdftexversion>120 % 1.21a supports \ifeof18 + \ifeof18 % + \chardef\pdf@shellescape=0 % + \else + \chardef\pdf@shellescape=1 % + \fi + \fi + }% + \else + \def\pdf@shellescape{% + \pdfshellescape + }% + \fi + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdffiledump\endcsname\relax + \pdftexcmds@nopdftex + \else + \def\pdf@filedump#1#2#3{% + \pdffiledump offset#1 length#2{#3}% + }% + \fi +% \end{macrocode} +% \begin{macrocode} + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdfmdfivesum\endcsname\relax + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname mdfivesum\endcsname\relax + \pdftexcmds@nopdftex + \else + \def\pdf@mdfivesum#{\mdfivesum}% + \let\pdf@mdfivesumnative\pdf@mdfivesum + \def\pdf@filemdfivesum#{\mdfivesum file}% + \fi + \else + \def\pdf@mdfivesum#{\pdfmdfivesum}% + \let\pdf@mdfivesumnative\pdf@mdfivesum + \def\pdf@filemdfivesum#{\pdfmdfivesum file}% + \fi +% \end{macrocode} +% \begin{macrocode} + \def\pdf@system#{% + \immediate\write18% + }% + \def\pdftexcmds@temp#1{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname + \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax + \pdftexcmds@nopdftex + \else + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\let\csname pdf@#1\expandafter\endcsname + \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname + \fi + }% + \pdftexcmds@temp{resettimer}% + \pdftexcmds@temp{elapsedtime}% +\fi +% \end{macrocode} +% +% \subsection{\cs{pdf@primitive}, \cs{pdf@ifprimitive}} +% +% Since version 1.40.0 \hologo{pdfTeX} has \cs{pdfprimitive} and +% \cs{ifpdfprimitive}. And \cs{pdfprimitive} was fixed in +% version 1.40.4. +% +% \hologo{XeTeX} provides them under the name \cs{primitive} and +% \cs{ifprimitive}. \hologo{LuaTeX} knows both name variants, +% but they have possibly to be enabled first (|tex.enableprimitives|). +% +% Depending on the format TeX Live uses a prefix |luatex|. +% +% Caution: \cs{let} must be used for the definition of +% the macros, especially because of \cs{ifpdfprimitive}. +% +% \subsubsection{Using \hologo{LuaTeX}'s \texttt{tex.enableprimitives}} +% +% \begin{macrocode} +\ifluatex +% \end{macrocode} +% \begin{macro}{\pdftexcmds@directlua} +% \begin{macrocode} + \ifnum\luatexversion<36 % + \def\pdftexcmds@directlua{\directlua0 }% + \else + \let\pdftexcmds@directlua\directlua + \fi +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} + \begingroup + \newlinechar=10 % + \endlinechar=\newlinechar + \pdftexcmds@directlua{% + if tex.enableprimitives then + tex.enableprimitives( + 'pdf@', + {'primitive', 'ifprimitive', 'pdfdraftmode','draftmode'} + ) + tex.enableprimitives('', {'luaescapestring'}) + end + }% + \endgroup % +% \end{macrocode} +% +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \subsubsection{Trying various names to find the primitives} +% +% \begin{macro}{\pdftexcmds@strip@prefix} +% \begin{macrocode} +\def\pdftexcmds@strip@prefix#1>{} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\pdftexcmds@temp#1#2#3{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdf@#1\endcsname\relax + \begingroup + \def\x{#3}% + \edef\x{\expandafter\pdftexcmds@strip@prefix\meaning\x}% + \escapechar=-1 % + \edef\y{\expandafter\meaning\csname#2\endcsname}% + \expandafter\endgroup + \ifx\x\y + \expandafter\let\csname pdf@#1\expandafter\endcsname + \csname #2\endcsname + \fi + \fi +} +% \end{macrocode} +% +% \begin{macro}{\pdf@primitive} +% \begin{macrocode} +\pdftexcmds@temp{primitive}{pdfprimitive}{pdfprimitive}% pdfTeX, oldLuaTeX +\pdftexcmds@temp{primitive}{primitive}{primitive}% XeTeX, luatex +\pdftexcmds@temp{primitive}{luatexprimitive}{pdfprimitive}% oldLuaTeX +\pdftexcmds@temp{primitive}{luatexpdfprimitive}{pdfprimitive}% oldLuaTeX +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@ifprimitive} +% \begin{macrocode} +\pdftexcmds@temp{ifprimitive}{ifpdfprimitive}{ifpdfprimitive}% pdfTeX, oldLuaTeX +\pdftexcmds@temp{ifprimitive}{ifprimitive}{ifprimitive}% XeTeX, luatex +\pdftexcmds@temp{ifprimitive}{luatexifprimitive}{ifpdfprimitive}% oldLuaTeX +\pdftexcmds@temp{ifprimitive}{luatexifpdfprimitive}{ifpdfprimitive}% oldLuaTeX +% \end{macrocode} +% \end{macro} +% +% Disable broken \cs{pdfprimitive}. +% \begin{macrocode} +\ifluatex\else +\begingroup + \expandafter\ifx\csname pdf@primitive\endcsname\relax + \else + \expandafter\ifx\csname pdftexversion\endcsname\relax + \else + \ifnum\pdftexversion=140 % + \expandafter\ifx\csname pdftexrevision\endcsname\relax + \else + \ifnum\pdftexrevision<4 % + \endgroup + \let\pdf@primitive\@undefined + \@PackageInfoNoLine{pdftexcmds}{% + \string\pdf@primitive\space disabled, % + because\MessageBreak + \string\pdfprimitive\space is broken until pdfTeX 1.40.4% + }% + \begingroup + \fi + \fi + \fi + \fi + \fi +\endgroup +\fi +% \end{macrocode} +% +% \subsubsection{Result} +% +% \begin{macrocode} +\begingroup + \@PackageInfoNoLine{pdftexcmds}{% + \string\pdf@primitive\space is % + \expandafter\ifx\csname pdf@primitive\endcsname\relax not \fi + available% + }% + \@PackageInfoNoLine{pdftexcmds}{% + \string\pdf@ifprimitive\space is % + \expandafter\ifx\csname pdf@ifprimitive\endcsname\relax not \fi + available% + }% +\endgroup +% \end{macrocode} +% +% \subsection{\hologo{XeTeX}} +% +% Look for primitives \cs{shellescape}, \cs{strcmp}. +% \begin{macrocode} +\def\pdftexcmds@temp#1{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdf@#1\endcsname\relax + \begingroup + \escapechar=-1 % + \edef\x{\expandafter\meaning\csname#1\endcsname}% + \def\y{#1}% + \def\z##1->{}% + \edef\y{\expandafter\z\meaning\y}% + \expandafter\endgroup + \ifx\x\y + \expandafter\def\csname pdf@#1\expandafter\endcsname + \expandafter{% + \csname#1\endcsname + }% + \fi + \fi +}% +\pdftexcmds@temp{shellescape}% +\pdftexcmds@temp{strcmp}% +% \end{macrocode} +% +% \subsection{\cs{pdf@isprimitive}} +% +% \begin{macrocode} +\def\pdf@isprimitive{% + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname pdf@strcmp\endcsname\relax + \long\def\pdf@isprimitive##1{% + \expandafter\pdftexcmds@isprimitive\expandafter{\meaning##1}% + }% + \long\def\pdftexcmds@isprimitive##1##2{% + \expandafter\pdftexcmds@@isprimitive\expandafter{\string##2}{##1}% + }% + \def\pdftexcmds@@isprimitive##1##2{% + \ifnum0\pdftexcmds@equal##1\delimiter##2\delimiter=1 % + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + }% + \def\pdftexcmds@equal##1##2\delimiter##3##4\delimiter{% + \ifx##1##3% + \ifx\relax##2##4\relax + 1% + \else + \ifx\relax##2\relax + \else + \ifx\relax##4\relax + \else + \pdftexcmds@equalcont{##2}{##4}% + \fi + \fi + \fi + \fi + }% + \def\pdftexcmds@equalcont##1{% + \def\pdftexcmds@equalcont####1####2##1##1##1##1{% + ##1##1##1##1% + \pdftexcmds@equal####1\delimiter####2\delimiter + }% + }% + \expandafter\pdftexcmds@equalcont\csname fi\endcsname + \else + \long\def\pdf@isprimitive##1##2{% + \ifnum\pdf@strcmp{\meaning##1}{\string##2}=0 % + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + }% + \fi +} +\ifluatex +\ifx\pdfdraftmode\@undefined + \let\pdfdraftmode\draftmode +\fi +\else + \pdf@isprimitive +\fi +% \end{macrocode} +% +% \subsection{\cs{pdf@draftmode}} +% +% +% \begin{macrocode} +\let\pdftexcmds@temp\ltx@zero % +\ltx@IfUndefined{pdfdraftmode}{% + \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode not found}% +}{% + \ifpdf + \let\pdftexcmds@temp\ltx@one + \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode found}% + \else + \@PackageInfoNoLine{pdftexcmds}{% + \ltx@backslashchar pdfdraftmode is ignored in DVI mode% + }% + \fi +} +\ifcase\pdftexcmds@temp +% \end{macrocode} +% \begin{macro}{\pdf@draftmode} +% \begin{macrocode} + \let\pdf@draftmode\ltx@zero +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@ifdraftmode} +% \begin{macrocode} + \let\pdf@ifdraftmode\ltx@secondoftwo +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdftexcmds@setdraftmode} +% \begin{macrocode} + \def\pdftexcmds@setdraftmode#1{}% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\else +% \end{macrocode} +% \begin{macro}{\pdftexcmds@draftmode} +% \begin{macrocode} + \let\pdftexcmds@draftmode\pdfdraftmode +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@ifdraftmode} +% \begin{macrocode} + \def\pdf@ifdraftmode{% + \ifnum\pdftexcmds@draftmode=\ltx@one + \expandafter\ltx@firstoftwo + \else + \expandafter\ltx@secondoftwo + \fi + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@draftmode} +% \begin{macrocode} + \def\pdf@draftmode{% + \ifnum\pdftexcmds@draftmode=\ltx@one + \expandafter\ltx@one + \else + \expandafter\ltx@zero + \fi + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdftexcmds@setdraftmode} +% \begin{macrocode} + \def\pdftexcmds@setdraftmode#1{% + \pdftexcmds@draftmode=#1\relax + }% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\fi +% \end{macrocode} +% \begin{macro}{\pdf@setdraftmode} +% \begin{macrocode} +\def\pdf@setdraftmode#1{% + \begingroup + \count\ltx@cclv=#1\relax + \edef\x{\endgroup + \noexpand\pdftexcmds@@setdraftmode{\the\count\ltx@cclv}% + }% + \x +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdftexcmds@@setdraftmode} +% \begin{macrocode} +\def\pdftexcmds@@setdraftmode#1{% + \ifcase#1 % + \pdftexcmds@setdraftmode{#1}% + \or + \pdftexcmds@setdraftmode{#1}% + \else + \@PackageWarning{pdftexcmds}{% + \string\pdf@setdraftmode: Ignoring\MessageBreak + invalid value `#1'% + }% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \subsection{Load Lua module} +% +% \begin{macrocode} +\ifluatex +\else + \expandafter\pdftexcmds@AtEnd +\fi% +% \end{macrocode} +% +% \begin{macrocode} +\pdftexcmds@directlua{% + require("pdftexcmds")% +} +\ifnum\luatexversion>37 % + \ifnum0% + \pdftexcmds@directlua{% + if status.ini_version then % + tex.write("1")% + end% + }>0 % + \everyjob\expandafter{% + \the\everyjob + \pdftexcmds@directlua{% + require("pdftexcmds")% + }% + }% + \fi +\fi +\begingroup + \def\x{2020-06-27 v0.33}% + \ltx@onelevel@sanitize\x + \edef\y{% + \pdftexcmds@directlua{% + if oberdiek.pdftexcmds.getversion then % + oberdiek.pdftexcmds.getversion()% + end% + }% + }% + \ifx\x\y + \else + \@PackageError{pdftexcmds}{% + Wrong version of lua module.\MessageBreak + Package version: \x\MessageBreak + Lua module: \y + }\@ehc + \fi +\endgroup +% \end{macrocode} +% +% \subsection{Lua functions} +% +% \subsubsection{Helper macros} +% +% \begin{macro}{\pdftexcmds@toks} +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname newtoks\endcsname\relax + \toksdef\pdftexcmds@toks=0 % +\else + \csname newtoks\endcsname\pdftexcmds@toks +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pdftexcmds@Patch} +% \begin{macrocode} +\def\pdftexcmds@Patch{0} +\ifnum\luatexversion>40 % + \ifnum\luatexversion<66 % + \def\pdftexcmds@Patch{1}% + \fi +\fi +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\ifcase\pdftexcmds@Patch + \catcode`\&=14 % +\else + \catcode`\&=9 % +% \end{macrocode} +% \begin{macro}{\pdftexcmds@PatchDecode} +% \begin{macrocode} + \def\pdftexcmds@PatchDecode#1\@nil{% + \pdftexcmds@DecodeA#1^^A^^A\@nil{}% + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdftexcmds@DecodeA} +% \begin{macrocode} + \def\pdftexcmds@DecodeA#1^^A^^A#2\@nil#3{% + \ifx\relax#2\relax + \ltx@ReturnAfterElseFi{% + \pdftexcmds@DecodeB#3#1^^A^^B\@nil{}% + }% + \else + \ltx@ReturnAfterFi{% + \pdftexcmds@DecodeA#2\@nil{#3#1^^@}% + }% + \fi + }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdftexcmds@DecodeB} +% \begin{macrocode} + \def\pdftexcmds@DecodeB#1^^A^^B#2\@nil#3{% + \ifx\relax#2\relax% + \ltx@ReturnAfterElseFi{% + \ltx@zero + #3#1% + }% + \else + \ltx@ReturnAfterFi{% + \pdftexcmds@DecodeB#2\@nil{#3#1^^A}% + }% + \fi + }% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \begin{macrocode} +\ifnum\luatexversion<36 % +\else + \catcode`\0=9 % +\fi +% \end{macrocode} +% +% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} +% +% \begin{macro}{\pdf@strcmp} +% \begin{macrocode} +\long\def\pdf@strcmp#1#2{% + \directlua0{% + oberdiek.pdftexcmds.strcmp("\luaescapestring{#1}",% + "\luaescapestring{#2}")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\pdf@isprimitive +% \end{macrocode} +% \begin{macro}{\pdf@escapehex} +% \begin{macrocode} +\long\def\pdf@escapehex#1{% + \directlua0{% + oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}", "byte")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@escapehexnative} +% \begin{macrocode} +\long\def\pdf@escapehexnative#1{% + \directlua0{% + oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@unescapehex} +% \begin{macrocode} +\def\pdf@unescapehex#1{% +& \romannumeral\expandafter\pdftexcmds@PatchDecode + \the\expandafter\pdftexcmds@toks + \directlua0{% + oberdiek.pdftexcmds.toks="pdftexcmds@toks"% + oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", "byte", \pdftexcmds@Patch)% + }% +& \@nil +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@unescapehexnative} +% \begin{macrocode} +\def\pdf@unescapehexnative#1{% +& \romannumeral\expandafter\pdftexcmds@PatchDecode + \the\expandafter\pdftexcmds@toks + \directlua0{% + oberdiek.pdftexcmds.toks="pdftexcmds@toks"% + oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", \pdftexcmds@Patch)% + }% +& \@nil +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@escapestring} +% \begin{macrocode} +\long\def\pdf@escapestring#1{% + \directlua0{% + oberdiek.pdftexcmds.escapestring("\luaescapestring{#1}")% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@escapename} +% \begin{macrocode} +\long\def\pdf@escapename#1{% + \directlua0{% + oberdiek.pdftexcmds.escapename("\luaescapestring{#1}", "byte")% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@escapenamenative} +% \begin{macrocode} +\long\def\pdf@escapenamenative#1{% + \directlua0{% + oberdiek.pdftexcmds.escapename("\luaescapestring{#1}")% + }% +} +% \end{macrocode} +% \end{macro} +% +% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} +% +% \begin{macro}{\pdf@filesize} +% \begin{macrocode} +\def\pdf@filesize#1{% + \directlua0{% + oberdiek.pdftexcmds.filesize("\luaescapestring{#1}")% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@filemoddate} +% \begin{macrocode} +\def\pdf@filemoddate#1{% + \directlua0{% + oberdiek.pdftexcmds.filemoddate("\luaescapestring{#1}")% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@filedump} +% \begin{macrocode} +\def\pdf@filedump#1#2#3{% + \directlua0{% + oberdiek.pdftexcmds.filedump("\luaescapestring{\number#1}",% + "\luaescapestring{\number#2}",% + "\luaescapestring{#3}")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@mdfivesum} +% \begin{macrocode} +\long\def\pdf@mdfivesum#1{% + \directlua0{% + oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@mdfivesumnative} +% \begin{macrocode} +\long\def\pdf@mdfivesumnative#1{% + \directlua0{% + oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}")% + }% +}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@filemdfivesum} +% \begin{macrocode} +\def\pdf@filemdfivesum#1{% + \directlua0{% + oberdiek.pdftexcmds.filemdfivesum("\luaescapestring{#1}")% + }% +}% +% \end{macrocode} +% \end{macro} +% +% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} +% +% \begin{macro}{\protected} +% \begin{macrocode} +\let\pdftexcmds@temp=Y% +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname protected\endcsname\relax + \pdftexcmds@directlua0{% + if tex.enableprimitives then % + tex.enableprimitives('', {'protected'})% + end% + }% +\fi +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname protected\endcsname\relax + \let\pdftexcmds@temp=N% +\fi +% \end{macrocode} +% \end{macro} +% \begin{macro}{\numexpr} +% \begin{macrocode} +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname numexpr\endcsname\relax + \pdftexcmds@directlua0{% + if tex.enableprimitives then % + tex.enableprimitives('', {'numexpr'})% + end% + }% +\fi +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname numexpr\endcsname\relax + \let\pdftexcmds@temp=N% +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\ifx\pdftexcmds@temp N% + \@PackageWarningNoLine{pdftexcmds}{% + Definitions of \ltx@backslashchar pdf@resettimer and% + \MessageBreak + \ltx@backslashchar pdf@elapsedtime are skipped, because% + \MessageBreak + e-TeX's \ltx@backslashchar protected or % + \ltx@backslashchar numexpr are missing% + }% +\else +% \end{macrocode} +% +% \begin{macro}{\pdf@resettimer} +% \begin{macrocode} + \protected\def\pdf@resettimer{% + \pdftexcmds@directlua0{% + oberdiek.pdftexcmds.resettimer()% + }% + }% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pdf@elapsedtime} +% \begin{macrocode} + \protected\def\pdf@elapsedtime{% + \numexpr + \pdftexcmds@directlua0{% + oberdiek.pdftexcmds.elapsedtime()% + }% + \relax + }% +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\fi +% \end{macrocode} +% +% \subsubsection{Shell escape} +% +% \begin{macro}{\pdf@shellescape} +% +% \begin{macrocode} +\ifnum\luatexversion<68 % +\else + \protected\edef\pdf@shellescape{% + \numexpr\directlua{tex.sprint(% + \number\catcodetable@string,status.shell_escape)}\relax} +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pdf@system} +% \begin{macrocode} +\def\pdf@system#1{% + \directlua0{% + oberdiek.pdftexcmds.system("\luaescapestring{#1}")% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pdf@lastsystemstatus} +% \begin{macrocode} +\def\pdf@lastsystemstatus{% + \directlua0{% + oberdiek.pdftexcmds.lastsystemstatus()% + }% +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\pdf@lastsystemexit} +% \begin{macrocode} +\def\pdf@lastsystemexit{% + \directlua0{% + oberdiek.pdftexcmds.lastsystemexit()% + }% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\catcode`\0=12 % +% \end{macrocode} +% +% \begin{macro}{\pdf@pipe} +% Check availability of |io.popen| first. +% \begin{macrocode} +\ifnum0% + \pdftexcmds@directlua{% + if io.popen then % + tex.write("1")% + end% + }% + =1 % + \def\pdf@pipe#1{% +& \romannumeral\expandafter\pdftexcmds@PatchDecode + \the\expandafter\pdftexcmds@toks + \pdftexcmds@directlua{% + oberdiek.pdftexcmds.toks="pdftexcmds@toks"% + oberdiek.pdftexcmds.pipe("\luaescapestring{#1}", \pdftexcmds@Patch)% + }% +& \@nil + }% +\fi +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +\pdftexcmds@AtEnd% +% +% \end{macrocode} +% +% \subsection{Lua module} +% +% \begin{macrocode} +%<*lua> +% \end{macrocode} +% +% \begin{macrocode} +oberdiek = oberdiek or {} +local pdftexcmds = oberdiek.pdftexcmds or {} +oberdiek.pdftexcmds = pdftexcmds +local systemexitstatus +function pdftexcmds.getversion() + tex.write("2020-06-27 v0.33") +end +% \end{macrocode} +% +% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} +% +% \begin{macrocode} +function pdftexcmds.strcmp(A, B) + if A == B then + tex.write("0") + elseif A < B then + tex.write("-1") + else + tex.write("1") + end +end +local function utf8_to_byte(str) + local i = 0 + local n = string.len(str) + local t = {} + while i < n do + i = i + 1 + local a = string.byte(str, i) + if a < 128 then + table.insert(t, string.char(a)) + else + if a >= 192 and i < n then + i = i + 1 + local b = string.byte(str, i) + if b < 128 or b >= 192 then + i = i - 1 + elseif a == 194 then + table.insert(t, string.char(b)) + elseif a == 195 then + table.insert(t, string.char(b + 64)) + end + end + end + end + return table.concat(t) +end +function pdftexcmds.escapehex(str, mode) + if mode == "byte" then + str = utf8_to_byte(str) + end + tex.write((string.gsub(str, ".", + function (ch) + return string.format("%02X", string.byte(ch)) + end + ))) +end +% \end{macrocode} +% See procedure |unescapehex| in file \xfile{utils.c} of \hologo{pdfTeX}. +% Caution: |tex.write| ignores leading spaces. +% \begin{macrocode} +function pdftexcmds.unescapehex(str, mode, patch) + local a = 0 + local first = true + local result = {} + for i = 1, string.len(str), 1 do + local ch = string.byte(str, i) + if ch >= 48 and ch <= 57 then + ch = ch - 48 + elseif ch >= 65 and ch <= 70 then + ch = ch - 55 + elseif ch >= 97 and ch <= 102 then + ch = ch - 87 + else + ch = nil + end + if ch then + if first then + a = ch * 16 + first = false + else + table.insert(result, a + ch) + first = true + end + end + end + if not first then + table.insert(result, a) + end + if patch == 1 then + local temp = {} + for i, a in ipairs(result) do + if a == 0 then + table.insert(temp, 1) + table.insert(temp, 1) + else + if a == 1 then + table.insert(temp, 1) + table.insert(temp, 2) + else + table.insert(temp, a) + end + end + end + result = temp + end + if mode == "byte" then + local utf8 = {} + for i, a in ipairs(result) do + if a < 128 then + table.insert(utf8, a) + else + if a < 192 then + table.insert(utf8, 194) + a = a - 128 + else + table.insert(utf8, 195) + a = a - 192 + end + table.insert(utf8, a + 128) + end + end + result = utf8 + end +% \end{macrocode} +% this next line added for current luatex; this is the only +% change in the file. eroux, 28apr13. (v 0.21) +% \begin{macrocode} + local unpack = _G["unpack"] or table.unpack + tex.settoks(pdftexcmds.toks, string.char(unpack(result))) +end +% \end{macrocode} +% See procedure |escapestring| in file \xfile{utils.c} of \hologo{pdfTeX}. +% \begin{macrocode} +function pdftexcmds.escapestring(str, mode) + if mode == "byte" then + str = utf8_to_byte(str) + end + tex.write((string.gsub(str, ".", + function (ch) + local b = string.byte(ch) + if b < 33 or b > 126 then + return string.format("\\%.3o", b) + end + if b == 40 or b == 41 or b == 92 then + return "\\" .. ch + end +% \end{macrocode} +% Lua 5.1 returns the match in case of return value |nil|. +% \begin{macrocode} + return nil + end + ))) +end +% \end{macrocode} +% See procedure |escapename| in file \xfile{utils.c} of \hologo{pdfTeX}. +% \begin{macrocode} +function pdftexcmds.escapename(str, mode) + if mode == "byte" then + str = utf8_to_byte(str) + end + tex.write((string.gsub(str, ".", + function (ch) + local b = string.byte(ch) + if b == 0 then +% \end{macrocode} +% In Lua 5.0 |nil| could be used for the empty string, +% But |nil| returns the match in Lua 5.1, thus we use +% the empty string explicitly. +% \begin{macrocode} + return "" + end + if b <= 32 or b >= 127 + or b == 35 or b == 37 or b == 40 or b == 41 + or b == 47 or b == 60 or b == 62 or b == 91 + or b == 93 or b == 123 or b == 125 then + return string.format("#%.2X", b) + else +% \end{macrocode} +% Lua 5.1 returns the match in case of return value |nil|. +% \begin{macrocode} + return nil + end + end + ))) +end +% \end{macrocode} +% +% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} +% +% \begin{macrocode} +function pdftexcmds.filesize(filename) + local foundfile = kpse.find_file(filename, "tex", true) + if foundfile then + local size = lfs.attributes(foundfile, "size") + if size then + tex.write(size) + end + end +end +% \end{macrocode} +% See procedure |makepdftime| in file \xfile{utils.c} of \hologo{pdfTeX}. +% \begin{macrocode} +function pdftexcmds.filemoddate(filename) + local foundfile = kpse.find_file(filename, "tex", true) + if foundfile then + local date = lfs.attributes(foundfile, "modification") + if date then + local d = os.date("*t", date) + if d.sec >= 60 then + d.sec = 59 + end + local u = os.date("!*t", date) + local off = 60 * (d.hour - u.hour) + d.min - u.min + if d.year ~= u.year then + if d.year > u.year then + off = off + 1440 + else + off = off - 1440 + end + elseif d.yday ~= u.yday then + if d.yday > u.yday then + off = off + 1440 + else + off = off - 1440 + end + end + local timezone + if off == 0 then + timezone = "Z" + else + local hours = math.floor(off / 60) + local mins = math.abs(off - hours * 60) + timezone = string.format("%+03d'%02d'", hours, mins) + end + tex.write(string.format("D:%04d%02d%02d%02d%02d%02d%s", + d.year, d.month, d.day, d.hour, d.min, d.sec, timezone)) + end + end +end +function pdftexcmds.filedump(offset, length, filename) + length = tonumber(length) + if length and length > 0 then + local foundfile = kpse.find_file(filename, "tex", true) + if foundfile then + offset = tonumber(offset) + if not offset then + offset = 0 + end + local filehandle = io.open(foundfile, "rb") + if filehandle then + if offset > 0 then + filehandle:seek("set", offset) + end + local dump = filehandle:read(length) + pdftexcmds.escapehex(dump) + filehandle:close() + end + end + end +end +function pdftexcmds.mdfivesum(str, mode) + if mode == "byte" then + str = utf8_to_byte(str) + end + pdftexcmds.escapehex(md5.sum(str)) +end +function pdftexcmds.filemdfivesum(filename) + local foundfile = kpse.find_file(filename, "tex", true) + if foundfile then + local filehandle = io.open(foundfile, "rb") + if filehandle then + local contents = filehandle:read("*a") + pdftexcmds.escapehex(md5.sum(contents)) + filehandle:close() + end + end +end +% \end{macrocode} +% +% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} +% +% The functions for timekeeping are based on +% Andy Thomas' work \cite{AndyThomas:Analog}. +% Changes: +% \begin{itemize} +% \item Overflow check is added. +% \item |string.format| is used to avoid exponential number +% representation for sure. +% \item |tex.write| is used instead of |tex.print| to get +% tokens with catcode 12 and without appended \cs{endlinechar}. +% \end{itemize} +% \begin{macrocode} +local basetime = 0 +function pdftexcmds.resettimer() + basetime = os.clock() +end +function pdftexcmds.elapsedtime() + local val = (os.clock() - basetime) * 65536 + .5 + if val > 2147483647 then + val = 2147483647 + end + tex.write(string.format("%d", math.floor(val))) +end +% \end{macrocode} +% +% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}} +% +% \begin{macrocode} +function pdftexcmds.shellescape() + if os.execute then + if status + and status.luatex_version + and status.luatex_version >= 68 then + tex.write(os.execute()) + else + local result = os.execute() + if result == 0 then + tex.write("0") + else + if result == nil then + tex.write("0") + else + tex.write("1") + end + end + end + else + tex.write("0") + end +end +function pdftexcmds.system(cmdline) + systemexitstatus = nil + texio.write_nl("log", "system(" .. cmdline .. ") ") + if os.execute then + texio.write("log", "executed.") + systemexitstatus = os.execute(cmdline) + else + texio.write("log", "disabled.") + end +end +function pdftexcmds.lastsystemstatus() + local result = tonumber(systemexitstatus) + if result then + local x = math.floor(result / 256) + tex.write(result - 256 * math.floor(result / 256)) + end +end +function pdftexcmds.lastsystemexit() + local result = tonumber(systemexitstatus) + if result then + tex.write(math.floor(result / 256)) + end +end +function pdftexcmds.pipe(cmdline, patch) + local result + systemexitstatus = nil + texio.write_nl("log", "pipe(" .. cmdline ..") ") + if io.popen then + texio.write("log", "executed.") + local handle = io.popen(cmdline, "r") + if handle then + result = handle:read("*a") + handle:close() + end + else + texio.write("log", "disabled.") + end + if result then + if patch == 1 then + local temp = {} + for i, a in ipairs(result) do + if a == 0 then + table.insert(temp, 1) + table.insert(temp, 1) + else + if a == 1 then + table.insert(temp, 1) + table.insert(temp, 2) + else + table.insert(temp, a) + end + end + end + result = temp + end + tex.settoks(pdftexcmds.toks, result) + else + tex.settoks(pdftexcmds.toks, "") + end +end +% \end{macrocode} +% \begin{macrocode} +% +% \end{macrocode} +% \section{Installation} +% +% \subsection{Download} +% +% \paragraph{Package.} This package is available on +% CTAN\footnote{\CTANpkg{pdftexcmds}}: +% \begin{description} +% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.dtx}] The source file. +% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.pdf}] Documentation. +% \end{description} +% +% \subsection{Package installation} +% +% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting +% \docstrip\ archive. The files are extracted by running the +% \xfile{.dtx} through \plainTeX: +% \begin{quote} +% \verb|tex pdftexcmds.dtx| +% \end{quote} +% +% \paragraph{TDS.} Now the different files must be moved into +% the different directories in your installation TDS tree +% (also known as \xfile{texmf} tree): +% \begin{quote} +% \def\t{^^A +% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}} +% pdftexcmds.sty & tex/generic/pdftexcmds/pdftexcmds.sty\\ +% pdftexcmds.lua & tex/generic/pdftexcmds/pdftexcmds.lua\\ +% pdftexcmds.pdf & doc/latex/pdftexcmds/pdftexcmds.pdf\\ +% pdftexcmds.dtx & source/latex/pdftexcmds/pdftexcmds.dtx\\ +% \end{tabular}^^A +% }^^A +% \sbox0{\t}^^A +% \ifdim\wd0>\linewidth +% \begingroup +% \advance\linewidth by\leftmargin +% \advance\linewidth by\rightmargin +% \edef\x{\endgroup +% \def\noexpand\lw{\the\linewidth}^^A +% }\x +% \def\lwbox{^^A +% \leavevmode +% \hbox to \linewidth{^^A +% \kern-\leftmargin\relax +% \hss +% \usebox0 +% \hss +% \kern-\rightmargin\relax +% }^^A +% }^^A +% \ifdim\wd0>\lw +% \sbox0{\small\t}^^A +% \ifdim\wd0>\linewidth +% \ifdim\wd0>\lw +% \sbox0{\footnotesize\t}^^A +% \ifdim\wd0>\linewidth +% \ifdim\wd0>\lw +% \sbox0{\scriptsize\t}^^A +% \ifdim\wd0>\linewidth +% \ifdim\wd0>\lw +% \sbox0{\tiny\t}^^A +% \ifdim\wd0>\linewidth +% \lwbox +% \else +% \usebox0 +% \fi +% \else +% \lwbox +% \fi +% \else +% \usebox0 +% \fi +% \else +% \lwbox +% \fi +% \else +% \usebox0 +% \fi +% \else +% \lwbox +% \fi +% \else +% \usebox0 +% \fi +% \else +% \lwbox +% \fi +% \else +% \usebox0 +% \fi +% \end{quote} +% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's +% TDS installing feature, then some files can already be in the right +% place, see the documentation of \docstrip. +% +% \subsection{Refresh file name databases} +% +% If your \TeX~distribution +% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh +% these. For example, \TeX\,Live\ users run \verb|texhash| or +% \verb|mktexlsr|. +% +% \subsection{Some details for the interested} +% +% \paragraph{Unpacking with \LaTeX.} +% The \xfile{.dtx} chooses its action depending on the format: +% \begin{description} +% \item[\plainTeX:] Run \docstrip\ and extract the files. +% \item[\LaTeX:] Generate the documentation. +% \end{description} +% If you insist on using \LaTeX\ for \docstrip\ (really, +% \docstrip\ does not need \LaTeX), then inform the autodetect routine +% about your intention: +% \begin{quote} +% \verb|latex \let\install=y\input{pdftexcmds.dtx}| +% \end{quote} +% Do not forget to quote the argument according to the demands +% of your shell. +% +% \paragraph{Generating the documentation.} +% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate +% the documentation. The process can be configured by the +% configuration file \xfile{ltxdoc.cfg}. For instance, put this +% line into this file, if you want to have A4 as paper format: +% \begin{quote} +% \verb|\PassOptionsToClass{a4paper}{article}| +% \end{quote} +% An example follows how to generate the +% documentation with pdf\LaTeX: +% \begin{quote} +%\begin{verbatim} +%pdflatex pdftexcmds.dtx +%bibtex pdftexcmds.aux +%makeindex -s gind.ist pdftexcmds.idx +%pdflatex pdftexcmds.dtx +%makeindex -s gind.ist pdftexcmds.idx +%pdflatex pdftexcmds.dtx +%\end{verbatim} +% \end{quote} +% +% \printbibliography[ +% heading=bibnumbered, +% ] +% +% \begin{History} +% \begin{Version}{2007/11/11 v0.1} +% \item +% First version. +% \end{Version} +% \begin{Version}{2007/11/12 v0.2} +% \item +% Short description fixed. +% \end{Version} +% \begin{Version}{2007/12/12 v0.3} +% \item +% Organization of Lua code as module. +% \end{Version} +% \begin{Version}{2009/04/10 v0.4} +% \item +% Adaptation for syntax change of \cs{directlua} in +% \hologo{LuaTeX} 0.36. +% \end{Version} +% \begin{Version}{2009/09/22 v0.5} +% \item +% \cs{pdf@primitive}, \cs{pdf@ifprimitive} added. +% \item +% \hologo{XeTeX}'s variants are detected for +% \cs{pdf@shellescape}, \cs{pdf@strcmp}, \cs{pdf@primitive}, +% \cs{pdf@ifprimitive}. +% \end{Version} +% \begin{Version}{2009/09/23 v0.6} +% \item +% Macro \cs{pdf@isprimitive} added. +% \end{Version} +% \begin{Version}{2009/12/12 v0.7} +% \item +% Short info shortened. +% \end{Version} +% \begin{Version}{2010/03/01 v0.8} +% \item +% Required date for package \xpackage{ifluatex} updated. +% \end{Version} +% \begin{Version}{2010/04/01 v0.9} +% \item +% Use \cs{ifeof18} for defining \cs{pdf@shellescape} between +% \hologo{pdfTeX} 1.21a (inclusive) and 1.30.0 (exclusive). +% \end{Version} +% \begin{Version}{2010/11/04 v0.10} +% \item +% \cs{pdf@draftmode}, \cs{pdf@ifdraftmode} and +% \cs{pdf@setdraftmode} added. +% \end{Version} +% \begin{Version}{2010/11/11 v0.11} +% \item +% Missing \cs{RequirePackage} for package \xpackage{ifpdf} added. +% \end{Version} +% \begin{Version}{2011/01/30 v0.12} +% \item +% Already loaded package files are not input in \hologo{plainTeX}. +% \end{Version} +% \begin{Version}{2011/03/04 v0.13} +% \item +% Improved Lua function \texttt{shellescape} that also +% uses the result of \texttt{os.execute()} (thanks to Philipp Stephani). +% \end{Version} +% \begin{Version}{2011/04/10 v0.14} +% \item +% Version check of loaded module added. +% \item +% Patch for bug in \hologo{LuaTeX} between 0.40.6 and 0.65 that +% is fixed in revision 4096. +% \end{Version} +% \begin{Version}{2011/04/16 v0.15} +% \item +% \hologo{LuaTeX}: \cs{pdf@shellescape} is only supported +% for version 0.70.0 and higher due to a bug, \texttt{os.execute()} +% crashes in some circumstances. Fixed in \hologo{LuaTeX} +% beta-0.70.0, revision 4167. +% \end{Version} +% \begin{Version}{2011/04/22 v0.16} +% \item +% Previous fix was not working due to a wrong catcode of digit +% zero (due to easily support the old \cs{directlua0}). +% The version border is lowered to 0.68, because some +% beta-0.67.0 seems also to work. +% \end{Version} +% \begin{Version}{2011/06/29 v0.17} +% \item +% Documentation addition to \cs{pdf@shellescape}. +% \end{Version} +% \begin{Version}{2011/07/01 v0.18} +% \item +% Add Lua module loading in \cs{everyjob} for \hologo{iniTeX} +% (\hologo{LuaTeX} only). +% \end{Version} +% \begin{Version}{2011/07/28 v0.19} +% \item +% Missing space in an info message added (Martin M\"unch). +% \end{Version} +% \begin{Version}{2011/11/29 v0.20} +% \item +% \cs{pdf@resettimer} and \cs{pdf@elapsedtime} added +% (thanks Andy Thomas). +% \end{Version} +% \begin{Version}{2016/05/10 v0.21} +% \item +% local unpack added +% (thanks \'{E}lie Roux). +% \end{Version} +% \begin{Version}{2016/05/21 v0.22} +% \item +% adjust \cs{textbackslas}h usage in bib file for biber bug. +% \end{Version} +% \begin{Version}{2016/10/02 v0.23} +% \item +% add file.close to lua filehandles (github pull request). +% \end{Version} +% \begin{Version}{2017/01/29 v0.24} +% \item +% Avoid loading luatex-loader for current luatex. (Use +% pdftexcmds.lua not oberdiek.pdftexcmds.lua to simplify file +% search with standard require) +% \end{Version} +% \begin{Version}{2017/03/19 v0.25} +% \item +% New \cs{pdf@shellescape} for Lua\TeX, see github issue 20. +% \end{Version} +% \begin{Version}{2018/01/21 v0.26} +% \item +% use rb not r mode for file open github issue 34. +% \end{Version} +% \begin{Version}{2018/01/30 v0.27} +% \item +% \cs{pdf@mdfivesum} for \hologo{XeTeX} +% \end{Version} +% \begin{Version}{2018/09/07 v0.28} +% \item +% Fix catcode regime in luatex sprint for \cs{pdf@shellescape} GH issue 45 +% \end{Version} +% \begin{Version}{2018/09/10 v0.29} +% \item +% Actually do the fix described above in the code, not just document it. +% \end{Version} +% \begin{Version}{2019/07/25 v0.30} +% \item +% Remove uses of module function, see PR70 +% \end{Version} +% \begin{Version}{2019/11/24 v0.31} +% \item +% Use \xpackage{iftex} directly rather than \xpackage{ifluatex} and \xpackage{ifpdf} wrappers. +% \item detect \verb|\filmoddate| and other \hologo{XeTeX} commands. +% \item Adjust \cs{pdf@escapestring} in \hologo{LuaTeX} to produce +% the same as in \hologo{pdfTeX} in the 8bit +% range and not drop all non ascii characters. +% \end{Version} +% \begin{Version}{2020-06-04 v0.32} +% \item Updated pdftexcmds.elapsedtime to lua 5.3 (issue 4). +% \end{Version} +% \begin{Version}{2020-06-24 v0.33} +% \item avoid that \cs{pdfelapsedtime} and \cs{pdfresettimer} are set to \cs{relax} +% when using xelatex (issue 5). +% \item load ltluatex when using plain so that the catcode tables are +% available. +% \end{Version} +% \end{History} +% +% \PrintIndex +% +% \Finale +\endinput diff --git a/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx b/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx deleted file mode 100644 index 7e9de4e5583..00000000000 --- a/Master/texmf-dist/source/latex/pdftexcmds/pdftexcmds.dtx +++ /dev/null @@ -1,2264 +0,0 @@ -% \iffalse meta-comment -% -% File: pdftexcmds.dtx -% Version: 2020-06-04 v0.32 -% Info: Utility functions of pdfTeX for LuaTeX -% -% Copyright (C) -% 2007, 2009-2011 Heiko Oberdiek -% 2016-2020 Oberdiek Package Support Group -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either -% version 1.3c of this license or (at your option) any later -% version. This version of this license is in -% https://www.latex-project.org/lppl/lppl-1-3c.txt -% and the latest version of this license is in -% https://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of -% LaTeX version 2005/12/01 or later. -% -% This work has the LPPL maintenance status "maintained". -% -% The Current Maintainers of this work are -% Heiko Oberdiek and the Oberdiek Package Support Group -% https://github.com/ho-tex/pdftexcmds/issues -% -% The Base Interpreter refers to any `TeX-Format', -% because some files are installed in TDS:tex/generic//. -% -% This work consists of the main source file pdftexcmds.dtx -% and the derived files -% pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv, -% pdftexcmds.bib, pdftexcmds-test1.tex, pdftexcmds-test2.tex, -% pdftexcmds-test-shell.tex, pdftexcmds-test-escape.tex, -% pdftexcmds.lua. -% -% Distribution: -% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.dtx -% CTAN:macros/latex/contrib/pdftexcmds/pdftexcmds.pdf -% -% Unpacking: -% (a) If pdftexcmds.ins is present: -% tex pdftexcmds.ins -% (b) Without pdftexcmds.ins: -% tex pdftexcmds.dtx -% (c) If you insist on using LaTeX -% latex \let\install=y\input{pdftexcmds.dtx} -% (quote the arguments according to the demands of your shell) -% -% Documentation: -% (a) If pdftexcmds.drv is present: -% latex pdftexcmds.drv -% (b) Without pdftexcmds.drv: -% latex pdftexcmds.dtx; ... -% The class ltxdoc loads the configuration file ltxdoc.cfg -% if available. Here you can specify further options, e.g. -% use A4 as paper format: -% \PassOptionsToClass{a4paper}{article} -% -% Programm calls to get the documentation (example): -% pdflatex pdftexcmds.dtx -% bibtex pdftexcmds.aux -% makeindex -s gind.ist pdftexcmds.idx -% pdflatex pdftexcmds.dtx -% makeindex -s gind.ist pdftexcmds.idx -% pdflatex pdftexcmds.dtx -% -% Installation: -% TDS:tex/generic/pdftexcmds/pdftexcmds.sty -% TDS:scripts/pdftexcmds/pdftexcmds.lua -% TDS:doc/latex/pdftexcmds/pdftexcmds.pdf -% TDS:source/latex/pdftexcmds/pdftexcmds.dtx -% -%<*ignore> -\begingroup - \catcode123=1 % - \catcode125=2 % - \def\x{LaTeX2e}% -\expandafter\endgroup -\ifcase 0\ifx\install y1\fi\expandafter - \ifx\csname processbatchFile\endcsname\relax\else1\fi - \ifx\fmtname\x\else 1\fi\relax -\else\csname fi\endcsname -% -%<*install> -\input docstrip.tex -\Msg{************************************************************************} -\Msg{* Installation} -\Msg{* Package: pdftexcmds 2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)} -\Msg{************************************************************************} - -\keepsilent -\askforoverwritefalse - -\let\MetaPrefix\relax -\preamble - -This is a generated file. - -Project: pdftexcmds -Version: 2020-06-04 v0.32 - -Copyright (C) - 2007, 2009-2011 Heiko Oberdiek - 2016-2019 Oberdiek Package Support Group - -This work may be distributed and/or modified under the -conditions of the LaTeX Project Public License, either -version 1.3c of this license or (at your option) any later -version. This version of this license is in - https://www.latex-project.org/lppl/lppl-1-3c.txt -and the latest version of this license is in - https://www.latex-project.org/lppl.txt -and version 1.3 or later is part of all distributions of -LaTeX version 2005/12/01 or later. - -This work has the LPPL maintenance status "maintained". - -The Current Maintainers of this work are -Heiko Oberdiek and the Oberdiek Package Support Group -https://github.com/ho-tex/pdftexcmds/issues - - -The Base Interpreter refers to any `TeX-Format', -because some files are installed in TDS:tex/generic//. - -This work consists of the main source file pdftexcmds.dtx -and the derived files - pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv, - pdftexcmds.lua. - -\endpreamble -\let\MetaPrefix\DoubleperCent - -\generate{% - \file{pdftexcmds.ins}{\from{pdftexcmds.dtx}{install}}% - \file{pdftexcmds.drv}{\from{pdftexcmds.dtx}{driver}}% - \nopreamble - \nopostamble - \file{pdftexcmds.bib}{\from{pdftexcmds.dtx}{bib}}% - \usepreamble\defaultpreamble - \usepostamble\defaultpostamble - \usedir{tex/generic/pdftexcmds}% - \file{pdftexcmds.sty}{\from{pdftexcmds.dtx}{package}}% -% \usedir{doc/latex/pdftexcmds/test}% -% \file{pdftexcmds-test1.tex}{\from{pdftexcmds.dtx}{test1}}% -% \file{pdftexcmds-test2.tex}{\from{pdftexcmds.dtx}{test2}}% -% \file{pdftexcmds-test-shell.tex}{\from{pdftexcmds.dtx}{test-shell}}% -% \file{pdftexcmds-test-escape.tex}{\from{pdftexcmds.dtx}{test-escape}}% -} -\def\MetaPrefix{-- } -\def\defaultpostamble{% - \MetaPrefix^^J% - \MetaPrefix\space End of File `\outFileName'.% -} -\def\currentpostamble{\defaultpostamble}% -\generate{% - \usedir{scripts/pdftexcmds}% - \file{pdftexcmds.lua}{\from{pdftexcmds.dtx}{lua}}% -} - -\catcode32=13\relax% active space -\let =\space% -\Msg{************************************************************************} -\Msg{*} -\Msg{* To finish the installation you have to move the following} -\Msg{* file into a directory searched by TeX:} -\Msg{*} -\Msg{* pdftexcmds.sty} -\Msg{*} -\Msg{* And install the following script files:} -\Msg{*} -\Msg{* pdftexcmds.lua} -\Msg{*} -\Msg{* To produce the documentation run the file `pdftexcmds.drv'} -\Msg{* through LaTeX.} -\Msg{*} -\Msg{* Happy TeXing!} -\Msg{*} -\Msg{************************************************************************} - -\endbatchfile -% -%<*bib> -@online{AndyThomas:Analog, - author={Thomas, Andy}, - title={Analog of {\texttt{\csname textbackslash\endcsname}pdfelapsedtime} for - {\hologo{LuaTeX}} and {\hologo{XeTeX}}}, - url={http://tex.stackexchange.com/a/32531}, - urldate={2011-11-29}, -} -% -%<*ignore> -\fi -% -%<*driver> -\NeedsTeXFormat{LaTeX2e} -\ProvidesFile{pdftexcmds.drv}% - [2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)]% -\documentclass{ltxdoc} -\usepackage{holtxdoc}[2011/11/22] -\usepackage{paralist} -\usepackage{csquotes} -\usepackage[ - backend=bibtex, - bibencoding=ascii, - alldates=iso8601, -]{biblatex}[2011/11/13] -\bibliography{oberdiek-source} -\bibliography{pdftexcmds} -\begin{document} - \DocInput{pdftexcmds.dtx}% -\end{document} -% -% \fi -% -% -% -% \GetFileInfo{pdftexcmds.drv} -% -% \title{The \xpackage{pdftexcmds} package} -% \date{2020-06-04 v0.32} -% \author{Heiko Oberdiek\thanks -% {Please report any issues at \url{https://github.com/ho-tex/pdftexcmds/issues}}} -% -% \maketitle -% -% \begin{abstract} -% \hologo{LuaTeX} provides most of the commands of \hologo{pdfTeX} 1.40. However -% a number of utility functions are removed. This package tries to fill -% the gap and implements some of the missing primitive using Lua. -% \end{abstract} -% -% \tableofcontents -% -% \def\csi#1{\texttt{\textbackslash\textit{#1}}} -% -% \section{Documentation} -% -% Some primitives of \hologo{pdfTeX} \cite{pdftex-manual} -% are not defined by \hologo{LuaTeX} \cite{luatex-manual}. -% This package implements macro based solutions using Lua code -% for the following missing \hologo{pdfTeX} primitives; -% \begin{compactitem} -% \item \cs{pdfstrcmp} -% \item \cs{pdfunescapehex} -% \item \cs{pdfescapehex} -% \item \cs{pdfescapename} -% \item \cs{pdfescapestring} -% \item \cs{pdffilesize} -% \item \cs{pdffilemoddate} -% \item \cs{pdffiledump} -% \item \cs{pdfmdfivesum} -% \item \cs{pdfresettimer} -% \item \cs{pdfelapsedtime} -% \item |\immediate\write18| -% \end{compactitem} -% The original names of the primitives cannot be used: -% \begin{itemize} -% \item -% The syntax for their arguments cannot easily -% simulated by macros. The primitives using key words -% such as |file| (\cs{pdfmdfivesum}) or |offset| and |length| -% (\cs{pdffiledump}) and uses \meta{general text} for the other -% arguments. Using token registers assignments, \meta{general text} could -% be catched. However, the simulated primitives are expandable -% and register assignments would destroy this important property. -% (\meta{general text} allows something like |\expandafter\bgroup ...}|.) -% \item -% The original primitives can be expanded using one expansion step. -% The new macros need two expansion steps because of the additional -% macro expansion. Example: -% \begin{quote} -% |\expandafter\foo\pdffilemoddate{file}|\\ -% vs.\\ -% |\expandafter\expandafter\expandafter|\\ -% |\foo\pdf@filemoddate{file}| -% \end{quote} -% \end{itemize} -% -% \hologo{LuaTeX} isn't stable yet and thus the status of this package is -% \emph{experimental}. Feedback is welcome. -% -% \subsection{General principles} -% -% \begin{description} -% \item[Naming convention:] -% Usually this package defines a macro |\pdf@|\meta{cmd} if -% \hologo{pdfTeX} provides |\pdf|\meta{cmd}. -% \item[Arguments:] The order of arguments in |\pdf@|\meta{cmd} -% is the same as for the corresponding primitive of \hologo{pdfTeX}. -% The arguments are ordinary undelimited \hologo{TeX} arguments, -% no \meta{general text} and without additional keywords. -% \item[Expandibility:] -% The macro |\pdf@|\meta{cmd} is expandable if the -% corresponding \hologo{pdfTeX} primitive has this property. -% Exact two expansion steps are necessary (first is the macro -% expansion) except for \cs{pdf@primitive} and \cs{pdf@ifprimitive}. -% The latter ones are not macros, but have the direct meaning of the -% primitive. -% \item[Without \hologo{LuaTeX}:] -% The macros |\pdf@|\meta{cmd} are mapped to the commands -% of \hologo{pdfTeX} if they are available. Otherwise they are undefined. -% \item[Availability:] -% The macros that the packages provides are undefined, if -% the necessary primitives are not found and cannot be -% implemented by Lua. -% \end{description} -% -% \subsection{Macros} -% -% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} -% -% \begin{declcs}{pdf@strcmp} \M{stringA} \M{stringB} -% \end{declcs} -% Same as |\pdfstrcmp{|\meta{stringA}|}{|\meta{stringB}|}|. -% -% \begin{declcs}{pdf@unescapehex} \M{string} -% \end{declcs} -% Same as |\pdfunescapehex{|\meta{string}|}|. -% The argument is a byte string given in hexadecimal notation. -% The result are character tokens from 0 until 255 with -% catcode 12 and the space with catcode 10. -% -% \begin{declcs}{pdf@escapehex} \M{string}\\ -% \cs{pdf@escapestring} \M{string}\\ -% \cs{pdf@escapename} \M{string} -% \end{declcs} -% Same as the primitives of \hologo{pdfTeX}. However \hologo{pdfTeX} does not -% know about characters with codes 256 and larger. Thus the -% string is treated as byte string, characters with more than -% eight bits are ignored. -% -% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} -% -% \begin{declcs}{pdf@filesize} \M{filename} -% \end{declcs} -% Same as |\pdffilesize{|\meta{filename}|}|. -% -% \begin{declcs}{pdf@filemoddate} \M{filename} -% \end{declcs} -% Same as |\pdffilemoddate{|\meta{filename}|}|. -% -% \begin{declcs}{pdf@filedump} \M{offset} \M{length} \M{filename} -% \end{declcs} -% Same as |\pdffiledump offset| \meta{offset} |length| \meta{length} -% |{|\meta{filename}|}|. Both \meta{offset} and \meta{length} must -% not be empty, but must be a valid \hologo{TeX} number. -% -% \begin{declcs}{pdf@mdfivesum} \M{string} -% \end{declcs} -% Same as |\pdfmdfivesum{|\meta{string}|}|. Keyword |file| is supported -% by macro \cs{pdf@filemdfivesum}. -% -% \begin{declcs}{pdf@filemdfivesum} \M{filename} -% \end{declcs} -% Same as |\pdfmdfivesum file{|\meta{filename}|}|. -% -% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} -% -% The timekeeping macros are based on Andy Thomas' work \cite{AndyThomas:Analog}. -% -% \begin{declcs}{pdf@resettimer} -% \end{declcs} -% Same as \cs{pdfresettimer}, it resets the internal timer. -% -% \begin{declcs}{pdf@elapsedtime} -% \end{declcs} -% Same as \cs{pdfelapsedtime}. It behaves like a read-only integer. -% For printing purposes it can be prefixed by \cs{the} or \cs{number}. -% It measures the time in scaled seconds (seconds multiplied with 65536) -% since the latest call of \cs{pdf@resettimer} or start of -% program/package. The resolution, the shortest time interval that -% can be measured, depends on the program and system. -% \begin{itemize} -% \item \hologo{pdfTeX} with |gettimeofday|: $\ge$ 1/65536\,s -% \item \hologo{pdfTeX} with |ftime|: $\ge$ 1\,ms -% \item \hologo{pdfTeX} with |time|: $\ge$ 1\,s -% \item \hologo{LuaTeX}: $\ge$ 10\,ms\\ -% (|os.clock()| returns a float number with two decimal digits in -% \hologo{LuaTeX} beta-0.70.1-2011061416 (rev 4277)). -% \end{itemize} -% -% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}} -% -% \begin{declcs}{pdf@draftmode} -% \end{declcs} -% If the \TeX\ compiler knows \cs{pdfdraftmode} or \cs{draftmode} -% (\hologo{pdfTeX}, -% \hologo{LuaTeX}), then \cs{pdf@draftmode} returns, whether -% this mode is enabled. The result is an implicit number: -% one means the draft mode is available and enabled. -% If the value is zero, then the mode is not active or -% \cs{pdfdraftmode} is not available. -% An explicit number is yielded by \cs{number}\cs{pdf@draftmode}. -% The macro cannot -% be used to change the mode, see \cs{pdf@setdraftmode}. -% -% \begin{declcs}{pdf@ifdraftmode} \M{true} \M{false} -% \end{declcs} -% If \cs{pdfdraftmode} is available and enabled, \meta{true} is -% called, otherwise \meta{false} is executed. -% -% \begin{declcs}{pdf@setdraftmode} \M{value} -% \end{declcs} -% Macro \cs{pdf@setdraftmode} expects the number zero or one as -% \meta{value}. Zero deactivates the mode and one enables the draft mode. -% The macro does not have an effect, if the feature \cs{pdfdraftmode} is not -% available. -% -% \begin{declcs}{pdf@shellescape} -% \end{declcs} -% Same as |\pdfshellescape|. It is or expands to |1| if external -% commands can be executed and |0| otherwise. In \hologo{pdfTeX} external -% commands must be enabled first by command line option or -% configuration option. In \hologo{LuaTeX} option |--safer| disables -% the execution of external commands. -% -% In \hologo{LuaTeX} before 0.68.0 \cs{pdf@shellescape} is not -% available due to a bug in |os.execute()|. The argumentless form -% crashes in some circumstances with segmentation fault. -% (It is fixed in version 0.68.0 or revision 4167 of \hologo{LuaTeX}. -% and packported to some version of 0.67.0). -% -% Hints for usage: -% \begin{itemize} -% \item Before its use \cs{pdf@shellescape} should be tested, -% whether it is available. Example with package \xpackage{ltxcmds} -% (loaded by package \xpackage{pdftexcmds}): -%\begin{quote} -%\begin{verbatim} -%\ltx@IfUndefined{pdf@shellescape}{% -% % \pdf@shellescape is undefined -%}{% -% % \pdf@shellescape is available -%} -%\end{verbatim} -%\end{quote} -% Use \cs{ltx@ifundefined} in expandable contexts. -% \item \cs{pdf@shellescape} might be a numerical constant, -% expands to the primitive, or expands to a plain number. -% Therefore use it in contexts where these differences does not matter. -% \item Use in comparisons, e.g.: -% \begin{quote} -% |\ifnum\pdf@shellescape=0 ...| -% \end{quote} -% \item Print the number: |\number\pdf@shellescape| -% \end{itemize} -% -% \begin{declcs}{pdf@system} \M{cmdline} -% \end{declcs} -% It is a wrapper for |\immediate\write18| in \hologo{pdfTeX} or -% |os.execute| in \hologo{LuaTeX}. -% -% In theory |os.execute| -% returns a status number. But its meaning is quite -% undefined. Are there some reliable properties? -% Does it make sense to provide an user interface to -% this status exit code? -% -% \begin{declcs}{pdf@primitive} \csi{cmd} -% \end{declcs} -% Same as \cs{pdfprimitive} in \hologo{pdfTeX} or \hologo{LuaTeX}. -% In \hologo{XeTeX} the -% primitive is called \cs{primitive}. Despite the current definition -% of the command \csi{cmd}, it's meaning as primitive is used. -% -% \begin{declcs}{pdf@ifprimitive} \csi{cmd} -% \end{declcs} -% Same as \cs{ifpdfprimitive} in \hologo{pdfTeX} or -% \hologo{LuaTeX}. \hologo{XeTeX} calls -% it \cs{ifprimitive}. It is a switch that checks if the command -% \csi{cmd} has it's primitive meaning. -% -% \subsubsection{Additional macro: \cs{pdf@isprimitive}} -% -% \begin{declcs}{pdf@isprimitive} \csi{cmd1} \csi{cmd2} \M{true} \M{false} -% \end{declcs} -% If \csi{cmd1} has the primitive meaning given by the primitive name -% of \csi{cmd2}, then the argument \meta{true} is executed, otherwise -% \meta{false}. The macro \cs{pdf@isprimitive} is expandable. -% Internally it checks the result of \cs{meaning} and is therefore -% available for all \hologo{TeX} variants, even the original \hologo{TeX}. -% Example with \hologo{LaTeX}: -%\begin{quote} -%\begin{verbatim} -%\makeatletter -%\pdf@isprimitive{@@input}{input}{% -% \typeout{\string\@@input\space is original\string\input}% -%}{% -% \typeout{Oops, \string\@@input\space is not the % -% original\string\input}% -%} -%\end{verbatim} -%\end{quote} -% -% \subsubsection{Experimental} -% -% \begin{declcs}{pdf@unescapehexnative} \M{string}\\ -% \cs{pdf@escapehexnative} \M{string}\\ -% \cs{pdf@escapenamenative} \M{string}\\ -% \cs{pdf@mdfivesumnative} \M{string} -% \end{declcs} -% The variants without |native| in the macro name are supposed to -% be compatible with \hologo{pdfTeX}. However characters with more than -% eight bits are not supported and are ignored. If \hologo{LuaTeX} is -% running, then its UTF-8 coded strings are used. Thus the full -% unicode character range is supported. However the result -% differs from \hologo{pdfTeX} for characters with eight or more bits. -% -% \begin{declcs}{pdf@pipe} \M{cmdline} -% \end{declcs} -% It calls \meta{cmdline} and returns the output of the external -% program in the usual manner as byte string (catcode 12, space with -% catcode 10). The Lua documentation says, that the used |io.popen| -% may not be available on all platforms. Then macro \cs{pdf@pipe} -% is undefined. -% -% \StopEventually{ -% } -% -% \section{Implementation} -% -% \begin{macrocode} -%<*package> -% \end{macrocode} -% -% \subsection{Reload check and package identification} -% Reload check, especially if the package is not used with \LaTeX. -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode35=6 % # - \catcode39=12 % ' - \catcode44=12 % , - \catcode45=12 % - - \catcode46=12 % . - \catcode58=12 % : - \catcode64=11 % @ - \catcode123=1 % { - \catcode125=2 % } - \expandafter\let\expandafter\x\csname ver@pdftexcmds.sty\endcsname - \ifx\x\relax % plain-TeX, first loading - \else - \def\empty{}% - \ifx\x\empty % LaTeX, first loading, - % variable is initialized, but \ProvidesPackage not yet seen - \else - \expandafter\ifx\csname PackageInfo\endcsname\relax - \def\x#1#2{% - \immediate\write-1{Package #1 Info: #2.}% - }% - \else - \def\x#1#2{\PackageInfo{#1}{#2, stopped}}% - \fi - \x{pdftexcmds}{The package is already loaded}% - \aftergroup\endinput - \fi - \fi -\endgroup% -% \end{macrocode} -% Package identification: -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode35=6 % # - \catcode39=12 % ' - \catcode40=12 % ( - \catcode41=12 % ) - \catcode44=12 % , - \catcode45=12 % - - \catcode46=12 % . - \catcode47=12 % / - \catcode58=12 % : - \catcode64=11 % @ - \catcode91=12 % [ - \catcode93=12 % ] - \catcode123=1 % { - \catcode125=2 % } - \expandafter\ifx\csname ProvidesPackage\endcsname\relax - \def\x#1#2#3[#4]{\endgroup - \immediate\write-1{Package: #3 #4}% - \xdef#1{#4}% - }% - \else - \def\x#1#2[#3]{\endgroup - #2[{#3}]% - \ifx#1\@undefined - \xdef#1{#3}% - \fi - \ifx#1\relax - \xdef#1{#3}% - \fi - }% - \fi -\expandafter\x\csname ver@pdftexcmds.sty\endcsname -\ProvidesPackage{pdftexcmds}% - [2020-06-04 v0.32 Utility functions of pdfTeX for LuaTeX (HO)]% -% \end{macrocode} -% -% \subsection{Catcodes} -% -% \begin{macrocode} -\begingroup\catcode61\catcode48\catcode32=10\relax% - \catcode13=5 % ^^M - \endlinechar=13 % - \catcode123=1 % { - \catcode125=2 % } - \catcode64=11 % @ - \def\x{\endgroup - \expandafter\edef\csname pdftexcmds@AtEnd\endcsname{% - \endlinechar=\the\endlinechar\relax - \catcode13=\the\catcode13\relax - \catcode32=\the\catcode32\relax - \catcode35=\the\catcode35\relax - \catcode61=\the\catcode61\relax - \catcode64=\the\catcode64\relax - \catcode123=\the\catcode123\relax - \catcode125=\the\catcode125\relax - }% - }% -\x\catcode61\catcode48\catcode32=10\relax% -\catcode13=5 % ^^M -\endlinechar=13 % -\catcode35=6 % # -\catcode64=11 % @ -\catcode123=1 % { -\catcode125=2 % } -\def\TMP@EnsureCode#1#2{% - \edef\pdftexcmds@AtEnd{% - \pdftexcmds@AtEnd - \catcode#1=\the\catcode#1\relax - }% - \catcode#1=#2\relax -} -\TMP@EnsureCode{0}{12}% -\TMP@EnsureCode{1}{12}% -\TMP@EnsureCode{2}{12}% -\TMP@EnsureCode{10}{12}% ^^J -\TMP@EnsureCode{33}{12}% ! -\TMP@EnsureCode{34}{12}% " -\TMP@EnsureCode{38}{4}% & -\TMP@EnsureCode{39}{12}% ' -\TMP@EnsureCode{40}{12}% ( -\TMP@EnsureCode{41}{12}% ) -\TMP@EnsureCode{42}{12}% * -\TMP@EnsureCode{43}{12}% + -\TMP@EnsureCode{44}{12}% , -\TMP@EnsureCode{45}{12}% - -\TMP@EnsureCode{46}{12}% . -\TMP@EnsureCode{47}{12}% / -\TMP@EnsureCode{58}{12}% : -\TMP@EnsureCode{60}{12}% < -\TMP@EnsureCode{62}{12}% > -\TMP@EnsureCode{91}{12}% [ -\TMP@EnsureCode{93}{12}% ] -\TMP@EnsureCode{94}{7}% ^ (superscript) -\TMP@EnsureCode{95}{12}% _ (other) -\TMP@EnsureCode{96}{12}% ` -\TMP@EnsureCode{126}{12}% ~ (other) -\edef\pdftexcmds@AtEnd{% - \pdftexcmds@AtEnd - \escapechar=\number\escapechar\relax - \noexpand\endinput -} -\escapechar=92 % -% \end{macrocode} -% -% \subsection{Load packages} -% -% \begin{macrocode} -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname RequirePackage\endcsname\relax - \def\TMP@RequirePackage#1[#2]{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname ver@#1.sty\endcsname\relax - \input #1.sty\relax - \fi - }% - \TMP@RequirePackage{infwarerr}[2007/09/09]% - \TMP@RequirePackage{iftex}[2019/11/07]%% - \TMP@RequirePackage{ltxcmds}[2010/12/02]% -\else - \RequirePackage{infwarerr}[2007/09/09]% - \RequirePackage{iftex}[2019/11/07]% - \RequirePackage{ltxcmds}[2010/12/02]% -\fi -% \end{macrocode} -% -% \subsection{Without \hologo{LuaTeX}} -% -% \begin{macrocode} -\ifluatex -\else - \def\pdftexcmds@nopdftex{% - \let\pdftexcmds@nopdftex\relax - }% - \def\pdftexcmds@temp#1{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname - \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax - \pdftexcmds@nopdftex - \else - \expandafter\def\csname pdf@#1\expandafter\endcsname - \expandafter{% - \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname - }% - \fi - }% - \pdftexcmds@temp{strcmp}% - \pdftexcmds@temp{escapehex}% - \let\pdf@escapehexnative\pdf@escapehex - \pdftexcmds@temp{unescapehex}% - \let\pdf@unescapehexnative\pdf@unescapehex - \pdftexcmds@temp{escapestring}% - \pdftexcmds@temp{escapename}% - \pdftexcmds@temp{filesize}% - \pdftexcmds@temp{filemoddate}% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdfshellescape\endcsname\relax - \pdftexcmds@nopdftex - \ltx@IfUndefined{pdftexversion}{% - }{% - \ifnum\pdftexversion>120 % 1.21a supports \ifeof18 - \ifeof18 % - \chardef\pdf@shellescape=0 % - \else - \chardef\pdf@shellescape=1 % - \fi - \fi - }% - \else - \def\pdf@shellescape{% - \pdfshellescape - }% - \fi - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdffiledump\endcsname\relax - \pdftexcmds@nopdftex - \else - \def\pdf@filedump#1#2#3{% - \pdffiledump offset#1 length#2{#3}% - }% - \fi -% \end{macrocode} -% \begin{macrocode} - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdfmdfivesum\endcsname\relax - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname mdfivesum\endcsname\relax - \pdftexcmds@nopdftex - \else - \def\pdf@mdfivesum#{\mdfivesum}% - \let\pdf@mdfivesumnative\pdf@mdfivesum - \def\pdf@filemdfivesum#{\mdfivesum file}% - \fi - \else - \def\pdf@mdfivesum#{\pdfmdfivesum}% - \let\pdf@mdfivesumnative\pdf@mdfivesum - \def\pdf@filemdfivesum#{\pdfmdfivesum file}% - \fi -% \end{macrocode} -% \begin{macrocode} - \def\pdf@system#{% - \immediate\write18% - }% - \def\pdftexcmds@temp#1{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname - \expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname\relax - \pdftexcmds@nopdftex - \else - \expandafter\let\csname pdf@#1\expandafter\endcsname - \csname\expandafter\ifx\csname pdf#1\endcsname\relax\else pdf\fi#1\endcsname - \fi - }% - \pdftexcmds@temp{resettimer}% - \pdftexcmds@temp{elapsedtime}% -\fi -% \end{macrocode} -% -% \subsection{\cs{pdf@primitive}, \cs{pdf@ifprimitive}} -% -% Since version 1.40.0 \hologo{pdfTeX} has \cs{pdfprimitive} and -% \cs{ifpdfprimitive}. And \cs{pdfprimitive} was fixed in -% version 1.40.4. -% -% \hologo{XeTeX} provides them under the name \cs{primitive} and -% \cs{ifprimitive}. \hologo{LuaTeX} knows both name variants, -% but they have possibly to be enabled first (|tex.enableprimitives|). -% -% Depending on the format TeX Live uses a prefix |luatex|. -% -% Caution: \cs{let} must be used for the definition of -% the macros, especially because of \cs{ifpdfprimitive}. -% -% \subsubsection{Using \hologo{LuaTeX}'s \texttt{tex.enableprimitives}} -% -% \begin{macrocode} -\ifluatex -% \end{macrocode} -% \begin{macro}{\pdftexcmds@directlua} -% \begin{macrocode} - \ifnum\luatexversion<36 % - \def\pdftexcmds@directlua{\directlua0 }% - \else - \let\pdftexcmds@directlua\directlua - \fi -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} - \begingroup - \newlinechar=10 % - \endlinechar=\newlinechar - \pdftexcmds@directlua{% - if tex.enableprimitives then - tex.enableprimitives( - 'pdf@', - {'primitive', 'ifprimitive', 'pdfdraftmode','draftmode'} - ) - tex.enableprimitives('', {'luaescapestring'}) - end - }% - \endgroup % -% \end{macrocode} -% -% \begin{macrocode} -\fi -% \end{macrocode} -% -% \subsubsection{Trying various names to find the primitives} -% -% \begin{macro}{\pdftexcmds@strip@prefix} -% \begin{macrocode} -\def\pdftexcmds@strip@prefix#1>{} -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\def\pdftexcmds@temp#1#2#3{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdf@#1\endcsname\relax - \begingroup - \def\x{#3}% - \edef\x{\expandafter\pdftexcmds@strip@prefix\meaning\x}% - \escapechar=-1 % - \edef\y{\expandafter\meaning\csname#2\endcsname}% - \expandafter\endgroup - \ifx\x\y - \expandafter\let\csname pdf@#1\expandafter\endcsname - \csname #2\endcsname - \fi - \fi -} -% \end{macrocode} -% -% \begin{macro}{\pdf@primitive} -% \begin{macrocode} -\pdftexcmds@temp{primitive}{pdfprimitive}{pdfprimitive}% pdfTeX, oldLuaTeX -\pdftexcmds@temp{primitive}{primitive}{primitive}% XeTeX, luatex -\pdftexcmds@temp{primitive}{luatexprimitive}{pdfprimitive}% oldLuaTeX -\pdftexcmds@temp{primitive}{luatexpdfprimitive}{pdfprimitive}% oldLuaTeX -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@ifprimitive} -% \begin{macrocode} -\pdftexcmds@temp{ifprimitive}{ifpdfprimitive}{ifpdfprimitive}% pdfTeX, oldLuaTeX -\pdftexcmds@temp{ifprimitive}{ifprimitive}{ifprimitive}% XeTeX, luatex -\pdftexcmds@temp{ifprimitive}{luatexifprimitive}{ifpdfprimitive}% oldLuaTeX -\pdftexcmds@temp{ifprimitive}{luatexifpdfprimitive}{ifpdfprimitive}% oldLuaTeX -% \end{macrocode} -% \end{macro} -% -% Disable broken \cs{pdfprimitive}. -% \begin{macrocode} -\ifluatex\else -\begingroup - \expandafter\ifx\csname pdf@primitive\endcsname\relax - \else - \expandafter\ifx\csname pdftexversion\endcsname\relax - \else - \ifnum\pdftexversion=140 % - \expandafter\ifx\csname pdftexrevision\endcsname\relax - \else - \ifnum\pdftexrevision<4 % - \endgroup - \let\pdf@primitive\@undefined - \@PackageInfoNoLine{pdftexcmds}{% - \string\pdf@primitive\space disabled, % - because\MessageBreak - \string\pdfprimitive\space is broken until pdfTeX 1.40.4% - }% - \begingroup - \fi - \fi - \fi - \fi - \fi -\endgroup -\fi -% \end{macrocode} -% -% \subsubsection{Result} -% -% \begin{macrocode} -\begingroup - \@PackageInfoNoLine{pdftexcmds}{% - \string\pdf@primitive\space is % - \expandafter\ifx\csname pdf@primitive\endcsname\relax not \fi - available% - }% - \@PackageInfoNoLine{pdftexcmds}{% - \string\pdf@ifprimitive\space is % - \expandafter\ifx\csname pdf@ifprimitive\endcsname\relax not \fi - available% - }% -\endgroup -% \end{macrocode} -% -% \subsection{\hologo{XeTeX}} -% -% Look for primitives \cs{shellescape}, \cs{strcmp}. -% \begin{macrocode} -\def\pdftexcmds@temp#1{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdf@#1\endcsname\relax - \begingroup - \escapechar=-1 % - \edef\x{\expandafter\meaning\csname#1\endcsname}% - \def\y{#1}% - \def\z##1->{}% - \edef\y{\expandafter\z\meaning\y}% - \expandafter\endgroup - \ifx\x\y - \expandafter\def\csname pdf@#1\expandafter\endcsname - \expandafter{% - \csname#1\endcsname - }% - \fi - \fi -}% -\pdftexcmds@temp{shellescape}% -\pdftexcmds@temp{strcmp}% -% \end{macrocode} -% -% \subsection{\cs{pdf@isprimitive}} -% -% \begin{macrocode} -\def\pdf@isprimitive{% - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname pdf@strcmp\endcsname\relax - \long\def\pdf@isprimitive##1{% - \expandafter\pdftexcmds@isprimitive\expandafter{\meaning##1}% - }% - \long\def\pdftexcmds@isprimitive##1##2{% - \expandafter\pdftexcmds@@isprimitive\expandafter{\string##2}{##1}% - }% - \def\pdftexcmds@@isprimitive##1##2{% - \ifnum0\pdftexcmds@equal##1\delimiter##2\delimiter=1 % - \expandafter\ltx@firstoftwo - \else - \expandafter\ltx@secondoftwo - \fi - }% - \def\pdftexcmds@equal##1##2\delimiter##3##4\delimiter{% - \ifx##1##3% - \ifx\relax##2##4\relax - 1% - \else - \ifx\relax##2\relax - \else - \ifx\relax##4\relax - \else - \pdftexcmds@equalcont{##2}{##4}% - \fi - \fi - \fi - \fi - }% - \def\pdftexcmds@equalcont##1{% - \def\pdftexcmds@equalcont####1####2##1##1##1##1{% - ##1##1##1##1% - \pdftexcmds@equal####1\delimiter####2\delimiter - }% - }% - \expandafter\pdftexcmds@equalcont\csname fi\endcsname - \else - \long\def\pdf@isprimitive##1##2{% - \ifnum\pdf@strcmp{\meaning##1}{\string##2}=0 % - \expandafter\ltx@firstoftwo - \else - \expandafter\ltx@secondoftwo - \fi - }% - \fi -} -\ifluatex -\ifx\pdfdraftmode\@undefined - \let\pdfdraftmode\draftmode -\fi -\else - \pdf@isprimitive -\fi -% \end{macrocode} -% -% \subsection{\cs{pdf@draftmode}} -% -% -% \begin{macrocode} -\let\pdftexcmds@temp\ltx@zero % -\ltx@IfUndefined{pdfdraftmode}{% - \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode not found}% -}{% - \ifpdf - \let\pdftexcmds@temp\ltx@one - \@PackageInfoNoLine{pdftexcmds}{\ltx@backslashchar pdfdraftmode found}% - \else - \@PackageInfoNoLine{pdftexcmds}{% - \ltx@backslashchar pdfdraftmode is ignored in DVI mode% - }% - \fi -} -\ifcase\pdftexcmds@temp -% \end{macrocode} -% \begin{macro}{\pdf@draftmode} -% \begin{macrocode} - \let\pdf@draftmode\ltx@zero -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@ifdraftmode} -% \begin{macrocode} - \let\pdf@ifdraftmode\ltx@secondoftwo -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdftexcmds@setdraftmode} -% \begin{macrocode} - \def\pdftexcmds@setdraftmode#1{}% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\else -% \end{macrocode} -% \begin{macro}{\pdftexcmds@draftmode} -% \begin{macrocode} - \let\pdftexcmds@draftmode\pdfdraftmode -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@ifdraftmode} -% \begin{macrocode} - \def\pdf@ifdraftmode{% - \ifnum\pdftexcmds@draftmode=\ltx@one - \expandafter\ltx@firstoftwo - \else - \expandafter\ltx@secondoftwo - \fi - }% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@draftmode} -% \begin{macrocode} - \def\pdf@draftmode{% - \ifnum\pdftexcmds@draftmode=\ltx@one - \expandafter\ltx@one - \else - \expandafter\ltx@zero - \fi - }% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdftexcmds@setdraftmode} -% \begin{macrocode} - \def\pdftexcmds@setdraftmode#1{% - \pdftexcmds@draftmode=#1\relax - }% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\fi -% \end{macrocode} -% \begin{macro}{\pdf@setdraftmode} -% \begin{macrocode} -\def\pdf@setdraftmode#1{% - \begingroup - \count\ltx@cclv=#1\relax - \edef\x{\endgroup - \noexpand\pdftexcmds@@setdraftmode{\the\count\ltx@cclv}% - }% - \x -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdftexcmds@@setdraftmode} -% \begin{macrocode} -\def\pdftexcmds@@setdraftmode#1{% - \ifcase#1 % - \pdftexcmds@setdraftmode{#1}% - \or - \pdftexcmds@setdraftmode{#1}% - \else - \@PackageWarning{pdftexcmds}{% - \string\pdf@setdraftmode: Ignoring\MessageBreak - invalid value `#1'% - }% - \fi -} -% \end{macrocode} -% \end{macro} -% -% \subsection{Load Lua module} -% -% \begin{macrocode} -\ifluatex -\else - \expandafter\pdftexcmds@AtEnd -\fi% -% \end{macrocode} -% -% \begin{macrocode} -\pdftexcmds@directlua{% - require("pdftexcmds")% -} -\ifnum\luatexversion>37 % - \ifnum0% - \pdftexcmds@directlua{% - if status.ini_version then % - tex.write("1")% - end% - }>0 % - \everyjob\expandafter{% - \the\everyjob - \pdftexcmds@directlua{% - require("pdftexcmds")% - }% - }% - \fi -\fi -\begingroup - \def\x{2020-06-04 v0.32}% - \ltx@onelevel@sanitize\x - \edef\y{% - \pdftexcmds@directlua{% - if oberdiek.pdftexcmds.getversion then % - oberdiek.pdftexcmds.getversion()% - end% - }% - }% - \ifx\x\y - \else - \@PackageError{pdftexcmds}{% - Wrong version of lua module.\MessageBreak - Package version: \x\MessageBreak - Lua module: \y - }\@ehc - \fi -\endgroup -% \end{macrocode} -% -% \subsection{Lua functions} -% -% \subsubsection{Helper macros} -% -% \begin{macro}{\pdftexcmds@toks} -% \begin{macrocode} -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname newtoks\endcsname\relax - \toksdef\pdftexcmds@toks=0 % -\else - \csname newtoks\endcsname\pdftexcmds@toks -\fi -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\pdftexcmds@Patch} -% \begin{macrocode} -\def\pdftexcmds@Patch{0} -\ifnum\luatexversion>40 % - \ifnum\luatexversion<66 % - \def\pdftexcmds@Patch{1}% - \fi -\fi -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\ifcase\pdftexcmds@Patch - \catcode`\&=14 % -\else - \catcode`\&=9 % -% \end{macrocode} -% \begin{macro}{\pdftexcmds@PatchDecode} -% \begin{macrocode} - \def\pdftexcmds@PatchDecode#1\@nil{% - \pdftexcmds@DecodeA#1^^A^^A\@nil{}% - }% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdftexcmds@DecodeA} -% \begin{macrocode} - \def\pdftexcmds@DecodeA#1^^A^^A#2\@nil#3{% - \ifx\relax#2\relax - \ltx@ReturnAfterElseFi{% - \pdftexcmds@DecodeB#3#1^^A^^B\@nil{}% - }% - \else - \ltx@ReturnAfterFi{% - \pdftexcmds@DecodeA#2\@nil{#3#1^^@}% - }% - \fi - }% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdftexcmds@DecodeB} -% \begin{macrocode} - \def\pdftexcmds@DecodeB#1^^A^^B#2\@nil#3{% - \ifx\relax#2\relax% - \ltx@ReturnAfterElseFi{% - \ltx@zero - #3#1% - }% - \else - \ltx@ReturnAfterFi{% - \pdftexcmds@DecodeB#2\@nil{#3#1^^A}% - }% - \fi - }% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\fi -% \end{macrocode} -% -% \begin{macrocode} -\ifnum\luatexversion<36 % -\else - \catcode`\0=9 % -\fi -% \end{macrocode} -% -% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} -% -% \begin{macro}{\pdf@strcmp} -% \begin{macrocode} -\long\def\pdf@strcmp#1#2{% - \directlua0{% - oberdiek.pdftexcmds.strcmp("\luaescapestring{#1}",% - "\luaescapestring{#2}")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\pdf@isprimitive -% \end{macrocode} -% \begin{macro}{\pdf@escapehex} -% \begin{macrocode} -\long\def\pdf@escapehex#1{% - \directlua0{% - oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}", "byte")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@escapehexnative} -% \begin{macrocode} -\long\def\pdf@escapehexnative#1{% - \directlua0{% - oberdiek.pdftexcmds.escapehex("\luaescapestring{#1}")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@unescapehex} -% \begin{macrocode} -\def\pdf@unescapehex#1{% -& \romannumeral\expandafter\pdftexcmds@PatchDecode - \the\expandafter\pdftexcmds@toks - \directlua0{% - oberdiek.pdftexcmds.toks="pdftexcmds@toks"% - oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", "byte", \pdftexcmds@Patch)% - }% -& \@nil -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@unescapehexnative} -% \begin{macrocode} -\def\pdf@unescapehexnative#1{% -& \romannumeral\expandafter\pdftexcmds@PatchDecode - \the\expandafter\pdftexcmds@toks - \directlua0{% - oberdiek.pdftexcmds.toks="pdftexcmds@toks"% - oberdiek.pdftexcmds.unescapehex("\luaescapestring{#1}", \pdftexcmds@Patch)% - }% -& \@nil -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@escapestring} -% \begin{macrocode} -\long\def\pdf@escapestring#1{% - \directlua0{% - oberdiek.pdftexcmds.escapestring("\luaescapestring{#1}")% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@escapename} -% \begin{macrocode} -\long\def\pdf@escapename#1{% - \directlua0{% - oberdiek.pdftexcmds.escapename("\luaescapestring{#1}", "byte")% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@escapenamenative} -% \begin{macrocode} -\long\def\pdf@escapenamenative#1{% - \directlua0{% - oberdiek.pdftexcmds.escapename("\luaescapestring{#1}")% - }% -} -% \end{macrocode} -% \end{macro} -% -% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} -% -% \begin{macro}{\pdf@filesize} -% \begin{macrocode} -\def\pdf@filesize#1{% - \directlua0{% - oberdiek.pdftexcmds.filesize("\luaescapestring{#1}")% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@filemoddate} -% \begin{macrocode} -\def\pdf@filemoddate#1{% - \directlua0{% - oberdiek.pdftexcmds.filemoddate("\luaescapestring{#1}")% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@filedump} -% \begin{macrocode} -\def\pdf@filedump#1#2#3{% - \directlua0{% - oberdiek.pdftexcmds.filedump("\luaescapestring{\number#1}",% - "\luaescapestring{\number#2}",% - "\luaescapestring{#3}")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@mdfivesum} -% \begin{macrocode} -\long\def\pdf@mdfivesum#1{% - \directlua0{% - oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@mdfivesumnative} -% \begin{macrocode} -\long\def\pdf@mdfivesumnative#1{% - \directlua0{% - oberdiek.pdftexcmds.mdfivesum("\luaescapestring{#1}")% - }% -}% -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@filemdfivesum} -% \begin{macrocode} -\def\pdf@filemdfivesum#1{% - \directlua0{% - oberdiek.pdftexcmds.filemdfivesum("\luaescapestring{#1}")% - }% -}% -% \end{macrocode} -% \end{macro} -% -% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} -% -% \begin{macro}{\protected} -% \begin{macrocode} -\let\pdftexcmds@temp=Y% -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname protected\endcsname\relax - \pdftexcmds@directlua0{% - if tex.enableprimitives then % - tex.enableprimitives('', {'protected'})% - end% - }% -\fi -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname protected\endcsname\relax - \let\pdftexcmds@temp=N% -\fi -% \end{macrocode} -% \end{macro} -% \begin{macro}{\numexpr} -% \begin{macrocode} -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname numexpr\endcsname\relax - \pdftexcmds@directlua0{% - if tex.enableprimitives then % - tex.enableprimitives('', {'numexpr'})% - end% - }% -\fi -\begingroup\expandafter\expandafter\expandafter\endgroup -\expandafter\ifx\csname numexpr\endcsname\relax - \let\pdftexcmds@temp=N% -\fi -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\ifx\pdftexcmds@temp N% - \@PackageWarningNoLine{pdftexcmds}{% - Definitions of \ltx@backslashchar pdf@resettimer and% - \MessageBreak - \ltx@backslashchar pdf@elapsedtime are skipped, because% - \MessageBreak - e-TeX's \ltx@backslashchar protected or % - \ltx@backslashchar numexpr are missing% - }% -\else -% \end{macrocode} -% -% \begin{macro}{\pdf@resettimer} -% \begin{macrocode} - \protected\def\pdf@resettimer{% - \pdftexcmds@directlua0{% - oberdiek.pdftexcmds.resettimer()% - }% - }% -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\pdf@elapsedtime} -% \begin{macrocode} - \protected\def\pdf@elapsedtime{% - \numexpr - \pdftexcmds@directlua0{% - oberdiek.pdftexcmds.elapsedtime()% - }% - \relax - }% -% \end{macrocode} -% \end{macro} -% \begin{macrocode} -\fi -% \end{macrocode} -% -% \subsubsection{Shell escape} -% -% \begin{macro}{\pdf@shellescape} -% -% \begin{macrocode} -\ifnum\luatexversion<68 % -\else - \protected\edef\pdf@shellescape{% - \numexpr\directlua{tex.sprint(% - \number\catcodetable@string,status.shell_escape)}\relax} -\fi -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\pdf@system} -% \begin{macrocode} -\def\pdf@system#1{% - \directlua0{% - oberdiek.pdftexcmds.system("\luaescapestring{#1}")% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\pdf@lastsystemstatus} -% \begin{macrocode} -\def\pdf@lastsystemstatus{% - \directlua0{% - oberdiek.pdftexcmds.lastsystemstatus()% - }% -} -% \end{macrocode} -% \end{macro} -% \begin{macro}{\pdf@lastsystemexit} -% \begin{macrocode} -\def\pdf@lastsystemexit{% - \directlua0{% - oberdiek.pdftexcmds.lastsystemexit()% - }% -} -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\catcode`\0=12 % -% \end{macrocode} -% -% \begin{macro}{\pdf@pipe} -% Check availability of |io.popen| first. -% \begin{macrocode} -\ifnum0% - \pdftexcmds@directlua{% - if io.popen then % - tex.write("1")% - end% - }% - =1 % - \def\pdf@pipe#1{% -& \romannumeral\expandafter\pdftexcmds@PatchDecode - \the\expandafter\pdftexcmds@toks - \pdftexcmds@directlua{% - oberdiek.pdftexcmds.toks="pdftexcmds@toks"% - oberdiek.pdftexcmds.pipe("\luaescapestring{#1}", \pdftexcmds@Patch)% - }% -& \@nil - }% -\fi -% \end{macrocode} -% \end{macro} -% -% \begin{macrocode} -\pdftexcmds@AtEnd% -% -% \end{macrocode} -% -% \subsection{Lua module} -% -% \begin{macrocode} -%<*lua> -% \end{macrocode} -% -% \begin{macrocode} -oberdiek = oberdiek or {} -local pdftexcmds = oberdiek.pdftexcmds or {} -oberdiek.pdftexcmds = pdftexcmds -local systemexitstatus -function pdftexcmds.getversion() - tex.write("2020-06-04 v0.32") -end -% \end{macrocode} -% -% \subsubsection[Strings]{Strings \cite[``7.15 Strings'']{pdftex-manual}} -% -% \begin{macrocode} -function pdftexcmds.strcmp(A, B) - if A == B then - tex.write("0") - elseif A < B then - tex.write("-1") - else - tex.write("1") - end -end -local function utf8_to_byte(str) - local i = 0 - local n = string.len(str) - local t = {} - while i < n do - i = i + 1 - local a = string.byte(str, i) - if a < 128 then - table.insert(t, string.char(a)) - else - if a >= 192 and i < n then - i = i + 1 - local b = string.byte(str, i) - if b < 128 or b >= 192 then - i = i - 1 - elseif a == 194 then - table.insert(t, string.char(b)) - elseif a == 195 then - table.insert(t, string.char(b + 64)) - end - end - end - end - return table.concat(t) -end -function pdftexcmds.escapehex(str, mode) - if mode == "byte" then - str = utf8_to_byte(str) - end - tex.write((string.gsub(str, ".", - function (ch) - return string.format("%02X", string.byte(ch)) - end - ))) -end -% \end{macrocode} -% See procedure |unescapehex| in file \xfile{utils.c} of \hologo{pdfTeX}. -% Caution: |tex.write| ignores leading spaces. -% \begin{macrocode} -function pdftexcmds.unescapehex(str, mode, patch) - local a = 0 - local first = true - local result = {} - for i = 1, string.len(str), 1 do - local ch = string.byte(str, i) - if ch >= 48 and ch <= 57 then - ch = ch - 48 - elseif ch >= 65 and ch <= 70 then - ch = ch - 55 - elseif ch >= 97 and ch <= 102 then - ch = ch - 87 - else - ch = nil - end - if ch then - if first then - a = ch * 16 - first = false - else - table.insert(result, a + ch) - first = true - end - end - end - if not first then - table.insert(result, a) - end - if patch == 1 then - local temp = {} - for i, a in ipairs(result) do - if a == 0 then - table.insert(temp, 1) - table.insert(temp, 1) - else - if a == 1 then - table.insert(temp, 1) - table.insert(temp, 2) - else - table.insert(temp, a) - end - end - end - result = temp - end - if mode == "byte" then - local utf8 = {} - for i, a in ipairs(result) do - if a < 128 then - table.insert(utf8, a) - else - if a < 192 then - table.insert(utf8, 194) - a = a - 128 - else - table.insert(utf8, 195) - a = a - 192 - end - table.insert(utf8, a + 128) - end - end - result = utf8 - end -% \end{macrocode} -% this next line added for current luatex; this is the only -% change in the file. eroux, 28apr13. (v 0.21) -% \begin{macrocode} - local unpack = _G["unpack"] or table.unpack - tex.settoks(pdftexcmds.toks, string.char(unpack(result))) -end -% \end{macrocode} -% See procedure |escapestring| in file \xfile{utils.c} of \hologo{pdfTeX}. -% \begin{macrocode} -function pdftexcmds.escapestring(str, mode) - if mode == "byte" then - str = utf8_to_byte(str) - end - tex.write((string.gsub(str, ".", - function (ch) - local b = string.byte(ch) - if b < 33 or b > 126 then - return string.format("\\%.3o", b) - end - if b == 40 or b == 41 or b == 92 then - return "\\" .. ch - end -% \end{macrocode} -% Lua 5.1 returns the match in case of return value |nil|. -% \begin{macrocode} - return nil - end - ))) -end -% \end{macrocode} -% See procedure |escapename| in file \xfile{utils.c} of \hologo{pdfTeX}. -% \begin{macrocode} -function pdftexcmds.escapename(str, mode) - if mode == "byte" then - str = utf8_to_byte(str) - end - tex.write((string.gsub(str, ".", - function (ch) - local b = string.byte(ch) - if b == 0 then -% \end{macrocode} -% In Lua 5.0 |nil| could be used for the empty string, -% But |nil| returns the match in Lua 5.1, thus we use -% the empty string explicitly. -% \begin{macrocode} - return "" - end - if b <= 32 or b >= 127 - or b == 35 or b == 37 or b == 40 or b == 41 - or b == 47 or b == 60 or b == 62 or b == 91 - or b == 93 or b == 123 or b == 125 then - return string.format("#%.2X", b) - else -% \end{macrocode} -% Lua 5.1 returns the match in case of return value |nil|. -% \begin{macrocode} - return nil - end - end - ))) -end -% \end{macrocode} -% -% \subsubsection[Files]{Files \cite[``7.18 Files'']{pdftex-manual}} -% -% \begin{macrocode} -function pdftexcmds.filesize(filename) - local foundfile = kpse.find_file(filename, "tex", true) - if foundfile then - local size = lfs.attributes(foundfile, "size") - if size then - tex.write(size) - end - end -end -% \end{macrocode} -% See procedure |makepdftime| in file \xfile{utils.c} of \hologo{pdfTeX}. -% \begin{macrocode} -function pdftexcmds.filemoddate(filename) - local foundfile = kpse.find_file(filename, "tex", true) - if foundfile then - local date = lfs.attributes(foundfile, "modification") - if date then - local d = os.date("*t", date) - if d.sec >= 60 then - d.sec = 59 - end - local u = os.date("!*t", date) - local off = 60 * (d.hour - u.hour) + d.min - u.min - if d.year ~= u.year then - if d.year > u.year then - off = off + 1440 - else - off = off - 1440 - end - elseif d.yday ~= u.yday then - if d.yday > u.yday then - off = off + 1440 - else - off = off - 1440 - end - end - local timezone - if off == 0 then - timezone = "Z" - else - local hours = math.floor(off / 60) - local mins = math.abs(off - hours * 60) - timezone = string.format("%+03d'%02d'", hours, mins) - end - tex.write(string.format("D:%04d%02d%02d%02d%02d%02d%s", - d.year, d.month, d.day, d.hour, d.min, d.sec, timezone)) - end - end -end -function pdftexcmds.filedump(offset, length, filename) - length = tonumber(length) - if length and length > 0 then - local foundfile = kpse.find_file(filename, "tex", true) - if foundfile then - offset = tonumber(offset) - if not offset then - offset = 0 - end - local filehandle = io.open(foundfile, "rb") - if filehandle then - if offset > 0 then - filehandle:seek("set", offset) - end - local dump = filehandle:read(length) - pdftexcmds.escapehex(dump) - filehandle:close() - end - end - end -end -function pdftexcmds.mdfivesum(str, mode) - if mode == "byte" then - str = utf8_to_byte(str) - end - pdftexcmds.escapehex(md5.sum(str)) -end -function pdftexcmds.filemdfivesum(filename) - local foundfile = kpse.find_file(filename, "tex", true) - if foundfile then - local filehandle = io.open(foundfile, "rb") - if filehandle then - local contents = filehandle:read("*a") - pdftexcmds.escapehex(md5.sum(contents)) - filehandle:close() - end - end -end -% \end{macrocode} -% -% \subsubsection[Timekeeping]{Timekeeping \cite[``7.17 Timekeeping'']{pdftex-manual}} -% -% The functions for timekeeping are based on -% Andy Thomas' work \cite{AndyThomas:Analog}. -% Changes: -% \begin{itemize} -% \item Overflow check is added. -% \item |string.format| is used to avoid exponential number -% representation for sure. -% \item |tex.write| is used instead of |tex.print| to get -% tokens with catcode 12 and without appended \cs{endlinechar}. -% \end{itemize} -% \begin{macrocode} -local basetime = 0 -function pdftexcmds.resettimer() - basetime = os.clock() -end -function pdftexcmds.elapsedtime() - local val = (os.clock() - basetime) * 65536 + .5 - if val > 2147483647 then - val = 2147483647 - end - tex.write(string.format("%d", math.floor(val))) -end -% \end{macrocode} -% -% \subsubsection[Miscellaneous]{Miscellaneous \cite[``7.21 Miscellaneous'']{pdftex-manual}} -% -% \begin{macrocode} -function pdftexcmds.shellescape() - if os.execute then - if status - and status.luatex_version - and status.luatex_version >= 68 then - tex.write(os.execute()) - else - local result = os.execute() - if result == 0 then - tex.write("0") - else - if result == nil then - tex.write("0") - else - tex.write("1") - end - end - end - else - tex.write("0") - end -end -function pdftexcmds.system(cmdline) - systemexitstatus = nil - texio.write_nl("log", "system(" .. cmdline .. ") ") - if os.execute then - texio.write("log", "executed.") - systemexitstatus = os.execute(cmdline) - else - texio.write("log", "disabled.") - end -end -function pdftexcmds.lastsystemstatus() - local result = tonumber(systemexitstatus) - if result then - local x = math.floor(result / 256) - tex.write(result - 256 * math.floor(result / 256)) - end -end -function pdftexcmds.lastsystemexit() - local result = tonumber(systemexitstatus) - if result then - tex.write(math.floor(result / 256)) - end -end -function pdftexcmds.pipe(cmdline, patch) - local result - systemexitstatus = nil - texio.write_nl("log", "pipe(" .. cmdline ..") ") - if io.popen then - texio.write("log", "executed.") - local handle = io.popen(cmdline, "r") - if handle then - result = handle:read("*a") - handle:close() - end - else - texio.write("log", "disabled.") - end - if result then - if patch == 1 then - local temp = {} - for i, a in ipairs(result) do - if a == 0 then - table.insert(temp, 1) - table.insert(temp, 1) - else - if a == 1 then - table.insert(temp, 1) - table.insert(temp, 2) - else - table.insert(temp, a) - end - end - end - result = temp - end - tex.settoks(pdftexcmds.toks, result) - else - tex.settoks(pdftexcmds.toks, "") - end -end -% \end{macrocode} -% \begin{macrocode} -% -% \end{macrocode} -%% \section{Installation} -% -% \subsection{Download} -% -% \paragraph{Package.} This package is available on -% CTAN\footnote{\CTANpkg{pdftexcmds}}: -% \begin{description} -% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.dtx}] The source file. -% \item[\CTAN{macros/latex/contrib/pdftexcmds/pdftexcmds.pdf}] Documentation. -% \end{description} -% -% -% \paragraph{Bundle.} All the packages of the bundle `pdftexcmds' -% are also available in a TDS compliant ZIP archive. There -% the packages are already unpacked and the documentation files -% are generated. The files and directories obey the TDS standard. -% \begin{description} -% \item[\CTANinstall{install/macros/latex/contrib/pdftexcmds.tds.zip}] -% \end{description} -% \emph{TDS} refers to the standard ``A Directory Structure -% for \TeX\ Files'' (\CTANpkg{tds}). Directories -% with \xfile{texmf} in their name are usually organized this way. -% -% \subsection{Bundle installation} -% -% \paragraph{Unpacking.} Unpack the \xfile{pdftexcmds.tds.zip} in the -% TDS tree (also known as \xfile{texmf} tree) of your choice. -% Example (linux): -% \begin{quote} -% |unzip pdftexcmds.tds.zip -d ~/texmf| -% \end{quote} -% -% \paragraph{Script installation.} -% Check the directory \xfile{TDS:scripts/pdftexcmds/} for -% scripts that need further installation steps. -% -% \subsection{Package installation} -% -% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting -% \docstrip\ archive. The files are extracted by running the -% \xfile{.dtx} through \plainTeX: -% \begin{quote} -% \verb|tex pdftexcmds.dtx| -% \end{quote} -% -% \paragraph{TDS.} Now the different files must be moved into -% the different directories in your installation TDS tree -% (also known as \xfile{texmf} tree): -% \begin{quote} -% \def\t{^^A -% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}} -% pdftexcmds.sty & tex/generic/pdftexcmds/pdftexcmds.sty\\ -% pdftexcmds.lua & scripts/pdftexcmds/pdftexcmds.lua\\ -% pdftexcmds.pdf & doc/latex/pdftexcmds/pdftexcmds.pdf\\ -% pdftexcmds.dtx & source/latex/pdftexcmds/pdftexcmds.dtx\\ -% \end{tabular}^^A -% }^^A -% \sbox0{\t}^^A -% \ifdim\wd0>\linewidth -% \begingroup -% \advance\linewidth by\leftmargin -% \advance\linewidth by\rightmargin -% \edef\x{\endgroup -% \def\noexpand\lw{\the\linewidth}^^A -% }\x -% \def\lwbox{^^A -% \leavevmode -% \hbox to \linewidth{^^A -% \kern-\leftmargin\relax -% \hss -% \usebox0 -% \hss -% \kern-\rightmargin\relax -% }^^A -% }^^A -% \ifdim\wd0>\lw -% \sbox0{\small\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\footnotesize\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\scriptsize\t}^^A -% \ifdim\wd0>\linewidth -% \ifdim\wd0>\lw -% \sbox0{\tiny\t}^^A -% \ifdim\wd0>\linewidth -% \lwbox -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \else -% \lwbox -% \fi -% \else -% \usebox0 -% \fi -% \end{quote} -% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's -% TDS installing feature, then some files can already be in the right -% place, see the documentation of \docstrip. -% -% \subsection{Refresh file name databases} -% -% If your \TeX~distribution -% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh -% these. For example, \TeX\,Live\ users run \verb|texhash| or -% \verb|mktexlsr|. -% -% \subsection{Some details for the interested} -% -% \paragraph{Unpacking with \LaTeX.} -% The \xfile{.dtx} chooses its action depending on the format: -% \begin{description} -% \item[\plainTeX:] Run \docstrip\ and extract the files. -% \item[\LaTeX:] Generate the documentation. -% \end{description} -% If you insist on using \LaTeX\ for \docstrip\ (really, -% \docstrip\ does not need \LaTeX), then inform the autodetect routine -% about your intention: -% \begin{quote} -% \verb|latex \let\install=y\input{pdftexcmds.dtx}| -% \end{quote} -% Do not forget to quote the argument according to the demands -% of your shell. -% -% \paragraph{Generating the documentation.} -% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate -% the documentation. The process can be configured by the -% configuration file \xfile{ltxdoc.cfg}. For instance, put this -% line into this file, if you want to have A4 as paper format: -% \begin{quote} -% \verb|\PassOptionsToClass{a4paper}{article}| -% \end{quote} -% An example follows how to generate the -% documentation with pdf\LaTeX: -% \begin{quote} -%\begin{verbatim} -%pdflatex pdftexcmds.dtx -%bibtex pdftexcmds.aux -%makeindex -s gind.ist pdftexcmds.idx -%pdflatex pdftexcmds.dtx -%makeindex -s gind.ist pdftexcmds.idx -%pdflatex pdftexcmds.dtx -%\end{verbatim} -% \end{quote} -% -% \printbibliography[ -% heading=bibnumbered, -% ] -% -% \begin{History} -% \begin{Version}{2007/11/11 v0.1} -% \item -% First version. -% \end{Version} -% \begin{Version}{2007/11/12 v0.2} -% \item -% Short description fixed. -% \end{Version} -% \begin{Version}{2007/12/12 v0.3} -% \item -% Organization of Lua code as module. -% \end{Version} -% \begin{Version}{2009/04/10 v0.4} -% \item -% Adaptation for syntax change of \cs{directlua} in -% \hologo{LuaTeX} 0.36. -% \end{Version} -% \begin{Version}{2009/09/22 v0.5} -% \item -% \cs{pdf@primitive}, \cs{pdf@ifprimitive} added. -% \item -% \hologo{XeTeX}'s variants are detected for -% \cs{pdf@shellescape}, \cs{pdf@strcmp}, \cs{pdf@primitive}, -% \cs{pdf@ifprimitive}. -% \end{Version} -% \begin{Version}{2009/09/23 v0.6} -% \item -% Macro \cs{pdf@isprimitive} added. -% \end{Version} -% \begin{Version}{2009/12/12 v0.7} -% \item -% Short info shortened. -% \end{Version} -% \begin{Version}{2010/03/01 v0.8} -% \item -% Required date for package \xpackage{ifluatex} updated. -% \end{Version} -% \begin{Version}{2010/04/01 v0.9} -% \item -% Use \cs{ifeof18} for defining \cs{pdf@shellescape} between -% \hologo{pdfTeX} 1.21a (inclusive) and 1.30.0 (exclusive). -% \end{Version} -% \begin{Version}{2010/11/04 v0.10} -% \item -% \cs{pdf@draftmode}, \cs{pdf@ifdraftmode} and -% \cs{pdf@setdraftmode} added. -% \end{Version} -% \begin{Version}{2010/11/11 v0.11} -% \item -% Missing \cs{RequirePackage} for package \xpackage{ifpdf} added. -% \end{Version} -% \begin{Version}{2011/01/30 v0.12} -% \item -% Already loaded package files are not input in \hologo{plainTeX}. -% \end{Version} -% \begin{Version}{2011/03/04 v0.13} -% \item -% Improved Lua function \texttt{shellescape} that also -% uses the result of \texttt{os.execute()} (thanks to Philipp Stephani). -% \end{Version} -% \begin{Version}{2011/04/10 v0.14} -% \item -% Version check of loaded module added. -% \item -% Patch for bug in \hologo{LuaTeX} between 0.40.6 and 0.65 that -% is fixed in revision 4096. -% \end{Version} -% \begin{Version}{2011/04/16 v0.15} -% \item -% \hologo{LuaTeX}: \cs{pdf@shellescape} is only supported -% for version 0.70.0 and higher due to a bug, \texttt{os.execute()} -% crashes in some circumstances. Fixed in \hologo{LuaTeX} -% beta-0.70.0, revision 4167. -% \end{Version} -% \begin{Version}{2011/04/22 v0.16} -% \item -% Previous fix was not working due to a wrong catcode of digit -% zero (due to easily support the old \cs{directlua0}). -% The version border is lowered to 0.68, because some -% beta-0.67.0 seems also to work. -% \end{Version} -% \begin{Version}{2011/06/29 v0.17} -% \item -% Documentation addition to \cs{pdf@shellescape}. -% \end{Version} -% \begin{Version}{2011/07/01 v0.18} -% \item -% Add Lua module loading in \cs{everyjob} for \hologo{iniTeX} -% (\hologo{LuaTeX} only). -% \end{Version} -% \begin{Version}{2011/07/28 v0.19} -% \item -% Missing space in an info message added (Martin M\"unch). -% \end{Version} -% \begin{Version}{2011/11/29 v0.20} -% \item -% \cs{pdf@resettimer} and \cs{pdf@elapsedtime} added -% (thanks Andy Thomas). -% \end{Version} -% \begin{Version}{2016/05/10 v0.21} -% \item -% local unpack added -% (thanks \'{E}lie Roux). -% \end{Version} -% \begin{Version}{2016/05/21 v0.22} -% \item -% adjust \cs{textbackslas}h usage in bib file for biber bug. -% \end{Version} -% \begin{Version}{2016/10/02 v0.23} -% \item -% add file.close to lua filehandles (github pull request). -% \end{Version} -% \begin{Version}{2017/01/29 v0.24} -% \item -% Avoid loading luatex-loader for current luatex. (Use -% pdftexcmds.lua not oberdiek.pdftexcmds.lua to simplify file -% search with standard require) -% \end{Version} -% \begin{Version}{2017/03/19 v0.25} -% \item -% New \cs{pdf@shellescape} for Lua\TeX, see github issue 20. -% \end{Version} -% \begin{Version}{2018/01/21 v0.26} -% \item -% use rb not r mode for file open github issue 34. -% \end{Version} -% \begin{Version}{2018/01/30 v0.27} -% \item -% \cs{pdf@mdfivesum} for \hologo{XeTeX} -% \end{Version} -% \begin{Version}{2018/09/07 v0.28} -% \item -% Fix catcode regime in luatex sprint for \cs{pdf@shellescape} GH issue 45 -% \end{Version} -% \begin{Version}{2018/09/10 v0.29} -% \item -% Actually do the fix described above in the code, not just document it. -% \end{Version} -% \begin{Version}{2019/07/25 v0.30} -% \item -% Remove uses of module function, see PR70 -% \end{Version} -% \begin{Version}{2019/11/24 v0.31} -% \item -% Use \xpackage{iftex} directly rather than \xpackage{ifluatex} and \xpackage{ifpdf} wrappers. -% \item detect \verb|\filmoddate| and other \hologo{XeTeX} commands. -% \item Adjust \cs{pdf@escapestring} in \hologo{LuaTeX} to produce -% the same as in \hologo{pdfTeX} in the 8bit -% range and not drop all non ascii characters. -% \end{Version} -% \begin{Version}{2020-06-04 v0.32} -% \item Updated pdftexcmds.elapsedtime to lua 5.3 (issue 4). -% \end{Version} -% \end{History} -% -% \PrintIndex -% -% \Finale -\endinput -- cgit v1.2.3