From cc862e582aa0dd7c0dee16bb5475394338a07641 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Wed, 6 Dec 2017 23:56:06 +0000
Subject: l3 (7dec17)

git-svn-id: svn://tug.org/texlive/trunk@46003 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/source/latex/l3kernel/l3file.dtx | 195 ++++++++++++---------
 1 file changed, 108 insertions(+), 87 deletions(-)

(limited to 'Master/texmf-dist/source/latex/l3kernel/l3file.dtx')

diff --git a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
index d7d94f5cf3a..271a66e704f 100644
--- a/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
+++ b/Master/texmf-dist/source/latex/l3kernel/l3file.dtx
@@ -7,7 +7,7 @@
 % 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
+%    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.
@@ -21,7 +21,7 @@
 % for those people who are interested.
 %
 %<*driver>
-\documentclass[full]{l3doc}
+\documentclass[full,kernel]{l3doc}
 \begin{document}
 \DocInput{\jobname.dtx}
 \PrintIndex
@@ -42,7 +42,7 @@
 %    }^^A
 % }
 %
-% \date{Released 2017/11/14}
+% \date{Released 2017/12/05}
 %
 % \maketitle
 %
@@ -381,8 +381,8 @@
 %   Use outside of a \cs[no-index]{ior_map_\ldots} scenario leads to low
 %   level \TeX{} errors.
 %   \begin{texnote}
-%     When the mapping is broken, additional tokens may be inserted by the
-%     internal macro \cs{__prg_break_point:Nn} before further items are taken
+%     When the mapping is broken, additional tokens may be inserted
+%     before further items are taken
 %     from the input stream. This depends on the design of the mapping
 %     function.
 %   \end{texnote}
@@ -390,17 +390,17 @@
 %
 % \begin{function}[added = 2012-06-29]{\ior_map_break:n}
 %   \begin{syntax}
-%     \cs{ior_map_break:n} \Arg{tokens}
+%     \cs{ior_map_break:n} \Arg{code}
 %   \end{syntax}
 %   Used to terminate a \cs[no-index]{ior_map_\ldots} function before all
 %   lines in the \meta{stream} have been processed, inserting
-%   the \meta{tokens} after the mapping has ended. This
+%   the \meta{code} after the mapping has ended. This
 %   normally takes place within a conditional statement, for example
 %   \begin{verbatim}
 %     \ior_map_inline:Nn \l_my_ior
 %       {
 %         \str_if_eq:nnTF { #1 } { bingo }
-%           { \ior_map_break:n { <tokens> } }
+%           { \ior_map_break:n { <code> } }
 %           {
 %             % Do something useful
 %           }
@@ -409,8 +409,8 @@
 %   Use outside of a \cs[no-index]{ior_map_\ldots} scenario leads to low
 %   level \TeX{} errors.
 %   \begin{texnote}
-%     When the mapping is broken, additional tokens may be inserted by the
-%     internal macro \cs{__prg_break_point:Nn} before the \meta{tokens} are
+%     When the mapping is broken, additional tokens may be inserted
+%     before the \meta{code} is
 %     inserted into the input stream.
 %     This depends on the design of the mapping function.
 %   \end{texnote}
@@ -532,7 +532,7 @@
 %
 % \subsection{Wrapping lines in output}
 %
-% \begin{function}[added = 2012-06-28, updated = 2017-07-17]{\iow_wrap:nnnN}
+% \begin{function}[added = 2012-06-28, updated = 2017-12-04]{\iow_wrap:nnnN}
 %   \begin{syntax}
 %     \cs{iow_wrap:nnnN} \Arg{text} \Arg{run-on text} \Arg{set up} \meta{function}
 %   \end{syntax}
@@ -546,7 +546,7 @@
 %   \meta{text} and \meta{run-on text} are exhaustively expanded by the
 %   function, with the following substitutions:
 %   \begin{itemize}
-%     \item |\\| may be used to force a new line,
+%     \item |\\| or \cs{iow_newline:} may be used to force a new line,
 %     \item \verb*|\ | may be used to represent a forced space
 %       (for example after a control sequence),
 %     \item |\#|, |\%|, |\{|, |\}|, |\~| may be used to represent
@@ -841,9 +841,9 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}[int]{\__file_name_sanitize:nN}
-% \begin{macro}[int]{\__file_name_quote:nN}
-% \begin{macro}[int, aux]{\@@_name_sanitize_aux:n}
+% \begin{macro}{\__file_name_sanitize:nN}
+% \begin{macro}{\__file_name_quote:nN}
+% \begin{macro}{\@@_name_sanitize_aux:n}
 %   For converting a token list to a string where active characters are treated
 %   as strings from the start. The logic to the quoting normalisation is the
 %   same as used by \texttt{lualatexquotejobname}: check for balanced |"|, and
@@ -885,7 +885,7 @@
 % \end{macro}
 %
 % \begin{macro}{\file_get_full_name:nN, \file_get_full_name:VN}
-% \begin{macro}[aux]{\@@_get_full_name_search:nN}
+% \begin{macro}{\@@_get_full_name_search:nN}
 %   The way to test if a file exists is to try to open it: if it does
 %   not exist then \TeX{} reports end-of-file. A search is made
 %   looking at each potential path in turn (starting from the current
@@ -955,7 +955,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[int]{\__file_missing:n}
+% \begin{macro}{\__file_missing:n}
 %   An error message for a missing file, also used in \cs{ior_open:Nn}.
 %    \begin{macrocode}
 \cs_new_protected:Npn \__file_missing:n #1
@@ -968,10 +968,10 @@
 % \end{macro}
 %
 % \begin{macro}{\file_input:n}
-% \begin{macro}[aux]{\@@_input:n, \@@_input:V}
-% \begin{macro}[aux]{\@@_input_push:n}
-% \begin{macro}[aux]{\@@_input_pop:}
-% \begin{macro}[aux]{\@@_input_pop:nnn}
+% \begin{macro}{\@@_input:n, \@@_input:V}
+% \begin{macro}{\@@_input_push:n}
+% \begin{macro}{\@@_input_pop:}
+% \begin{macro}{\@@_input_pop:nnn}
 %   Loading a file is done in a safe way, checking first that the file
 %   exists and loading only if it does.  Push the file name on the
 %   \cs{g_@@_stack_seq}, and add it to the file list, either
@@ -1036,7 +1036,7 @@
 % \end{macro}
 %
 % \begin{macro}{\file_parse_full_name:nNNN}
-% \begin{macro}[aux]
+% \begin{macro}
 %   {\@@_parse_full_name_auxi:w, \@@_parse_full_name_split:nNNNTF}
 %   Parsing starts by stripping off any surrounding quotes.  Then find
 %   the directory |#4| by splitting at the last~|/|.  (The auxiliary
@@ -1091,19 +1091,17 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}{\file_show_list:, \file_log_list:}
-% \begin{macro}[aux, EXP]{\@@_list_aux:n}
+% \begin{macro}{\file_show_list:, \file_log_list:, \@@_list:N}
+% \begin{macro}[EXP]{\@@_list_aux:n}
 %   A function to list all files used to the log, without duplicates.
 %   In package mode, if \cs{@filelist} is still defined, we need to take
 %   this list of file names into account (we capture it
 %   \cs{AtBeginDocument} into \cs{g_@@_record_seq}), turning it to a
-%   string (this does not affect the commas of this comma list).  The
-%   message system is a bit finnicky (it can only display results that
-%   start with |>~| and end with a dot) so that constrains the possible
-%   markup.  The advantage is that we get terminal and log outputs for
-%   free.
+%   string (this does not affect the commas of this comma list).
 %    \begin{macrocode}
-\cs_new_protected:Npn \file_show_list:
+\cs_new_protected:Npn \file_show_list: { \@@_list:N \msg_show:nnxxxx }
+\cs_new_protected:Npn \file_log_list: { \@@_list:N \msg_log:nnxxxx }
+\cs_new_protected:Npn \@@_list:N #1
   {
     \seq_clear:N \l_@@_tmp_seq
 %<*package>
@@ -1115,16 +1113,10 @@
 %</package>
     \seq_concat:NNN \l_@@_tmp_seq \l_@@_tmp_seq \g_@@_record_seq
     \seq_remove_duplicates:N \l_@@_tmp_seq
-    \__msg_show_wrap:n
-      {
-        >~File~List~< \\
-        \seq_map_function:NN \l_@@_tmp_seq \@@_list_aux:n
-        ............
-      }
+    #1 { LaTeX/kernel } { file-list }
+      { \seq_map_function:NN \l_@@_tmp_seq \@@_list_aux:n } { } { } { }
   }
-\cs_new:Npn \@@_list_aux:n #1 { #1 \\ }
-\cs_new_protected:Npn \file_log_list:
-  { \__msg_log_next: \file_show_list: }
+\cs_new:Npn \@@_list_aux:n #1 { \iow_newline: #1 }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1255,7 +1247,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[int]{\@@_new:N}
+% \begin{macro}{\@@_new:N}
 %   In package mode, streams are reserved using \tn{newread} before they
 %   can be managed by \pkg{ior}.  To prevent \pkg{ior} from being
 %   affected by redefinitions of \tn{newread} (such as done by the
@@ -1271,8 +1263,8 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[int]{\@@_open:Nn, \@@_open:No}
-% \begin{macro}[aux]{\@@_open_stream:Nn}
+% \begin{macro}{\@@_open:Nn, \@@_open:No}
+% \begin{macro}{\@@_open_stream:Nn}
 %   The stream allocation itself uses the fact that there is a list of all of
 %   those available, so allocation is simply a question of using the number at
 %   the top of the list. In package mode, life gets more complex as it's
@@ -1331,25 +1323,26 @@
 % \end{macro}
 %
 % \begin{macro}{\ior_show_list:, \ior_log_list:}
-% \begin{macro}[aux]{\@@_list:Nn}
+% \begin{macro}{\@@_list:N}
 %   Show the property lists, but with some \enquote{pretty printing}.
 %   See the \pkg{l3msg} module.  The first argument of the message is
 %   |ior| (as opposed to |iow|) and the second is empty if no read
-%   stream is open and non-empty (in fact a question mark) otherwise.
-%   The code of the message \texttt{show-streams} takes care of
-%   translating |ior|/|iow| to English.  The list of streams is
-%   formatted using \cs{__msg_show_item_unbraced:nn}.
+%   stream is open and non-empty (the list of streams formatted using
+%   \cs{msg_show_item_unbraced:nn}) otherwise.  The code of the message
+%   \texttt{show-streams} takes care of translating |ior|/|iow| to
+%   English.
 %    \begin{macrocode}
-\cs_new_protected:Npn \ior_show_list:
-  { \@@_list:Nn \g_@@_streams_prop { ior } }
-\cs_new_protected:Npn \ior_log_list:
-  { \__msg_log_next: \ior_show_list: }
-\cs_new_protected:Npn \@@_list:Nn #1#2
+\cs_new_protected:Npn \ior_show_list: { \@@_list:N \msg_show:nnxxxx }
+\cs_new_protected:Npn \ior_log_list: { \@@_list:N \msg_log:nnxxxx }
+\cs_new_protected:Npn \@@_list:N #1
   {
-    \__msg_show_pre:nnxxxx { LaTeX / kernel } { show-streams }
-      {#2} { \prop_if_empty:NF #1 { ? } } { } { }
-    \__msg_show_wrap:n
-      { \prop_map_function:NN #1 \__msg_show_item_unbraced:nn }
+    #1 { LaTeX / kernel } { show-streams }
+      { ior }
+      {
+        \prop_map_function:NN \g_@@_streams_prop
+          \msg_show_item_unbraced:nn
+      }
+      { } { }
   }
 %    \end{macrocode}
 % \end{macro}
@@ -1357,7 +1350,7 @@
 %
 % \subsubsection{Reading input}
 %
-% \begin{macro}[int]{\if_eof:w}
+% \begin{macro}{\if_eof:w}
 %   The primitive conditional
 %    \begin{macrocode}
 \cs_new_eq:NN \if_eof:w \tex_ifeof:D
@@ -1424,9 +1417,9 @@
 % \end{macro}
 %
 % \begin{macro}{\ior_map_inline:Nn, \ior_str_map_inline:Nn}
-% \begin{macro}[aux]{\@@_map_inline:NNn}
-% \begin{macro}[aux]{\@@_map_inline:NNNn}
-% \begin{macro}[aux]{\@@_map_inline_loop:NNN}
+% \begin{macro}{\@@_map_inline:NNn}
+% \begin{macro}{\@@_map_inline:NNNn}
+% \begin{macro}{\@@_map_inline_loop:NNN}
 % \begin{variable}{\l_@@_internal_tl}
 %   Mapping to an input stream can be done on either a token or a string
 %   basis, hence the set up. Within that, there is a check to avoid reading
@@ -1567,7 +1560,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[int]{\@@_new:N}
+% \begin{macro}{\@@_new:N}
 %   As for read streams, copy \tn{newwrite} in package mode, making sure
 %   that it is not \tn{outer}.
 %    \begin{macrocode}
@@ -1579,7 +1572,7 @@
 % \end{macro}
 %
 % \begin{macro}{\iow_open:Nn, \iow_open:cn}
-% \begin{macro}[aux]{\@@_open_stream:Nn, \@@_open_stream:NV}
+% \begin{macro}{\@@_open_stream:Nn, \@@_open_stream:NV}
 %   The same idea as for reading, but without the path and without the need
 %   to allow for a conditional version.
 %    \begin{macrocode}
@@ -1634,14 +1627,21 @@
 % \end{macro}
 %
 % \begin{macro}{\iow_show_list:, \iow_log_list:}
-% \begin{macro}{\@@_list:Nn}
+% \begin{macro}{\@@_list:N}
 %   Done as for input, but with a copy of the auxiliary so the name is correct.
 %    \begin{macrocode}
-\cs_new_protected:Npn \iow_show_list:
-  { \@@_list:Nn \g_@@_streams_prop { iow } }
-\cs_new_protected:Npn \iow_log_list:
-  { \__msg_log_next: \iow_show_list: }
-\cs_new_eq:NN \@@_list:Nn \__ior_list:Nn
+\cs_new_protected:Npn \iow_show_list: { \@@_list:N \msg_show:nnxxxx }
+\cs_new_protected:Npn \iow_log_list: { \@@_list:N \msg_log:nnxxxx }
+\cs_new_protected:Npn \@@_list:N #1
+  {
+    #1 { LaTeX / kernel } { show-streams }
+      { iow }
+      {
+        \prop_map_function:NN \g_@@_streams_prop
+          \msg_show_item_unbraced:nn
+      }
+      { } { }
+  }
 %    \end{macrocode}
 % \end{macro}
 % \end{macro}
@@ -1669,8 +1669,8 @@
 %
 % \subsubsection{Immediate writing}
 %
-% \begin{macro}[int]{\@@_with:Nnn}
-% \begin{macro}[aux]{\@@_with_aux:nNnn}
+% \begin{macro}{\@@_with:Nnn}
+% \begin{macro}{\@@_with_aux:nNnn}
 %   If the integer~|#1| is equal to~|#2|, just leave~|#3| in the input
 %   stream.  Otherwise, pass the old value to an auxiliary, which sets
 %   the integer to the new value, runs the code, and restores the
@@ -1776,8 +1776,8 @@
 %    \end{macrocode}
 % \end{variable}
 %
-% \begin{macro}[aux]{\@@_set_indent:n}
-% \begin{macro}[aux]{\@@_unindent:w}
+% \begin{macro}{\@@_set_indent:n}
+% \begin{macro}{\@@_unindent:w}
 % \begin{variable}{\l_@@_one_indent_tl, \l_@@_one_indent_int}
 %   The \texttt{one_indent} variables hold one indentation marker and
 %   its length.  The \cs{@@_unindent:w} auxiliary removes one
@@ -1872,8 +1872,8 @@
 % \end{variable}
 %
 % \begin{macro}{\iow_indent:n}
-% \begin{macro}[EXP,aux]{\@@_indent:n}
-% \begin{macro}[EXP,aux]{\@@_indent_error:n}
+% \begin{macro}[EXP]{\@@_indent:n}
+% \begin{macro}[EXP]{\@@_indent_error:n}
 %   We set \cs{iow_indent:n} to produce an error when outside
 %   messages. Within wrapped message, it is set to \cs{@@_indent:n} when
 %   valid and otherwise to \cs{@@_indent_error:n}.  The first places the
@@ -1923,7 +1923,7 @@
       \cs_set:Npx \% { \token_to_str:N \% }
       \cs_set:Npx \~ { \token_to_str:N \~ }
       \int_set:Nn \tex_escapechar:D { 92 }
-      \cs_set_eq:NN \\ \c_@@_wrap_newline_marker_tl
+      \cs_set_eq:NN \\ \iow_newline:
       \cs_set_eq:NN \  \c_catcode_other_space_tl
       \cs_set_eq:NN \iow_indent:n \@@_indent:n
       #3
@@ -1962,8 +1962,9 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_do:, \@@_wrap_start:w}
-%   Escape spaces.  Set up a few variables, in particular the initial
+% \begin{macro}{\@@_wrap_do:, \@@_wrap_fix_newline:w, \@@_wrap_start:w}
+%   Escape spaces and change newlines to \cs{c_@@_wrap_newline_marker_tl}.
+%   Set up a few variables, in particular the initial
 %   value of \cs{l_@@_wrap_tl}: the space stops the
 %   \texttt{f}-expansion of the main wrapping function and
 %   \cs{use_none:n} removes a newline marker inserted by later code.
@@ -1978,8 +1979,22 @@
         \exp_args:No \__str_to_other_fast:n \l_@@_wrap_tl
         \c_@@_wrap_end_marker_tl
       }
+    \tl_set:Nx \l_@@_wrap_tl
+      {
+        \exp_after:wN \@@_wrap_fix_newline:w \l_@@_wrap_tl
+          ^^J \q_nil ^^J \q_stop
+      }
     \exp_after:wN \@@_wrap_start:w \l_@@_wrap_tl
   }
+\cs_new:Npn \@@_wrap_fix_newline:w #1 ^^J #2 ^^J
+  {
+    #1
+    \if_meaning:w \q_nil #2
+      \use_i_delimit_by_q_stop:nw
+    \fi:
+    \c_@@_wrap_newline_marker_tl
+    \@@_wrap_fix_newline:w #2 ^^J
+  }
 \cs_new_protected:Npn \@@_wrap_start:w
   {
     \bool_set_false:N \l_@@_line_break_bool
@@ -1993,7 +2008,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_chunk:nw, \@@_wrap_next:nw}
+% \begin{macro}{\@@_wrap_chunk:nw, \@@_wrap_next:nw}
 %   The \texttt{chunk} and \texttt{next} auxiliaries are defined
 %   indirectly to obtain the expansions of \cs{c_catcode_other_space_tl}
 %   and \cs{c_@@_wrap_marker_tl} in their definition.  The \texttt{next}
@@ -2035,8 +2050,8 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_line:nw}
-% \begin{macro}[EXP,aux]
+% \begin{macro}{\@@_wrap_line:nw}
+% \begin{macro}[EXP]
 %   {
 %     \@@_wrap_line_loop:w,
 %     \@@_wrap_line_aux:Nw,
@@ -2126,8 +2141,8 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[EXP,aux]{\@@_wrap_break:w}
-% \begin{macro}[EXP,aux]
+% \begin{macro}[EXP]{\@@_wrap_break:w}
+% \begin{macro}[EXP]
 %   {
 %     \@@_wrap_break_first:w,
 %     \@@_wrap_break_none:w,
@@ -2189,7 +2204,7 @@
 % \end{macro}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_next_line:w}
+% \begin{macro}{\@@_wrap_next_line:w}
 %   The special case where the end of a line coincides with the end of a
 %   chunk is detected here, to avoid a spurious empty line.  Otherwise,
 %   call \cs{@@_wrap_line:nw} to find characters for the next line
@@ -2214,7 +2229,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_indent:, \@@_wrap_unindent:}
+% \begin{macro}{\@@_wrap_indent:, \@@_wrap_unindent:}
 %   These functions are called after a chunk has been wrapped, when
 %   encountering \texttt{indent}/\texttt{unindent} markers.  Add the
 %   line part (last line part of the previous chunk) to the line so far
@@ -2242,7 +2257,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_newline:, \@@_wrap_end:}
+% \begin{macro}{\@@_wrap_newline:, \@@_wrap_end:}
 %   These functions are called after a chunk has been line-wrapped, when
 %   encountering a \texttt{newline}/\texttt{end} marker.  Unless we just
 %   took a line-break, store the line part and the line so far into the
@@ -2266,7 +2281,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[aux]{\@@_wrap_store_do:n}
+% \begin{macro}{\@@_wrap_store_do:n}
 %   First add the last line part to the line, then append it to
 %   \cs{l_@@_wrap_tl} with the appropriate new line (with
 %   \enquote{run-on} text), possibly with its last space removed (|#1|
@@ -2287,7 +2302,7 @@
 %    \end{macrocode}
 % \end{macro}
 %
-% \begin{macro}[EXP, aux]{\@@_wrap_trim:N, \@@_wrap_trim:w}
+% \begin{macro}[EXP]{\@@_wrap_trim:N, \@@_wrap_trim:w}
 %   Remove one trailing \enquote{other} space from the argument.
 %    \begin{macrocode}
 \cs_set_protected:Npn \@@_tmp:w #1
@@ -2309,6 +2324,12 @@
     The~requested~file~could~not~be~found~in~the~current~directory,~
     in~the~TeX~search~path~or~in~the~LaTeX~search~path.
   }
+\__msg_kernel_new:nnn { kernel } { file-list }
+  {
+    >~File~List~<
+    #1 \\
+    .............
+  }
 \__msg_kernel_new:nnnn { kernel } { input-streams-exhausted }
   { Input~streams~exhausted }
   {
-- 
cgit v1.2.3

