summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/l3experimental
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-05-05 22:01:18 +0000
committerKarl Berry <karl@freefriends.org>2014-05-05 22:01:18 +0000
commitd78a5a4de1e73a2151e8ed2635a199d928ccb559 (patch)
treeca490a3efa7d3614793427f850ec1aeb6bf971f1 /Master/texmf-dist/source/latex/l3experimental
parentb41cac6cebc8095cf8eaf7e84f8a2d5f63b7be38 (diff)
latex3 (5may14)
git-svn-id: svn://tug.org/texlive/trunk@33859 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/l3experimental')
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.dtx1258
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.ins40
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/l3str/l3str.dtx40
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx20
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx64
-rw-r--r--Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx6
6 files changed, 48 insertions, 1380 deletions
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.dtx b/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.dtx
deleted file mode 100644
index 36454f14c49..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.dtx
+++ /dev/null
@@ -1,1258 +0,0 @@
-% \iffalse meta-comment
-%
-%% File l3dt.dtx Copyright (C) 2011-2013 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
-%%
-%% http://www.latex-project.org/lppl.txt
-%%
-%% This file is part of the "l3experimental bundle" (The Work in LPPL)
-%% and all files in that bundle must be distributed together.
-%%
-%% The released version of this bundle is available from CTAN.
-%%
-%% -----------------------------------------------------------------------
-%%
-%% The development version of the bundle can be found at
-%%
-%% http://www.latex-project.org/svnroot/experimental/trunk/
-%%
-%% for those people who are interested.
-%%
-%%%%%%%%%%%
-%% NOTE: %%
-%%%%%%%%%%%
-%%
-%% Snapshots taken from the repository represent work in progress and may
-%% not work or may contain conflicting material! We therefore ask
-%% people _not_ to put them into distributions, archives, etc. without
-%% prior consultation with the LaTeX Project Team.
-%%
-%% -----------------------------------------------------------------------
-%%
-%
-%<*driver|package>
-\RequirePackage{expl3}
-\GetIdInfo$Id: l3dt.dtx 4482 2013-04-24 21:05:12Z joseph $
- {L3 Experimental data tables}
-%</driver|package>
-%<*driver>
-\documentclass[full]{l3doc}
-\begin{document}
- \DocInput{\jobname.dtx}
-\end{document}
-%</driver>
-% \fi
-%
-% \title{^^A
-% The \pkg{l3dt} package\\ Data tables^^A
-% \thanks{This file describes v\ExplFileVersion,
-% last revised \ExplFileDate.}^^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 \ExplFileDate}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% \LaTeX3 implements a \enquote{data table} variable type, which is made up of
-% a series of rows each of which contain a number of key--value pairs. Thus
-% a data table is in effect an array of property lists. The rows of the table
-% are stored in a fixed order, and are numbered consecutively from one.
-% In the same way, the order of keys (columns) is recorded in a sequence-like
-% manner, again indexed from one.
-%
-% Within each row in a data table each entry must have a unique \meta{key}: if
-% an entry is added to a row within a data table which already contains the
-% \meta{key} then the new entry will overwrite the existing one. The
-% \meta{keys} are compared on a string basis, using the same method as
-% \cs{str_if_eq:nn}.
-%
-% \section{Creating and initialising data tables}
-%
-% \begin{function}{\dt_new:N}
-% \begin{syntax}
-% \cs{dt_new:N} \meta{data table}
-% \end{syntax}
-% Creates a new \meta{data table} or raises an error if the name is
-% already taken. The declaration is global. The \meta{property lists} will
-% initially contain no entries.
-% \end{function}
-%
-% \begin{function}{\dt_clear:N, \dt_gclear:N}
-% \begin{syntax}
-% \cs{dt_clear:N} \meta{data table}
-% \end{syntax}
-% Clears all entries and keys from the \meta{data table}.
-% \end{function}
-%
-% \begin{function}{\dt_clear_new:N, \dt_gclear_new:N}
-% \begin{syntax}
-% \cs{dt_clear_new:N} \meta{data table}
-% \end{syntax}
-% Ensures that the \meta{data table} exists globally by applying
-% \cs{dt_new:N} if necessary, then applies \cs{dt_(g)clear:N} to leave
-% the table empty.
-% \end{function}
-%
-% \begin{function}{\dt_set_eq:NN, \dt_gset_eq:NN}
-% \begin{syntax}
-% \cs{dt_set_eq:NN} \meta{data table1} \meta{data table2}
-% \end{syntax}
-% Sets the content of \meta{data table1} equal to that of
-% \meta{data table2}.
-% \end{function}
-%
-% \section{Adding data}
-%
-% \begin{function}{\dt_add_key:Nn, \dt_gadd_key:Nn}
-% \begin{syntax}
-% \cs{dt_add_key:Nn} \meta{dt} \Arg{key}
-% \end{syntax}
-% Adds the \meta{key} to the list of those in the \meta{data table}. The
-% \meta{key} will be converted to a string using \cs{tl_to_str:n}, and thus
-% category codes in the \meta{key} are ignored. If the \meta{key} is already
-% present in the \meta{data table} then no action is taken.
-% \end{function}
-%
-% \begin{function}{\dt_add_row:N, \dt_gadd_row:N}
-% \begin{syntax}
-% \cs{dt_add_row:N} \meta{dt}
-% \end{syntax}
-% Adds a new row to the \meta{data table}. This will initially contain
-% no entries: all keys will be blank.
-% \end{function}
-%
-% \begin{function}{\dt_put:Nnn, \dt_gput:Nnn}
-% \begin{syntax}
-% \cs{dt_put:Nnn} \meta{dt} \Arg{key} \Arg{value}
-% \end{syntax}
-% Adds an entry to the current row of the \meta{data table} which may be
-% accessed using the \meta{key} and which has \meta{value}. Both the
-% \meta{key} and \meta{value} may contain any \meta{balanced text}. The
-% \meta{key} is stored after processing with \cs{tl_to_str:n}, meaning
-% that category codes are ignored. If the \meta{key} is already present
-% in the current row of the \meta{data table}, the existing entry is
-% overwritten by the new \meta{value}.
-% \end{function}
-%
-% \begin{function}{\dt_put:Nnnn, \dt_gput:Nnnn}
-% \begin{syntax}
-% \cs{dt_put:Nnnn} \meta{dt} \Arg{row} \Arg{key} \Arg{value}
-% \end{syntax}
-% Adds an entry to the \meta{row} of the \meta{data table} which may be
-% accessed using the \meta{key} and which has \meta{value}. Both the
-% \meta{key} and \meta{value} may contain any \meta{balanced text}. The
-% \meta{key} is stored after processing with \cs{tl_to_str:n}, meaning
-% that category codes are ignored. If the \meta{key} is already present
-% in the \meta{row} of the \meta{data table}, the existing entry is
-% overwritten by the new \meta{value}. The \meta{row} should be given as
-% an \meta{integer expression}.
-% \end{function}
-%
-% \section{Removing data}
-%
-% \begin{function}{\dt_remove:Nn, \dt_gremove:Nn}
-% \begin{syntax}
-% \cs{dt_remove:Nn} \meta{dt} \Arg{key}
-% \end{syntax}
-% Deletes any entry from the current row of the \meta{data table} with
-% the \meta{key}. The \meta{key} is compared after processing with
-% \cs{tl_to_str:n}, meaning that category codes are ignored. Deleting of
-% all entries from a row does not delete the row itself.
-% \end{function}
-%
-% \begin{function}{\dt_remove:Nnn, \dt_gremove:Nnn}
-% \begin{syntax}
-% \cs{dt_remove:Nnn} \meta{dt} \Arg{row} \Arg{key}
-% \end{syntax}
-% Deletes any entry from the \meta{row} of the \meta{data table} with
-% the \meta{key}. The \meta{key} is compared after processing with
-% \cs{tl_to_str:n}, meaning that category codes are ignored. The \meta{row}
-% may be given as an \meta{integer expression}. Deleting of
-% all entries from a row does not delete the row itself.
-% \end{function}
-%
-% \begin{function}{\dt_remove_key:Nn, \dt_gremove_key:Nn}
-% \begin{syntax}
-% \cs{dt_remove_key:N} \meta{data table} \Arg{key}
-% \end{syntax}
-% Removes the \meta{key} from the \meta{data table} if it is present.
-% The \meta{key} and any associated \meta{value} will be removed from any
-% row that it is found in.
-% \end{function}
-%
-% \begin{function}{\dt_remove_row:Nn, \dt_gremove_row:Nn}
-% \begin{syntax}
-% \cs{dt_remove_row:Nn} \meta{data table} \Arg{row}
-% \end{syntax}
-% Removes the \meta{row} (given as an \meta{integer expressions}) from the
-% \meta{data table}. The remaining rows of the table will be renumbered
-% such that they are sequential.
-% \end{function}
-%
-% \section{Recovering information}
-%
-% \begin{function}[EXP]{\dt_keys:N}
-% \begin{syntax}
-% \cs{dt_keys:N} \meta{dt}
-% \end{syntax}
-% Leaves the number of keys in the \meta{data table} in the input
-% stream as an \meta{integer denotation}.
-% \end{function}
-%
-% \begin{function}[EXP]{\dt_rows:N}
-% \begin{syntax}
-% \cs{dt_rows:N} \meta{dt}
-% \end{syntax}
-% Leaves the number of rows in the \meta{data table} in the input
-% stream as an \meta{integer denotation}.
-% \end{function}
-%
-% \begin{function}{\dt_get:NnN}
-% \begin{syntax}
-% \cs{dt_get:NnnN} \meta{dt} \Arg{key} \meta{tl var}
-% \end{syntax}
-% Recovers the \meta{value} stored with \meta{key} from the current row in
-% the \meta{data table}, and places this in the \meta{token list variable}.
-% If the \meta{key} is not found in the \meta{row} of the \meta{data table}
-% then the \meta{token list variable} will contain the special marker
-% \cs{q_no_value}. The \meta{token list variable} is set within the
-% current \TeX{} group. The \meta{row} should be given as an
-% \meta{integer expression}. See also \cs{dt_get:NnNTF}.
-% \end{function}
-%
-% \begin{function}[TF]{\dt_get:NnN}
-% \begin{syntax}
-% \cs{dt_get:NnnNTF} \meta{dt} \Arg{key} \meta{tl var} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Recovers the \meta{value} stored with \meta{key} from the current row in
-% the \meta{data table}, and places this in the \meta{token list variable}.
-% If the \meta{key} is not found in the \meta{row} of the \meta{data table}
-% then the \meta{token list variable} will contain the special marker
-% \cs{q_no_value}. The \meta{token list variable} is set within the
-% current \TeX{} group. The \meta{row} should be given as an
-% \meta{integer expression}. Once the \meta{token list variable} has been
-% assigned either the \meta{true code} or \meta{false code} will be left in
-% the input stream, depending on whether the \meta{key} was found.
-% See also \cs{dt_get:NnN}.
-% \end{function}
-%
-% \begin{function}{\dt_get:NnnN}
-% \begin{syntax}
-% \cs{dt_get:NnnN} \meta{dt} \Arg{row} \Arg{key} \meta{tl var}
-% \end{syntax}
-% Recovers the \meta{value} stored with \meta{key} from \meta{row} in the
-% \meta{data table}, and places this in the \meta{token list variable}. If
-% the \meta{key} is not found in the \meta{row} of the \meta{data table}
-% then the \meta{token list variable} will contain the special marker
-% \cs{q_no_value}. The \meta{token list variable} is set within the
-% current \TeX{} group. The \meta{row} should be given as an
-% \meta{integer expression}. See also \cs{dt_get:NnnNTF}.
-% \end{function}
-%
-% \begin{function}[TF]{\dt_get:NnnN}
-% \begin{syntax}
-% \cs{dt_get:NnnNTF} \meta{dt} \Arg{row} \Arg{key} \meta{tl var} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Recovers the \meta{value} stored with \meta{key} from \meta{row} in the
-% \meta{data table}, and places this in the \meta{token list variable}. If
-% the \meta{key} is not found in the \meta{row} of the \meta{data table}
-% then the \meta{token list variable} will contain the special marker
-% \cs{q_no_value}. The \meta{token list variable} is set within the
-% current \TeX{} group. The \meta{row} should be given as an
-% \meta{integer expression}. Once the \meta{token list variable} has been
-% assigned either the \meta{true code} or \meta{false code} will be left in
-% the input stream, depending on whether the \meta{key} was found.
-% See also \cs{dt_get:NnnN}.
-% \end{function}
-%
-% \section{Mapping to data tables}
-%
-% \begin{function}{\dt_map_variables:Nnn}
-% \begin{syntax}
-% \cs{dt_map_variables:Nnn} \meta{data table} \Arg{key--variable mapping} \Arg{code}
-% \end{syntax}
-% Applies the \meta{code} to each \meta{row} of the \meta{data table}. The
-% \meta{keys} of the \meta{data table} are mapped to variables by the
-% \meta{key--variable mapping}, which should be a key--value list of the form
-% \begin{verbatim}
-% key-a = \l_a_tl ,
-% key-b = \l_b_tl
-% ...
-% \end{verbatim}
-% It is not necessary to map all of the \meta{keys} in a \meta{data table}
-% to variables. If there is not \meta{value} for a \meta{key} in a row,
-% the variable will contain the marker \cs{q_no_value}. Assignment of the
-% \meta{variables} is local to the current \TeX{} group. The mapping
-% to rows is ordered.
-% \end{function}
-%
-% \begin{variable}{\g_dt_map_level_int}
-% The nesting level of the data table mapping is available as
-% \cs{g_dt_map_level_int}. Within a mapping, the \texttt{int} variable
-% \cs{l_dt_map_\meta{level}_row_int} is available so that the row
-% number being operated on is available. Thus
-% \begin{verbatim}
-% \int_use:c { l_dt_map_ \int_use:N \g_dt_map_level_int _row_int }
-% \end{verbatim}
-% will give the current row for the current mapping.
-% \end{variable}
-%
-% \begin{function}[rEXP]{\dt_map_break:, \dt_map_break:n}
-% \begin{syntax}
-% \cs{dt_map_break:}
-% \cs{dt_map_break:n} \Arg{tokens}
-% \end{syntax}
-% Used to terminate a \cs{dt_map_\ldots} function before all
-% entries in the \meta{data table} have been processed. This will
-% normally take place within a conditional statement, for example
-% \begin{verbatim}
-% \dt_map_variables:Nn \l_my_dt { a = \l_my_tl }
-% {
-% \str_if_eq:VnTF \l_my_tl { bingo }
-% { \dt_map_break: }
-% {
-% % Do something useful
-% }
-% }
-% \end{verbatim}
-% The \texttt{:n} variant will insert the \meta{tokens} into the input stream
-% after the mapping terminates. Use outside of a \cs{dt_map_\ldots} scenario
-% will lead to low level \TeX{} errors.
-% \end{function}
-%
-% \section{Data table conditionals}
-%
-% \begin{function}[EXP, pTF]{\dt_if_empty:N}
-% \begin{syntax}
-% \cs{dt_if_empty_p:N} \meta{dt}
-% \cs{dt_if_empty:NTF} \meta{dt} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the \meta{dt} is empty, containing no keys and no rows.
-% \end{function}
-%
-% \begin{function}[EXP, pTF]{\dt_if_in:Nn}
-% \begin{syntax}
-% \cs{dt_if_in_p:Nn} \meta{dt} \Arg{key}
-% \cs{dt_if_in:NnTF} \meta{dt} \Arg{key} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the \meta{key} is present in the \meta{data table} at all,
-% \emph{i.e.} if it is one of the columns of the table. This test will be
-% \texttt{true} even if none of the rows contain an entry for the \meta{key}.
-% \end{function}
-%
-% \begin{function}[EXP, pTF]{\dt_if_in_row:Nnn}
-% \begin{syntax}
-% \cs{dt_if_in_row_p:Nnn} \meta{dt} \Arg{row} \Arg{key}
-% \cs{dt_if_in_row:NnnTF} \meta{dt} \Arg{row} \Arg{key} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the \meta{key} is present in the \meta{row} of the
-% \meta{data table}. The \meta{row} may be given as an \meta{integer
-% expression}.
-% \end{function}
-%
-% \begin{function}[EXP, pTF]{\dt_if_in_row:Nn}
-% \begin{syntax}
-% \cs{dt_if_in_row_p:Nn} \meta{dt} \Arg{key}
-% \cs{dt_if_in_row:NnTF} \meta{dt} \Arg{key} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests if the \meta{key} is present in the current row of
-% \meta{data table}.
-% \end{function}
-%
-% \section{Variables}
-%
-% \begin{variable}{\c_empty_dt}
-% A permanently empty data table.
-% \end{variable}
-%
-% \begin{variable}{\l_tmpa_dt, \l_tmpb_dt, \g_tmpa_dt, \g_tmpb_dt}
-% Scratch data tables for general use: these are never used by the kernel.
-% \end{variable}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3dt} implementation}
-%
-% \begin{macrocode}
-%<*initex|package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=dt>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<*package>
-\ProvidesExplPackage
- {\ExplFileName}{\ExplFileDate}{\ExplFileVersion}{\ExplFileDescription}
-%</package>
-% \end{macrocode}
-%
-% \subsection{Structures}
-%
-% The structure of a data table must allow each row (record) to contain only
-% some of the keys, and for the keys to be removed after the table
-% is initialised. It also needs to ensure that a unique match can be made to
-% every item in the table. At the same time, it is desirable to keep all of
-% the information about the table in a single \TeX{} macro. This can be
-% achieved by packing the data into a structure in which each key and row is
-% numbered:
-% \begin{quote}
-% \Arg{rows} \\
-% \Arg{columns} \\
-% \cs{q_@@} \meta{key_1} \cs{q_@@} \meta{key_2} \cs{q_@@} \ldots \\
-% \cs{q_nil} \\
-% \cs{q_@@_header} \\
-% \cs{q_@@_row} \\
-% \meta{row_1} \\
-% \cs{q_@@} \meta{key_1} \cs{q_@@} \Arg{data_{1,1}} \\
-% \cs{q_@@} \meta{key_2} \cs{q_@@} \Arg{data_{1,2}} \\
-% \ldots \\
-% \cs{q_@@} \\
-% \cs{q_nil} \\
-% \cs{q_@@_row} \\
-% \meta{row_2} \\
-% \cs{q_@@} \meta{key_1} \cs{q_@@} \Arg{data_{2,1}} \\
-% \cs{q_@@} \meta{key_2} \cs{q_@@} \Arg{data_{2,2}} \\
-% \ldots \\
-% \cs{q_@@} \\
-% \cs{q_nil} \\
-% \cs{q_@@_row} \\
-% \ldots \\
-% \cs{q_@@_row}
-% \end{quote}
-%
-% \begin{variable}{\q_@@, \q_@@_row, \q_@@_header}
-% The quarks are set up.
-% \begin{macrocode}
-\quark_new:N \q_@@
-\quark_new:N \q_@@_row
-\quark_new:N \q_@@_header
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\c_empty_dt}
-% A permanently-empty data table, which therefore contains only the minimum
-% number of items necessary to comply with the structure above.
-% \begin{macrocode}
-\tl_const:Nn \c_empty_dt
- {
- { 0 }
- { 0 }
- \q_@@
- \q_nil
- \q_@@_header
- \q_@@_row
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Allocation and initialisation}
-%
-% \begin{macro}{\dt_new:N}
-% Internally, data tables are token lists, but an empty dt
-% is not an empty tl.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_new:N #1 { \cs_new_eq:NN #1 \c_empty_dt }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\dt_clear:N, \dt_gclear:N}
-% The same idea for clearing.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_clear:N #1 { \cs_set_eq:NN #1 \c_empty_dt }
-\cs_new_protected:Npn \dt_gclear:N #1 { \cs_gset_eq:NN #1 \c_empty_dt }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {\dt_clear_new:N, \dt_gclear_new:N}
-% Once again a simple copy from the token list functions.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_clear_new:N #1
- { \cs_if_exist:NTF #1 { \dt_clear:N #1 } { \dt_new:N #1 } }
-\cs_new_protected:Npn \dt_gclear_new:N #1
- { \cs_if_exist:NTF #1 { \dt_gclear:N #1 } { \dt_new:N #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\dt_set_eq:NN, \dt_gset_eq:NN}
-% Once again, these are simply copies from the token list functions.
-% \begin{macrocode}
-\cs_new_eq:NN \dt_set_eq:NN \tl_set_eq:NN
-\cs_new_eq:NN \dt_gset_eq:NN \tl_gset_eq:NN
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\l_tmpa_dt, \l_tmpb_dt, \g_tmpa_dt, \g_tmpb_dt}
-% Scratch tables.
-% \begin{macrocode}
-\dt_new:N \l_tmpa_dt
-\dt_new:N \l_tmpb_dt
-\dt_new:N \g_tmpa_dt
-\dt_new:N \g_tmpb_dt
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Splitting functions}
-%
-% \begin{macro}[aux]{\@@_split:nnnn}
-% \begin{macro}[aux]{\@@_split:w}
-% Two general auxiliaries. The \texttt{nnnn} function is used to apply the
-% \texttt{T} branch if a match is found and the \texttt{F} branch otherwise.
-% The \texttt{w} function is general purpose, and is used to define the
-% matching parameter set.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split:nnnn #1#2#3#4 { #3 #2 }
-\cs_new_protected:Npn \@@_split:w { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int,EXP]{\@@_split_header:NT}
-% \begin{macro}[aux,EXP]{\@@_split_header:wn}
-% Splits the header from the table, inserting the code required to then
-% process the split table. The \cs{q_nil} is also removed from the end of the
-% header, as it is essentially a distraction here.
-% \begin{macrocode}
-\cs_new:Npn \@@_split_header:NT #1#2
- { \exp_after:wN \@@_split_header:wn #1 \q_stop {#2} }
-\cs_new:Npn \@@_split_header:wn #1 \q_nil \q_@@_header #2 \q_stop #3
- { #3 {#1} { \q_@@_header #2 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_split_key:nnTF}
-% \begin{macro}[aux]{\@@_split_key_aux:nnTF}
-% Here, the split is made for a partial list within a row. The row is
-% basically the same as a property list, so the split here is almost
-% identical to that in \cs{prop_split_aux:NnTF}. The row-end data is set up
-% such that it will not interfere with this process.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split_key:nnTF #1#2
- { \exp_args:No \@@_split_key_aux:nnTF { \tl_to_str:n {#2} } {#1} }
-\cs_new_protected:Npn \@@_split_key_aux:nnTF #1#2
- {
- \cs_set_protected:Npn \@@_split:w
- ##1 \q_@@ #1 \q_@@ ##2##3##4 \q_mark ##5 \q_stop
- { \@@_split:nnnn ##3 { { ##1 \q_@@ } {##2} {##4} } }
- \@@_split:w #2 \q_mark
- \q_@@ #1 \q_@@ { } { ? \use_ii:nn { } } \q_mark \q_stop
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_split_key_list:NnTF}
-% \begin{macro}[aux]{\@@_split_key_list_aux:NnTF}
-% Finding a key in the header uses a similar approach to finding a key in
-% a property list. Here, if the key is found there will always be at least
-% one token between \cs{q_@@} and \cs{q_@@_header} due to the \cs{q_nil}
-% which is part of a new table. The use of |##1##2##3| in \cs{@@_split:w}
-% here is to deal with the overall number of rows and keys. The set up here
-% means that these will always be unbraced then rebraced: simply grabbing
-% |##1##2| to include this and anything before the key of interest will give
-% variable results depending on whether the match is to the very first key or not.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split_key_list:NnTF #1#2
- { \exp_args:NNo \@@_split_key_list_aux:NnTF #1 { \tl_to_str:n {#2} } }
-\cs_new_protected:Npn \@@_split_key_list_aux:NnTF #1#2
- {
- \cs_set_protected:Npn \@@_split:w
- ##1##2##3 \q_@@ #2 \q_@@ ##4##5 \q_@@_header ##6 \q_mark ##7 \q_stop
- {
- \@@_split:nnnn ##4
- { { {##1} {##2} ##3 \q_@@ } { ##4##5 \q_@@_header ##6 } }
- }
- \exp_after:wN \@@_split:w #1 \q_mark
- \q_@@ #2 \q_@@ { ? \use_ii:nn { } } \q_@@_header \q_mark \q_stop
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[int]{\@@_split_row:NnTF}
-% \begin{macro}[aux]{\@@_split_row_aux:NnTF, \@@_split_row_aux:NfTF}
-% The usual approach, here using the fact that each row start with row number
-% and ends with \cs{q_nil} so there will always be at least one token to be
-% absorbed as |##2|. The only odd thing to watch here is that the row
-% number is evaluated so that higher-level functions in the main do not
-% need to have an \texttt{f}-type variant.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_split_row:NnTF #1#2
- { \@@_split_row_aux:NfTF #1 { \int_eval:n {#2} } }
-\cs_new_protected:Npn \@@_split_row_aux:NnTF #1#2
- {
- \cs_set_protected:Npn \@@_split:w
- ##1 \q_@@_row #2 \q_@@ ##2##3 \q_@@_row ##4 \q_mark ##5 \q_stop
- {
- \@@_split:nnnn ##2
- { { ##1 \q_@@_row } { #2 \q_@@ ##2##3 } {##4} }
- }
- \exp_after:wN \@@_split:w #1 \q_mark
- \q_@@_row #2 \q_@@ { ? \use_ii:nn { } } \q_@@_row \q_mark \q_stop
- }
-\cs_generate_variant:Nn \@@_split_row_aux:NnTF { Nf }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Adding and removing data}
-%
-% \begin{macro}{\dt_add_key:Nn, \dt_gadd_key:Nn}
-% \begin{macro}[aux]{\@@_add_key:NNn}
-% \begin{macro}[aux]{\@@_add_key:NNnnn}
-% \begin{macro}[aux]{\@@_add_key:NNnnn}
-% Here, there are two stages. If the key is already present in the list of
-% known keys then no action is taken, and the split list is thrown away.
-% On the other hand, if the key is not present then the header and body
-% are separated and the key is added to the end of the list of known keys
-% (hence keys are ordered). The \cs{@@_split_header:Nn} function will have
-% removed the \cs{q_nil} from the header, and so it is put back in here.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_add_key:Nn { \@@_add_key:NNn \tl_set:Nx }
-\cs_new_protected_nopar:Npn \dt_gadd_key:Nn { \@@_add_key:NNn \tl_gset:Nx }
-\cs_new_protected:Npn \@@_add_key:NNn #1#2#3
- {
- \@@_split_key_list:NnTF #2 {#3}
- { \use_none:nn }
- {
- \@@_split_header:NT #2
- { \@@_add_key:NNnnn #1 #2 {#3} }
- }
- }
-\cs_new_protected:Npn \@@_add_key:NNnnn #1#2#3#4#5
- { \@@_add_key:NNnnnwnn #1 #2 #4 \q_stop {#3} {#5} }
-\cs_new_protected:Npn \@@_add_key:NNnnnwnn #1#2#3#4#5 \q_stop #6#7
- {
- #1 #2
- {
- {#3}
- { \int_eval:n { #4 + \c_one } }
- \exp_not:n {#5}
- \tl_to_str:n {#6}
- \exp_not:n { \q_@@ \q_nil #7 }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\dt_add_row:N, \dt_gadd_row:N}
-% \begin{macro}[aux]{\@@_add_row:NN}
-% \begin{macro}[aux]{\@@_add_row:NnN, \@@_add_row:NfN}
-% \begin{macro}[aux,EXP]{\@@_add_row:nw}
-% Adding a row means incrementing the total number and adding the structure
-% of an empty row. As finding the rows will get slow for large tables, this
-% is only done once.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_add_row:N { \@@_add_row:NN \tl_set:Nx }
-\cs_new_protected_nopar:Npn \dt_gadd_row:N { \@@_add_row:NN \tl_gset:Nx }
-\cs_new_protected:Npn \@@_add_row:NN #1#2
- { \@@_add_row:NfN #1 { \int_eval:n { \dt_rows:N #2 + \c_one } } #2 }
-\cs_new_protected:Npn \@@_add_row:NnN #1#2#3
- {
- #1 #3
- {
- {#2}
- \exp_after:wN \@@_add_row:nw #3 \q_stop
- #2
- \exp_not:n { \q_@@ \q_nil \q_@@_row }
- }
- }
-\cs_generate_variant:Nn \@@_add_row:NnN { Nf }
-\cs_new:Npn \@@_add_row:nw #1#2 \q_stop { \exp_not:n {#2} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\dt_put:Nnn, \dt_gput:Nnn}
-% Adding to the current row is simply a special case of adding to an
-% arbitrary row.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_put:Nnn #1
- { \dt_put:Nnnn #1 { \dt_rows:N #1 } }
-\cs_new_protected:Npn \dt_gput:Nnn #1
- { \dt_gput:Nnnn #1 { \dt_rows:N #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\dt_put:Nnnn, \dt_gput:Nnnn}
-% \begin{macro}[aux]{\@@_put:NNNnnn}
-% \begin{macro}[aux]{\@@_put:NNnnnnn}
-% \begin{macro}[aux]{\@@_put_update:NNnnnnnnn}
-% \begin{macro}[aux]{\@@_put_add_to_row:NNnnnnn}
-% \begin{macro}[aux, EXP]{\@@_put_add_to_row_aux:w}
-% Adding to a row is a slightly complex procedure. The lead-off is the
-% standard combination across the local and global routes.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_put:Nnnn
- { \@@_put:NNNnnn \dt_add_key:Nn \tl_set:Nx }
-\cs_new_protected_nopar:Npn \dt_gput:Nnnn
- { \@@_put:NNNnnn \dt_gadd_key:Nn \tl_gset:Nx }
-% \end{macrocode}
-% Add the key to the list those known, if necessary, then check that the
-% row requested makes sense.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_put:NNNnnn #1#2#3#4#5#6
- {
- #1 #3 {#5}
- \@@_split_row:NnTF #3 {#4}
- { \@@_put:NNnnnnn #2 #3 {#5} {#6} }
- {
- \__msg_kernel_error:nnxxx { dt } { unknown-row }
- { \token_to_str:N #3 } { \int_eval:n {#4} } { \dt_rows:N #3 }
- }
- }
-% \end{macrocode}
-% At this stage, the arguments are
-% \begin{enumerate}
-% \item the set function \cs{tl_(g)set:Nx},
-% \item the data table,
-% \item the key,
-% \item the value,
-% \item the data table before the row,
-% \item the extracted data table row,
-% \item the data table after the row.
-% \end{enumerate}
-% Splitting on the key will then leave three further items in the input
-% stack if the key is already present. So there is some care needed sending
-% the parameters forward without running out of \TeX{} arguments.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_put:NNnnnnn #1#2#3#4#5#6#7
- {
- \@@_split_key:nnTF {#6} {#3}
- { \@@_put_update:NNnnnnnnn #1 #2 {#3} {#4} {#5} {#7} }
- { \@@_put_add_to_row:NNnnnnn #1 #2 {#3} {#4} {#5} {#6} {#7} }
- }
-% \end{macrocode}
-% The arguments here are
-% \begin{enumerate}
-% \item the set function \cs{tl_(g)set:Nx},
-% \item the data table,
-% \item the key,
-% \item the value,
-% \item the data table before the row,
-% \item the data table after the row,
-% \item the row before the key,
-% \item the current value for the key
-% \item the row after the key.
-% \end{enumerate}
-% What happens here is a reconstruction of the table: everything except
-% |#8| is needed. To try to keep things clear, there are a few more
-% \cs{exp_not:n} here than formally required.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_put_update:NNnnnnnnn #1#2#3#4#5#6#7#8#9
- {
- #1 #2
- {
- \exp_not:n { #5 #7 }
- \tl_to_str:n {#3}
- \exp_not:n { \q_@@ {#4} \q_@@ #9 \q_@@_row #6 }
- }
- }
-% \end{macrocode}
-% A slightly more complex case when adding an item. The arguments here are
-% identical to those for \cs{@@_put:NNnnnnnn}. The row has not been
-% split, so the \cs{q_nil} there is removed and re-added to come after the
-% new content.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_put_add_to_row:NNnnnnn #1#2#3#4#5#6#7
- {
- #1 #2
- {
- \exp_not:n {#5}
- \exp_not:o { \@@_put_add_to_row_aux:w #6 }
- \tl_to_str:n {#3}
- \exp_not:n { \q_@@ {#4} \q_@@ \q_nil \q_@@_row #7 }
- }
- }
-\cs_new:Npn \@@_put_add_to_row_aux:w #1 \q_nil {#1}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\dt_keys:N}
-% \begin{macro}[EXP, aux]{\@@_keys:nnw}
-% \begin{macro}[EXP]{\dt_rows:N}
-% The number of rows in a dt is the very first entry. Getting the number of
-% keys is almost the same, except a custom auxiliary is needed.
-% \begin{macrocode}
-\cs_new:Npn \dt_keys:N #1 { \exp_after:wN \@@_keys:nnw #1 \q_stop }
-\cs_new:Npn \@@_keys:nnw #1#2#3 \q_stop {#2}
-\cs_new:Npn \dt_rows:N #1
- { \exp_after:wN \use_i_delimit_by_q_stop:nw #1 \q_stop }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Removing data}
-%
-% \begin{macro}{\dt_remove:Nn,\dt_gremove:Nn}
-% Deleting to the current row is simply a special case of deleting to an
-% arbitrary row.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_remove:Nn #1
- { \dt_remove:Nnn #1 { \dt_rows:N #1 } }
-\cs_new_protected:Npn \dt_gremove:Nn #1
- { \dt_gremove:Nnn #1 { \dt_rows:N #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\dt_remove:Nnn, \dt_gremove:Nnn}
-% \begin{macro}[aux]{\dt_remove_aux:NNnn}
-% \begin{macro}[aux]{\dt_remove_aux:NNnnnn}
-% \begin{macro}[aux]{\dt_remove_aux:NNnnnnn}
-% Deleting a single entry from a single row means first splitting by row,
-% then splitting by key, and finally doing the assignment. If the row or the
-% key are not present then the entire function does nothing at all.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_remove:Nnn { \dt_remove_aux:NNnn \tl_set:Nn }
-\cs_new_protected_nopar:Npn \dt_gremove:Nnn { \dt_remove_aux:NNnn \tl_gset:Nn }
-\cs_new_protected:Npn \dt_remove_aux:NNnn #1#2#3#4
- {
- \@@_split_row:NnTF #2 {#3}
- { \dt_remove_aux:NNnnnn #1 #2 {#4} }
- { }
- }
-\cs_new_protected:Npn \dt_remove_aux:NNnnnn #1#2#3#4#5#6
- {
- \@@_split_key:nnTF {#5} {#3}
- { \dt_remove_aux:NNnnnnn #1 #2 {#4} {#6} }
- { }
- }
-\cs_new_protected:Npn \dt_remove_aux:NNnnnnn #1#2#3#4#5#6#7
- { #1 #2 { #3 #5 #7 #4 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\dt_remove_key:Nn, \dt_gremove_key:Nn}
-% \begin{macro}[aux]{\dt_remove_key_aux:NNn}
-% \begin{macro}[aux]{\dt_remove_key_aux:nNNnn}
-% \begin{macro}[aux, EXP]{\dt_remove_key_aux:w}
-% Deleting a key also removes from the table itself, so that there is no
-% need to do any awkward checks when extracting data from the table. (It's
-% likely that there will be more cases of accessing data than deleting
-% rows). The deletion mapping ignores rows entirely and just pulls out
-% matching key--value pairs, as this reduces the number of matches needed
-% to a minimum.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_remove_key:Nn
- { \dt_remove_key_aux:NNn \tl_set:Nx }
-\cs_new_protected_nopar:Npn \dt_gremove_key:Nn
- { \dt_remove_key_aux:NNn \tl_gset:Nx }
-\cs_new_protected:Npn \dt_remove_key_aux:NNn #1#2#3
- {
- \@@_split_key_list:NnTF #2 {#3}
- { \exp_args:No \dt_remove_key_aux:nNNnn { \tl_to_str:n {#3} } #1 #2 }
- { }
- }
-\cs_new_protected:Npn \dt_remove_key_aux:nNNnn #1#2#3#4#5
- { \dt_remove_key_aux:nNNnnwn {#1} #2 #3 #4 \q_stop {#5} }
-\cs_new_protected:Npn \dt_remove_key_aux:nNNnnwn #1#2#3#4#5#6 \q_stop #7
- {
- \cs_set:Npn \dt_remove_key_aux:w ##1 \q_@@ #1 \q_@@ ##2 ##3
- {
- \exp_not:n {##1}
- \__quark_if_recursion_tail_break:nN {##3} \dt_map_break:
- \dt_remove_key_aux:w ##3
- }
-
- #2 #3
- {
- {#4}
- { \int_eval:n { #5 - \c_one } }
- \exp_not:n {#6}
- \dt_remove_key_aux:w #7 \q_@@ #1 \q_@@ { } \q_recursion_tail
- \__prg_break_point:Nn \dt_map_break: { }
- }
- }
-\cs_new:Npn \dt_remove_key_aux:w { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\dt_remove_row:Nn, \dt_gremove_row:Nn}
-% \begin{macro}[aux]{\dt_remove_row_aux:NNn}
-% \begin{macro}[aux]{\dt_remove_row_aux:NNnnnn}
-% \begin{macro}[aux, EXP]{\dt_remove_row_aux:nw}
-% \begin{macro}[aux, EXP]{\dt_remove_row_loop:nw}
-% Removing a row is a slightly complex operation as there are two stages.
-% The row itself is easy enough to remove, but then all later rows have to
-% be renumbers.
-% \begin{macrocode}
-\cs_new_protected_nopar:Npn \dt_remove_row:Nn
- { \dt_remove_row_aux:NNn \tl_set:Nx }
-\cs_new_protected_nopar:Npn \dt_gremove_row:Nn
- { \dt_remove_row_aux:NNn \tl_gset:Nx }
-\cs_new_protected:Npn \dt_remove_row_aux:NNn #1#2#3
- {
- \@@_split_row:NnTF #2 {#3}
- { \dt_remove_row_aux:NNnnn #1 #2 }
- { }
- }
-% \end{macrocode}
-% If the code gets here, then |#3| is the table before the removed row,
-% |#4| is the removed row and |#5| is everything afterwards. The first stage
-% is to work out the new number of rows, then include all of |#3| except
-% the old number of rows. The removed row |#4| is thrown away, and then there
-% is a loop to recalculate the row numbers for all of the later rows.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_remove_row_aux:NNnnn #1#2#3#4#5
- {
- #1 #2
- {
- { \int_eval:n { \dt_rows:N #2 - \c_one } }
- \dt_remove_row_aux:nw #3 \q_stop
- \dt_remove_row_loop:nw #5 \q_recursion_tail \q_@@_row
- \__prg_break_point:Nn \dt_map_break: { }
- }
- }
-\cs_new_eq:NN \dt_remove_row_aux:nw \@@_add_row:nw
-\cs_new:Npn \dt_remove_row_loop:nw #1#2 \q_@@_row
- {
- \__quark_if_recursion_tail_break:nN {#1} \dt_map_break:
- \int_eval:n { #1 - \c_one }
- \exp_not:n { #2 \q_@@_row }
- \dt_remove_row_loop:nw
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Accessing data in data tables}
-%
-% \begin{macro}{\dt_get:NnnN}
-% \begin{macro}[aux]{\dt_get_aux:nNnnn}
-% \begin{macro}[aux]{\dt_get_aux:nNnnn}
-% Recovering a value from a row means doing two splits: first find the row,
-% then find the key. Nothing exciting, just a question of tracking the
-% returned items.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_get:NnnN #1#2#3#4
- {
- \@@_split_row:NnTF #1 {#2}
- { \dt_get_aux:nNnnn {#3} #4 }
- { \tl_set:Nn #4 { \q_no_value } }
- }
-\cs_new_protected:Npn \dt_get_aux:nNnnn #1#2#3#4#5
- {
- \@@_split_key:nnTF {#4} {#1}
- { \dt_get_aux:Nnnn #2 }
- { \tl_set:Nn #2 { \q_no_value } }
- }
-\cs_new_protected:Npn \dt_get_aux:Nnnn #1#2#3#4 { \tl_set:Nn #1 {#3} }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[TF]{\dt_get:NnnN}
-% \begin{macro}[aux]{\@@_get_true:nNnnn}
-% \begin{macro}[aux]{\@@_get_true:Nnnn}
-% The same idea as the standard method, but built as a conditional.
-% \begin{macrocode}
-\prg_new_protected_conditional:Npnn \dt_get:NnnN #1#2#3#4 { T , F , TF }
- {
- \@@_split_row:NnTF #1 {#2}
- { \@@_get_true:nNnnn {#3} #4 }
- { \prg_return_false: }
- }
-\cs_new_protected:Npn \@@_get_true:nNnnn #1#2#3#4#5
- {
- \@@_split_key:nnTF {#4} {#1}
- { \@@_get_true:Nnnn #2 }
- { \prg_return_false: }
- }
-\cs_new_protected:Npn \@@_get_true:Nnnn #1#2#3#4
- {
- \tl_set:Nn #1 {#3}
- \prg_return_true:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\dt_get:NnN}
-% \begin{macro}[TF]{\dt_get:NnN}
-% Simple wrappers.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_get:NnN #1
- { \dt_get:NnnN #1 { \dt_rows:N #1 } }
-\cs_new_protected:Npn \dt_get:NnNT #1
- { \dt_get:NnnNF #1 { \dt_rows:N #1 } }
-\cs_new_protected:Npn \dt_get:NnNF #1
- { \dt_get:NnnNF #1 { \dt_rows:N #1 } }
-\cs_new_protected:Npn \dt_get:NnNTF #1
- { \dt_get:NnnNTF #1 { \dt_rows:N #1 } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Mapping to data tables}
-%
-% \begin{variable}{\g_dt_map_level_int}
-% Unlike other mappings, the mapping level here has to be available
-% and so linked to the module.
-% \begin{macrocode}
-\int_new:N \g_dt_map_level_int
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\dt_map_variables:Nnn}
-% \begin{macro}[aux]{\@@_map_variables_key:nn}
-% \begin{macro}[aux]{\@@_map_variables:nnn}
-% \begin{macro}[aux]{\@@_map_variables:nNNw}
-% \begin{macro}[aux]{\@@_map_variables:nnw}
-% Mapping across a data table is more complex than other cases as there
-% are two \enquote{dimensions} to worry about: the rows and the keys.
-% The first stage of the mapping is to convert the key--variable mapping
-% into a sequence that can be used later. This is done with the assumption
-% that any key without a variable can simply be dropped entirely. The
-% header of the table is then split from the body.
-% \begin{macrocode}
-\cs_new_protected:Npn \dt_map_variables:Nnn #1#2#3
- {
- \int_gincr:N \g_dt_map_level_int
- \seq_gclear_new:c { g_dt_map_ \int_use:N \g_dt_map_level_int _seq }
- \keyval_parse:NNn \use_none:n \@@_map_variables_key:nn {#2}
- \@@_split_header:NT #1 { \@@_map_variables:nnn {#3} }
- }
-\cs_new_protected:Npn \@@_map_variables_key:nn #1#2
- {
- \seq_gput_right:cn { g_dt_map_ \int_use:N \g_dt_map_level_int _seq }
- { {#1} #2 }
- }
-% \end{macrocode}
-% As \cs{@@_split_header:NT} will leave a couple of tokens at the front
-% of the body part of the split, there is a quick piece of tidying up
-% to remove them.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_map_variables:nnn #1#2#3
- { \@@_map_variables:nNNw {#1} #3 \q_stop }
-\cs_new_protected:Npn \@@_map_variables:nNNw
- #1 \q_@@_header \q_@@_row #2 \q_stop
- {
- \int_zero_new:c { l_dt_map_ \int_use:N \g_dt_map_level_int _row_int }
- \@@_map_variables:nnw {#1} #2 { } \q_recursion_tail \q_@@_row
- \__prg_break_point:Nn \dt_map_break:
- { \int_gdecr:N \g_dt_map_level_int }
- }
-\cs_new_protected:Npn \@@_map_variables:nnw #1#2#3#4 \q_@@_row
- {
- \__quark_if_recursion_tail_break:nN {#3} \dt_map_break:
- \seq_map_inline:cn { g_dt_map_ \int_use:N \g_dt_map_level_int _seq }
- { \dt_get_aux:nNnnn ##1 { } {#3#4} { } }
- #1
- \int_incr:c { l_dt_map_ \int_use:N \g_dt_map_level_int _row_int }
- \@@_map_variables:nnw {#1}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[rEXP]{\dt_map_break:}
-% \begin{macro}[rEXP]{\dt_map_break:n}
-% The break statements use the general \cs{__prg_map_break:Nn}.
-% \begin{macrocode}
-\cs_new_nopar:Npn \dt_map_break:
- { \__prg_map_break:Nn \dt_map_break: { } }
-\cs_new_nopar:Npn \dt_map_break:n
- { \__prg_map_break:Nn \dt_map_break: }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Data table conditionals}
-%
-% \begin{macro}[pTF, EXP]{\dt_if_empty:N}
-% An empty data table has not only no rows but also no keys. (The number of
-% rows can be tested using \cs{dt_rows:N} and an \texttt{int} test.)
-% \begin{macrocode}
-\prg_new_conditional:Npnn \dt_if_empty:N #1 { T , F , TF , p }
- {
- \if_meaning:w #1 \c_empty_dt
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[pTF, EXP]{\dt_if_in:Nn}
-% \begin{macro}[aux, EXP]{\@@_if_in:nnn}
-% \begin{macro}[aux, EXP]{\@@_if_in:nwN}
-% \begin{macro}[aux, EXP]{\@@_if_in:n}
-% Expandably checking for the presence of a key in the table as a whole
-% requires a mapping to the header. The idea is the usual recursion set
-% up with a string-based comparison only after checking for the end of
-% the loop.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \dt_if_in:Nn #1#2 { p , T , F , TF }
- { \@@_split_header:NT #1 { \@@_if_in:nnn {#2} } }
-\cs_new:Npn \@@_if_in:nnn #1#2#3
- {
- \exp_last_unbraced:Nno \@@_if_in:nwN {#1} { \use_none:nn #2 }
- \q_recursion_tail \q_@@
- \__prg_break_point:
- }
-\cs_new:Npn \@@_if_in:nwN #1#2 \q_@@
- {
- \if_meaning:w \q_recursion_tail #2
- \exp_after:wN \__prg_break:n
- \else:
- \exp_after:wN \use_none:n
- \fi:
- { \prg_return_false: }
- \str_if_eq:nnTF {#1} {#2}
- { \__prg_break:n { \prg_return_true: } }
- { \@@_if_in:nwN {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[pTF, EXP]{\dt_if_in_row:Nnn}
-% \begin{macro}[aux, EXP]{\@@_if_in_row:nw}
-% \begin{macro}[aux, EXP]{\@@_if_in_row:nn}
-% \begin{macro}[aux, EXP]{\@@_if_in_row:nwn}
-% \begin{macro}[aux, EXP]{\@@_if_in_row:N}
-% Finding a key in a single row in an expandable way requires two mappings.
-% To start of with, there is a search for the row. This uses for termination
-% the fact that each row starts \cs{q_@@_row} and ends \cs{q_nil}, and
-% always contains at least the row number as the first \meta{balanced
-% text}. That can be replaced by the tail marker to terminate iteration:
-% all that is then needed is the correct placement of the clean-up code.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \dt_if_in_row:Nnn #1#2#3 { p , T , F , TF }
- {
- \exp_last_unbraced:Nno \@@_if_in_row:nw {#2} #1
- \q_recursion_tail \q_nil
- \__prg_break_point:
- { \tl_to_str:n {#3} }
- }
-% \end{macrocode}
-% The row iteration does a numerical comparison to see if the target row has
-% been found. That means that the row argument does not need to be converted
-% to a number earlier.
-% \begin{macrocode}
-\cs_new:Npn \@@_if_in_row:nw #1#2 \q_@@_row #3#4 \q_nil
- {
- \if_meaning:w \q_recursion_tail #3
- \exp_after:wN \__prg_break:n
- \else:
- \exp_after:wN \use_none:n
- \fi:
- {
- \use_i:nn
- \prg_return_false:
- }
- \int_compare:nNnTF {#1} = {#3}
- { \__prg_break:n { \exp_args:Nno \@@_if_in_row:nn {#4} } }
- { \@@_if_in_row:nw {#1} }
- }
-% \end{macrocode}
-% The second iteration is along the row. This is basically the same as
-% \cs{prop_if_in:NnTF} with the \cs{q_@@} in place of \cs{q__prop}.
-% \begin{macrocode}
-\cs_new:Npn \@@_if_in_row:nn #1#2
- {
- \@@_if_in_row:nwn {#2} #1 {#2} \q_@@ { } \q_recursion_tail
- \__prg_break_point:
- }
-\cs_new:Npn \@@_if_in_row:nwn #1 \q_@@ #2 \q_@@ #3
- {
- \str_if_eq_x:nnTF {#1} {#2}
- { \@@_if_in_row:N }
- { \@@_if_in_row:nwn {#1} }
- }
-\cs_new:Npn \@@_if_in_row:N #1
- {
- \if_meaning:w \q_@@ #1
- \prg_return_true:
- \else:
- \prg_return_false:
- \fi:
- \__prg_break:
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}[pTF, EXP]{\dt_if_in_row:Nn}
-% Simple wrappers.
-% \begin{macrocode}
-\cs_new:Npn \dt_if_in_row_p:Nn #1
- { \dt_if_in_row_p:Nnn #1 { \dt_rows:N #1 } }
-\cs_new:Npn \dt_if_in_row:NnT #1
- { \dt_if_in_row:NnnT #1 { \dt_rows:N #1 } }
-\cs_new:Npn \dt_if_in_row:NnF #1
- { \dt_if_in_row:NnnF #1 { \dt_rows:N #1 } }
-\cs_new:Npn \dt_if_in_row:NnTF #1
- { \dt_if_in_row:NnnTF #1 { \dt_rows:N #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Messages}
-%
-% \begin{macrocode}
-\__msg_kernel_new:nnnn { dt } { unknown-row }
- { Data~table~#1~does~not~contain~a~row~'#2'. }
- {
- Data~table~#1~contains~#3~rows.~These~must~be~accessed~by~number:~row~
- #2~is~not~present~in~the~table.
- }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</initex|package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.ins b/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.ins
deleted file mode 100644
index 54db0f43b92..00000000000
--- a/Master/texmf-dist/source/latex/l3experimental/l3dt/l3dt.ins
+++ /dev/null
@@ -1,40 +0,0 @@
-\iffalse meta-comment
-
-File l3dt.ins Copyright (C) 2011 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
-
- http://www.latex-project.org/lppl.txt
-
-This file is part of the "l3trial bundle" (The Work in LPPL)
-and all files in that bundle must be distributed together.
-
-The released version of this bundle is available from CTAN.
-
-\fi
-
-\input l3docstrip.tex
-\askforoverwritefalse
-
-\preamble
-
-EXPERIMENTAL CODE
-
-Do not distribute this file without also distributing the
-source files specified above.
-
-Do not distribute a modified version of this file.
-
-\endpreamble
-% stop docstrip adding \endinput
-\postamble
-\endpostamble
-
-\keepsilent
-
-\generate{\file{l3dt.sty}{\from{l3dt.dtx}{package}}}
-
-\endbatchfile
diff --git a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.dtx b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.dtx
index 90a2575bcd0..17c2b53a187 100644
--- a/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/l3str/l3str.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: l3str.dtx Copyright (C) 2011-2013 The LaTeX3 Project
+%% File: l3str.dtx Copyright (C) 2011-2014 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
@@ -35,7 +35,7 @@
%
%<*driver|package>
\RequirePackage{expl3}
-\GetIdInfo$Id: l3str.dtx 4576 2013-07-24 21:40:24Z joseph $
+\GetIdInfo$Id: l3str.dtx 4728 2014-05-04 13:25:37Z joseph $
{L3 Experimental strings}
%</driver|package>
%<*driver>
@@ -66,7 +66,7 @@
% \date{Released \ExplFileDate}
%
% \maketitle
-%
+%
% \tableofcontents
%
% \begin{documentation}
@@ -112,40 +112,6 @@
% |\|\meta{character}.
% \end{variable}
%
-% \begin{function}[EXP]{\tl_to_str:N, \tl_to_str:n}
-% \begin{syntax}
-% \cs{tl_to_str:N} \meta{tl var}
-% \cs{tl_to_str:n} \Arg{token list}
-% \end{syntax}
-% Converts the \meta{token list} to a \meta{string}, leaving the
-% resulting character tokens in the input stream.
-% \begin{texnote}
-% Converting a \meta{token list} to a \meta{string} yields a
-% concatenation of the string representations of every token in the
-% \meta{token list}.
-% The string representation of a control sequence is
-% \begin{itemize}
-% \item an escape character, whose character code is given by the
-% internal parameter \tn{escapechar}, absent if the
-% \tn{escapechar} is negative;
-% \item the control sequence name, as defined by \cs{cs_to_str:N};
-% \item a space, unless the control sequence name is a single
-% character whose category at the time of expansion of
-% \cs{tl_to_str:n} is not \enquote{letter}.
-% \end{itemize}
-% The string representation of an explicit character token is that
-% character, doubled in the case of (explicit) macro parameter
-% characters (normally |#|).
-% In particular, the string representation of a token list may
-% depend on the category codes in effect when it is evaluated, and
-% the value of the \tn{escapechar}: for instance |\tl_to_str:n {\a}|
-% normally produces the three character \enquote{backslash},
-% \enquote{lower-case a}, \enquote{space}, but it may also produce a
-% single \enquote{lower-case a} if the escape character is negative
-% and \texttt{a} is currently not a letter.
-% \end{texnote}
-% \end{function}
-%
% \begin{function}{\str_new:N, \str_new:c}
% \begin{syntax}
% \cs{str_new:N} \meta{str~var}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
index 1d2a22efea3..8efec4fc252 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xcoffins/xcoffins.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-%% File: xcoffins.dtx Copyright(C) 2010,2011 The LaTeX3 Project
+%% File: xcoffins.dtx Copyright(C) 2010-2012,2014 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
@@ -36,13 +36,13 @@
%
%<*driver|package>
\RequirePackage{xparse}
-\GetIdInfo$Id: xcoffins.dtx 4029 2012-07-29 18:16:03Z bruno $
+\GetIdInfo$Id: xcoffins.dtx 4728 2014-05-04 13:25:37Z joseph $
{L3 Experimental design-level coffins}
%</driver|package>
%<*driver>
\documentclass[full]{l3doc}
\usepackage{xcoffins} % Not yet part of expl3, so not in l3doc
-\usepackage{xcolor} % As coffins only loads basic colour support
+\usepackage{xcolor} % As coffins only loads basic color support
\NewCoffin \ExampleCoffin
\NewCoffin \SmallCoffin
\NewCoffin \OutputCoffin
@@ -131,9 +131,9 @@
% Before any alignment can take place, coffins must be created and
% their contents must be created. All coffin operations are local
% to the current \TeX{} group with the exception of coffin creation.
-% Coffins are also \enquote{colour safe}: in contrast to the code-level
+% Coffins are also \enquote{color safe}: in contrast to the code-level
% \cs{box_\ldots} functions there is no need to add additional grouping
-% to coffins when dealing with colour.
+% to coffins when dealing with color.
%
% \begin{function}{\NewCoffin}
% \begin{syntax}
@@ -620,7 +620,7 @@
%
% \begin{function}{\DisplayCoffinHandles}
% \begin{syntax}
-% \cs{DisplayCoffinHandles} \meta{coffin} \Arg{colour}
+% \cs{DisplayCoffinHandles} \meta{coffin} \Arg{color}
% \end{syntax}
% This function first calculates the intersections between all of
% the \meta{poles} of the \meta{coffin} to give a set of
@@ -628,20 +628,20 @@
% location in the source, with the position of the \meta{handles}
% marked on the coffin. The \meta{handles} will be labelled as part
% of this process: the locations of the \meta{handles} and the labels
-% are both printed in the \meta{colour} specified.
+% are both printed in the \meta{color} specified.
% \end{function}
%
% \begin{function}{\MarkCoffinHandle}
% \begin{syntax}
% \cs{MarkCoffinHandle} \meta{coffin}
-% ~~[ \meta{pole1} , \meta{pole2} ] \Arg{colour}
+% ~~[ \meta{pole1} , \meta{pole2} ] \Arg{color}
% \end{syntax}
% This function first calculates the \meta{handle} for the
% \meta{coffin} as defined by the intersection of \meta{pole1} and
% \meta{pole2}. It then marks the position of the \meta{handle}
% on the \meta{coffin}. The \meta{handle} will be labelled as part of
% this process: the location of the \meta{handle} and the label are
-% both printed in the \meta{colour} specified. If no \meta{poles} are
+% both printed in the \meta{color} specified. If no \meta{poles} are
% give, the default |(H,l)| is used.
% \end{function}
%
@@ -689,7 +689,7 @@
% \begin{macrocode}
%<*package>
% \end{macrocode}
-%
+%
% \begin{macrocode}
%<@@=coffin>
% \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 3bbe92eacc0..f22931ea3b9 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/l3galley.dtx
@@ -1,7 +1,7 @@
% \iffalse
%
%% File: l3galley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
-%% (C) 2010-2013 The LaTeX3 Project
+%% (C) 2010-2014 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
@@ -37,7 +37,7 @@
%
%<*driver|package>
\RequirePackage{xparse}
-\GetIdInfo$Id: l3galley.dtx 4494 2013-05-24 06:27:01Z joseph $
+\GetIdInfo$Id: l3galley.dtx 4728 2014-05-04 13:25:37Z joseph $
{L3 Experimental galley code}
%</driver|package>
%<*driver>
@@ -172,7 +172,7 @@
% \end{function}
%
% \subsection{Between paragraphs}
-%
+%
% \begin{variable}{\g_galley_previous_par_lines_int}
% The number of lines in the preceding conceptual paragraph. This may not
% correspond to the \TeX{} \tn{prevgraf} primitive value as one conceptual
@@ -355,7 +355,7 @@
% the interaction of a display block with the paragraphs before and after it
% can be adjusted independent of the design of text.
% \end{function}
-%
+%
% \subsection{Hyphenation}
%
% \begin{variable}{\l_galley_hyphen_left_int}
@@ -562,7 +562,7 @@
% \end{variable}
%
% \section{Paragraphs}
-%
+%
% \begin{function}{\galley_par:}
% \begin{syntax}
% \cs{galley_par:}
@@ -675,7 +675,7 @@
% \begin{macrocode}
%<*initex|package>
% \end{macrocode}
-%
+%
% \begin{macrocode}
%<@@=galley>
% \end{macrocode}
@@ -691,7 +691,7 @@
%
% Functions or settings which are needed by the galley but perhaps also
% elsewhere.
-%
+%
% \begin{macro}{\seq_map_function:Nc}
% Used to allow a mapping to choose the outcome using a passed option.
% \begin{macrocode}
@@ -706,7 +706,7 @@
\tex_defaulthyphenchar:D 45 \scan_stop:
%</initex>
% \end{macrocode}
-%
+%
% \subsection{Scratch variables}
%
% \begin{variable}{\l_@@_tmp_int}
@@ -735,7 +735,7 @@
\bool_new:N \l_@@_parshape_multipar_bool
% \end{macrocode}
% \end{variable}
-%
+%
% \begin{variable}
% {\l_@@_parshape_left_indent_seq, \l_@@_parshape_right_indent_seq}
% Used to convert user input comma lists into sequences for mapping, and also
@@ -811,7 +811,7 @@
\bool_new:N \l_@@_begin_level_bool
% \end{macrocode}
% \end{variable}
-%
+%
% \begin{variable}
% {
% \g_@@_cutout_left_seq, \l_@@_cutout_left_seq,
@@ -1148,7 +1148,7 @@
{
\group_begin:
\tex_par:D
- \group_end:
+ \group_end:
}
% \end{macrocode}
% In horizontal mode, the paragraph shape is set \enquote{just in time}
@@ -1160,7 +1160,7 @@
% \begin{macrocode}
{
\g_galley_par_end_hook_tl
- \group_begin:
+ \group_begin:
\tex_par:D
\group_end:
\int_gset:Nn \g_galley_previous_par_lines_int
@@ -1528,7 +1528,7 @@
% \end{macro}
%
% \subsection{Measure}
-%
+%
% \begin{variable}{\l_@@_total_left_margin_dim, \l_@@_total_right_margin_dim}
% Used to set the measure, first by providing a place to save the existing
% values, then allowing calculation of the difference between old and new
@@ -1570,7 +1570,7 @@
- \l_galley_total_left_margin_dim
- \l_galley_total_right_margin_dim
}
- \@@_set_measure:
+ \@@_set_measure:
}
% \end{macrocode}
% Saves the previous margin state so that it can be used for calculation
@@ -1595,7 +1595,7 @@
{
\int_compare:nNnTF \tex_parshape:D = \c_zero
{ \@@_parshape_measure: }
- {
+ {
\dim_sub:Nn \l_@@_total_left_margin_dim
\l_galley_total_left_margin_dim
\dim_sub:Nn \l_@@_total_right_margin_dim
@@ -1621,7 +1621,7 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
+%
% \begin{macro}{\@@_parshape_reset:}
% Test for paragraph shapes to be removed: a multi-step procedure! First,
% check to see if there is a shape at all. If there is, the second check
@@ -1634,9 +1634,9 @@
\int_compare:nNnF \tex_parshape:D = \c_zero
{
\bool_if:nTF
- {
+ {
\seq_if_empty_p:N \g_@@_cutout_left_seq
- && \seq_if_empty_p:N \g_@@_cutout_right_seq
+ && \seq_if_empty_p:N \g_@@_cutout_right_seq
}
{
\bool_if:NF \l_@@_parshape_multipar_bool
@@ -1659,13 +1659,13 @@
{ \@@_parshape_set: }
{ \@@_parshape_measure: }
\@@_cutout_set:Nn \g_@@_cutout_left_seq { left }
- \@@_cutout_set:Nn \g_@@_cutout_right_seq { right }
+ \@@_cutout_set:Nn \g_@@_cutout_right_seq { right }
}
- }
+ }
}
% \end{macrocode}
% \end{macro}
-%
+%
% \begin{macro}[int]{\@@_parshape_measure:}
% Sets the parshape to the full measure at the current time: used in a few
% places, so worth spinning out.
@@ -1679,7 +1679,7 @@
}
% \end{macrocode}
% \end{macro}
-%
+%
% \subsection{Paragraph shape}
%
% \begin{macro}
@@ -1731,7 +1731,7 @@
{
\seq_put_right:Nn \l_@@_parshape_left_indent_seq { 0 pt }
\seq_put_right:Nn \l_@@_parshape_right_indent_seq { 0 pt }
- }
+ }
\@@_parshape_set:
}
\cs_new_protected_nopar:Npn \@@_parshape_set:
@@ -1758,13 +1758,13 @@
% \end{macro}
% \end{macro}
% \end{macro}
-%
+%
% \subsection{Cutouts}
-%
+%
% Cutouts are another way of looking at paragraph shapes, but apply to
% a fixed number of lines within a galley. As such, they require separate
% handling from the measure and shape.
-%
+%
% \begin{macro}{\galley_cutout_left:nn, \galley_cutout_right:nn}
% \begin{macro}[int]{\@@_cutout:nnn}
% \begin{macro}[aux]{\@@_cutout_store:nn}
@@ -1800,7 +1800,7 @@
{ \seq_count:c { g_@@_cutout_ #1 _ seq } }
{
\seq_map_inline:Nn \l_@@_tmpa_seq
- {
+ {
\@@_cutout_store:nn
{ \seq_gpop:cNF { g_@@_cutout_ #1 _ seq } }
{##1}
@@ -1808,7 +1808,7 @@
}
{
\seq_map_inline:cn { g_@@_cutout_ #1 _ seq }
- {
+ {
\@@_cutout_store:nn
{ \seq_pop:NNF \l_@@_tmpa_seq }
{##1}
@@ -1889,14 +1889,14 @@
\c_space_tl
\dim_eval:n { \etex_parshapelength:D \l_@@_tmp_int - ( #1 ) }
\c_space_tl
- }
+ }
}
}
\cs_new_protected:Npn \@@_cutout_right:n #1
{
\int_incr:N \l_@@_tmp_int
\tl_put_right:Nx \l_@@_tmp_tl
- {
+ {
\int_compare:nNnTF \l_@@_tmp_int > \tex_parshape:D
{
\dim_use:N \l_@@_total_left_margin_dim
@@ -1920,12 +1920,12 @@
{
\int_incr:N \l_@@_tmp_int
\tl_put_right:Nx \l_@@_tmp_tl
- {
+ {
\dim_eval:n { \etex_parshapeindent:D #1 }
\c_space_tl
\dim_eval:n { \etex_parshapelength:D #1 }
\c_space_tl
- }
+ }
}
% \end{macrocode}
% \end{macro}
diff --git a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
index d0086f4a3e3..b1dda9c1990 100644
--- a/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
+++ b/Master/texmf-dist/source/latex/l3experimental/xgalley/xgalley.dtx
@@ -1,7 +1,7 @@
% \iffalse
%
%% File: xgalley.dtx Copyright (C) 1999-2001, 2004-2009 Frank Mittelbach
-%% (C) 2010-2012 The LaTeX3 Project
+%% (C) 2010-2012,2014 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
@@ -37,7 +37,7 @@
%
%<*driver|package>
\RequirePackage{expl3}
-\GetIdInfo$Id: xgalley.dtx 4373 2012-12-17 16:41:59Z joseph $
+\GetIdInfo$Id: xgalley.dtx 4728 2014-05-04 13:25:37Z joseph $
{L3 Experimental galley}
%</driver|package>
%<*driver>
@@ -744,7 +744,7 @@
% \begin{macrocode}
%<*package>
% \end{macrocode}
-%
+%
% \begin{macrocode}
%<@@=galley>
% \end{macrocode}