diff options
Diffstat (limited to 'Master/texmf-dist/source')
82 files changed, 983 insertions, 462 deletions
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx index 5fa12ee7915..1bb701c02ee 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3benchmark/l3benchmark.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -128,7 +128,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3benchmark}{2019-03-05}{} +\ProvidesExplPackage{l3benchmark}{2019-05-03}{} {L3 Experimental benchmarking} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx index adff2c4ead3..70952138e5e 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3cctab/l3cctab.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -150,7 +150,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3cctab}{2019-03-05}{} +\ProvidesExplPackage{l3cctab}{2019-05-03}{} {L3 Experimental category code tables} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx index 3f4e1c3f1a7..92ca58363a2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3color/l3color.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -265,7 +265,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3color}{2019-03-05}{} +\ProvidesExplPackage{l3color}{2019-05-03}{} {L3 Experimental color support} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx index 7f23d1f4ab4..0859e7a2f9d 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-boxes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx index c59359fd02e..7d5ae3948d6 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-layers.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx index 3cded354fe2..874d1910d09 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-paths.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -880,7 +880,7 @@ { \bool_set_true:c { l_@@_path_use_ ##1 _ bool } } { \cs_if_exist_use:cF { @@_path_use_action_ ##1 : } - { \ERROR } + { \msg_error:nnn { draw } { invalid-path-action } {##1} } } } \@@_softpath_round_corners: @@ -888,11 +888,15 @@ { \l_draw_bb_update_bool } { \l_@@_path_use_stroke_bool } { \@@_path_use_stroke_bb: } - \bool_if:NTF \l_@@_path_use_clear_bool - { \@@_softpath_use_clear: } - { \@@_softpath_use: } + \@@_softpath_use: \bool_if:NT \l_@@_path_use_clip_bool - { \driver_draw_clip: } + { + \driver_draw_clip: + \bool_lazy_or:nnF + { \l_@@_path_use_fill_bool } + { \l_@@_path_use_stroke_bool } + { \driver_draw_discardpath: } + } \bool_lazy_or:nnT { \l_@@_path_use_fill_bool } { \l_@@_path_use_stroke_bool } @@ -905,6 +909,8 @@ : } } + \bool_if:NT \l_@@_path_use_clear_bool + { \@@_softpath_clear: } } \cs_new_protected:Npn \@@_path_use_action_draw: { @@ -1016,6 +1022,12 @@ % \end{macrocode} % \end{macro} % +% \begin{macrocode} +\msg_new:nnnn { draw } { invalid-path-action } + { Invalid~action~'#1'~for~path. } + { Paths~can~be~used~with~actions~'draw',~'clip',~'fill'~or~'stroke'. } +% \end{macrocode} +% % \begin{macrocode} %</initex|package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx index f8d729ca030..bda4d40370a 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-points.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx index 5f28fc920d9..d360a1ccba5 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-scopes.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx index ef5f38d68c8..13d77d0fdc9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-softpath.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -105,7 +105,7 @@ % \end{macro} % % \begin{macro} -% {\@@_softpath_use:, \@@_softpath_clear:, \@@_softpath_use_clear:} +% {\@@_softpath_use:, \@@_softpath_clear:} % Using and clearing is trivial. % \begin{macrocode} \cs_new_protected:Npn \@@_softpath_use: @@ -118,11 +118,6 @@ \tl_build_gclear:N \g_@@_softpath_main_tl \bool_gset_false:N \g_@@_softpath_corners_bool } -\cs_new_protected:Npn \@@_softpath_use_clear: - { - \@@_softpath_use: - \@@_softpath_clear: - } % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx index 0e51979e19c..2cf0bf5d500 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-state.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx index 226d626030e..e8393ec9ee2 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw-transforms.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx index 73ed6390dcd..b4a3ed383bd 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3draw/l3draw.dtx @@ -27,7 +27,6 @@ %</driver|package> %<*driver> \documentclass[full]{l3doc} -\usepackage[utf8]{inputenc} \usepackage{l3draw} % For creating code demonstrations % This needs access to some code-level interfaces in listings @@ -111,7 +110,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -609,13 +608,16 @@ % Inserts the current path, carrying out one ore more possible \meta{actions} % (a comma list): % \begin{itemize} -% \item \texttt{clear} Resets the path to empty -% \item \texttt{clip} Clips any content outside of the path -% \item \texttt{draw} +% \item \texttt{stroke} Draws a line along the current path +% \item \texttt{draw} A synonym for \texttt{stroke} % \item \texttt{fill} Fills the interior of the path with the current % file color -% \item \texttt{stroke} Draws a line along the current path +% \item \texttt{clip} Clips any content outside of the path % \end{itemize} +% Actions are applied in the order given irrespective of the input order. +% Note that whilst it is possible to use a path without clearing it, the +% normal use case would be to clear the path (this resets data structures +% at the macro level). % \end{function} % % \subsubsection{Path operations on drawing axes} @@ -1143,7 +1145,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3draw}{2019-03-05}{} +\ProvidesExplPackage{l3draw}{2019-05-03}{} {L3 Experimental core drawing support} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx index 240db74607d..33c7b8fa7a5 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-convert.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -234,7 +234,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3str-convert}{2019-03-05}{} +\ProvidesExplPackage{l3str-convert}{2019-05-03}{} {L3 Experimental string encoding conversions} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx index a6a7646cd4e..afb473ccfb9 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str-format.dtx @@ -48,7 +48,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -164,7 +164,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3str-format}{2019-03-05}{} +\ProvidesExplPackage{l3str-format}{2019-05-03}{} {L3 Experimental string formatting} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx index 9cedffc79a9..173abde66b4 100644 --- a/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/l3sys-shell/l3sys-shell.dtx @@ -46,7 +46,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -136,7 +136,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3sys-shell}{2019-03-05}{} +\ProvidesExplPackage{l3sys-shell}{2019-05-03}{} {L3 Experimental system shell functions} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx index f38466a5d51..803b8188769 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx @@ -56,7 +56,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -675,7 +675,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xcoffins}{2019-03-05}{} +\ProvidesExplPackage{xcoffins}{2019-05-03}{} {L3 Experimental design level coffins} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx index 7e5f9c806b6..04ec76c9270 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx @@ -61,7 +61,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -687,7 +687,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{l3galley}{2019-03-05}{} +\ProvidesExplPackage{l3galley}{2019-05-03}{} {L3 Experimental galley code} %</package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx index 21c9700de59..556a51a9511 100644 --- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx +++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx @@ -47,7 +47,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -734,7 +734,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xgalley}{2019-03-05}{} +\ProvidesExplPackage{xgalley}{2019-05-03}{} {L3 Experimental galley} \RequirePackage{xparse,xtemplate,l3galley} % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx index 09996096f79..ea95adf4ba1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/expl3.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/expl3.dtx @@ -23,7 +23,7 @@ % for those people who are interested. % %<*driver|generic|package> -\def\ExplFileDate{2019-04-21}% +\def\ExplFileDate{2019-05-03}% %</driver|generic|package> %<*driver> \documentclass[full]{l3doc} @@ -51,7 +51,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -1025,9 +1025,10 @@ % \item Johannes Braams % \item David Carlisle % \item Robin Fairbairns +% \item Ulrike Fischer +% \item Enrico Gregorio % \item Morten H{\o}gholm % \item Bruno Le Floch -% \item Thomas Lotze % \item Frank Mittelbach % \item Will Robertson % \item Chris Rowley @@ -1039,6 +1040,7 @@ % \item Michael Downes % \item Denys Duchier % \item Alan Jeffrey +% \item Thomas Lotze % \item Martin Schr{\"o}der % \end{itemize} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3.ins b/Master/texmf-dist/source/latex/l3kernel/l3.ins index 2451257ac01..ed2d726b1fb 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3.ins +++ b/Master/texmf-dist/source/latex/l3kernel/l3.ins @@ -104,6 +104,7 @@ and all files in that bundle must be distributed together. \from{l3luatex.dtx} {package,tex} \from{l3unicode.dtx} {package} \from{l3candidates.dtx} {package} + \from{l3legacy.dtx} {package} \from{l3deprecation.dtx}{package} } } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx index f47082f4cf9..c4f03c70e33 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3alloc.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx index b78dbe8c6fd..61eb639ae27 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -914,6 +914,9 @@ % abc { def } % \end{verbatim} % \emph{i.e.} only the outer braces are removed. +% \begin{texnote} +% The \cs{use:n} function is equivalent to \LaTeXe{}'s \tn{@firstofone}. +% \end{texnote} % \end{function} % % \begin{function}[EXP]{\use_i:nn, \use_ii:nn} @@ -929,6 +932,10 @@ % of these tokens is also fixed (if it has not already been by % some other absorption). A single expansion is needed for the % functions to take effect. +% \begin{texnote} +% These are equivalent to \LaTeXe{}'s \tn{@firstoftwo} and +% \tn{@secondoftwo}. +% \end{texnote} % \end{function} % % \begin{function}[EXP]{\use_i:nnn, \use_ii:nnn, \use_iii:nnn} @@ -1003,6 +1010,10 @@ % These functions work after a single expansion. One or more of the % \texttt{n} arguments may be an unbraced single token % (\emph{i.e.}~an \texttt{N} argument). +% \begin{texnote} +% These are equivalent to \LaTeXe{}'s \tn{@gobble}, \tn{@gobbbletwo}, +% \emph{etc.} +% \end{texnote} % \end{function} % % \begin{function}[EXP, added = 2018-06-18]{\use:e} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index 09d82e7623a..50a93c97455 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx index e8263234e22..f5537eb1277 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx index f39ec112729..39a6dd5623a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3candidates.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -299,83 +299,6 @@ % % \section{Additions to \pkg{l3file}} % -% \begin{function}[noTF, added = 2017-07-11, updated = 2019-02-16] -% {\file_get_mdfive_hash:nN} -% \begin{syntax} -% \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{tl var} -% \end{syntax} -% Searches for \meta{file name} using the current \TeX{} search -% path and the additional paths controlled by \cs{file_path_include:n}. -% If found, sets the \meta{str var} to the MD5 sum generated from the -% content of the file. The file is read as bytes, which means that in -% contrast to most \TeX{} behaviour there will be a difference in result -% depending on the line endings used in text files. The same file will -% produce the same result between different engines: the algorithm used -% is the same in all cases. -% Where the file is not found, the \meta{str var} will be empty. -% \end{function} -% -% \begin{function}[noTF, added = 2017-07-09, updated = 2019-02-16] -% {\file_get_size:nN} -% \begin{syntax} -% \cs{file_get_size:nN} \Arg{file name} \meta{tl var} -% \end{syntax} -% Searches for \meta{file name} using the current \TeX{} search -% path and the additional paths controlled by \cs{file_path_include:n}. -% If found, sets the \meta{str var} to the size of the file in bytes. -% Where the file is not found, the \meta{str var} will be empty. -% This is not available in older versions of \XeTeX{}. -% \end{function} -% -% \begin{function}[noTF, added = 2017-07-09, updated = 2019-02-16] -% {\file_get_timestamp:nN} -% \begin{syntax} -% \cs{file_get_timestamp:nN} \Arg{file name} \meta{tl var} -% \end{syntax} -% Searches for \meta{file name} using the current \TeX{} search -% path and the additional paths controlled by \cs{file_path_include:n}. -% If found, sets the \meta{str var} to the modification timestamp of -% the file in the form |D:|\meta{year}\meta{month}\meta{day}\meta{hour}^^A -% \meta{minute}\meta{second}\meta{offset}, where the latter may be |Z| -% (UTC) or \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|. -% Where the file is not found, the \meta{str var} will be empty. -% This is not available in older versions of \XeTeX{}. -% \end{function} -% -% \begin{function}[added = 2014-07-02]{\file_if_exist_input:n, \file_if_exist_input:nF} -% \begin{syntax} -% \cs{file_if_exist_input:n} \Arg{file name} -% \cs{file_if_exist_input:nF} \Arg{file name} \Arg{false code} -% \end{syntax} -% Searches for \meta{file name} using the current \TeX{} search -% path and the additional paths controlled by -% \cs{file_path_include:n}. If found then -% reads in the file as additional \LaTeX{} source as described for -% \cs{file_input:n}, otherwise inserts the \meta{false code}. -% Note that these functions do not raise -% an error if the file is not found, in contrast to \cs{file_input:n}. -% \end{function} -% -% \begin{function}[added = 2017-07-07]{\file_input_stop:} -% \begin{syntax} -% \cs{file_input_stop:} -% \end{syntax} -% Ends the reading of a file started by \cs{file_input:n} or similar before -% the end of the file is reached. Where the file reading is being terminated -% due to an error, \cs{msg_critical:nn(nn)} should be preferred. -% \begin{texnote} -% This function must be used on a line on its own: \TeX{} reads files -% line-by-line and so any additional tokens in the \enquote{current} line -% will still be read. -% -% This is also true if the function is hidden inside another function -% (which will be the normal case), i.e., all tokens on the same line -% in the source file are still processed. Putting it on a line by itself -% in the definition doesn't help as it is the line where it is used that -% counts! -% \end{texnote} -% \end{function} -% % \begin{function}[added = 2019-01-13]{\ior_map_variable:NNn} % \begin{syntax} % \cs{ior_map_variable:NNn} \meta{stream} \meta{tl~var} \Arg{code} @@ -1324,26 +1247,6 @@ % and |#3| and |#4| empty. % \end{function} % -% \begin{function}[TF, updated = 2012-12-20]{\peek_N_type:} -% \begin{syntax} -% \cs{peek_N_type:TF} \Arg{true code} \Arg{false code} -% \end{syntax} -% Tests if the next \meta{token} in the input stream can be safely -% grabbed as an \texttt{N}-type argument. The test is \meta{false} -% if the next \meta{token} is either an explicit or implicit -% begin-group or end-group token (with any character code), or -% an explicit or implicit space character (with character code $32$ -% and category code $10$), or an outer token (never used in \LaTeX3) -% and \meta{true} in all other cases. -% Note that a \meta{true} result ensures that the next \meta{token} is -% a valid \texttt{N}-type argument. However, if the next \meta{token} -% is for instance \cs{c_space_token}, the test takes the -% \meta{false} branch, even though the next \meta{token} is in fact -% a valid \texttt{N}-type argument. The \meta{token} is left -% in the input stream after the \meta{true code} or \meta{false code} -% (as appropriate to the result of the test). -% \end{function} -% % \begin{function}[added = 2018-09-23] % { % \peek_catcode_collect_inline:Nn, @@ -1595,130 +1498,6 @@ % \end{macrocode} % \end{macro} % -% \subsection{Additions to \pkg{l3file}} -% -% \begin{macrocode} -%<@@=file> -% \end{macrocode} -% -% \begin{macro} -% {\file_get_mdfive_hash:nN, \file_get_size:nN, \file_get_timestamp:nN} -% \begin{macro}{\@@_get_details:nnN} -% These are all wrappers around the \pdfTeX{} primitives doing the same -% jobs: as we want consistent file paths to be found, they are all set up -% using \cs{file_get_full_name:nN} and so are non-expandable \texttt{get} -% functions. Much of the code is repetitive but we need to branch for -% \LuaTeX{} (emulation in Lua), for the slightly different syntax -% needed for \tn{tex_mdfivesum:D} and for the fact that primitive -% coverage varies in other engines. -% \begin{macrocode} -\cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2 - { \file_get_mdfive_hash:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } -\cs_new_protected:Npn \file_get_size:nN #1#2 - { \file_get_size:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } -\cs_new_protected:Npn \file_get_timestamp:nN #1#2 - { \file_get_timestamp:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } -\prg_new_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 { T , F , TF } - { \@@_get_details:nnN {#1} { mdfivesum } {#2} } -\prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF } - { \@@_get_details:nnN {#1} { size } {#2} } -\prg_new_protected_conditional:Npnn \file_get_timestamp:nN #1#2 { T , F , TF } - { \@@_get_details:nnN {#1} { moddate } {#2} } -\cs_new_protected:Npn \@@_get_details:nnN #1#2#3 - { - \file_get_full_name:nNTF {#1} \l_@@_full_name_tl - { - \tl_set:Nx #3 - { - \use:c { tex_file #2 :D } \exp_after:wN - { \l_@@_full_name_tl } - } - \prg_return_true: - } - { \prg_return_false: } - } -\sys_if_engine_luatex:TF - { - \cs_set_protected:Npn \@@_get_details:nnN #1#2#3 - { - \file_get_full_name:nNTF {#1} \l_@@_full_name_tl - { - \tl_set:Nx #3 - { - \lua_now:e - { - l3kernel.file#2 - ( " \lua_escape:e { \l_@@_full_name_tl } " ) - } - } - \prg_return_true: - } - { \prg_return_false: } - } - } - { - \prg_set_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 - { T , F , TF } - { - \file_get_full_name:nNTF {#1} \l_@@_full_name_tl - { - \tl_set:Nx #2 - { - \tex_mdfivesum:D file \exp_after:wN - { \l_@@_full_name_tl } - } - \prg_return_true: - } - { \prg_return_false: } - } - \cs_if_exist:NF \tex_filesize:D - { - \cs_set_protected:Npn \@@_get_details:nnN #1#2#3 - { - \tl_clear:N #3 - \__kernel_msg_error:nnx - { kernel } { primitive-not-available } - { \exp_not:c { (pdf)file #2 } } - \prg_return_false: - } - } - } -\__kernel_msg_new:nnnn { kernel } { primitive-not-available } - { Primitive~\token_to_str:N #1 not~available } - { - The~version~of~XeTeX~in~use~does~not~provide~functionality~equivalent~to~ - the~\token_to_str:N #1 primitive. - } -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% \begin{macro}{\file_if_exist_input:n, \file_if_exist_input:nF} -% Input of a file with a test for existence. We do not define the |T| -% or |TF| variants because the most useful place to place the -% \meta{true code} would be inconsistent with other conditionals. -% \begin{macrocode} -\cs_new_protected:Npn \file_if_exist_input:n #1 - { - \file_get_full_name:nNT {#1} \l_@@_full_name_tl - { \@@_input:V \l_@@_full_name_tl } - } -\cs_new_protected:Npn \file_if_exist_input:nF #1#2 - { - \file_get_full_name:nNTF {#1} \l_@@_full_name_tl - { \@@_input:V \l_@@_full_name_tl } - {#2} - } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\file_input_stop:} -% A simple rename. -% \begin{macrocode} -\cs_new_protected:Npn \file_input_stop: { \tex_endinput:D } -% \end{macrocode} -% \end{macro} -% % \subsection{Additions to \pkg{l3flag}} % % \begin{macrocode} @@ -4331,77 +4110,6 @@ %<@@=peek> % \end{macrocode} % -% \begin{macro}[TF]{\peek_N_type:} -% \begin{macro} -% {\@@_execute_branches_N_type:, \@@_N_type:w, \@@_N_type_aux:nnw} -% All tokens are \texttt{N}-type tokens, except in four cases: -% begin-group tokens, end-group tokens, space tokens with character -% code~$32$, and outer tokens. Since \cs{l_peek_token} might be -% outer, we cannot use the convenient \cs{bool_if:nTF} function, and -% must resort to the old trick of using \tn{ifodd} to expand a set of -% tests. The \texttt{false} branch of this test is taken if the token -% is one of the first three kinds of non-\texttt{N}-type tokens -% (explicit or implicit), thus we call \cs{@@_false:w}. In the -% \texttt{true} branch, we must detect outer tokens, without impacting -% performance too much for non-outer tokens. The first filter is to -% search for \texttt{outer} in the \tn{meaning} of \cs{l_peek_token}. -% If that is absent, \cs{use_none_delimit_by_q_stop:w} cleans up, and -% we call \cs{@@_true:w}. Otherwise, the token can be a non-outer -% macro or a primitive mark whose parameter or replacement text -% contains \texttt{outer}, it can be the primitive \tn{outer}, or it -% can be an outer token. Macros and marks would have \texttt{ma} in -% the part before the first occurrence of \texttt{outer}; the meaning -% of \tn{outer} has nothing after \texttt{outer}, contrarily to outer -% macros; and that covers all cases, calling \cs{@@_true:w} or -% \cs{@@_false:w} as appropriate. Here, there is no \meta{search -% token}, so we feed a dummy \cs{scan_stop:} to the -% \cs{@@_token_generic:NNTF} function. -% \begin{macrocode} -\group_begin: - \cs_set_protected:Npn \@@_tmp:w #1 \q_stop - { - \cs_new_protected:Npn \@@_execute_branches_N_type: - { - \if_int_odd:w - \if_catcode:w \exp_not:N \l_peek_token { 0 \exp_stop_f: \fi: - \if_catcode:w \exp_not:N \l_peek_token } 0 \exp_stop_f: \fi: - \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi: - 1 \exp_stop_f: - \exp_after:wN \@@_N_type:w - \token_to_meaning:N \l_peek_token - \q_mark \@@_N_type_aux:nnw - #1 \q_mark \use_none_delimit_by_q_stop:w - \q_stop - \exp_after:wN \@@_true:w - \else: - \exp_after:wN \@@_false:w - \fi: - } - \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \q_mark ##3 - { ##3 {##1} {##2} } - } - \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \q_stop -\group_end: -\cs_new_protected:Npn \@@_N_type_aux:nnw #1 #2 #3 \fi: - { - \fi: - \tl_if_in:noTF {#1} { \tl_to_str:n {ma} } - { \@@_true:w } - { \tl_if_empty:nTF {#2} { \@@_true:w } { \@@_false:w } } - } -\cs_new_protected:Npn \peek_N_type:TF - { - \@@_token_generic:NNTF - \@@_execute_branches_N_type: \scan_stop: - } -\cs_new_protected:Npn \peek_N_type:T - { \@@_token_generic:NNT \@@_execute_branches_N_type: \scan_stop: } -\cs_new_protected:Npn \peek_N_type:F - { \@@_token_generic:NNF \@@_execute_branches_N_type: \scan_stop: } -% \end{macrocode} -% \end{macro} -% \end{macro} -% % \begin{variable}{\l_@@_collect_tl} % \begin{macrocode} \tl_new:N \l_@@_collect_tl diff --git a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx index d791282d867..9bee4a03f08 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3clist.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx index f17be5ff627..c894678366b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3coffins.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -78,7 +78,7 @@ % \begin{function}[added = 2011-08-17, updated = 2019-01-21] % { % \coffin_set_eq:NN, \coffin_set_eq:Nc, -% \coffin_set_eq:cN, \coffin_set_eq:cc +% \coffin_set_eq:cN, \coffin_set_eq:cc, % \coffin_gset_eq:NN, \coffin_gset_eq:Nc, % \coffin_gset_eq:cN, \coffin_gset_eq:cc % } diff --git a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx index c958a571e2f..07fd56ad92a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3color-base.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx index 08b49ce5eb0..9256691d5d4 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3deprecation.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx index 65080b66f0a..181d11b2fdf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3doc.dtx @@ -79,7 +79,7 @@ and all files in that bundle must be distributed together. % % \title{The \cls{l3doc} class} % \author{\Team} -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % \maketitle % \tableofcontents % @@ -432,7 +432,7 @@ and all files in that bundle must be distributed together. % necessary to highlight it as much and you also don't need to check it % for, say, having a test function and having a documentation chunk % earlier in a \env{function} environment. \pkg{l3doc} will pick up these -% cases form the presence of |__| in the name, or you may force marking +% cases from the presence of |__| in the name, or you may force marking % as internal by using |\begin{macro}[int]| to mark it as such. The margin % call-out is then printed in grey for such cases. % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx index a16a7db57c7..0df3d7d43b6 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3docstrip.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-basics.dtx index 382e2d735f9..efdcadba25a 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-basics.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -148,9 +148,21 @@ % % \begin{macro}{\@@_postscript_header:n} % PostScript for the header: a small saving but makes the code clearer. +% This is held until the start of shipout such that a document with no +% actual output does not write anything. % \begin{macrocode} -\cs_new_protected:Npn \@@_postscript_header:n #1 +\cs_new_protected:Npx \@@_postscript_header:n #1 +%<*initex> { \@@_literal:n { ! #1 } } +%</initex> +%<*package> + { + \cs_if_exist:NTF \AtBeginDvi + { \exp_not:N \AtBeginDvi } + { \use:n } + { \@@_literal:n { ! #1 } } + } +%</package> % \end{macrocode} % \end{macro} % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-box.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-box.dtx index f9bd0afad7c..d7b70d120b2 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-box.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-box.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-color.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-color.dtx index 0f17e011368..f3db989e459 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-color.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-color.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-draw.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-draw.dtx index 6e6be61890b..00a8dd95a94 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-draw.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-draw.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-image.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-image.dtx index ef2eea9f56d..6041b99fc84 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-image.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-image.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers-pdf.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers-pdf.dtx index a1275e4f4fc..8a5ed3e49b9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers-pdf.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers-pdf.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -60,6 +60,12 @@ %<@@=driver> % \end{macrocode} % +% Setting up PDF resources is a complex area with only limited documentation +% in the engine manuals. The following code builds heavily on existing ideas +% from \pkg{hyperref} work by Sebastian Rahtz and Heiko Oberdiek, and +% significant contributions by Alexander Grahn, in addition to the specific +% code referenced a various points. +% % \subsection{Shared code} % % A very small number of items that belong at the driver level but which @@ -76,12 +82,39 @@ % \end{macrocode} % \end{variable} % +% \begin{variable}{\l_@@_pdf_tmp_box} +% For fitting destinations. +% \begin{macrocode} +\box_new:N \l_@@_pdf_tmp_box +% \end{macrocode} +% \end{variable} +% % \subsection{\texttt{dvips} driver} % % \begin{macrocode} %<*dvips> % \end{macrocode} % +% \begin{macro}{\@@_pdfmark:n, \@@_pdfmark:x} +% Used often enough it should be a separate function. +% \begin{macrocode} +\cs_new_protected:Npn \@@_pdfmark:n #1 + { \@@_postscript:n { mark #1 ~ pdfmark } } +\cs_generate_variant:Nn \@@_pdfmark:n { x } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Catalogue entries} +% +% \begin{macro}{\driver_pdf_catalog_gput:nn, \driver_pdf_info_gput:nn} +% \begin{macrocode} +\cs_new_protected:Npn \driver_pdf_catalog_gput:nn #1#2 + { \@@_pdfmark:n { { Catalog } << /#1 ~ #2 >> /PUT } } +\cs_new_protected:Npn \driver_pdf_info_gput:nn #1#2 + { \@@_pdfmark:n { /#1 ~ #2 /DOCINFO } } +% \end{macrocode} +% \end{macro} +% % \subsubsection{Objects} % % \begin{variable}{\g_@@_pdf_object_int, \g_@@_pdf_object_prop} @@ -100,12 +133,12 @@ { \int_gincr:N \g_@@_pdf_object_int \int_const:cn - { g_@@_pdf_object_ \tl_to_str:n {#1} _int } + { c_@@_pdf_object_ \tl_to_str:n {#1} _int } { \g_@@_pdf_object_int } \prop_gput:Nnn \g_@@_pdf_object_prop {#1} {#2} } \cs_new:Npn \driver_pdf_object_ref:n #1 - { { driver.obj \int_use:c { g_@@_pdf_object_ \tl_to_str:n {#1} _int } } } + { { driver.obj \int_use:c { c_@@_pdf_object_ \tl_to_str:n {#1} _int } } } % \end{macrocode} % \end{macro} % \end{macro} @@ -123,9 +156,9 @@ % \begin{macrocode} \cs_new_protected:Npn \driver_pdf_object_write:nn #1#2 { - \@@_postscript:x + \@@_pdfmark:x { - mark /_objdef ~ \driver_pdf_object_ref:n {#1} + /_objdef ~ \driver_pdf_object_ref:n {#1} /type \str_case_e:nn { \prop_item:Nn \g_@@_pdf_object_prop {#1} } @@ -135,7 +168,7 @@ { fstream } { /stream } { stream } { /stream } } - /OBJ ~ pdfmark + /OBJ } \use:c { @@_pdf_object_write_ \prop_item:Nn \g_@@_pdf_object_prop {#1} :nn } @@ -143,18 +176,18 @@ } \cs_new_protected:Npn \@@_pdf_object_write_array:nn #1#2 { - \@@_postscript:x + \@@_pdfmark:x { - mark ~ \driver_pdf_object_ref:n {#1} - [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL ~ pdfmark + \driver_pdf_object_ref:n {#1} + [ ~ \exp_not:n {#2} ~ ] ~ /PUTINTERVAL } } \cs_new_protected:Npn \@@_pdf_object_write_dict:nn #1#2 { - \@@_postscript:x + \@@_pdfmark:x { - mark ~ \driver_pdf_object_ref:n {#1} - << \exp_not:n {#2} >> /PUT ~ pdfmark + \driver_pdf_object_ref:n {#1} + << \exp_not:n {#2} >> /PUT } } \cs_new_protected:Npn \@@_pdf_object_write_stream:nn #1#2 @@ -198,8 +231,9 @@ % \begin{macro} % { % driver.cvs , -% driver.rect.ht , -% driver.pt.dvi +% driver.dvi.pt , +% driver.pt.dvi , +% driver.rect.ht % } % Small utilities for PostScript manipulations. Conversion to DVI dimensions % is done here to allow for |Resolution|. The total height of a rectangle @@ -208,6 +242,7 @@ \@@_postscript_header:n { /driver.cvs { 65534 ~ string ~ cvs } def + /driver.dvi.pt { 72.27 ~ mul ~ Resolution ~ div } def /driver.pt.dvi { 72.27 ~ div ~ Resolution ~ mul } def /driver.rect.ht { dup ~ 1 ~ get ~ neg ~ exch ~ 3 ~ get ~ add } def } @@ -228,11 +263,15 @@ % % \begin{macro} % { -% driver.annotation.border , -% driver.annotation.ll , -% driver.annotation.ur , -% driver.link.ll , -% driver.link.ur , +% driver.rect , +% driver.save.ll , +% driver.save.ur , +% driver.save.linkll , +% driver.save.linkur , +% driver.llx , +% driver.lly , +% driver.urx , +% driver.ury % } % Functions for marking the limits of an annotation/link, plus drawing the % border. We separate links for generic annotations to support adding a @@ -240,23 +279,23 @@ % \begin{macrocode} \@@_postscript_header:n { - /driver.annotation.border + /driver.rect { /Rect [ driver.llx ~ driver.lly ~ driver.urx ~ driver.ury ] } def - /driver.annotation.ll + /driver.save.ll { currentpoint /driver.lly ~ exch ~ def /driver.llx ~ exch ~ def } def - /driver.annotation.ur + /driver.save.ur { currentpoint /driver.ury ~ exch ~ def /driver.urx ~ exch ~ def } def - /driver.link.ll + /driver.save.linkll { currentpoint ~ driver.linkmargin ~ add ~ @@ -266,7 +305,7 @@ /driver.llx ~ exch ~ def } def - /driver.link.ur + /driver.save.linkur { currentpoint ~ driver.linkmargin ~ sub ~ @@ -282,6 +321,68 @@ % % \begin{macro} % { +% driver.dest.anchor , +% driver.dest.x , +% driver.dest.y , +% driver.dest.point , +% driver.dest2device , +% driver.dev.x , +% driver.dev.y , +% driver.tmpa , +% driver.tmpb , +% driver.tmpc , +% driver.tmpd +% } +% For finding the anchor point of a destination link. We make the use case +% a separate function as it comes up a lot, and as this makes it easier to +% adjust if we need additional effects. We also need a more complex approach +% to convert a co-ordinate pair correctly when defining a rectangle: this +% can otherwise be out when using a landscape page. (Thanks to Alexander +% Grahn for the approach here.) +% \begin{macrocode} +\@@_postscript_header:n + { + /driver.dest.anchor + { + currentpoint ~ exch ~ + driver.dvi.pt ~ 72 ~ add ~ + /driver.dest.x ~ exch ~ def ~ + driver.dvi.pt ~ + vsize ~ 72 ~ sub ~ exch ~ sub ~ + /driver.dest.y ~ exch ~ def + } + def + /driver.dest.point + { driver.dest.x ~ driver.dest.y } def + /driver.dest2device + { + /driver.dest.y ~ exch ~ def + /driver.dest.x ~ exch ~ def ~ + matrix ~ currentmatrix ~ + matrix ~ defaultmatrix ~ + matrix ~ invertmatrix ~ + matrix ~ concatmatrix ~ + cvx ~ exec + /driver.dev.y ~ exch ~ def + /driver.dev.x ~ exch ~ def + /driver.tmpd ~ exch ~ def + /driver.tmpc ~ exch ~ def + /driver.tmpb ~ exch ~ def + /driver.tmpa ~ exch ~ def ~ + driver.dest.x ~ driver.tmpa ~ mul ~ + driver.dest.y ~ driver.tmpc ~ mul ~ add ~ + driver.dev.x ~ add ~ + driver.dest.x ~ driver.tmpb ~ mul ~ + driver.dest.y ~ driver.tmpd ~ mul ~ add ~ + driver.dev.y ~ add + } + def + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro} +% { % driver.bordertracking , % driver.bordertracking.begin , % driver.bordertracking.end , @@ -407,7 +508,7 @@ currentpoint ~ driver.originy ~ ne ~ exch ~ driver.originx ~ ne ~ or { - driver.link.ll + driver.save.linkll /driver.lly ~ driver.lly ~ driver.outerbox ~ 1 ~ get ~ sub ~ def ~ driver.bordertracking.begin @@ -428,7 +529,7 @@ currentpoint ~ driver.originy ~ ne ~ exch ~ driver.originx ~ ne ~ or { - driver.link.ll + driver.save.linkll /driver.lly ~ driver.lly ~ driver.outerbox ~ 1 ~ get ~ sub ~ def ~ driver.bordertracking.begin @@ -672,37 +773,36 @@ \@@_pdf_annotation:nnnn {#1} {#2} {#3} {#4} \int_gincr:N \g_@@_pdf_object_int \int_gset_eq:NN \g_@@_pdf_annotation_int \g_@@_pdf_object_int - \@@_postscript:x + \@@_pdfmark:x { - mark - /_objdef { driver.obj \int_use:N \g_@@_pdf_object_int } - driver.annotation.border ~ - #4 ~ - /ANN ~ pdfmark + + /_objdef { driver.obj \int_use:N \g_@@_pdf_object_int } + driver.rect ~ + #4 ~ + /ANN } } \cs_new_protected:Npn \@@_pdf_annotation:nnnn #1#2#3#4 { \box_move_down:nn {#3} - { \hbox:n { \@@_postscript:n { driver.annotation.ll } } } + { \hbox:n { \@@_postscript:n { driver.save.ll } } } \hbox:n {#4} \box_move_up:nn {#2} { \hbox:n { \tex_kern:D \dim_eval:n {#1} \scan_stop: - \@@_postscript:n { driver.annotation.ur } + \@@_postscript:n { driver.save.ur } } } \int_gincr:N \g_@@_pdf_object_int \int_gset_eq:NN \g_@@_pdf_annotation_int \g_@@_pdf_object_int - \@@_postscript:x + \@@_pdfmark:x { - mark - /_objdef { driver.obj \int_use:N \g_@@_pdf_object_int } - driver.annotation.border ~ - \c_@@_pdf_AR_fix_tl - /ANN ~ pdfmark + /_objdef { driver.obj \int_use:N \g_@@_pdf_object_int } + driver.rect ~ + \c_@@_pdf_AR_fix_tl + /ANN } } % \end{macrocode} @@ -852,20 +952,20 @@ %</package> } \box_move_down:nn { \box_dp:N \l_@@_pdf_content_box } - { \hbox:n { \@@_postscript:n { driver.link.ll } } } + { \hbox:n { \@@_postscript:n { driver.save.linkll } } } \@@_postscript:n { driver.bordertracking.begin } \hbox_unpack:N \l_@@_pdf_content_box \@@_postscript:n { driver.bordertracking.end } \box_move_up:nn { \box_ht:N \l_@@_pdf_content_box } { \hbox:n - { \@@_postscript:n { driver.link.ur } } + { \@@_postscript:n { driver.save.linkur } } } \@@_postscript:x { mark \g_@@_pdf_link_dict_tl /Subtype /Link ~ - driver.annotation.border + driver.rect /ANN ~ driver.pdfmark } \@@_pdf_link_sf_restore: @@ -998,6 +1098,63 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\driver_pdf_destination:nn, \driver_pdf_destination_rectangle:nn} +% Here, we need to turn the zoom into a scale. We also need to know where +% the current anchor point actually is: worked out in PostScript. For the +% rectangle version, we have a bit more PostScript: we need two points. +% \begin{macrocode} +\cs_new_protected:Npn \driver_pdf_destination:nn #1#2 + { + \@@_postscript:n { driver.dest.anchor } + \@@_pdfmark:x + { + /View + [ + \str_case:nnF {#2} + { + { xyz } { /XYZ ~ driver.dest.point ~ null } + { fit } { /Fit } + { fitb } { /FitB } + { fitbh } { /FitBH ~ driver.dest.y } + { fitbv } { /FitBV ~ driver.dest.x } + { fith } { /FitH ~ driver.dest.y } + { fitv } { /FitV ~ driver.dest.x } + } + { + /XYZ ~ driver.dest.point ~ \fp_eval:n { (#2) / 100 } + } + ] + /Dest ( \exp_not:n {#1} ) cvn + /DEST + } + } +\cs_new_protected:Npn \driver_pdf_destination_rectangle:nn #1#2 + { + \group_begin: + \hbox_set:Nn \l_@@_pdf_tmp_box {#2} + \box_move_down:nn + { \box_dp:N \l_@@_pdf_tmp_box } + { \hbox:n { \@@_postscript:n { driver.save.ll } } } + \box_use:N \l_@@_pdf_tmp_box + \box_move_up:nn + { \box_ht:N \l_@@_pdf_tmp_box } + { \hbox:n { \@@_postscript:n { driver.save.ur } } } + \@@_pdfmark:n + { + /View + [ + /FitR ~ + driver.llx ~ driver.lly ~ driver.dest2device ~ + driver.urx ~ driver.ury ~ driver.dest2device + ] + /Dest ( #1 ) cvn + /DEST + } + \group_end: + } +% \end{macrocode} +% \end{macro} +% % \subsubsection{Structure} % % \begin{macro}{\driver_pdf_compresslevel:n} @@ -1142,6 +1299,70 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\driver_pdf_destination:nn, \driver_pdf_destination_rectangle:nn} +% A simple task: pass the data to the primitive. The |\scan_stop:| deals +% with the danger of an unterminated keyword. The zoom given here is a +% percentage, but we need to pass it as \emph{per mille}. The rectangle +% version is also easy as everything is build in. +% \begin{macrocode} +\cs_new_protected:Npx \driver_pdf_destination:nn #1#2 + { + \cs_if_exist:NTF \tex_pdfextension:D + { \exp_not:N \tex_pdfextension:D dest ~ } + { \exp_not:N \tex_pdfdest:D } + name {#1} + \exp_not:N \str_case:nnF {#2} + { + { xyz } { xyz } + { fit } { fit } + { fitb } { fitb } + { fitbh } { fitbh } + { fitbv } { fitbv } + { fith } { fith } + { fitv } { fitv } + } + { xyz ~ zoom \exp_not:N \fp_eval:n { #2 * 10 } } + \scan_stop: + } +\cs_new_protected:Npx \driver_pdf_destination_rectangle:nn #1#2 + { + \group_begin: + \hbox_set:Nn \l_@@_pdf_tmp_box {#2} + \cs_if_exist:NTF \tex_pdfextension:D + { \exp_not:N \tex_pdfextension:D dest ~ } + { \exp_not:N \tex_pdfdest:D } + name {#1} + fitr ~ + width \exp_not:N \box_wd:N \l_@@_pdf_tmp_box + height \exp_not:N \box_ht:N \l_@@_pdf_tmp_box + depth \exp_not:N \box_dp:N \l_@@_pdf_tmp_box + \box_use:N \l_@@_pdf_tmp_box + \group_end: + } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Catalogue entries} +% +% \begin{macro}{\driver_pdf_catalog_gput:nn, \driver_pdf_info_gput:nn} +% \begin{macrocode} +\cs_new_protected:Npx \driver_pdf_catalog_gput:nn #1#2 + { + \cs_if_exist:NTF \tex_pdfextension:D + { \tex_pdfextension:D catalog } + { \tex_pdfcatalog:D } + { / #1 ~ #2 } + } +\cs_new_protected:Npx \driver_pdf_info_gput:nn #1#2 + { + \cs_if_exist:NTF \tex_pdfextension:D + { \tex_pdfextension:D info } + { \tex_pdfinfo:D } + { / #1 ~ #2 } + } +% \end{macrocode} +% \end{macro} +% % \subsubsection{Objects} % % \begin{variable}{\g_@@_pdf_object_prop} @@ -1163,7 +1384,7 @@ { #1 reserveobjnum ~ \int_const:cn - { g_@@_pdf_object_ \exp_not:N \tl_to_str:n {##1} _int } + { c_@@_pdf_object_ \exp_not:N \tl_to_str:n {##1} _int } {#2} \prop_gput:Nnn \exp_not:N \g_@@_pdf_object_prop {##1} {##2} } @@ -1172,12 +1393,12 @@ { \@@_tmp:w { \tex_pdfextension:D obj ~ } - { \tex_pdffeedback:D lastobj \scan_stop: } + { \exp_not:N \tex_pdffeedback:D lastobj \scan_stop: } } { \@@_tmp:w { \tex_pdfobj:D } { \tex_pdflastobj:D } } \group_end: \cs_new:Npn \driver_pdf_object_ref:n #1 - { \int_use:c { g_@@_pdf_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R } + { \int_use:c { c_@@_pdf_object_ \tl_to_str:n {#1} _int } ~ 0 ~ R } % \end{macrocode} % \end{macro} % \end{macro} @@ -1194,7 +1415,7 @@ { \tex_immediate:D #1 useobjnum ~ \int_use:c - { g_@@_pdf_object_ \tl_to_str:n {##1} _int } + { c_@@_pdf_object_ \tl_to_str:n {##1} _int } \str_case_e:nn { \prop_item:Nn \g_@@_pdf_object_prop {##1} } { @@ -1333,6 +1554,17 @@ % \end{macrocode} % \end{macro} % +% \subsubsection{Catalogue entries} +% +% \begin{macro}{\driver_pdf_catalog_gput:nn, \driver_pdf_info_gput:nn} +% \begin{macrocode} +\cs_new_protected:Npn \driver_pdf_catalog_gput:nn #1#2 + { \@@_pdf:n { put ~ @catalog << /#1 ~ #2 >> } } +\cs_new_protected:Npn \driver_pdf_info_gput:nn #1#2 + { \@@_pdf:n { docinfo << /#1 ~ #2 >> } } +% \end{macrocode} +% \end{macro} +% % \subsubsection{Objects} % % \begin{variable}{\g_@@_pdf_object_int, \g_@@_pdf_object_prop} @@ -1533,9 +1765,70 @@ % \end{macro} % % \begin{macro}{\driver_pdf_link_margin:n} -% Nope. +% Pass to \texttt{dvipdfmx}. +% \begin{macrocode} +\cs_new_protected:Npn \driver_pdf_link_margin:n #1 + { \@@_literal:x { dvipdfmx:config~g~ \dim_eval:n {#1} } } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\driver_pdf_destination:nn, \driver_pdf_destination_rectangle:nn} +% Here, we need to turn the zoom into a scale. The method for \texttt{FitR} +% is from Alexander Grahn: the idea is to avoid needing to do any calculations +% in \TeX{} by using the driver data for \texttt{@xpos} and \texttt{@ypos}. % \begin{macrocode} -\cs_new_protected:Npn \driver_pdf_link_margin:n #1 { } +\cs_new_protected:Npn \driver_pdf_destination:nn #1#2 + { + \@@_pdf:x + { + dest ~ ( \exp_not:n {#1} ) + [ + @thispage + \str_case:nnF {#2} + { + { xyz } { /XYZ ~ @xpos ~ @ypos ~ null } + { fit } { /Fit } + { fitb } { /FitB } + { fitbh } { /FitBH } + { fitbv } { /FitBV ~ @xpos } + { fith } { /FitH ~ @ypos } + { fitv } { /FitV ~ @xpos } + } + { /XYZ ~ @xpos ~ @ypos ~ \fp_eval:n { (#2) / 100 } } + ] + } + } +\cs_new_protected:Npn \driver_pdf_destination_rectangle:nn #1#2 + { + \group_begin: + \hbox_set:Nn \l_@@_pdf_tmp_box {#2} + \box_move_down:nn { \box_dp:N \l_@@_pdf_tmp_box } + { + \hbox:n + { + \@@_pdf:n { obj ~ @driver_#1_llx ~ @xpos } + \@@_pdf:n { obj ~ @driver_#1_lly ~ @ypos } + } + } + \box_use:N \l_@@_pdf_tmp_box + \box_move_up:nn { \box_ht:N \l_@@_pdf_tmp_box } + { + \hbox:n + { + \@@_pdf:n + { + dest ~ (#1) + [ + @thispage + /FitR ~ + @driver_#1_llx ~ @driver_#1_lly ~ + @xpos ~ @ypos + ] + } + } + } + \group_end: + } % \end{macrocode} % \end{macro} % @@ -1589,6 +1882,16 @@ %<*dvisvgm> % \end{macrocode} % +% \subsubsection{Catalogue entries} +% +% \begin{macro}{\driver_pdf_catalog_gput:nn, \driver_pdf_info_gput:nn} +% No-op. +% \begin{macrocode} +\cs_new_protected:Npn \driver_pdf_catalog_gput:nn #1#2 { } +\cs_new_protected:Npn \driver_pdf_info_gput:nn #1#2 { } +% \end{macrocode} +% \end{macro} +% % \subsubsection{Objects} % % \begin{macro}{\driver_pdf_object_new:nn} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx index 687f8c93dd8..04a731183ae 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3drivers.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -439,7 +439,7 @@ % % \begin{function}{\driver_draw_box_use:Nnnnn} % \begin{syntax} -% \cs{driver_draw_box:Nnnnnnn} \meta{box} +% \cs{driver_draw_box_use:Nnnnn} \meta{box} % \Arg{a} \Arg{b} \Arg{c} \Arg{d} \Arg{x} \Arg{y} % \end{syntax} % Inserts the \meta{box} as an hbox with the box reference point placed @@ -447,8 +447,9 @@ % to the box, allowing it to be in synchronisation with any scaling, rotation % or skewing applying more generally. Note that \TeX{} material should not % be inserted directly into a drawing as it would not be in the correct -% location. Also note that as for other drawing elements the box here -% has no size from a \TeX{} perspective. +% location. Also note that this function must be used inside a box of zero +% size, shifted appropriately for the correct result; a low-level engine +% error may result if this is not the case. % \end{function} % % \subsection{Coordinate system transformations} @@ -492,6 +493,9 @@ % \cs{driver_pdf_link_begin_user:nnw} \Arg{attributes} \Arg{action} % \Arg{content} % \cs{driver_pdf_link_end:} +% \cs{driver_pdf_link_begin_goto:nnw} \Arg{attributes} \Arg{target} +% \Arg{content} +% \cs{driver_pdf_link_end:} % \end{syntax} % Creates a link of the \meta{type} |goto| or |user| with the given % \meta{attributes}, points toward the \meta{action} and surround the @@ -514,7 +518,74 @@ % Sets the length of the margin between content and the border of a link. % Different back-ends treat the scoping of this value in different ways: % \pdfTeX{} and \LuaTeX{} treat it as scoped by \TeX{}, whilst with -% \texttt{dvips} the scope is managed at the PostScript level. +% \texttt{dvips} the scope is managed at the PostScript level. For +% \texttt{(x)dvipdfmx}, this setting applies to \emph{all} annotations +% (\emph{i.e.}~it is global), and thus it may be necessary to set to +% \texttt{0pt} to avoid breaking for example animations. +% \end{function} +% +% \begin{function}[added = 2019-04-26]{\driver_pdf_destination:nn} +% \begin{syntax} +% \cs{driver_pdf_destination:nn} \Arg{name} \Arg{action} +% \end{syntax} +% Creates a destination (anchor) called \meta{name}; when a jump is made +% by a link to the destination, one of the following actions may take +% place +% \begin{itemize} +% \item \texttt{xyz} Move the view such that the target point is at the +% top-left of the viewer screen +% \item \texttt{\meta{scale}} As for \texttt{xyz}, but also sets the +% viewer \meta{scale} +% \item \texttt{fit} Display the page containing the destination and fit +% the entire page within the viewer window +% \item \texttt{fitb} Display the page containing the destination and fit +% the bounding box of the page within the viewer window +% \item \texttt{fitbh} Move to the destination page such that the +% anchor point is at the top of the viewer screen, and scale +% such that the bounding box fills the viewer width +% \item \texttt{fitbv} Move to the destination page such that the +% anchor point is at the left of the viewer screen, and scale +% such that the bounding box fills the viewer height +% \item \texttt{fith} Move to the destination page such that the +% anchor point is at the top of the viewer screen, and scale +% such that the page fills the viewer width +% \item \texttt{fitv} Move to the destination page such that the +% anchor point is at the left of the viewer screen, and scale +% such that the page fills the viewer height +% \end{itemize} +% A \meta{scale} of zero is equivalent to \texttt{xyz}. +% \end{function} +% +% \begin{function}[added = 2019-04-28]{\driver_pdf_destination_rectangle:nn} +% \begin{syntax} +% \cs{driver_pdf_destination_rectangle:nn} \Arg{name} \Arg{content} +% \end{syntax} +% Creates a destination (anchor) called \meta{name}; when a jump is made +% by a link to the destination, the viewer will set the zoom such that all +% of the \meta{content} is visible taking up the full width or height of the +% viewer area. +% \end{function} +% +% \subsection{PDF Catalogue entries} +% +% \begin{function}[added = 2019-04-28]{\driver_pdf_catalog_gput:nn} +% \begin{syntax} +% \cs{driver_pdf_catalog_gput:nn} \Arg{key} \Arg{value} +% \end{syntax} +% Adds the key--value pair to the PDF catalog. The \meta{key} should +% be given \emph{without} the leading |/|. The \meta{value} should be +% a \enquote{raw} PDF dictionary entry, including the |(|/|)| pair for +% a string, a leading |/| for a boolean, \emph{etc.} +% \end{function} +% +% \begin{function}[added = 2019-04-28]{\driver_pdf_info_gput:nn} +% \begin{syntax} +% \cs{driver_pdf_info_gput:nn} \Arg{key} \Arg{value} +% \end{syntax} +% Adds the key--value pair to the PDF information. The \meta{key} should +% be given \emph{without} the leading |/|. The \meta{value} should be +% a \enquote{raw} PDF dictionary entry, including the |(|/|)| pair for +% a string or leading |/| for a boolean. % \end{function} % % \subsection{PDF Objects} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx index 31f2e717cd3..d4e684149b0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3expan.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx index 1788f805cc0..04144df0f70 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -439,7 +439,7 @@ % \subsection{Wrapping lines in output} % % \begin{function}[added = 2012-06-28, updated = 2017-12-04] -% {\iow_wrap:nnnN \iow_wrap:nxnN} +% {\iow_wrap:nnnN, \iow_wrap:nxnN} % \begin{syntax} % \cs{iow_wrap:nnnN} \Arg{text} \Arg{run-on text} \Arg{set up} \meta{function} % \end{syntax} @@ -655,6 +655,51 @@ % quote (|"|) characters or is surrounded by a pair of quotes. % \end{function} % +% \begin{function}[noTF, added = 2017-07-11, updated = 2019-02-16] +% {\file_get_mdfive_hash:nN} +% \begin{syntax} +% \cs{file_get_mdfive_hash:nN} \Arg{file name} \meta{tl var} +% \end{syntax} +% Searches for \meta{file name} using the current \TeX{} search +% path and the additional paths controlled by \cs{l_file_search_path_seq}. +% If found, sets the \meta{tl var} to the MD5 sum generated from the +% content of the file. The file is read as bytes, which means that in +% contrast to most \TeX{} behaviour there will be a difference in result +% depending on the line endings used in text files. The same file will +% produce the same result between different engines: the algorithm used +% is the same in all cases. +% Where the file is not found, the \meta{tl var} will set to +% \cs{q_no_value}. +% \end{function} +% +% \begin{function}[noTF, added = 2017-07-09, updated = 2019-02-16] +% {\file_get_size:nN} +% \begin{syntax} +% \cs{file_get_size:nN} \Arg{file name} \meta{tl var} +% \end{syntax} +% Searches for \meta{file name} using the current \TeX{} search +% path and the additional paths controlled by \cs{l_file_search_path_seq}. +% If found, sets the \meta{tl var} to the size of the file in bytes. +% Where the file is not found, the \meta{tl var} will set to \cs{q_no_value}. +% This is not available in older versions of \XeTeX{}. +% \end{function} +% +% \begin{function}[noTF, added = 2017-07-09, updated = 2019-02-16] +% {\file_get_timestamp:nN} +% \begin{syntax} +% \cs{file_get_timestamp:nN} \Arg{file name} \meta{tl var} +% \end{syntax} +% Searches for \meta{file name} using the current \TeX{} search +% path and the additional paths controlled by \cs{l_file_search_path_seq}. +% If found, sets the \meta{tl var} to the modification timestamp of +% the file in the form |D:|\meta{year}\meta{month}\meta{day}\meta{hour}^^A +% \meta{minute}\meta{second}\meta{offset}, where the latter may be |Z| +% (UTC) or \meta{plus-minus}\meta{hours}|'|\meta{minutes}|'|. +% Where the file is not found, the \meta{tl var} will be set to +% \cs{q_no_value}. +% This is not available in older versions of \XeTeX{}. +% \end{function} +% % \begin{function}[updated = 2017-06-26]{\file_input:n} % \begin{syntax} % \cs{file_input:n} \Arg{file name} @@ -666,6 +711,41 @@ % function. An error is raised if the file is not found. % \end{function} % +% \begin{function}[added = 2014-07-02]{\file_if_exist_input:n, \file_if_exist_input:nF} +% \begin{syntax} +% \cs{file_if_exist_input:n} \Arg{file name} +% \cs{file_if_exist_input:nF} \Arg{file name} \Arg{false code} +% \end{syntax} +% Searches for \meta{file name} using the current \TeX{} search +% path and the additional paths controlled by +% \cs{file_path_include:n}. If found then +% reads in the file as additional \LaTeX{} source as described for +% \cs{file_input:n}, otherwise inserts the \meta{false code}. +% Note that these functions do not raise +% an error if the file is not found, in contrast to \cs{file_input:n}. +% \end{function} +% +% \begin{function}[added = 2017-07-07]{\file_input_stop:} +% \begin{syntax} +% \cs{file_input_stop:} +% \end{syntax} +% Ends the reading of a file started by \cs{file_input:n} or similar before +% the end of the file is reached. Where the file reading is being terminated +% due to an error, \cs[index = msg_critical:nn]{msg_critical:nn(nn)} +% should be preferred. +% \begin{texnote} +% This function must be used on a line on its own: \TeX{} reads files +% line-by-line and so any additional tokens in the \enquote{current} line +% will still be read. +% +% This is also true if the function is hidden inside another function +% (which will be the normal case), i.e., all tokens on the same line +% in the source file are still processed. Putting it on a line by itself +% in the definition doesn't help as it is the line where it is used that +% counts! +% \end{texnote} +% \end{function} +% % \begin{function}{\file_show_list:, \file_log_list:} % \begin{syntax} % \cs{file_show_list:} @@ -2360,6 +2440,98 @@ % \end{macro} % \end{macro} % +% \begin{macro} +% {\file_get_mdfive_hash:nN, \file_get_size:nN, \file_get_timestamp:nN} +% \begin{macro}{\@@_get_details:nnN} +% These are all wrappers around the \pdfTeX{} primitives doing the same +% jobs: as we want consistent file paths to be found, they are all set up +% using \cs{file_get_full_name:nN} and so are non-expandable \texttt{get} +% functions. Much of the code is repetitive but we need to branch for +% \LuaTeX{} (emulation in Lua), for the slightly different syntax +% needed for \tn{tex_mdfivesum:D} and for the fact that primitive +% coverage varies in other engines. +% \begin{macrocode} +\cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2 + { \file_get_mdfive_hash:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } +\cs_new_protected:Npn \file_get_size:nN #1#2 + { \file_get_size:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } +\cs_new_protected:Npn \file_get_timestamp:nN #1#2 + { \file_get_timestamp:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } +\prg_new_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 { T , F , TF } + { \@@_get_details:nnN {#1} { mdfivesum } {#2} } +\prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF } + { \@@_get_details:nnN {#1} { size } {#2} } +\prg_new_protected_conditional:Npnn \file_get_timestamp:nN #1#2 { T , F , TF } + { \@@_get_details:nnN {#1} { moddate } {#2} } +\cs_new_protected:Npn \@@_get_details:nnN #1#2#3 + { + \file_get_full_name:nNTF {#1} \l_@@_full_name_tl + { + \tl_set:Nx #3 + { + \use:c { tex_file #2 :D } \exp_after:wN + { \l_@@_full_name_tl } + } + \prg_return_true: + } + { \prg_return_false: } + } +\sys_if_engine_luatex:TF + { + \cs_set_protected:Npn \@@_get_details:nnN #1#2#3 + { + \file_get_full_name:nNTF {#1} \l_@@_full_name_tl + { + \tl_set:Nx #3 + { + \lua_now:e + { + l3kernel.file#2 + ( " \lua_escape:e { \l_@@_full_name_tl } " ) + } + } + \prg_return_true: + } + { \prg_return_false: } + } + } + { + \prg_set_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 + { T , F , TF } + { + \file_get_full_name:nNTF {#1} \l_@@_full_name_tl + { + \tl_set:Nx #2 + { + \tex_mdfivesum:D file \exp_after:wN + { \l_@@_full_name_tl } + } + \prg_return_true: + } + { \prg_return_false: } + } + \cs_if_exist:NF \tex_filesize:D + { + \cs_set_protected:Npn \@@_get_details:nnN #1#2#3 + { + \tl_clear:N #3 + \__kernel_msg_error:nnx + { kernel } { primitive-not-available } + { \exp_not:c { (pdf)file #2 } } + \prg_return_false: + } + } + } +\__kernel_msg_new:nnnn { kernel } { primitive-not-available } + { Primitive~\token_to_str:N #1 not~available } + { + The~version~of~XeTeX~in~use~does~not~provide~functionality~equivalent~to~ + the~\token_to_str:N #1 primitive. + } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}[TF]{\file_if_exist:n} % The test for the existence of a file is a wrapper around the function to % add a path to a file. If the file was found, the path contains @@ -2375,6 +2547,32 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}{\file_if_exist_input:n, \file_if_exist_input:nF} +% Input of a file with a test for existence. We do not define the |T| +% or |TF| variants because the most useful place to place the +% \meta{true code} would be inconsistent with other conditionals. +% \begin{macrocode} +\cs_new_protected:Npn \file_if_exist_input:n #1 + { + \file_get_full_name:nNT {#1} \l_@@_full_name_tl + { \@@_input:V \l_@@_full_name_tl } + } +\cs_new_protected:Npn \file_if_exist_input:nF #1#2 + { + \file_get_full_name:nNTF {#1} \l_@@_full_name_tl + { \@@_input:V \l_@@_full_name_tl } + {#2} + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\file_input_stop:} +% A simple rename. +% \begin{macrocode} +\cs_new_protected:Npn \file_input_stop: { \tex_endinput:D } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{\__kernel_file_missing:n} % An error message for a missing file, also used in \cs{ior_open:Nn}. % \begin{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx index 83c0a9e06c9..02262210e2f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3final.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3final.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx index dc677b17047..52b31eac7b9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3flag.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx index b125f5ea225..a9c642d99b7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-assign.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx index a91ba3739ef..3d265954d73 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-aux.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx index acf8a9730e9..a80e731be6e 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-basics.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx index 19579e1178a..e6e4f4b2fcf 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-convert.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx index 5f4855a1e00..36c5d841fc9 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-expo.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx index 827ef37a567..a2d4d15ddd5 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-extended.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx index 4ac7c2b31b7..2c4d6a74764 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-logic.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx index 49b590ecb14..9a9704fa656 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-parse.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx index c54d211f315..4e1b2d28e96 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-random.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx index ce271732d57..6b15cdddf4c 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-round.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx index 308ef31eddb..a103146534d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-traps.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % \maketitle % % \begin{documentation} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx index 7364871989c..b877bdbf308 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp-trig.dtx @@ -40,7 +40,7 @@ % {latex-team@latex-project.org}^^A % }^^A % } -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx index 57ed60854bb..ac802b718aa 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fp.dtx @@ -49,7 +49,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -888,7 +888,7 @@ % specified, providing a tuple as an argument of any other operation % yields the \enquote{invalid operation} exception and a \nan{} result. % -% \begin{function}[tested = m3fp-logic002, module = ]{?:} +% \begin{function}[tested = m3fp-logic002]{?:} % \begin{syntax} % \cs{fp_eval:n} \{ \meta{operand_1} |?| \meta{operand_2} |:| \meta{operand_3} \} % \end{syntax} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx index 524a6f3664b..9cc229840d3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3fparray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx index a7d092c5d3f..8bc1dc8b734 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3int.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3int.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx index fca4e4d1871..a54746edeff 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3intarray.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx index a97f81dec26..5e564fb7561 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3kernel-functions.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx index 3ed79a5a6f0..519a82ae949 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3keys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx new file mode 100644 index 00000000000..c9f8d393387 --- /dev/null +++ b/Master/texmf-dist/source/latex/l3kernel/l3legacy.dtx @@ -0,0 +1,100 @@ +% \iffalse meta-comment +% +%% File: l3legacy.dtx +% +% Copyright (C) 2019 The LaTeX3 Project +% +% It may be distributed and/or modified under the conditions of the +% LaTeX Project Public License (LPPL), either version 1.3c of this +% license or (at your option) any later version. The latest version +% of this license is in the file +% +% https://www.latex-project.org/lppl.txt +% +% This file is part of the "l3kernel bundle" (The Work in LPPL) +% and all files in that bundle must be distributed together. +% +% ----------------------------------------------------------------------- +% +% The development version of the bundle can be found at +% +% https://github.com/latex3/latex3 +% +% for those people who are interested. +% +%<*driver> +\documentclass[full,kernel]{l3doc} +\begin{document} + \DocInput{\jobname.dtx} +\end{document} +%</driver> +% \fi +% +% \title{^^A +% The \textsf{l3legacy} package\\ Interfaces to legacy concepts^^A +% } +% +% \author{^^A +% The \LaTeX3 Project\thanks +% {^^A +% E-mail: +% \href{mailto:latex-team@latex-project.org} +% {latex-team@latex-project.org}^^A +% }^^A +% } +% +% \date{Released 2019-05-03} +% +% \maketitle +% +% \begin{documentation} +% +% There are a small number of \TeX{} or \LaTeXe{} concepts which are not used +% in \pkg{expl3} code but which need to be manipulated when working as a \LaTeXe{} +% package. To allow these to be integrated cleanly into \pkg{expl3} code, a set +% of legacy interfaces are provided here. +% +% \begin{function}[EXP,pTF]{\legacy_if:n} +% \begin{syntax} +% \cs{legacy_if:nTF} \Arg{name} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the \LaTeXe{}/plain \TeX{} conditional (generated by \tn{newif}) +% if \texttt{true} or \texttt{false} and branches accordingly. The +% \meta{name} of the conditional should \emph{omit} the leading \texttt{if}. +% \end{function} +% +% \end{documentation} +% +% \begin{implementation} +% +% \section{\pkg{l3legacy} Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macrocode} +%<@@=legacy> +% \end{macrocode} +% +% \begin{macro}[EXP,pTF]{\legacy_if:n} +% A friendly wrapper. +% \begin{macrocode} +\prg_new_conditional:Npnn \legacy_if:n #1 { p , T , F , TF } + { + \exp_args:Nc \if_meaning:w { if#1 } \iftrue + \prg_return_true: + \else: + \prg_return_false: + \fi: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macrocode} +%</package> +% \end{macrocode} +% +% \end{implementation} +% +% \PrintIndex diff --git a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx index 1f65299275c..d87fa9438a0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3luatex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx index 12b28ac9126..59f58620bb0 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3msg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx index 3f28662217f..5d7a52fbd01 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3names.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3names.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -578,6 +578,7 @@ \@@_primitive:NN \pdfoutline \tex_pdfoutline:D \@@_primitive:NN \pdfoutput \tex_pdfoutput:D \@@_primitive:NN \pdfpageattr \tex_pdfpageattr:D + \@@_primitive:NN \pdfpagesattr \tex_pdfpagesattr:D \@@_primitive:NN \pdfpagebox \tex_pdfpagebox:D \@@_primitive:NN \pdfpageref \tex_pdfpageref:D \@@_primitive:NN \pdfpageresources \tex_pdfpageresources:D @@ -1107,6 +1108,11 @@ \@@_primitive:NN \Uunderdelimiter \tex_Uunderdelimiter:D \@@_primitive:NN \Uvextensible \tex_Uvextensible:D % \end{macrocode} +% Primitives from Harf\TeX{}. +% \begin{macrocode} + \@@_primitive:NN \harftexrevision \tex_harftexrevision:D + \@@_primitive:NN \harftexversion \tex_harftexversion:D +% \end{macrocode} % Primitives from \pTeX{}. % \begin{macrocode} \@@_primitive:NN \autospacing \tex_autospacing:D diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx index a1a56553da0..3bdc75dc10f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prg.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx index 52f5eba505f..32fb92ad357 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3prop.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx index 6e08abab51e..6cdcb536309 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3quark.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx index ced12c3404f..5c9eff6ef28 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3regex.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx index b22030d34cc..d4a2b9a0b4f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3seq.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx index 2a929db3037..e499441e1d1 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3skip.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx index 7cab64d19f0..f8e541f8467 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sort.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx index 0e45bc3f008..7c3e2c7a2bc 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3str.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3str.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx index 644a578cca8..649e913a4f7 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3sys.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx index 19e5e939ccb..6fd11dc328f 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl-analysis.dtx @@ -44,7 +44,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx index 1f75ca2c18c..f8a097c5e7d 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3tl.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx index f8d6b75ffac..17961a9129b 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3token.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3token.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % @@ -931,6 +931,26 @@ % (as appropriate to the result of the test). % \end{function} % +% \begin{function}[TF, updated = 2012-12-20]{\peek_N_type:} +% \begin{syntax} +% \cs{peek_N_type:TF} \Arg{true code} \Arg{false code} +% \end{syntax} +% Tests if the next \meta{token} in the input stream can be safely +% grabbed as an \texttt{N}-type argument. The test is \meta{false} +% if the next \meta{token} is either an explicit or implicit +% begin-group or end-group token (with any character code), or +% an explicit or implicit space character (with character code $32$ +% and category code $10$), or an outer token (never used in \LaTeX3) +% and \meta{true} in all other cases. +% Note that a \meta{true} result ensures that the next \meta{token} is +% a valid \texttt{N}-type argument. However, if the next \meta{token} +% is for instance \cs{c_space_token}, the test takes the +% \meta{false} branch, even though the next \meta{token} is in fact +% a valid \texttt{N}-type argument. The \meta{token} is left +% in the input stream after the \meta{true code} or \meta{false code} +% (as appropriate to the result of the test). +% \end{function} +% % \section{Description of all possible tokens} % \label{sec:l3token:all-tokens} % @@ -2405,6 +2425,77 @@ % \end{macrocode} % \end{macro} % +% \begin{macro}[TF]{\peek_N_type:} +% \begin{macro} +% {\@@_execute_branches_N_type:, \@@_N_type:w, \@@_N_type_aux:nnw} +% All tokens are \texttt{N}-type tokens, except in four cases: +% begin-group tokens, end-group tokens, space tokens with character +% code~$32$, and outer tokens. Since \cs{l_peek_token} might be +% outer, we cannot use the convenient \cs{bool_if:nTF} function, and +% must resort to the old trick of using \tn{ifodd} to expand a set of +% tests. The \texttt{false} branch of this test is taken if the token +% is one of the first three kinds of non-\texttt{N}-type tokens +% (explicit or implicit), thus we call \cs{@@_false:w}. In the +% \texttt{true} branch, we must detect outer tokens, without impacting +% performance too much for non-outer tokens. The first filter is to +% search for \texttt{outer} in the \tn{meaning} of \cs{l_peek_token}. +% If that is absent, \cs{use_none_delimit_by_q_stop:w} cleans up, and +% we call \cs{@@_true:w}. Otherwise, the token can be a non-outer +% macro or a primitive mark whose parameter or replacement text +% contains \texttt{outer}, it can be the primitive \tn{outer}, or it +% can be an outer token. Macros and marks would have \texttt{ma} in +% the part before the first occurrence of \texttt{outer}; the meaning +% of \tn{outer} has nothing after \texttt{outer}, contrarily to outer +% macros; and that covers all cases, calling \cs{@@_true:w} or +% \cs{@@_false:w} as appropriate. Here, there is no \meta{search +% token}, so we feed a dummy \cs{scan_stop:} to the +% \cs{@@_token_generic:NNTF} function. +% \begin{macrocode} +\group_begin: + \cs_set_protected:Npn \@@_tmp:w #1 \q_stop + { + \cs_new_protected:Npn \@@_execute_branches_N_type: + { + \if_int_odd:w + \if_catcode:w \exp_not:N \l_peek_token { 0 \exp_stop_f: \fi: + \if_catcode:w \exp_not:N \l_peek_token } 0 \exp_stop_f: \fi: + \if_meaning:w \l_peek_token \c_space_token 0 \exp_stop_f: \fi: + 1 \exp_stop_f: + \exp_after:wN \@@_N_type:w + \token_to_meaning:N \l_peek_token + \q_mark \@@_N_type_aux:nnw + #1 \q_mark \use_none_delimit_by_q_stop:w + \q_stop + \exp_after:wN \@@_true:w + \else: + \exp_after:wN \@@_false:w + \fi: + } + \cs_new_protected:Npn \@@_N_type:w ##1 #1 ##2 \q_mark ##3 + { ##3 {##1} {##2} } + } + \exp_after:wN \@@_tmp:w \tl_to_str:n { outer } \q_stop +\group_end: +\cs_new_protected:Npn \@@_N_type_aux:nnw #1 #2 #3 \fi: + { + \fi: + \tl_if_in:noTF {#1} { \tl_to_str:n {ma} } + { \@@_true:w } + { \tl_if_empty:nTF {#2} { \@@_true:w } { \@@_false:w } } + } +\cs_new_protected:Npn \peek_N_type:TF + { + \@@_token_generic:NNTF + \@@_execute_branches_N_type: \scan_stop: + } +\cs_new_protected:Npn \peek_N_type:T + { \@@_token_generic:NNT \@@_execute_branches_N_type: \scan_stop: } +\cs_new_protected:Npn \peek_N_type:F + { \@@_token_generic:NNF \@@_execute_branches_N_type: \scan_stop: } +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macrocode} %</initex|package> % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx index 5c826977390..c7bb566c066 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3unicode.dtx @@ -43,7 +43,7 @@ % }^^A % } % -% \date{Released 2019-04-21} +% \date{Released 2019-05-03} % % \maketitle % diff --git a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx index 841e2a54d13..4696ceda345 100644 --- a/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx +++ b/Master/texmf-dist/source/latex/l3packages/l3keys2e/l3keys2e.dtx @@ -62,7 +62,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -133,7 +133,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{l3keys2e}{2019-03-05}{} +\ProvidesExplPackage{l3keys2e}{2019-05-03}{} {LaTeX2e option processing using LaTeX3 keys} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx index a923cfd4b83..71a0d646ebe 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfp/xfp.dtx @@ -64,7 +64,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -167,7 +167,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfp}{2019-03-05}{} +\ProvidesExplPackage{xfp}{2019-05-03}{} {L3 Floating point unit} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx index a3a128ba887..a67213fcb1a 100644 --- a/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xfrac/xfrac.dtx @@ -65,7 +65,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -535,7 +535,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xfrac}{2019-03-05}{} +\ProvidesExplPackage{xfrac}{2019-05-03}{} {L3 Experimental split-level fractions} % \end{macrocode} % diff --git a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx index 91d6a006658..c9061d80572 100644 --- a/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xparse/xparse.dtx @@ -67,7 +67,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -898,7 +898,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xparse}{2019-03-05}{} +\ProvidesExplPackage{xparse}{2019-05-03}{} {L3 Experimental document command parser} % \end{macrocode} % @@ -1415,6 +1415,9 @@ % \begin{macrocode} \cs_new_protected:Npn \@@_start_env:nnnnn #1#2 { +%<*package> + \cs_if_exist_use:N \conditionally@traceoff +%</package> \str_set:Nn \l_@@_environment_str {#2} \bool_set_true:N \l_@@_environment_bool \@@_start_aux:ccnnnn @@ -1424,6 +1427,9 @@ } \cs_new_protected:Npx \@@_start:nNNnnn #1#2#3 { +%<*package> + \exp_not:n { \cs_if_exist_use:N \conditionally@traceoff } +%</package> \exp_not:c { xparse~function~is~not~expandable } \exp_not:n { \bool_set_false:N \l_@@_environment_bool } \exp_not:N \@@_start_aux:NNnnnn @@ -1460,6 +1466,9 @@ { \tl_if_empty:NF \l_@@_defaults_tl { \@@_defaults: } \tl_if_empty:NF \l_@@_process_all_tl { \@@_args_process: } +%<*package> + \cs_if_exist_use:N \conditionally@traceon +%</package> \exp_after:wN \l_@@_fn_code_tl \l_@@_args_tl } % \end{macrocode} diff --git a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx index 73ef8cc857d..2dec040e45b 100644 --- a/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx +++ b/Master/texmf-dist/source/latex/l3packages/xtemplate/xtemplate.dtx @@ -63,7 +63,7 @@ % }^^A % } % -% \date{Released 2019-03-05} +% \date{Released 2019-05-03} % % \maketitle % @@ -682,7 +682,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{xtemplate}{2019-03-05}{} +\ProvidesExplPackage{xtemplate}{2019-05-03}{} {L3 Experimental prototype document functions} % \end{macrocode} % |