summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/l3kernel/l3msg.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/l3kernel/l3msg.dtx')
-rw-r--r--macros/latex/contrib/l3kernel/l3msg.dtx2443
1 files changed, 0 insertions, 2443 deletions
diff --git a/macros/latex/contrib/l3kernel/l3msg.dtx b/macros/latex/contrib/l3kernel/l3msg.dtx
deleted file mode 100644
index 3acae8d111..0000000000
--- a/macros/latex/contrib/l3kernel/l3msg.dtx
+++ /dev/null
@@ -1,2443 +0,0 @@
-% \iffalse meta-comment
-%
-%% File: l3msg.dtx
-%
-% Copyright (C) 2009-2024 The LaTeX 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 \pkg{l3msg} module\\ Messages^^A
-% }
-%
-% \author{^^A
-% The \LaTeX{} Project\thanks
-% {^^A
-% E-mail:
-% \href{mailto:latex-team@latex-project.org}
-% {latex-team@latex-project.org}^^A
-% }^^A
-% }
-%
-% \date{Released 2024-03-14}
-%
-% \maketitle
-%
-% \begin{documentation}
-%
-% Messages need to be passed to the user by modules, either when errors
-% occur or to indicate how the code is proceeding. The \pkg{l3msg}
-% module provides a consistent method for doing this (as opposed to
-% writing directly to the terminal or log).
-%
-% The system used by \pkg{l3msg} to create messages divides the process
-% into two distinct parts. Named messages are created in the first part
-% of the process; at this stage, no decision is made about the type of
-% output that the message will produce. The second part of the process
-% is actually producing a message. At this stage a choice of message
-% \emph{class} has to be made, for example \texttt{error},
-% \texttt{warning} or \texttt{info}.
-%
-% By separating out the creation and use of messages, several benefits
-% are available. First, the messages can be altered later without
-% needing details of where they are used in the code. This makes it
-% possible to alter the language used, the detail level and so on.
-% Secondly, the output which results from a given message can be
-% altered. This can be done on a message class, module or message name
-% basis. In this way, message behaviour can be altered and messages can
-% be entirely suppressed.
-%
-% \section{Creating new messages}
-%
-% All messages have to be created before they can be used.
-% The text of messages is automatically wrapped to the length
-% available in the console. As a result, formatting is only needed
-% where it helps to show meaning. In particular, |\\| may be
-% used to force a new line and \verb*|\ | forces an explicit space.
-% Additionally, |\{|, |\#|, |\}|, |\%| and |\~| can be used to produce
-% the corresponding character.
-%
-% Messages may be subdivided \emph{by one level} using the~|/|
-% character. This is used within the message filtering system to allow
-% for example the \LaTeX{} kernel messages to belong to the module
-% \texttt{LaTeX} while still being filterable at a more granular level.
-% Thus for example
-% \begin{verbatim}
-% \msg_new:nnnn { mymodule } { submodule / message } ...
-% \end{verbatim}
-% will allow to filter out specifically messages from the \texttt{submodule}.
-%
-% Some authors may find the need to include spaces as |~| characters
-% tedious. This can be avoided by locally reseting the cateogry code
-% of \verb*| |.
-% \begin{verbatim}
-% \char_set_catcode_space:n { `\ }
-% \msg_new:nnn { foo } { bar }
-% {Some message text using '#1' and usual message shorthands \{ \ \ \}.}
-% \char_set_catcode_ignore:n { `\ }
-% \end{verbatim}
-% although in general this may be confusing; simply writing the messages
-% using |~| characters is the method favored by the team.
-%
-% \begin{function}[updated = 2011-08-16]
-% {
-% \msg_new:nnnn, \msg_new:nnee,
-% \msg_new:nnn, \msg_new:nne
-% }
-% \begin{syntax}
-% \cs{msg_new:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
-% \end{syntax}
-% Creates a \meta{message} for a given \meta{module}.
-% The message is defined to first give \meta{text} and then
-% \meta{more text} if the user requests it. If no \meta{more text} is
-% available then a standard text is given instead. Within \meta{text}
-% and \meta{more text} four parameters (|#1| to |#4|) can be used:
-% these will be supplied at the time the message is
-% used. An error is raised if the \meta{message} already exists.
-% \end{function}
-%
-% \begin{function}{\msg_set:nnnn, \msg_set:nnn}
-% \begin{syntax}
-% \cs{msg_set:nnnn} \Arg{module} \Arg{message} \Arg{text} \Arg{more text}
-% \end{syntax}
-% Sets up the text for a \meta{message} for a given \meta{module}.
-% The message is defined to first give \meta{text} and then
-% \meta{more text} if the user requests it. If no \meta{more text} is
-% available then a standard text is given instead. Within \meta{text}
-% and \meta{more text} four parameters (|#1| to |#4|) can be used:
-% these will be supplied at the time the message is used.
-% \end{function}
-%
-% \begin{function}[EXP, pTF, added = 2012-03-03]{\msg_if_exist:nn}
-% \begin{syntax}
-% \cs{msg_if_exist_p:nn} \Arg{module} \Arg{message}
-% \cs{msg_if_exist:nnTF} \Arg{module} \Arg{message} \Arg{true code} \Arg{false code}
-% \end{syntax}
-% Tests whether the \meta{message} for the \meta{module} is currently
-% defined.
-% \end{function}
-%
-% \section{Customizable information for message modules}
-%
-% \begin{function}[EXP, added = 2018-10-10]{\msg_module_name:n}
-% \begin{syntax}
-% \cs{msg_module_name:n} \Arg{module}
-% \end{syntax}
-% Expands to the public name of the \meta{module} as defined by
-% \cs{g_msg_module_name_prop} (or otherwise leaves the \meta{module}
-% unchanged).
-% \end{function}
-%
-% \begin{function}[EXP, added = 2018-10-10]{\msg_module_type:n}
-% \begin{syntax}
-% \cs{msg_module_type:n} \Arg{module}
-% \end{syntax}
-% Expands to the description which applies to the \meta{module},
-% for example a |Package| or |Class|. The information here is defined
-% in \cs{g_msg_module_type_prop}, and will default to |Package| if an
-% entry is not present.
-% \end{function}
-%
-% \begin{variable}[added = 2018-10-10]{\g_msg_module_name_prop}
-% Provides a mapping between the module name used for messages, and that
-% for documentation.
-% \end{variable}
-%
-% \begin{variable}[added = 2018-10-10]{\g_msg_module_type_prop}
-% Provides a mapping between the module name used for messages, and that
-% type of module. For example, for \LaTeX{}3 core messages, an empty entry
-% is set here meaning that they are not described using the standard
-% |Package| text.
-% \end{variable}
-%
-% \section{Contextual information for messages}
-%
-% \begin{function}[rEXP]{\msg_line_context:}
-% \begin{syntax}
-% \cs{msg_line_context:}
-% \end{syntax}
-% Prints the current line number when a message is given, and
-% thus suitable for giving context to messages. The number itself
-% is proceeded by the text |on line|.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_line_number:}
-% \begin{syntax}
-% \cs{msg_line_number:}
-% \end{syntax}
-% Prints the current line number when a message is given.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_fatal_text:n}
-% \begin{syntax}
-% \cs{msg_fatal_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text
-% \begin{quote}
-% \ttfamily
-% Fatal Package \meta{module} Error
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_critical_text:n}
-% \begin{syntax}
-% \cs{msg_critical_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text
-% \begin{quote}
-% \ttfamily
-% Critical Package \meta{module} Error
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_error_text:n}
-% \begin{syntax}
-% \cs{msg_error_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text
-% \begin{quote}
-% \ttfamily
-% Package \meta{module} Error
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_warning_text:n}
-% \begin{syntax}
-% \cs{msg_warning_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text
-% \begin{quote}
-% \ttfamily
-% Package \meta{module} Warning
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included. The \meta{type} of \meta{module} may be adjusted:
-% |Package| is the standard outcome: see \cs{msg_module_type:n}.
-% \end{function}
-%
-% \begin{function}[EXP]{\msg_info_text:n}
-% \begin{syntax}
-% \cs{msg_info_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text:
-% \begin{quote}
-% \ttfamily
-% Package \meta{module} Info
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included. The \meta{type} of \meta{module} may be adjusted:
-% |Package| is the standard outcome: see \cs{msg_module_type:n}.
-% \end{function}
-%
-% \begin{function}[EXP,updated = 2018-09-30]{\msg_see_documentation_text:n}
-% \begin{syntax}
-% \cs{msg_see_documentation_text:n} \Arg{module}
-% \end{syntax}
-% Produces the standard text
-% \begin{quote}
-% \ttfamily
-%
-% See the \meta{module} documentation for further information.
-% \end{quote}
-% This function can be redefined to alter the language in which the
-% message is given, using |#1| as the name of the \meta{module} to
-% be included. The name of the \meta{module} is produced using
-% \cs{msg_module_name:n}.
-% \end{function}
-%
-% \section{Issuing messages}
-%
-% Messages behave differently depending on the message class. In all cases,
-% the message may be issued supplying~$0$ to~$4$ arguments. If the number of
-% arguments supplied here does not match the number in the definition of the
-% message, extra arguments are ignored, or empty arguments added (of
-% course the sense of the message may be impaired). The four arguments are
-% converted to strings before being added to the message text: the
-% \texttt{e}-type variants should be used to expand material.
-% Note that this expansion takes place with the standard definitions in
-% effect, which means that shorthands such as |\~| or |\\| are
-% \emph{not} available; instead one should use \cs{iow_char:N} |\~| and
-% \cs{iow_newline:}, respectively.
-% The following message classes exist:
-% \begin{itemize}
-% \item \texttt{fatal}, ending the \TeX{} run;
-% \item \texttt{critical}, ending the file being input;
-% \item \texttt{error}, interrupting the \TeX{} run without ending it;
-% \item \texttt{warning}, written to terminal and log file, for
-% important messages that may require corrections by the user;
-% \item \texttt{note} (less common than \texttt{info}) for important
-% information messages written to the terminal and log file;
-% \item \texttt{info} for normal information messages written to the log
-% file only;
-% \item \texttt{term} and \texttt{log} for un-decorated messages written
-% to the terminal and log file, or to the log file only;
-% \item \texttt{none} for suppressed messages.
-% \end{itemize}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_fatal:nnnnnn ,
-% \msg_fatal:nnnnn ,
-% \msg_fatal:nnnn ,
-% \msg_fatal:nnn ,
-% \msg_fatal:nn ,
-% \msg_fatal:nnVV ,
-% \msg_fatal:nnVn ,
-% \msg_fatal:nnnV ,
-% \msg_fatal:nnV ,
-% \msg_fatal:nneeee ,
-% \msg_fatal:nneee ,
-% \msg_fatal:nnnee ,
-% \msg_fatal:nnee ,
-% \msg_fatal:nnne ,
-% \msg_fatal:nne
-% }
-% \begin{syntax}
-% \cs{msg_fatal:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} error \meta{message}, passing \meta{arg one} to
-% \meta{arg four} to the text-creating functions. After issuing a
-% fatal error the \TeX{} run halts. No PDF file will be produced in
-% this case (DVI mode runs may produce a truncated DVI file).
-% \end{function}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_critical:nnnnnn ,
-% \msg_critical:nnnnn ,
-% \msg_critical:nnnn ,
-% \msg_critical:nnn ,
-% \msg_critical:nn ,
-% \msg_critical:nnVV ,
-% \msg_critical:nnVn ,
-% \msg_critical:nnnV ,
-% \msg_critical:nnV ,
-% \msg_critical:nneeee ,
-% \msg_critical:nneee ,
-% \msg_critical:nnnee ,
-% \msg_critical:nnee ,
-% \msg_critical:nnne ,
-% \msg_critical:nne
-% }
-% \begin{syntax}
-% \cs{msg_critical:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} error \meta{message}, passing \meta{arg one} to
-% \meta{arg four} to the text-creating functions. After issuing a
-% critical error, \TeX{} stops reading the current input file.
-% This may halt the \TeX{} run (if the current file is the main file)
-% or may abort reading a sub-file.
-% \begin{texnote}
-% The \TeX{} \tn{endinput} primitive is used to exit the file. In
-% particular, the rest of the current line remains in the input
-% stream.
-% \end{texnote}
-% \end{function}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_error:nnnnnn ,
-% \msg_error:nnnnn ,
-% \msg_error:nnnn ,
-% \msg_error:nnn ,
-% \msg_error:nn ,
-% \msg_error:nnVV ,
-% \msg_error:nnVn ,
-% \msg_error:nnnV ,
-% \msg_error:nnV ,
-% \msg_error:nneeee ,
-% \msg_error:nneee ,
-% \msg_error:nnnee ,
-% \msg_error:nnee ,
-% \msg_error:nnne ,
-% \msg_error:nne
-% }
-% \begin{syntax}
-% \cs{msg_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} error \meta{message}, passing \meta{arg one} to
-% \meta{arg four} to the text-creating functions. The error
-% interrupts processing and issues the text at the terminal. After user
-% input, the run continues.
-% \end{function}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_warning:nnnnnn ,
-% \msg_warning:nnnnn ,
-% \msg_warning:nnnn ,
-% \msg_warning:nnn ,
-% \msg_warning:nn ,
-% \msg_warning:nnVV ,
-% \msg_warning:nnVn ,
-% \msg_warning:nnnV ,
-% \msg_warning:nnV ,
-% \msg_warning:nneeee ,
-% \msg_warning:nneee ,
-% \msg_warning:nnnee ,
-% \msg_warning:nnee ,
-% \msg_warning:nnne ,
-% \msg_warning:nne
-% }
-% \begin{syntax}
-% \cs{msg_warning:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} warning \meta{message}, passing \meta{arg one}
-% to \meta{arg four} to the text-creating functions. The warning text
-% is added to the log file and the terminal, but the \TeX{} run
-% is not interrupted.
-% \end{function}
-%
-% \begin{function}[added = 2021-05-18]
-% {
-% \msg_note:nnnnnn ,
-% \msg_note:nnnnn ,
-% \msg_note:nnnn ,
-% \msg_note:nnn ,
-% \msg_note:nn ,
-% \msg_note:nnVV ,
-% \msg_note:nnVn ,
-% \msg_note:nnnV ,
-% \msg_note:nnV ,
-% \msg_note:nneeee ,
-% \msg_note:nneee ,
-% \msg_note:nnnee ,
-% \msg_note:nnee ,
-% \msg_note:nnne ,
-% \msg_note:nne ,
-% \msg_info:nnnnnn ,
-% \msg_info:nnnnn ,
-% \msg_info:nnnn ,
-% \msg_info:nnn ,
-% \msg_info:nn ,
-% \msg_info:nnVV ,
-% \msg_info:nnVn ,
-% \msg_info:nnnV ,
-% \msg_info:nnV ,
-% \msg_info:nneeee ,
-% \msg_info:nneee ,
-% \msg_info:nnnee ,
-% \msg_info:nnee ,
-% \msg_info:nnne ,
-% \msg_info:nne
-% }
-% \begin{syntax}
-% \cs{msg_note:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \cs{msg_info:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} information \meta{message}, passing
-% \meta{arg one} to \meta{arg four} to the text-creating functions.
-% For the more common \cs{msg_info:nnnnnn}, the information text is
-% added to the log file only, while \cs{msg_note:nnnnnn} adds the
-% info text to both the log file and the terminal. The \TeX{} run is
-% not interrupted.
-% \end{function}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_term:nnnnnn ,
-% \msg_term:nnnnn ,
-% \msg_term:nnnn ,
-% \msg_term:nnn ,
-% \msg_term:nn ,
-% \msg_term:nnVV ,
-% \msg_term:nnVn ,
-% \msg_term:nnnV ,
-% \msg_term:nnV ,
-% \msg_term:nneeee ,
-% \msg_term:nneee ,
-% \msg_term:nnnee ,
-% \msg_term:nnee ,
-% \msg_term:nnne ,
-% \msg_term:nne ,
-% \msg_log:nnnnnn ,
-% \msg_log:nnnnn ,
-% \msg_log:nnnn ,
-% \msg_log:nnn ,
-% \msg_log:nn ,
-% \msg_log:nnVV ,
-% \msg_log:nnVn ,
-% \msg_log:nnnV ,
-% \msg_log:nnV ,
-% \msg_log:nneeee ,
-% \msg_log:nneee ,
-% \msg_log:nnnee ,
-% \msg_log:nnee ,
-% \msg_log:nnne ,
-% \msg_log:nne
-% }
-% \begin{syntax}
-% \cs{msg_term:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \cs{msg_log:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} information \meta{message}, passing
-% \meta{arg one} to \meta{arg four} to the text-creating functions.
-% The output is briefer than \cs{msg_info:nnnnnn}, omitting for
-% instance the module name. It is added to the log file by
-% \cs{msg_log:nnnnnn} while \cs{msg_term:nnnnnn} also prints it on the
-% terminal.
-% \end{function}
-%
-% \begin{function}[updated = 2012-08-11]
-% {
-% \msg_none:nnnnnn ,
-% \msg_none:nnnnn ,
-% \msg_none:nnnn ,
-% \msg_none:nnn ,
-% \msg_none:nn ,
-% \msg_none:nnVV ,
-% \msg_none:nnVn ,
-% \msg_none:nnnV ,
-% \msg_none:nnV ,
-% \msg_none:nneeee ,
-% \msg_none:nneee ,
-% \msg_none:nnnee ,
-% \msg_none:nnee ,
-% \msg_none:nnne ,
-% \msg_none:nne
-% }
-% \begin{syntax}
-% \cs{msg_none:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Does nothing: used as a message class to prevent any output at
-% all (see the discussion of message redirection).
-% \end{function}
-%
-% \subsection{Messages for showing material}
-%
-% \begin{function}[added = 2017-12-04]
-% {
-% \msg_show:nnnnnn ,
-% \msg_show:nnnnn ,
-% \msg_show:nnnn ,
-% \msg_show:nnn ,
-% \msg_show:nn ,
-% \msg_show:nnVV ,
-% \msg_show:nnVn ,
-% \msg_show:nnnV ,
-% \msg_show:nnV ,
-% \msg_show:nneeee ,
-% \msg_show:nneee ,
-% \msg_show:nnnee ,
-% \msg_show:nnee ,
-% \msg_show:nnne ,
-% \msg_show:nne
-% }
-% \begin{syntax}
-% \cs{msg_show:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues \meta{module} information \meta{message}, passing \meta{arg
-% one} to \meta{arg four} to the text-creating functions. The
-% information text is shown on the terminal and the \TeX{} run is
-% interrupted in a manner similar to \cs{tl_show:n}. This is used in
-% conjunction with \cs{msg_show_item:n} and similar functions to print
-% complex variable contents completely. If the formatted text does
-% not contain |>~| at the start of a line, an additional line |>~.|
-% will be put at the end. In addition, a final period is added if not
-% present.
-% \end{function}
-%
-% \begin{function}[EXP, added = 2017-12-04]
-% {\msg_show_item:n, \msg_show_item_unbraced:n, \msg_show_item:nn, \msg_show_item_unbraced:nn}
-% \begin{syntax}
-% \cs{seq_map_function:NN} \meta{seq} \cs{msg_show_item:n}
-% \cs{prop_map_function:NN} \meta{prop} \cs{msg_show_item:nn}
-% \end{syntax}
-% Used in the text of messages for \cs{msg_show:nnnnnn} to show or log
-% a list of items or key--value pairs. The output of
-% \cs{msg_show_item:n} produces a newline, the prefix |>|, two spaces,
-% then the braced string representation of its argument.
-% The two-argument versions separates the key and value using
-% \verb*| => |, and the \texttt{unbraced} versions don't print the
-% surrounding braces.
-%
-% These functions are suitable for usage with iterator functions like
-% \cs{seq_map_function:NN}, \cs{prop_map_function:NN}, etc. For
-% example, with a sequence \cs[no-index]{l_tmpa_seq} containing |a|,
-% |{b}| and |\c|,
-% \begin{verbatim}
-% \seq_map_function:NN \l_tmpa_seq \msg_show_item:n
-% \end{verbatim}
-% would expand to three lines:
-% \begin{quotation}
-% \noindent\verb*|> {a}|\\
-% \verb*|> {{b}}|\\
-% \verb*|> {\c }|
-% \end{quotation}
-% \end{function}
-%
-% \subsection{Expandable error messages}
-%
-% In very rare cases it may be necessary to produce errors in an
-% expansion-only context. The functions in this section should only be
-% used if there is no alternative approach using \cs{msg_error:nnnnnn}
-% or other non-expandable commands from the previous section. Despite
-% having a similar interface as non-expandable messages, expandable
-% errors must be handled internally very differently from normal error
-% messages, as none of the tools to print to the terminal or the log
-% file are expandable. As a result, short-hands such as |\{| or |\\| do
-% not work, and messages must be very short (with default settings,
-% they are truncated after approximately 50 characters). It is
-% advisable to ensure that the message is understandable even when
-% truncated, by putting the most important information up front.
-% Another particularity of expandable messages is that they
-% cannot be redirected or turned off by the user.
-%
-% \begin{function}[EXP, added = 2015-08-06, updated = 2019-02-28]
-% {
-% \msg_expandable_error:nnnnnn ,
-% \msg_expandable_error:nnnnn ,
-% \msg_expandable_error:nnnn ,
-% \msg_expandable_error:nnn ,
-% \msg_expandable_error:nn ,
-% \msg_expandable_error:nnffff ,
-% \msg_expandable_error:nnfff ,
-% \msg_expandable_error:nnff ,
-% \msg_expandable_error:nnf ,
-% }
-% \begin{syntax}
-% \cs{msg_expandable_error:nnnnnn} \Arg{module} \Arg{message} \Arg{arg one} \Arg{arg two} \Arg{arg three} \Arg{arg four}
-% \end{syntax}
-% Issues an \enquote{Undefined error} message from \TeX{} itself
-% using the undefined control sequence \cs{???} then prints
-% \enquote{! \meta{module}: }\meta{error message}, which should be
-% short. With default settings, anything beyond approximately $60$
-% characters long (or bytes in some engines) is cropped. A leading
-% space might be removed as well.
-% \end{function}
-%
-% \section{Redirecting messages}
-%
-% Each message has a \enquote{name}, which can be used to alter the behaviour
-% of the message when it is given. Thus we might have
-% \begin{verbatim}
-% \msg_new:nnnn { module } { my-message } { Some~text } { Some~more~text }
-% \end{verbatim}
-% to define a message, with
-% \begin{verbatim}
-% \msg_error:nn { module } { my-message }
-% \end{verbatim}
-% when it is used. With no filtering, this raises an error. However, we
-% could alter the behaviour with
-% \begin{verbatim}
-% \msg_redirect_class:nn { error } { warning }
-% \end{verbatim}
-% to turn all errors into warnings, or with
-% \begin{verbatim}
-% \msg_redirect_module:nnn { module } { error } { warning }
-% \end{verbatim}
-% to alter only messages from that module, or even
-% \begin{verbatim}
-% \msg_redirect_name:nnn { module } { my-message } { warning }
-% \end{verbatim}
-% to target just one message. Redirection applies first to individual messages,
-% then to messages from one module and finally to messages of one class. Thus
-% it is possible to select out an individual message for special treatment
-% even if the entire class is already redirected.
-%
-% Multiple redirections are possible. Redirections can be cancelled by
-% providing an empty argument for the target class. Redirection to a
-% missing class raises an error immediately. Infinite loops are
-% prevented by eliminating the redirection starting from the target of
-% the redirection that caused the loop to appear. Namely, if
-% redirections are requested as $A \to B$, $B \to C$ and $C \to A$ in
-% this order, then the $A \to B$ redirection is cancelled.
-%
-% \begin{function}[updated = 2012-04-27]{\msg_redirect_class:nn}
-% \begin{syntax}
-% \cs{msg_redirect_class:nn} \Arg{class one} \Arg{class two}
-% \end{syntax}
-% Changes the behaviour of messages of \meta{class one} so that they
-% are processed using the code for those of \meta{class two}.
-% Each \meta{class} can be one of \texttt{fatal}, \texttt{critical},
-% \texttt{error}, \texttt{warning}, \texttt{note}, \texttt{info},
-% \texttt{term}, \texttt{log}, \texttt{none}.
-% \end{function}
-%
-% \begin{function}[updated = 2012-04-27]{\msg_redirect_module:nnn}
-% \begin{syntax}
-% \cs{msg_redirect_module:nnn} \Arg{module} \Arg{class one} \Arg{class two}
-% \end{syntax}
-% Redirects message of \meta{class one} for \meta{module} to act as
-% though they were from \meta{class two}. Messages of \meta{class one}
-% from sources other than \meta{module} are not affected by this
-% redirection. This function can be used to make some messages
-% \enquote{silent} by default. For example, all of the
-% \texttt{warning} messages of \meta{module} could be turned off with:
-% \begin{verbatim}
-% \msg_redirect_module:nnn { module } { warning } { none }
-% \end{verbatim}
-% \end{function}
-%
-% \begin{function}[updated = 2012-04-27]{\msg_redirect_name:nnn}
-% \begin{syntax}
-% \cs{msg_redirect_name:nnn} \Arg{module} \Arg{message} \Arg{class}
-% \end{syntax}
-% Redirects a specific \meta{message} from a specific \meta{module} to
-% act as a member of \meta{class} of messages. No further redirection
-% is performed. This function can be used to make a selected message
-% \enquote{silent} without changing global parameters:
-% \begin{verbatim}
-% \msg_redirect_name:nnn { module } { annoying-message } { none }
-% \end{verbatim}
-% \end{function}
-%
-% \end{documentation}
-%
-% \begin{implementation}
-%
-% \section{\pkg{l3msg} implementation}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% \begin{macrocode}
-%<@@=msg>
-% \end{macrocode}
-%
-% \begin{variable}{\l_@@_internal_tl}
-% A general scratch for the module.
-% \begin{macrocode}
-\tl_new:N \l_@@_internal_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_name_str, \l_@@_text_str}
-% Used to save module info when creating messages.
-% \begin{macrocode}
-\str_new:N \l_@@_name_str
-\str_new:N \l_@@_text_str
-% \end{macrocode}
-% \end{variable}
-%
-% \subsection{Internal auxiliaries}
-%
-% \begin{variable}{\s_@@_mark,\s_@@_stop}
-% Internal scan marks.
-% \begin{macrocode}
-\scan_new:N \s_@@_mark
-\scan_new:N \s_@@_stop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\@@_use_none_delimit_by_s_stop:w}
-% Functions to gobble up to a scan mark.
-% \begin{macrocode}
-\cs_new:Npn \@@_use_none_delimit_by_s_stop:w #1 \s_@@_stop { }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Creating messages}
-%
-% Messages are created and used separately, so there two parts to
-% the code here. First, a mechanism for creating message text.
-% This is pretty simple, as there is not actually a lot to do.
-%
-% \begin{variable}{\c_@@_text_prefix_tl, \c_@@_more_text_prefix_tl}
-% Locations for the text of messages.
-% \begin{macrocode}
-\tl_const:Nn \c_@@_text_prefix_tl { msg~text~>~ }
-\tl_const:Nn \c_@@_more_text_prefix_tl { msg~extra~text~>~ }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP,pTF]{\msg_if_exist:nn}
-% Test whether the control sequence containing the message text exists
-% or not.
-% \begin{macrocode}
-\prg_new_conditional:Npnn \msg_if_exist:nn #1#2 { p , T , F , TF }
- {
- \cs_if_exist:cTF { \c_@@_text_prefix_tl #1 / #2 }
- { \prg_return_true: } { \prg_return_false: }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_chk_if_free:nn}
-% This auxiliary is similar to \cs{__kernel_chk_if_free_cs:N}, and is used when
-% defining messages with \cs{msg_new:nnnn}.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_chk_free:nn #1#2
- {
- \msg_if_exist:nnT {#1} {#2}
- {
- \msg_error:nnnn { msg } { already-defined }
- {#1} {#2}
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_new:nnnn, \msg_new:nnee, \msg_new:nnxx,
-% \msg_new:nnn, \msg_new:nne, \msg_new:nnx
-% }
-% \begin{macro}{\msg_set:nnnn, \msg_set:nnn}
-% Setting a message simply means saving the appropriate text
-% into two functions. A sanity check first.
-% \begin{macrocode}
-\cs_new_protected:Npn \msg_new:nnnn #1#2#3#4
- {
- \@@_chk_free:nn {#1} {#2}
- \cs_gset:cpn { \c_@@_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#3}
- \cs_gset:cpn { \c_@@_more_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#4}
- }
-\cs_generate_variant:Nn \msg_new:nnnn { nnee , nnxx }
-\cs_new_protected:Npn \msg_new:nnn #1#2#3
- { \msg_new:nnnn {#1} {#2} {#3} { } }
-\cs_generate_variant:Nn \msg_new:nnn { nne , nnx }
-\cs_new_protected:Npn \msg_set:nnnn #1#2#3#4
- {
- \cs_set:cpn { \c_@@_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#3}
- \cs_set:cpn { \c_@@_more_text_prefix_tl #1 / #2 }
- ##1##2##3##4 {#4}
- }
-\cs_new_protected:Npn \msg_set:nnn #1#2#3
- { \msg_set:nnnn {#1} {#2} {#3} { } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Messages: support functions and text}
-%
-% \begin{variable}
-% {
-% \c_@@_coding_error_text_tl ,
-% \c_@@_continue_text_tl ,
-% \c_@@_critical_text_tl ,
-% \c_@@_fatal_text_tl ,
-% \c_@@_help_text_tl ,
-% \c_@@_no_info_text_tl ,
-% \c_@@_on_line_text_tl ,
-% \c_@@_return_text_tl ,
-% \c_@@_trouble_text_tl
-% }
-% Simple pieces of text for messages.
-% \begin{macrocode}
-\tl_const:Nn \c_@@_coding_error_text_tl
- {
- This~is~a~coding~error.
- \\ \\
- }
-\tl_const:Nn \c_@@_continue_text_tl
- { Type~<return>~to~continue }
-\tl_const:Nn \c_@@_critical_text_tl
- { Reading~the~current~file~'\g_file_curr_name_str'~will~stop. }
-\tl_const:Nn \c_@@_fatal_text_tl
- { This~is~a~fatal~error:~LaTeX~will~abort. }
-\tl_const:Nn \c_@@_help_text_tl
- { For~immediate~help~type~H~<return> }
-\tl_const:Nn \c_@@_no_info_text_tl
- {
- LaTeX~does~not~know~anything~more~about~this~error,~sorry.
- \c_@@_return_text_tl
- }
-\tl_const:Nn \c_@@_on_line_text_tl { on~line }
-\tl_const:Nn \c_@@_return_text_tl
- {
- \\ \\
- Try~typing~<return>~to~proceed.
- \\
- If~that~doesn't~work,~type~X~<return>~to~quit.
- }
-\tl_const:Nn \c_@@_trouble_text_tl
- {
- \\ \\
- More~errors~will~almost~certainly~follow: \\
- the~LaTeX~run~should~be~aborted.
- }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\msg_line_number:, \msg_line_context:}
-% For writing the line number nicely. \cs{msg_line_context:} was set up
-% earlier, so this is not \texttt{new}.
-% \begin{macrocode}
-\cs_new:Npn \msg_line_number: { \int_use:N \tex_inputlineno:D }
-\cs_gset:Npn \msg_line_context:
- {
- \c_@@_on_line_text_tl
- \c_space_tl
- \msg_line_number:
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Showing messages: low level mechanism}
-%
-% \begin{macro}{\@@_interrupt:Nnnn}
-% \begin{macro}{\@@_no_more_text:nnnn}
-% The low-level interruption macro is rather opaque, unfortunately.
-% Depending on the availability of more information there is a choice
-% of how to set up the further help. We feed the extra help text and
-% the message itself to a wrapping auxiliary, in this order because we
-% must first setup \TeX{}'s \tn{errhelp} register before issuing an
-% \tn{errmessage}. To deal with the various cases of critical or fatal
-% errors with and without help text, there is a bit of argument-passing
-% to do.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_interrupt:NnnnN #1#2#3#4#5
- {
- \str_set:Ne \l_@@_text_str { #1 {#2} }
- \str_set:Ne \l_@@_name_str { \msg_module_name:n {#2} }
- \cs_if_eq:cNTF
- { \c_@@_more_text_prefix_tl #2 / #3 }
- \@@_no_more_text:nnnn
- {
- \@@_interrupt_wrap:nnn
- { \use:c { \c_@@_text_prefix_tl #2 / #3 } #4 }
- { \c_@@_continue_text_tl }
- {
- \c_@@_no_info_text_tl
- \tl_if_empty:NF #5
- { \\ \\ #5 }
- }
- }
- {
- \@@_interrupt_wrap:nnn
- { \use:c { \c_@@_text_prefix_tl #2 / #3 } #4 }
- { \c_@@_help_text_tl }
- {
- \use:c { \c_@@_more_text_prefix_tl #2 / #3 } #4
- \tl_if_empty:NF #5
- { \\ \\ #5 }
- }
- }
- }
-\cs_new:Npn \@@_no_more_text:nnnn #1#2#3#4 { }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_interrupt_wrap:nnn}
-% \begin{macro}{\@@_interrupt_text:n, \@@_interrupt_more_text:n}
-% First setup \TeX{}'s \tn{errhelp} register with the extra help |#1|,
-% then build a nice-looking error message with |#2|. Everything is
-% done using \texttt{e}-type expansion as the new line markers are
-% different for the two type of text and need to be correctly set up.
-% The auxiliary \cs{@@_interrupt_more_text:n} receives its argument
-% as a line-wrapped string, which is thus unaffected by expansion.
-% We ave to split the main text into two parts as only the \enquote{message}
-% itself is wrapped with a leader: the generic help is wrapped at full
-% width. We also have to allow for the two characters used by \tn{errmessage}
-% itself.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_interrupt_wrap:nnn #1#2#3
- {
- \iow_wrap:nnnN { \\ #3 } { } { } \@@_interrupt_more_text:n
- \group_begin:
- \int_sub:Nn \l_iow_line_count_int { 2 }
- \iow_wrap:nenN { \l_@@_text_str : ~ #1 }
- {
- ( \l_@@_name_str )
- \prg_replicate:nn
- {
- \str_count:N \l_@@_text_str
- - \str_count:N \l_@@_name_str
- + 2
- }
- { ~ }
- }
- { } \@@_interrupt_text:n
- \iow_wrap:nnnN { \l_@@_internal_tl \\ \\ #2 } { } { }
- \@@_interrupt:n
- }
-\cs_new_protected:Npn \@@_interrupt_text:n #1
- {
- \group_end:
- \tl_set:Nn \l_@@_internal_tl {#1}
- }
-\cs_new_protected:Npn \@@_interrupt_more_text:n #1
- { \exp_args:Ne \tex_errhelp:D { #1 \iow_newline: } }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_interrupt:n}
-% The business end of the process starts by producing some visual
-% separation of the message from the main part of the log. The error
-% message needs to be printed with everything made
-% \enquote{invisible}: \TeX{}'s own information involves the macro in
-% which \tn{errmessage} is called, and the end of the argument of the
-% \tn{errmessage}, including the closing brace. We use an active |!|
-% to call the \tn{errmessage} primitive, and end its argument with
-% \cs{use_none:n} \Arg{spaces} which fills the output with spaces. Two
-% trailing closing braces are turned into spaces to hide them as well.
-% The group in which we alter the definition of the active |!| is
-% closed before producing the message: this ensures that tokens
-% inserted by typing |I| in the command-line are inserted after
-% the message is entirely cleaned up.
-%
-% The \cs{__kernel_iow_with:Nnn} auxiliary, defined in \pkg{l3file}, expects
-% an \meta{integer variable}, an integer \meta{value}, and some
-% \meta{code}. It runs the \meta{code} after ensuring that the
-% \meta{integer variable} takes the given \meta{value}, then restores
-% the former value of the \meta{integer variable} if needed. We use
-% it to ensure that the \tn{newlinechar} is $10$, as needed for
-% \cs{iow_newline:} to work, and that \tn{errorcontextlines} is $-1$,
-% to avoid showing irrelevant context. Note that restoring the former
-% value of these integers requires inserting tokens after the
-% \tn{errmessage}, which go in the way of tokens which could be
-% inserted by the user. This is unavoidable.
-% \begin{macrocode}
-\group_begin:
- \char_set_lccode:nn { 38 } { 32 } % &
- \char_set_lccode:nn { 46 } { 32 } % .
- \char_set_lccode:nn { 123 } { 32 } % {
- \char_set_lccode:nn { 125 } { 32 } % }
- \char_set_catcode_active:N \&
-\tex_lowercase:D
- {
- \group_end:
- \cs_new_protected:Npn \@@_interrupt:n #1
- {
- \iow_term:n { }
- \__kernel_iow_with:Nnn \tex_newlinechar:D { `\^^J }
- {
- \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
- {
- \group_begin:
- \cs_set_protected:Npn &
- {
- \tex_errmessage:D
- {
- #1
- \use_none:n
- { ............................................ }
- }
- }
- \exp_after:wN
- \group_end:
- &
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Displaying messages}
-%
-% \LaTeX{} is handling error messages and so the \TeX{} ones are disabled.
-% \begin{macrocode}
-\int_gset:Nn \tex_errorcontextlines:D { -1 }
-% \end{macrocode}
-%
-% \begin{macro}[EXP]
-% {
-% \msg_fatal_text:n ,
-% \msg_critical_text:n ,
-% \msg_error_text:n ,
-% \msg_warning_text:n ,
-% \msg_info_text:n
-% }
-% \begin{macro}[EXP]{\@@_text:nn}
-% \begin{macro}[EXP]{\@@_text:n}
-% A function for issuing messages: both the text and order could
-% in principle vary. The module name may be empty for kernel messages,
-% hence the slightly contorted code path for a space.
-% \begin{macrocode}
-\cs_new:Npn \msg_fatal_text:n #1
- {
- Fatal ~
- \msg_error_text:n {#1}
- }
-\cs_new:Npn \msg_critical_text:n #1
- {
- Critical ~
- \msg_error_text:n {#1}
- }
-\cs_new:Npn \msg_error_text:n #1
- { \@@_text:nn {#1} { Error } }
-\cs_new:Npn \msg_warning_text:n #1
- { \@@_text:nn {#1} { Warning } }
-\cs_new:Npn \msg_info_text:n #1
- { \@@_text:nn {#1} { Info } }
-\cs_new:Npn \@@_text:nn #1#2
- {
- \exp_args:Nf \@@_text:n { \msg_module_type:n {#1} }
- \exp_args:Nf \@@_text:n { \msg_module_name:n {#1} }
- #2
- }
-\cs_new:Npn \@@_text:n #1
- {
- \tl_if_blank:nF {#1}
- { #1 ~ }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{variable}{\g_msg_module_name_prop, \g_msg_module_type_prop}
-% For storing public module information: the kernel data is set up
-% in advance.
-% \begin{macrocode}
-\prop_new:N \g_msg_module_name_prop
-\prop_new:N \g_msg_module_type_prop
-\prop_gput:Nnn \g_msg_module_type_prop { LaTeX } { }
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}[EXP]{\msg_module_type:n}
-% Contextual footer information, with the potential to give modules an
-% alternative name.
-% \begin{macrocode}
-\cs_new:Npn \msg_module_type:n #1
- {
- \prop_if_in:NnTF \g_msg_module_type_prop {#1}
- { \prop_item:Nn \g_msg_module_type_prop {#1} }
- { Package }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]{\msg_module_name:n, \msg_see_documentation_text:n}
-% Contextual footer information, with the potential to give modules an
-% alternative name.
-% \begin{macrocode}
-\cs_new:Npn \msg_module_name:n #1
- {
- \prop_if_in:NnTF \g_msg_module_name_prop {#1}
- { \prop_item:Nn \g_msg_module_name_prop {#1} }
- {#1}
- }
-\cs_new:Npn \msg_see_documentation_text:n #1
- {
- See~the~ \msg_module_name:n {#1} ~
- documentation~for~further~information.
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\@@_class_new:nn}
-% \begin{macrocode}
-\group_begin:
- \cs_set_protected:Npn \@@_class_new:nn #1#2
- {
- \prop_new:c { l_@@_redirect_ #1 _prop }
- \cs_new_protected:cpn { @@_ #1 _code:nnnnnn }
- ##1##2##3##4##5##6 {#2}
- \cs_new_protected:cpn { msg_ #1 :nnnnnn } ##1##2##3##4##5##6
- {
- \use:e
- {
- \exp_not:n { \@@_use:nnnnnnn {#1} {##1} {##2} }
- { \tl_to_str:n {##3} } { \tl_to_str:n {##4} }
- { \tl_to_str:n {##5} } { \tl_to_str:n {##6} }
- }
- }
- \cs_new_protected:cpe { msg_ #1 :nnnnn } ##1##2##3##4##5
- { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} {##5} { } }
- \cs_new_protected:cpe { msg_ #1 :nnnn } ##1##2##3##4
- { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} {##4} { } { } }
- \cs_new_protected:cpe { msg_ #1 :nnn } ##1##2##3
- { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} {##3} { } { } { } }
- \cs_new_protected:cpe { msg_ #1 :nn } ##1##2
- { \exp_not:c { msg_ #1 :nnnnnn } {##1} {##2} { } { } { } { } }
- \cs_generate_variant:cn { msg_ #1 :nnn }
- { nnV , nne , nnx }
- \cs_generate_variant:cn { msg_ #1 :nnnn }
- { nnVV , nnVn , nnnV , nnne , nnnx , nnee , nnxx }
- \cs_generate_variant:cn { msg_ #1 :nnnnn }
- { nnnee , nnnxx , nneee , nnxxx }
- \cs_generate_variant:cn { msg_ #1 :nnnnnn } { nneeee , nnxxxx }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_fatal:nnnnnn ,
-% \msg_fatal:nnnnn ,
-% \msg_fatal:nnnn ,
-% \msg_fatal:nnn ,
-% \msg_fatal:nn ,
-% \msg_fatal:nnVV ,
-% \msg_fatal:nnVn ,
-% \msg_fatal:nnnV ,
-% \msg_fatal:nnV ,
-% \msg_fatal:nneeee ,
-% \msg_fatal:nneee ,
-% \msg_fatal:nnxxxx ,
-% \msg_fatal:nnxxx ,
-% \msg_fatal:nnnee ,
-% \msg_fatal:nnee ,
-% \msg_fatal:nnnxx ,
-% \msg_fatal:nnxx ,
-% \msg_fatal:nnnx ,
-% \msg_fatal:nnne ,
-% \msg_fatal:nne ,
-% \msg_fatal:nnx
-% }
-% \begin{macro}{\@@_fatal_exit:}
-% For fatal errors, after the error message \TeX{} bails out. We force
-% a bail out rather than using \tn{end} as this means it does not
-% matter if we are in a context where normally the run cannot end.
-% \begin{macrocode}
- \@@_class_new:nn { fatal }
- {
- \@@_interrupt:NnnnN
- \msg_fatal_text:n {#1} {#2}
- { {#3} {#4} {#5} {#6} }
- \c_@@_fatal_text_tl
- \@@_fatal_exit:
- }
- \cs_new_protected:Npn \@@_fatal_exit:
- {
- \tex_batchmode:D
- \tex_read:D -1 to \l_@@_internal_tl
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_critical:nnnnnn ,
-% \msg_critical:nnnnn ,
-% \msg_critical:nnnn ,
-% \msg_critical:nnn ,
-% \msg_critical:nn ,
-% \msg_critical:nnVV ,
-% \msg_critical:nnVn ,
-% \msg_critical:nnnV ,
-% \msg_critical:nnV ,
-% \msg_critical:nneeee ,
-% \msg_critical:nneee ,
-% \msg_critical:nnxxxx ,
-% \msg_critical:nnxxx ,
-% \msg_critical:nnnee ,
-% \msg_critical:nnee ,
-% \msg_critical:nnnxx ,
-% \msg_critical:nnxx ,
-% \msg_critical:nnnx ,
-% \msg_critical:nnne ,
-% \msg_critical:nne ,
-% \msg_critical:nnx
-% }
-% Not quite so bad: just end the current file.
-% \begin{macrocode}
- \@@_class_new:nn { critical }
- {
- \@@_interrupt:NnnnN
- \msg_critical_text:n {#1} {#2}
- { {#3} {#4} {#5} {#6} }
- \c_@@_critical_text_tl
- \tex_endinput:D
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_error:nnnnnn ,
-% \msg_error:nnnnn ,
-% \msg_error:nnnn ,
-% \msg_error:nnn ,
-% \msg_error:nn ,
-% \msg_error:nnVV ,
-% \msg_error:nnVn ,
-% \msg_error:nnnV ,
-% \msg_error:nnV ,
-% \msg_error:nneeee ,
-% \msg_error:nneee ,
-% \msg_error:nnxxxx ,
-% \msg_error:nnxxx ,
-% \msg_error:nnnee ,
-% \msg_error:nnee ,
-% \msg_error:nnnxx ,
-% \msg_error:nnxx ,
-% \msg_error:nnnx ,
-% \msg_error:nnne ,
-% \msg_error:nne ,
-% \msg_error:nnx
-% }
-% For an error, the interrupt routine is called. We check if there is
-% a \enquote{more text} by comparing that control sequence with a
-% permanently empty text. We have to undefine the bootstrap versions
-% here.
-% \begin{macrocode}
- \cs_undefine:N \msg_error:nnee
- \cs_undefine:N \msg_error:nne
- \cs_undefine:N \msg_error:nn
- \@@_class_new:nn { error }
- {
- \@@_interrupt:NnnnN
- \msg_error_text:n {#1} {#2}
- { {#3} {#4} {#5} {#6} }
- \c_empty_tl
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \@@_info_aux:NNnnnnnn ,
-% \msg_warning:nnnnnn ,
-% \msg_warning:nnnnn ,
-% \msg_warning:nnnn ,
-% \msg_warning:nnn ,
-% \msg_warning:nn ,
-% \msg_warning:nnVV ,
-% \msg_warning:nnVn ,
-% \msg_warning:nnnV ,
-% \msg_warning:nnV ,
-% \msg_warning:nneeee ,
-% \msg_warning:nneee ,
-% \msg_warning:nnxxxx ,
-% \msg_warning:nnxxx ,
-% \msg_warning:nnnee ,
-% \msg_warning:nnee ,
-% \msg_warning:nnnxx ,
-% \msg_warning:nnxx ,
-% \msg_warning:nnnx ,
-% \msg_warning:nnne ,
-% \msg_warning:nne ,
-% \msg_warning:nnx ,
-% \msg_note:nnnnnn ,
-% \msg_note:nnnnn ,
-% \msg_note:nnnn ,
-% \msg_note:nnn ,
-% \msg_note:nn ,
-% \msg_note:nnVV ,
-% \msg_note:nnVn ,
-% \msg_note:nnnV ,
-% \msg_note:nnV ,
-% \msg_note:nneeee ,
-% \msg_note:nneee ,
-% \msg_note:nnxxxx ,
-% \msg_note:nnxxx ,
-% \msg_note:nnnee ,
-% \msg_note:nnee ,
-% \msg_note:nnnxx ,
-% \msg_note:nnxx ,
-% \msg_note:nnnx ,
-% \msg_note:nnne ,
-% \msg_note:nne ,
-% \msg_note:nnx ,
-% \msg_info:nnnnnn ,
-% \msg_info:nnnnn ,
-% \msg_info:nnnn ,
-% \msg_info:nnn ,
-% \msg_info:nn ,
-% \msg_info:nnVV ,
-% \msg_info:nnVn ,
-% \msg_info:nnnV ,
-% \msg_info:nnV ,
-% \msg_info:nneeee ,
-% \msg_info:nneee ,
-% \msg_info:nnxxxx ,
-% \msg_info:nnxxx ,
-% \msg_info:nnnee ,
-% \msg_info:nnee ,
-% \msg_info:nnnxx ,
-% \msg_info:nnxx ,
-% \msg_info:nnnx ,
-% \msg_info:nnne ,
-% \msg_info:nne ,
-% \msg_info:nnx
-% }
-% Warnings and information messages have no decoration. Warnings are
-% printed to the terminal while information can either go to the log
-% or both log and terminal.
-% \begin{macrocode}
- \cs_new_protected:Npn \@@_info_aux:NNnnnnnn #1#2#3#4#5#6#7#8
- {
- \str_set:Ne \l_@@_text_str { #2 {#3} }
- \str_set:Ne \l_@@_name_str { \msg_module_name:n {#3} }
- #1 { }
- \iow_wrap:nenN
- {
- \l_@@_text_str : ~
- \use:c { \c_@@_text_prefix_tl #3 / #4 } {#5} {#6} {#7} {#8}
- }
- {
- ( \l_@@_name_str )
- \prg_replicate:nn
- {
- \str_count:N \l_@@_text_str
- - \str_count:N \l_@@_name_str
- }
- { ~ }
- }
- { } #1
- #1 { }
- }
- \@@_class_new:nn { warning }
- {
- \@@_info_aux:NNnnnnnn \iow_term:n \msg_warning_text:n
- {#1} {#2} {#3} {#4} {#5} {#6}
- }
- \@@_class_new:nn { note }
- {
- \@@_info_aux:NNnnnnnn \iow_term:n \msg_info_text:n
- {#1} {#2} {#3} {#4} {#5} {#6}
- }
- \@@_class_new:nn { info }
- {
- \@@_info_aux:NNnnnnnn \iow_log:n \msg_info_text:n
- {#1} {#2} {#3} {#4} {#5} {#6}
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_term:nnnnnn ,
-% \msg_term:nnnnn ,
-% \msg_term:nnnn ,
-% \msg_term:nnn ,
-% \msg_term:nn ,
-% \msg_term:nnVV ,
-% \msg_term:nnVn ,
-% \msg_term:nnnV ,
-% \msg_term:nnV ,
-% \msg_term:nneeee ,
-% \msg_term:nneee ,
-% \msg_term:nnxxxx ,
-% \msg_term:nnxxx ,
-% \msg_term:nnnee ,
-% \msg_term:nnee ,
-% \msg_term:nnnxx ,
-% \msg_term:nnxx ,
-% \msg_term:nnnx ,
-% \msg_term:nnne ,
-% \msg_term:nne ,
-% \msg_term:nnx ,
-% \msg_log:nnnnnn ,
-% \msg_log:nnnnn ,
-% \msg_log:nnnn ,
-% \msg_log:nnn ,
-% \msg_log:nn ,
-% \msg_log:nnVV ,
-% \msg_log:nnVn ,
-% \msg_log:nnnV ,
-% \msg_log:nnV ,
-% \msg_log:nneeee ,
-% \msg_log:nneee ,
-% \msg_log:nnxxxx ,
-% \msg_log:nnxxx ,
-% \msg_log:nnnee ,
-% \msg_log:nnee ,
-% \msg_log:nnnxx ,
-% \msg_log:nnxx ,
-% \msg_log:nnnx ,
-% \msg_log:nnne ,
-% \msg_log:nne ,
-% \msg_log:nnx
-% }
-% \enquote{Log} data is very similar to information, but with no extras
-% added.
-% \enquote{Term} is used for communicating with the user through the
-% terminal, like diagnostic messages, and debugging. This is similar
-% to \enquote{log} messages, but uses the terminal output.
-% \begin{macrocode}
- \@@_class_new:nn { log }
- {
- \iow_wrap:nnnN
- { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
- { } { } \iow_log:n
- }
- \@@_class_new:nn { term }
- {
- \iow_wrap:nnnN
- { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
- { } { } \iow_term:n
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_none:nnnnnn ,
-% \msg_none:nnnnn ,
-% \msg_none:nnnn ,
-% \msg_none:nnn ,
-% \msg_none:nn ,
-% \msg_none:nnVV ,
-% \msg_none:nnVn ,
-% \msg_none:nnnV ,
-% \msg_none:nnV ,
-% \msg_none:nneeee ,
-% \msg_none:nneee ,
-% \msg_none:nnxxxx ,
-% \msg_none:nnxxx ,
-% \msg_none:nnnee ,
-% \msg_none:nnee ,
-% \msg_none:nnnxx ,
-% \msg_none:nnxx ,
-% \msg_none:nnnx ,
-% \msg_none:nnne ,
-% \msg_none:nne ,
-% \msg_none:nnx
-% }
-% The \texttt{none} message type is needed so that input can be gobbled.
-% \begin{macrocode}
- \@@_class_new:nn { none } { }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \msg_show:nnnnnn ,
-% \msg_show:nnnnn ,
-% \msg_show:nnnn ,
-% \msg_show:nnn ,
-% \msg_show:nn ,
-% \msg_show:nnVV ,
-% \msg_show:nnVn ,
-% \msg_show:nnnV ,
-% \msg_show:nnV ,
-% \msg_show:nneeee ,
-% \msg_show:nneee ,
-% \msg_show:nnxxxx ,
-% \msg_show:nnxxx ,
-% \msg_show:nnnee ,
-% \msg_show:nnee ,
-% \msg_show:nnnxx ,
-% \msg_show:nnxx ,
-% \msg_show:nnnx ,
-% \msg_show:nnne ,
-% \msg_show:nne ,
-% \msg_show:nnx
-% }
-% \begin{macro}{\@@_show:n, \@@_show:w, \@@_show_dot:w, \@@_show:nn}
-% The \texttt{show} message type is used for \cs{seq_show:N} and
-% similar complicated data structures. Wrap the given text with a
-% trailing dot (important later) then pass it to \cs{@@_show:n}. If
-% there is |\\>~| (or if the whole thing starts with |>~|) we split
-% there, print the first part and show the second part using
-% \tn{showtokens} (the \cs{exp_after:wN} ensure a nice display). Note
-% that this primitive adds a leading |>~| and trailing dot. That is
-% why we included a trailing dot before wrapping and removed it
-% afterwards. If there is no |\\>~| do the same but with an empty
-% second part which adds a spurious but inevitable |>~.|
-% \begin{macrocode}
- \@@_class_new:nn { show }
- {
- \iow_wrap:nnnN
- { \use:c { \c_@@_text_prefix_tl #1 / #2 } {#3} {#4} {#5} {#6} }
- { } { } \@@_show:n
- }
- \cs_new_protected:Npn \@@_show:n #1
- {
- \tl_if_in:nnTF { ^^J #1 } { ^^J > ~ }
- {
- \tl_if_in:nnTF { #1 \s_@@_mark } { . \s_@@_mark }
- { \@@_show_dot:w } { \@@_show:w }
- ^^J #1 \s_@@_stop
- }
- { \@@_show:nn { ? #1 } { } }
- }
- \cs_new:Npn \@@_show_dot:w #1 ^^J > ~ #2 . \s_@@_stop
- { \@@_show:nn {#1} {#2} }
- \cs_new:Npn \@@_show:w #1 ^^J > ~ #2 \s_@@_stop
- { \@@_show:nn {#1} {#2} }
- \cs_new_protected:Npn \@@_show:nn #1#2
- {
- \tl_if_empty:nF {#1}
- { \exp_args:No \iow_term:n { \use_none:n #1 } }
- \tl_set:Nn \l_@@_internal_tl {#2}
- \__kernel_iow_with:Nnn \tex_newlinechar:D { 10 }
- {
- \__kernel_iow_with:Nnn \tex_errorcontextlines:D { -1 }
- {
- \tex_showtokens:D \exp_after:wN \exp_after:wN \exp_after:wN
- { \exp_after:wN \l_@@_internal_tl }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% End the group to eliminate \cs{@@_class_new:nn}.
-% \begin{macrocode}
-\group_end:
-% \end{macrocode}
-%
-% \begin{macro}[EXP]{\msg_show_item:n}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:n}
-% \begin{macro}[EXP]{\msg_show_item:nn}
-% \begin{macro}[EXP]{\msg_show_item_unbraced:nn}
-% Each item in the variable is formatted using one of the following
-% functions. We cannot use |\\| and so on because these short-hands
-% cannot be used inside the arguments of messages, only when defining
-% the messages. We need to use |^^J| here directly as \pkg{l3file} is
-% not yet loaded.
-% \begin{macrocode}
-\cs_new:Npe \msg_show_item:n #1
- { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n { {#1} } }
-\cs_new:Npe \msg_show_item_unbraced:n #1
- { ^^J > ~ \c_space_tl \exp_not:N \tl_to_str:n {#1} }
-\cs_new:Npe \msg_show_item:nn #1#2
- {
- ^^J > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#1} }
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n { {#2} }
- }
-\cs_new:Npe \msg_show_item_unbraced:nn #1#2
- {
- ^^J > \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#1}
- \use:nn { ~ } { ~ } => \use:nn { ~ } { ~ }
- \exp_not:N \tl_to_str:n {#2}
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\@@_class_chk_exist:nT}
-% Checking that a message class exists. We build this from
-% \cs{cs_if_free:cTF} rather than \cs{cs_if_exist:cTF} because that
-% avoids reading the second argument earlier than necessary.
-% \begin{macrocode}
-\cs_new:Npn \@@_class_chk_exist:nT #1
- {
- \cs_if_free:cTF { @@_ #1 _code:nnnnnn }
- { \msg_error:nnn { msg } { class-unknown } {#1} }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{variable}{\l_@@_class_tl, \l_@@_current_class_tl}
-% Support variables needed for the redirection system.
-% \begin{macrocode}
-\tl_new:N \l_@@_class_tl
-\tl_new:N \l_@@_current_class_tl
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_redirect_prop}
-% For redirection of individually-named messages
-% \begin{macrocode}
-\prop_new:N \l_@@_redirect_prop
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_hierarchy_seq}
-% During redirection, split the message name into a sequence:
-% |{/module/submodule}|, |{/module}|, and |{}|.
-% \begin{macrocode}
-\seq_new:N \l_@@_hierarchy_seq
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{variable}{\l_@@_class_loop_seq}
-% Classes encountered when following redirections to check for loops.
-% \begin{macrocode}
-\seq_new:N \l_@@_class_loop_seq
-% \end{macrocode}
-% \end{variable}
-%
-% \begin{macro}{\@@_use:nnnnnnn}
-% \begin{macro}
-% {
-% \@@_use_redirect_name:n , \@@_use_hierarchy:nwwN ,
-% \@@_use_redirect_module:n, \@@_use_code:
-% }
-% Actually using a message is a multi-step process. First, some
-% safety checks on the message and class requested. The code and
-% arguments are then stored to avoid passing them around. The
-% assignment to \cs{@@_use_code:} is similar to \cs{tl_set:Nn}.
-% The message is eventually produced with whatever \cs{l_@@_class_tl}
-% is when \cs{@@_use_code:} is called.
-% Here is also a good place to suppress tracing output if the
-% \pkg{trace} package is loaded since all (non-expandable) messages go
-% through this auxiliary.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use:nnnnnnn #1#2#3#4#5#6#7
- {
- \cs_if_exist_use:N \conditionally@traceoff
- \msg_if_exist:nnTF {#2} {#3}
- {
- \@@_class_chk_exist:nT {#1}
- {
- \tl_set:Nn \l_@@_current_class_tl {#1}
- \cs_set_protected:Npe \@@_use_code:
- {
- \exp_not:n
- {
- \use:c { @@_ \l_@@_class_tl _code:nnnnnn }
- {#2} {#3} {#4} {#5} {#6} {#7}
- }
- }
- \@@_use_redirect_name:n { #2 / #3 }
- }
- }
- { \msg_error:nnnn { msg } { unknown } {#2} {#3} }
- \cs_if_exist_use:N \conditionally@traceon
- }
-\cs_new_protected:Npn \@@_use_code: { }
-% \end{macrocode}
-% The first check is for a individual message redirection. If this
-% applies then no further redirection is attempted. Otherwise, split
-% the message name into \meta{module}, \meta{submodule} and \meta{message}
-% (with an
-% arbitrary number of slashes), and store |{/module/submodule}|,
-% |{/module}| and |{}| into \cs{l_@@_hierarchy_seq}. We then
-% map through this sequence, applying the most specific redirection.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_redirect_name:n #1
- {
- \prop_get:NnNTF \l_@@_redirect_prop { / #1 } \l_@@_class_tl
- { \@@_use_code: }
- {
- \seq_clear:N \l_@@_hierarchy_seq
- \@@_use_hierarchy:nwwN { }
- #1 \s_@@_mark \@@_use_hierarchy:nwwN
- / \s_@@_mark \@@_use_none_delimit_by_s_stop:w
- \s_@@_stop
- \@@_use_redirect_module:n { }
- }
- }
-\cs_new_protected:Npn \@@_use_hierarchy:nwwN #1#2 / #3 \s_@@_mark #4
- {
- \seq_put_left:Nn \l_@@_hierarchy_seq {#1}
- #4 { #1 / #2 } #3 \s_@@_mark #4
- }
-% \end{macrocode}
-% At this point, the items of \cs{l_@@_hierarchy_seq} are the
-% various levels at which we should look for a redirection.
-% Redirections which are less specific than the argument of
-% \cs{@@_use_redirect_module:n} are not attempted. This argument is
-% empty for a class redirection, \texttt{/module} for a module
-% redirection, \emph{etc.} Loop through the sequence to find the most
-% specific redirection, with module |##1|. The loop is interrupted
-% after testing for a redirection for |##1| equal to the argument |#1|
-% (least specific redirection allowed). When a redirection is found,
-% break the mapping, then if the redirection targets the same class,
-% output the code with that class, and otherwise set the target as the
-% new current class, and search for further redirections. Those
-% redirections should be at least as specific as |##1|.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_use_redirect_module:n #1
- {
- \seq_map_inline:Nn \l_@@_hierarchy_seq
- {
- \prop_get:cnNTF { l_@@_redirect_ \l_@@_current_class_tl _prop }
- {##1} \l_@@_class_tl
- {
- \seq_map_break:n
- {
- \tl_if_eq:NNTF \l_@@_current_class_tl \l_@@_class_tl
- { \@@_use_code: }
- {
- \tl_set_eq:NN \l_@@_current_class_tl \l_@@_class_tl
- \@@_use_redirect_module:n {##1}
- }
- }
- }
- {
- \str_if_eq:nnT {##1} {#1}
- {
- \tl_set_eq:NN \l_@@_class_tl \l_@@_current_class_tl
- \seq_map_break:n { \@@_use_code: }
- }
- }
- }
- }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-% \begin{macro}{\msg_redirect_name:nnn}
-% Named message always use the given class even if that class is
-% redirected further. An empty target class cancels any existing
-% redirection for that message.
-% \begin{macrocode}
-\cs_new_protected:Npn \msg_redirect_name:nnn #1#2#3
- {
- \tl_if_empty:nTF {#3}
- { \prop_remove:Nn \l_@@_redirect_prop { / #1 / #2 } }
- {
- \@@_class_chk_exist:nT {#3}
- { \prop_put:Nnn \l_@@_redirect_prop { / #1 / #2 } {#3} }
- }
- }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\msg_redirect_class:nn, \msg_redirect_module:nnn}
-% \begin{macro}{\@@_redirect:nnn, \@@_redirect_loop_chk:nnn}
-% \begin{macro}{\@@_redirect_loop_list:n}
-% If the target class is empty, eliminate the corresponding
-% redirection. Otherwise, add the redirection. We must then check
-% for a loop: as an initialization, we start by storing the initial
-% class in \cs{l_@@_current_class_tl}.
-% \begin{macrocode}
-\cs_new_protected:Npn \msg_redirect_class:nn
- { \@@_redirect:nnn { } }
-\cs_new_protected:Npn \msg_redirect_module:nnn #1
- { \@@_redirect:nnn { / #1 } }
-\cs_new_protected:Npn \@@_redirect:nnn #1#2#3
- {
- \@@_class_chk_exist:nT {#2}
- {
- \tl_if_empty:nTF {#3}
- { \prop_remove:cn { l_@@_redirect_ #2 _prop } {#1} }
- {
- \@@_class_chk_exist:nT {#3}
- {
- \prop_put:cnn { l_@@_redirect_ #2 _prop } {#1} {#3}
- \tl_set:Nn \l_@@_current_class_tl {#2}
- \seq_clear:N \l_@@_class_loop_seq
- \@@_redirect_loop_chk:nnn {#2} {#3} {#1}
- }
- }
- }
- }
-% \end{macrocode}
-% Since multiple redirections can only happen with increasing
-% specificity, a loop requires that all steps are of the same
-% specificity. The new redirection can thus only create a loop with
-% other redirections for the exact same module, |#1|, and not
-% submodules. After some initialization above, follow redirections
-% with \cs{l_@@_class_tl}, and keep track in
-% \cs{l_@@_class_loop_seq} of the various classes encountered. A
-% redirection from a class to itself, or the absence of redirection
-% both mean that there is no loop. A redirection to the initial class
-% marks a loop. To break it, we must decide which redirection to
-% cancel. The user most likely wants the newly added redirection to
-% hold with no further redirection. We thus remove the redirection
-% starting from |#2|, target of the new redirection. Note that no
-% message is emitted by any of the underlying functions: otherwise we
-% may get an infinite loop because of a message from the message
-% system itself.
-% \begin{macrocode}
-\cs_new_protected:Npn \@@_redirect_loop_chk:nnn #1#2#3
- {
- \seq_put_right:Nn \l_@@_class_loop_seq {#1}
- \prop_get:cnNT { l_@@_redirect_ #1 _prop } {#3} \l_@@_class_tl
- {
- \str_if_eq:VnF \l_@@_class_tl {#1}
- {
- \tl_if_eq:NNTF \l_@@_class_tl \l_@@_current_class_tl
- {
- \prop_put:cnn { l_@@_redirect_ #2 _prop } {#3} {#2}
- \msg_warning:nneeee
- { msg } { redirect-loop }
- { \seq_item:Nn \l_@@_class_loop_seq { 1 } }
- { \seq_item:Nn \l_@@_class_loop_seq { 2 } }
- {#3}
- {
- \seq_map_function:NN \l_@@_class_loop_seq
- \@@_redirect_loop_list:n
- { \seq_item:Nn \l_@@_class_loop_seq { 1 } }
- }
- }
- { \@@_redirect_loop_chk:onn \l_@@_class_tl {#2} {#3} }
- }
- }
- }
-\cs_generate_variant:Nn \@@_redirect_loop_chk:nnn { o }
-\cs_new:Npn \@@_redirect_loop_list:n #1 { {#1} ~ => ~ }
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-% \subsection{Kernel-specific functions}
-%
-% \begin{macro}{\__kernel_msg_show_eval:Nn, \__kernel_msg_log_eval:Nn, \@@_show_eval:nnN}
-% A short-hand used for \cs{int_show:n} and similar functions that
-% passes to \cs{tl_show:n} the result of applying |#1| (a
-% function such as \cs{int_eval:n}) to the expression |#2|. The use of
-% \texttt{f}-expansion ensures that |#1| is expanded in the scope in which the
-% show command is called, rather than in the group created by
-% \cs{iow_wrap:nnnN}. This is only important for expressions
-% involving the \tn{currentgrouplevel} or \tn{currentgrouptype}.
-% On the other hand we want the expression to be converted to a string
-% with the usual escape character, hence within the wrapping code.
-% \begin{macrocode}
-\cs_new_protected:Npn \__kernel_msg_show_eval:Nn #1#2
- { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_show:n }
-\cs_new_protected:Npn \__kernel_msg_log_eval:Nn #1#2
- { \exp_args:Nf \@@_show_eval:nnN { #1 {#2} } {#2} \tl_log:n }
-\cs_new_protected:Npn \@@_show_eval:nnN #1#2#3 { #3 { #2 = #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% These are all retained purely for older \pkg{xparse} support.
-%
-% \begin{macro}{\__kernel_msg_new:nnnn, \__kernel_msg_new:nnn}
-% \begin{macrocode}
-\cs_new_protected:Npn \__kernel_msg_new:nnnn #1
- { \msg_new:nnnn { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_new:nnn #1
- { \msg_new:nnn { LaTeX / #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \__kernel_msg_info:nnxx ,
-% \__kernel_msg_warning:nnx ,
-% \__kernel_msg_warning:nnxx ,
-% \__kernel_msg_error:nnx ,
-% \__kernel_msg_error:nnxx ,
-% \__kernel_msg_error:nnxxx
-% }
-% \begin{macrocode}
-\cs_new_protected:Npn \__kernel_msg_info:nnxx #1
- { \msg_info:nnee { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_warning:nnx #1
- { \msg_warning:nne { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_warning:nnxx #1
- { \msg_warning:nnee { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_error:nnx #1
- { \msg_error:nne { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_error:nnxx #1
- { \msg_error:nnee { LaTeX / #1 } }
-\cs_new_protected:Npn \__kernel_msg_error:nnxxx #1
- { \msg_error:nneee { LaTeX / #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}
-% {
-% \__kernel_msg_expandable_error:nnn ,
-% \__kernel_msg_expandable_error:nnf ,
-% \__kernel_msg_expandable_error:nnff
-% }
-% \begin{macrocode}
-\cs_new:Npn \__kernel_msg_expandable_error:nnn #1
- { \msg_expandable_error:nnn { LaTeX / #1 } }
-\cs_new:Npn \__kernel_msg_expandable_error:nnf #1
- { \msg_expandable_error:nnf { LaTeX / #1 } }
-\cs_new:Npn \__kernel_msg_expandable_error:nnff #1
- { \msg_expandable_error:nnff { LaTeX / #1 } }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Internal messages}
-%
-% Error messages needed to actually implement the message system
-% itself.
-% \begin{macrocode}
-\msg_new:nnnn { msg } { already-defined }
- { Message~'#2'~for~module~'#1'~already~defined. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~was~asked~to~define~a~new~message~called~'#2'\\
- by~the~module~'#1':~this~message~already~exists.
- \c_@@_return_text_tl
- }
-\msg_new:nnnn { msg } { unknown }
- { Unknown~message~'#2'~for~module~'#1'. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~was~asked~to~display~a~message~called~'#2'\\
- by~the~module~'#1':~this~message~does~not~exist.
- \c_@@_return_text_tl
- }
-\msg_new:nnnn { msg } { class-unknown }
- { Unknown~message~class~'#1'. }
- {
- LaTeX~has~been~asked~to~redirect~messages~to~a~class~'#1':\\
- this~was~never~defined.
- \c_@@_return_text_tl
- }
-\msg_new:nnnn { msg } { redirect-loop }
- {
- Message~redirection~loop~caused~by~ {#1} ~=>~ {#2}
- \tl_if_empty:nF {#3} { ~for~module~' \use_none:n #3 ' } .
- }
- {
- Adding~the~message~redirection~ {#1} ~=>~ {#2}
- \tl_if_empty:nF {#3} { ~for~the~module~' \use_none:n #3 ' } ~
- created~an~infinite~loop\\\\
- \iow_indent:n { #4 \\\\ }
- }
-% \end{macrocode}
-%
-% Messages for earlier kernel modules plus a few for \pkg{l3keys} which
-% cover coding errors.
-% \begin{macrocode}
-\msg_new:nnnn { kernel } { bad-number-of-arguments }
- { Function~'#1'~cannot~be~defined~with~#2~arguments. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~define~a~function~'#1'~with~
- #2~arguments.~
- TeX~allows~between~0~and~9~arguments~for~a~single~function.
- }
-\msg_new:nnnn { kernel } { command-already-defined }
- { Control~sequence~#1~already~defined. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~a~new~control~sequence~'#1'~
- but~this~name~has~already~been~used~elsewhere. \\ \\
- The~current~meaning~is:\\
- \ \ #2
- }
-\msg_new:nnnn { kernel } { command-not-defined }
- { Control~sequence~#1~undefined. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~use~a~control~sequence~'#1':\\
- this~has~not~been~defined~yet.
- }
-\msg_new:nnnn { kernel } { empty-search-pattern }
- { Empty~search~pattern. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~replace~an~empty~pattern~by~'#1':~that~
- would~lead~to~an~infinite~loop!
- }
-\cs_if_exist:NF \tex_elapsedtime:D
- {
- \msg_new:nnnn { kernel } { no-elapsed-time }
- { No~clock~detected~for~#1. }
- { The~current~engine~provides~no~way~to~access~the~system~time. }
- }
-\msg_new:nnnn { kernel } { non-base-function }
- { Function~'#1'~is~not~a~base~function }
- {
- \c_@@_coding_error_text_tl
- Functions~defined~through~\iow_char:N\\cs_new:Nn~must~have~
- a~signature~consisting~of~only~normal~arguments~'N'~and~'n'.~
- The~signature~'#2'~of~'#1'~contains~other~arguments~'#3'.~
- To~define~variants~use~\iow_char:N\\cs_generate_variant:Nn~
- and~to~define~other~functions~use~\iow_char:N\\cs_new:Npn.
- }
-\msg_new:nnnn { kernel } { missing-colon }
- { Function~'#1'~contains~no~':'. }
- {
- \c_@@_coding_error_text_tl
- Code-level~functions~must~contain~':'~to~separate~the~
- argument~specification~from~the~function~name.~This~is~
- needed~when~defining~conditionals~or~variants,~or~when~building~a~
- parameter~text~from~the~number~of~arguments~of~the~function.
- }
-\msg_new:nnnn { kernel } { overflow }
- { Integers~larger~than~2^{30}-1~cannot~be~stored~in~arrays. }
- {
- An~attempt~was~made~to~store~#3~
- \tl_if_empty:nF {#2} { at~position~#2~ } in~the~array~'#1'.~
- The~largest~allowed~value~#4~will~be~used~instead.
- }
-\msg_new:nnnn { kernel } { out-of-bounds }
- { Access~to~an~entry~beyond~an~array's~bounds. }
- {
- An~attempt~was~made~to~access~or~store~data~at~position~#2~of~the~
- array~'#1',~but~this~array~has~entries~at~positions~from~1~to~#3.
- }
-\msg_new:nnnn { kernel } { protected-predicate }
- { Predicate~'#1'~must~be~expandable. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~define~'#1'~as~a~protected~predicate.~
- Only~expandable~tests~can~have~a~predicate~version.
- }
-\msg_new:nnn { kernel } { randint-backward-range }
- { Wrong~order~of~bounds~in~\iow_char:N\\int_rand:nn{#1}{#2}. }
-\msg_new:nnnn { kernel } { conditional-form-unknown }
- { Conditional~form~'#1'~for~function~'#2'~unknown. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~define~the~conditional~form~'#1'~of~
- the~function~'#2',~but~only~'TF',~'T',~'F',~and~'p'~forms~exist.
- }
-\msg_new:nnnn { kernel } { variant-too-long }
- { Variant~form~'#1'~longer~than~base~signature~of~'#2'. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~
- with~a~signature~starting~with~'#1',~but~that~is~longer~than~
- the~signature~(part~after~the~colon)~of~'#2'.
- }
-\msg_new:nnnn { kernel } { invalid-variant }
- { Variant~form~'#1'~invalid~for~base~form~'#2'. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~a~variant~of~the~function~'#2'~
- with~a~signature~starting~with~'#1',~but~cannot~change~an~argument~
- from~type~'#3'~to~type~'#4'.
- }
-\msg_new:nnnn { kernel } { invalid-exp-args }
- { Invalid~variant~specifier~'#1'~in~'#2'. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~an~\iow_char:N\\exp_args:N...~
- function~with~signature~'N#2'~but~'#1'~is~not~a~valid~argument~
- specifier.
- }
-\msg_new:nnn { kernel } { deprecated-variant }
- {
- Variant~form~'#1'~deprecated~for~base~form~'#2'.~
- One~should~not~change~an~argument~from~type~'#3'~to~type~'#4'
- \str_case:nnF {#3}
- {
- { n } { :~use~a~'\token_if_eq_charcode:NNTF #4 c v V'~variant? }
- { N } { :~base~form~only~accepts~a~single~token~argument. }
- {#4} { :~base~form~is~already~a~variant. }
- } { . }
- }
-\msg_new:nnn { char } { active }
- { Cannot~generate~active~chars. }
-\msg_new:nnn { char } { invalid-catcode }
- { Invalid~catcode~for~char~generation. }
-\msg_new:nnn { char } { null-space }
- { Cannot~generate~null~char~as~a~space. }
-\msg_new:nnn { char } { out-of-range }
- { Charcode~requested~out~of~engine~range. }
-\msg_new:nnn { dim } { zero-unit }
- { Zero~unit~in~conversion. }
-\msg_new:nnnn { kernel } { quote-in-shell }
- { Quotes~in~shell~command~'#1'. }
- { Shell~commands~cannot~contain~quotes~("). }
-\msg_new:nnnn { keys } { no-property }
- { No~property~given~in~definition~of~key~'#1'. }
- {
- \c_@@_coding_error_text_tl
- Inside~\keys_define:nn each~key~name~
- needs~a~property: \\ \\
- \iow_indent:n { #1 .<property> } \\ \\
- LaTeX~did~not~find~a~'.'~to~indicate~the~start~of~a~property.
- }
-\msg_new:nnnn { keys } { property-boolean-values-only }
- { The~property~'#1'~accepts~boolean~values~only. }
- {
- \c_@@_coding_error_text_tl
- The~property~'#1'~only~accepts~the~values~'true'~and~'false'.
- }
-\msg_new:nnnn { keys } { property-requires-value }
- { The~property~'#1'~requires~a~value. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~was~asked~to~set~property~'#1'~for~key~'#2'.\\
- No~value~was~given~for~the~property,~and~one~is~required.
- }
-\msg_new:nnnn { keys } { property-unknown }
- { The~key~property~'#1'~is~unknown. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~set~the~property~'#1'~for~key~'#2':~
- this~property~is~not~defined.
- }
-\msg_new:nnnn { quark } { invalid-function }
- { Quark~test~function~'#1'~is~invalid. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~quark~test~function~'#1'~
- \tl_if_empty:nTF {#2}
- { but~that~name~ }
- { with~signature~'#2',~but~that~signature~ }
- is~not~valid.
- }
-\__kernel_msg_new:nnn { quark } { invalid }
- { Invalid~quark~variable~'#1'. }
-\msg_new:nnnn { scanmark } { already-defined }
- { Scan~mark~#1~already~defined. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~create~a~new~scan~mark~'#1'~
- but~this~name~has~already~been~used~for~a~scan~mark.
- }
-\msg_new:nnnn { seq } { item-too-large }
- { Sequence~'#1'~does~not~have~an~item~#3 }
- {
- An~attempt~was~made~to~push~or~pop~the~item~at~position~#3~
- of~'#1',~but~this~
- \int_compare:nTF { #3 = 0 }
- { position~does~not~exist. }
- { sequence~only~has~#2~item \int_compare:nF { #2 = 1 } {s}. }
- }
-\msg_new:nnnn { seq } { shuffle-too-large }
- { The~sequence~#1~is~too~long~to~be~shuffled~by~TeX. }
- {
- TeX~has~ \int_eval:n { \c_max_register_int + 1 } ~
- toks~registers:~this~only~allows~to~shuffle~up~to~
- \int_use:N \c_max_register_int \ items.~
- The~list~will~not~be~shuffled.
- }
-\msg_new:nnnn { kernel } { variable-not-defined }
- { Variable~#1~undefined. }
- {
- \c_@@_coding_error_text_tl
- LaTeX~has~been~asked~to~show~a~variable~#1,~but~this~has~not~
- been~defined~yet.
- }
-\msg_new:nnnn { kernel } { bad-type }
- { Variable~'#1'~is~not~a~valid~#3. }
- {
- \c_@@_coding_error_text_tl
- The~variable~'#1'~with~\tl_if_empty:nTF {#4} {meaning} {value}\\\\
- \iow_indent:n {#2}\\\\
- should~be~a~#3~variable,~but~
- \tl_if_empty:nTF {#4}
- { it~is~not \str_if_eq:nnF {#3} { bool } { ~a~short~macro } . }
- {
- it~does~not~have~the~correct~
- \str_if_eq:nnTF {#2} {#4}
- { category~codes. }
- { internal~structure:\\\\\iow_indent:n {#4} }
- }
- }
-\msg_new:nnnn { prop } { bad-link }
- { Variable~'#1'~is~not~a~valid~(linked)~prop. }
- {
- \c_@@_coding_error_text_tl
- The~variable~'#1'~has~an~incorrect~internal~structure.~
- Its~internal~entry~'#2'~points~to~'#3',~whose~name~is~not~of~the~
- form~'#4~<key>'.
- }
-\msg_new:nnnn { clist } { non-clist }
- { Variable~'#1'~is~not~a~valid~clist. }
- {
- \c_@@_coding_error_text_tl
- The~variable~'#1'~with~value\\\\
- \iow_indent:n {#2}\\\\
- should~be~a~clist~variable,~but~it~includes~empty~or~blank~items~
- without~braces.
- }
-\msg_new:nnnn { prop } { misused }
- { A~property~list~was~misused. }
- {
- \c_@@_coding_error_text_tl
- A~property~list~variable~was~used~without~an~accessor~function.~
- It~
- \tl_if_empty:nTF {#1}
- { is~empty. }
- { contains~the~key-value~pairs \use_none:n #1 . }
- }
-\msg_new:nnnn { prop } { inner-make }
- { '#1'~ cannot~ be~ used~ in~ a~ group. }
- {
- \c_@@_coding_error_text_tl
- The~ command~ '#1'~ was~ applied~ to~ the~ property~ list~
- variable~ '#2', but~ the~ storage~ type~ can~ only~ be~ changed~
- at~ the~ outermost~ group~ level.
- }
-% \end{macrocode}
-%
-% Some errors only appear in expandable settings,
-% hence don't need a \enquote{more-text} argument.
-% \begin{macrocode}
-\msg_new:nnn { kernel } { bad-exp-end-f }
- { Misused~\exp_end_continue_f:w or~:nw }
-\msg_new:nnn { kernel } { bad-variable }
- { Erroneous~variable~#1 used! }
-\msg_new:nnn { seq } { misused }
- { A~sequence~was~misused. }
-\msg_new:nnn { prg } { negative-replication }
- { Negative~argument~for~\iow_char:N\\prg_replicate:nn. }
-\msg_new:nnn { prop } { prop-keyval }
- { Missing~'='~in~'#1'~(in~'..._keyval:Nn') }
-\msg_new:nnn { kernel } { unknown-comparison }
- { Relation~'#1'~not~among~=,<,>,==,!=,<=,>=. }
-\msg_new:nnn { kernel } { zero-step }
- { Zero~step~size~for~function~#1. }
-% \end{macrocode}
-%
-% Messages used by the \enquote{\texttt{show}} functions.
-% \begin{macrocode}
-\msg_new:nnn { clist } { show }
- {
- The~comma~list~ \tl_if_empty:nF {#1} { #1 ~ }
- \tl_if_empty:nTF {#2}
- { is~empty \\>~ . }
- { contains~the~items~(without~outer~braces): #2 . }
- }
-\msg_new:nnn { intarray } { show }
- { The~integer~array~#1~contains~#2~items: \\ #3 . }
-\msg_new:nnn { prop } { show }
- {
- The~ \str_if_eq:nnF {#3} { flat } { #3~ }
- property~list~#1~
- \tl_if_empty:nTF {#2}
- { is~empty \\>~ . }
- { contains~the~pairs~(without~outer~braces): #2 . }
- }
-\msg_new:nnn { seq } { show }
- {
- The~sequence~#1~
- \tl_if_empty:nTF {#2}
- { is~empty \\>~ . }
- { contains~the~items~(without~outer~braces): #2 . }
- }
-\msg_new:nnn { kernel } { show-streams }
- {
- \tl_if_empty:nTF {#2} { No~ } { The~following~ }
- \str_case:nn {#1}
- {
- { ior } { input ~ }
- { iow } { output ~ }
- }
- streams~are~
- \tl_if_empty:nTF {#2} { open } { in~use: #2 . }
- }
-% \end{macrocode}
-%
-% System layer messages
-% \begin{macrocode}
-\msg_new:nnnn { sys } { backend-set }
- { Backend~configuration~already~set. }
- {
- Run-time~backend~selection~may~only~be~carried~out~once~during~a~run.~
- This~second~attempt~to~set~them~will~be~ignored.
- }
-\msg_new:nnnn { sys } { load-debug-in-preamble }
- { Load~debug~support~in~the~preamble. }
- {
- Debugging~requires~support~loaded~in~the~preamble: \\
- Use~\sys_load_debug:~before~\begin{document}.
- }
-\msg_new:nnnn { sys } { wrong-backend }
- { Backend~request~inconsistent~with~engine:~using~'#2'~backend. }
- {
- You~have~requested~backend~'#1',~but~this~is~not~suitable~for~use~with~the~
- active~engine.~LaTeX~will~use~the~'#2'~backend~instead.
- }
-% \end{macrocode}
-%
-% \subsection{Expandable errors}
-%
-% \begin{macro}{\@@_expandable_error:nn}
-% In expansion only context, we cannot use the normal means of
-% reporting errors. Instead, we rely on a low-level \TeX{} error
-% caused by expanding a macro \cs{???} with parameter text ``|?|''
-% (this could be any token) which we used followed by something else
-% (here, a space). This shows
-% the context, which thanks to the odd-looking \cs{use:n} is
-% \begin{verbatim}
-% <argument> \???
-% ! mypkg Error: The error message.
-% \end{verbatim}
-% In other words, \TeX{} is processing the argument of \cs{use:n},
-% which is \cs{???} \meta{space} |!| \meta{error type} |:| \meta{error message}.
-% \begin{macrocode}
-\cs_set_protected:Npn \@@_tmp:w #1
- {
- \cs_new:Npn #1 ? { }
- \cs_new:Npn \@@_expandable_error:nn ##1##2
- {
- \exp_after:wN \exp_after:wN
- \exp_after:wN \@@_use_none_delimit_by_s_stop:w
- \use:n { #1 ~ ! ~ ##2 : ~ ##1 } \s_@@_stop
- }
- }
-\exp_args:Nc \@@_tmp:w { ??? }
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}[EXP]
-% {
-% \msg_expandable_error:nnnnnn ,
-% \msg_expandable_error:nnnnn ,
-% \msg_expandable_error:nnnn ,
-% \msg_expandable_error:nnn ,
-% \msg_expandable_error:nn ,
-% \msg_expandable_error:nnffff ,
-% \msg_expandable_error:nnfff ,
-% \msg_expandable_error:nnff ,
-% \msg_expandable_error:nnf
-% }
-% The command built from the csname
-% \cs{c_@@_text_prefix_tl} |#1 / #2|
-% takes four arguments and builds the error text, which is fed to
-% \cs{@@_expandable_error:n} with appropriate expansion: just as for
-% usual messages the arguments are first turned to strings, then the
-% message is fully expanded. The module name also has to be determined.
-% \begin{macrocode}
-\exp_args_generate:n { oooo }
-\cs_new:Npn \msg_expandable_error:nnnnnn #1#2#3#4#5#6
- {
- \exp_args:Nee \@@_expandable_error:nn
- {
- \exp_args:Nc \exp_args:Noooo
- { \c_@@_text_prefix_tl #1 / #2 }
- { \tl_to_str:n {#3} }
- { \tl_to_str:n {#4} }
- { \tl_to_str:n {#5} }
- { \tl_to_str:n {#6} }
- }
- { \msg_error_text:n {#1} }
- }
-\cs_new:Npn \msg_expandable_error:nnnnn #1#2#3#4#5
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} {#5} { } }
-\cs_new:Npn \msg_expandable_error:nnnn #1#2#3#4
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} {#4} { } { } }
-\cs_new:Npn \msg_expandable_error:nnn #1#2#3
- { \msg_expandable_error:nnnnnn {#1} {#2} {#3} { } { } { } }
-\cs_new:Npn \msg_expandable_error:nn #1#2
- { \msg_expandable_error:nnnnnn {#1} {#2} { } { } { } { } }
-\cs_generate_variant:Nn \msg_expandable_error:nnnnnn { nnffff }
-\cs_generate_variant:Nn \msg_expandable_error:nnnnn { nnfff }
-\cs_generate_variant:Nn \msg_expandable_error:nnnn { nnff }
-\cs_generate_variant:Nn \msg_expandable_error:nnn { nnf }
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Message formatting}
-%
-% \begin{macrocode}
-\prop_gput:Nnn \g_msg_module_name_prop { kernel } { LaTeX }
-\prop_gput:Nnn \g_msg_module_type_prop { kernel } { }
-\clist_map_inline:nn
- {
- char , clist , coffin , debug , deprecation , dim, msg ,
- quark , prg , prop , scanmark , seq , sys
- }
- {
- \prop_gput:Nnn \g_msg_module_name_prop {#1} { LaTeX }
- \prop_gput:Nnn \g_msg_module_type_prop {#1} { }
- }
-\prop_gput:Nnn \g_msg_module_name_prop { LaTeX / cmd } { LaTeX }
-\prop_gput:Nnn \g_msg_module_type_prop { LaTeX / cmd } { }
-\prop_gput:Nnn \g_msg_module_name_prop { LaTeX / ltcmd } { LaTeX }
-\prop_gput:Nnn \g_msg_module_type_prop { LaTeX / ltcmd } { }
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%
-% \end{implementation}
-%
-% \PrintIndex