% \iffalse
%% File: l3names.dtx Copyright (C) 1990-2006,2009 LaTeX3 project
%%
%% It may be distributed and/or modified under the conditions of the
%% LaTeX Project Public License (LPPL), either version 1.3c of this
%% license or (at your option) any later version.  The latest version
%% of this license is in the file
%%
%%    http://www.latex-project.org/lppl.txt
%%
%% This file is part of the ``expl3 bundle'' (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%%
%% The released version of this bundle is available from CTAN.
%%
%% -----------------------------------------------------------------------
%%
%% The development version of the bundle can be found at
%%
%%    http://www.latex-project.org/svnroot/experimental/trunk/
%%
%% for those people who are interested.
%%
%%%%%%%%%%%
%% NOTE: %%
%%%%%%%%%%%
%%
%%   Snapshots taken from the repository represent work in progress and may
%%   not work or may contain conflicting material!  We therefore ask
%%   people _not_ to put them into distributions, archives, etc. without
%%   prior consultation with the LaTeX Project Team.
%%
%% -----------------------------------------------------------------------
%^^A We need some basic initial character codes to be set up
%^^A immediately.
%<*initex>
\catcode`\{=1 % left brace is begin-group character
\catcode`\}=2 % right brace is end-group character
\catcode`\#=6 % hash mark is macro parameter character
\catcode`\^=7 %
\catcode`\^^I=10 % ascii tab is a blank space
%</initex>
%<package>\begingroup
%<*initex|package>
\def\GetIdInfo$#1${%
  \begingroup
    \def\GetIdInfoString{#1}%
    \def\IdInfoStringUnexp{Id}%
    \ifx \GetIdInfoString \IdInfoStringUnexp
      \def\next{\endgroup\GetIdInfoMissing}
    \else
      \def\next{\endgroup\GetIdInfoFull$#1$}
    \fi
    \next
}
\def\GetIdInfoFull$#1 #2.#3 #4 #5 #6 #7${%
  \GetIdInfoAux #5\relax{#2}#5\relax{#4}%
}
\def\GetIdInfoAux #1#2#3#4#5#6\relax{%
  \ifx#5/%
    \expandafter\GetIdInfoAuxCVS
  \else
    \expandafter\GetIdInfoAuxSVN
  \fi
}
%</initex|package>
%<*initex>
\def\GetIdInfoAuxCVS #1#2\relax#3#4{%
  \immediate\write-1{#1; v#2, #3; #4}%
}
\def\GetIdInfoAuxSVN #1#2-#3-#4\relax#5#6{%
  \immediate\write-1{#1; #2/#3/#4 v#5 #6}%
}
\def\GetIdInfoMissing#1{%
  \gdef\fileversion{000}%
  \gdef\filedate{0000/00/00}%
  \gdef\filedescription{#1}%
  \immediate\write-1{[Loading unknown package: #1]}%
}
%</initex>
%<*package>
\def\GetIdInfoAuxCVS #1#2\relax#3#4{%
  \gdef\fileversion{#3}%
  \gdef\filedate{#2}%
  \gdef\filedescription{#4}%
  \ProvidesPackage{#1}[#2 v#3 #4]%
}
\def\GetIdInfoAuxSVN #1#2-#3-#4\relax#5#6{%
  \gdef\fileversion{#5}%
  \gdef\filedate{#2/#3/#4}%
  \gdef\filedescription{#6}%
  \ProvidesPackage{#1}[#2/#3/#4 v#5 #6]
}
\def\GetIdInfoMissing#1{%
  \gdef\fileversion{000}%
  \gdef\filedate{0000/00/00}%
  \gdef\filedescription{#1}%
  \ProvidesPackage{[unknown package]}[0000/00/00 v0.0 #1]
}
%</package>
%<*driver>
\RequirePackage{l3names}
%</driver>
%\fi
\GetIdInfo$Id: l3names.dtx 1362 2009-05-28 20:19:21Z joseph $
     {L3 Experimental Naming Scheme for TeX Primitives}
%
%
% \iffalse
%<package>\endgroup
%<*driver>
%\fi
\ProvidesFile{l3names.dtx}
  [\filedate\space v\fileversion\space\filedescription]
%\iffalse
\documentclass[full]{l3doc}
\begin{document}
\DocInput{l3names.dtx}
\end{document}
%</driver>
% \fi
%
% \title{The \textsf{l3names} package\thanks{This file
%         has version number \fileversion, last
%         revised \filedate.}\\
% A systematic naming scheme for \TeX}
% \author{\Team}
% \date{\filedate}
% \maketitle
%
% \begin{documentation}
%
% \section{Setting up the \LaTeX3 programming language}
%
% This module is at the core of the \LaTeX3 programming language. It
% performs the following tasks:
% \begin{itemize}
% \item defines new names for all \TeX{} primitives;
% \item defines catcode regimes for programming;
% \item provides settings for when the code is used in a format;
% \item provides tools for when the code is used as a package within a
% \LaTeXe\ context.
% \end{itemize}
%
% \section{Using the modules}
%
% The modules documented in \file{source3} are designed to be used on top of
% \LaTeXe\ and are loaded all as one with the usual "\usepackage{expl3}" or
% "\RequirePackage{expl3}" instructions. These modules will also form the
% basis of the \LaTeX3 format, but work in this area is incomplete and not
% included in this documentation.
%
% As the modules use a coding syntax different from standard
% \LaTeX\ it provides a few functions for setting it up.
%
% \begin{function}{
%     \ExplSyntaxOn |
%     \ExplSyntaxOff 
%   } 
%   \begin{syntax}
%     "\ExplSyntaxOn" <code>  "\ExplSyntaxOff"
%   \end{syntax} 
%   Issues a catcode regime where spaces are ignored and colon and
%   underscore are letters. A space character may by input with "~" instead.
% \end{function}
%
% \begin{function}{
%     \ExplSyntaxNamesOn |
%     \ExplSyntaxNamesOff 
%   } 
%   \begin{syntax}
%     "\ExplSyntaxNamesOn" <code>  "\ExplSyntaxNamesOff"
%   \end{syntax} 
%   Issues a catcode regime where colon and underscore are letters, but
%   spaces remain the same.
% \end{function}
% 
% \begin{function}{
%     \ProvidesExplPackage |
%     \ProvidesExplClass 
%   } 
%   \begin{syntax}
%     "\RequirePackage{expl3}" \\
%     "\ProvidesExplPackage" \Arg{package}
%     \Arg{date} \Arg{version} \Arg{description}
%   \end{syntax} 
%   The package "l3names" (this module) provides
%   "\ProvidesExplPackage" which is a wrapper for "\ProvidesPackage"
%   and sets up the \LaTeX3 catcode settings for programming
%   automatically. Similar for the relationship between
%   "\ProvidesExplClass" and "\ProvidesClass". Spaces are not ignored
%   in the arguments of these commands.
% \end{function}
%
% \begin{function}{
%     \GetIdInfo      |
%     \filename       |
%     \filenameext    |
%     \filedate       |
%     \fileversion    |
%     \filetimestamp  | 
%     \fileauthor     |
%     \filedescription
%   } 
%   \begin{syntax}
%     "\RequirePackage{l3names}" \\
%     "\GetIdInfo" "$Id:" <cvs or svn info field> "$" \Arg{description}
%   \end{syntax} 
%   Extracts all information from a CVS or SVN field. Spaces are not
%   ignored in these fields. The information pieces are stored in
%   separate control sequences with "\filename" for the part of the
%   file name leading up to the period, "\filenameext" for the
%   extension, "\filedate" for date, "\fileversion" for version,
%   "\filetimestamp" for the time and "\fileauthor" for the author.
% \end{function}
%
% To summarize: Every single package using this syntax should identify
% itself using one of the above methods. Special care is taken so that
% every package or class file loaded with "\RequirePackage" or alike
% are loaded with usual \LaTeX\ catcodes and the \LaTeX3 catcode
% scheme is reloaded when needed afterwards. See implementation for
% details. If you use the "\GetIdInfo" command you can use the
% information when loading a package with
% \begin{verbatim}
% \ProvidesExplPackage{\filename}{\filedate}{\fileversion}{\filedescription}
% \end{verbatim}
%
%
% \end{documentation}
%
% \begin{implementation}
%
% \section{\pkg{l3names} implementation}
%
%    This is the base part of \LaTeX3 defining things like |catcode|s
%    and redefining the \TeX{} primitives, as well as setting up the code
%    to load \pkg{expl3} modules in \LaTeXe.
%
% \subsection{Internal functions}
%
% \begin{function}{ \ExplSyntaxStatus | \ExplSyntaxPopStack | \ExplSyntaxStack }
% Functions used to track the state of the catcode regime.
% \end{function}
%
% \begin{function}{\@pushfilename | \@popfilename}
% Re-definitions of \LaTeX's file-loading functions to support "\ExplSyntax".
% \end{function}
%
% \subsection{Package loading}
%
%    Before anything else, check that we're using \eTeX; 
%    no point continuing otherwise.
%    \begin{macrocode}
%<*initex|package>
\begingroup
\def\firstoftwo#1#2{#1}
\def\secondoftwo#1#2{#2}
\def\etexmissingerror{Not running under e-TeX}
\def\etexmissinghelp{%
  This package requires e-TeX.^^J%
  Try compiling the document with `elatex' instead of `latex'.^^J% 
  When using pdfTeX, try `pdfelatex' instead of `pdflatex'%
}%
\expandafter\ifx\csname eTeXversion\endcsname\relax
  \expandafter\secondoftwo\else\expandafter\firstoftwo\fi
    {\endgroup}{%
%<initex>      \expandafter\errhelp\expandafter{\etexmissinghelp}%
%<initex>      \expandafter\errmessage\expandafter{\etexmissingerror}%
%<package>      \PackageError{l3names}{\etexmissingerror}{\etexmissinghelp}%
      \endgroup
      \endinput
    }
%</initex|package>
%    \end{macrocode}
%
% \subsection{Catcode assignments}
%
% Catcodes for begingroup, endgroup, macro parameter, superscript, and tab,
% are all assigned before the start of the documented code. (See the beginning
% of \file{l3names.dtx}.)
%
% Reason for |\endlinechar=32| is that a line ending with a backslash
% will be interpreted as the token \verb*|\ | which seems most natural
% and since spaces are ignored it works as we intend elsewhere.
%
% Before we do this we must however record the settings for the
% catcode regime as it was when we start changing it.
%    \begin{macrocode}
%<*initex|package>
\edef\ExplSyntaxOff{
  \unexpanded{\ifodd \ExplSyntaxStatus\relax
  \def\ExplSyntaxStatus{0}
  }
  \catcode  126=\the \catcode 126 \relax
  \catcode  32=\the \catcode 32 \relax
  \catcode  9=\the \catcode 9 \relax
  \endlinechar  =\the \endlinechar \relax
  \catcode  95=\the \catcode 95 \relax
  \catcode  58=\the \catcode 58 \relax
  \noexpand\fi
}
\catcode126=10\relax  % tilde is a space char.
\catcode32=9\relax    % space is ignored
\catcode9=9\relax     % tab also ignored
\endlinechar=32\relax % endline is space
\catcode95=11\relax   % underscore letter
\catcode58=11\relax   % colon letter
%    \end{macrocode}
%
% \subsection{Setting up primitive names}
%
%    Here is the function that renames \TeX{}'s primitives.
%
% Normally the old name is left untouched, but the possibility of
% undefining the original names is made available by docstrip and
% package options.
% If nothing else, this gives a way of checking what `old code' a
% package depends on\ldots\
%
% If the package option `removeoldnames' is used then some trick code
% is run after the end of this file, to skip past the code which has
% been inserted by \LaTeXe\ to manage the file name stack, this code
% would break if run once the \TeX\ primitives have been undefined.
% (What a surprise!) \textbf{The option has been temporarily
%   disabled.}
%
% To get things started, give a new name for |\let|.
%    \begin{macrocode}
\let\tex_let:D\let
%</initex|package>
%    \end{macrocode}
%
% and now an internal function to  possibly
% remove the old name.
%
%    \begin{macrocode}
%<*initex>
\long\def\name_undefine:N#1{
    \tex_let:D#1\c_undefined}
%</initex>
%    \end{macrocode}
%
%    \begin{macrocode}
%<*package>
\DeclareOption{removeoldnames}{
  \long\def\name_undefine:N#1{
    \tex_let:D#1\c_undefined}}
%    \end{macrocode}
%
%    \begin{macrocode}
\DeclareOption{keepoldnames}{
  \long\def\name_undefine:N#1{}}
%    \end{macrocode}
%
%    \begin{macrocode}
\ExecuteOptions{keepoldnames}
%    \end{macrocode}
%
%    \begin{macrocode}
\ProcessOptions
%</package>
%    \end{macrocode}
%
% The internal function to give the new name and possibly undefine
% the old name.
%    \begin{macrocode}
%<*initex|package>
\long\def\name_primitive:NN#1#2{
  \tex_let:D #2 #1
  \name_undefine:N #1
      }
%    \end{macrocode}
%
% \subsection{Reassignment of primitives}
%
% In the current incarnation of this package, all \TeX\ primitives
% are given a new name of the form |\tex_|\emph{oldname}|:D|.
% But first three special cases which have symbolic original names.
% These are given modified new names, so that they may be entered
% without catcode tricks.
%    \begin{macrocode}
\name_primitive:NN \                      \tex_space:D
\name_primitive:NN \/                     \tex_italiccor:D
\name_primitive:NN \-                     \tex_hyphen:D
%    \end{macrocode}
%
% Now all the other primitives.
%    \begin{macrocode}
\name_primitive:NN \let                   \tex_let:D
\name_primitive:NN \def                   \tex_def:D
\name_primitive:NN \edef                  \tex_edef:D
\name_primitive:NN \gdef                  \tex_gdef:D
\name_primitive:NN \xdef                  \tex_xdef:D
\name_primitive:NN \chardef               \tex_chardef:D
\name_primitive:NN \countdef              \tex_countdef:D
\name_primitive:NN \dimendef              \tex_dimendef:D
\name_primitive:NN \skipdef               \tex_skipdef:D
\name_primitive:NN \muskipdef             \tex_muskipdef:D
\name_primitive:NN \mathchardef           \tex_mathchardef:D
\name_primitive:NN \toksdef               \tex_toksdef:D
\name_primitive:NN \futurelet             \tex_futurelet:D
\name_primitive:NN \advance               \tex_advance:D
\name_primitive:NN \divide                \tex_divide:D
\name_primitive:NN \multiply              \tex_multiply:D
\name_primitive:NN \font                  \tex_font:D
\name_primitive:NN \fam                   \tex_fam:D
\name_primitive:NN \global                \tex_global:D
\name_primitive:NN \long                  \tex_long:D
\name_primitive:NN \outer                 \tex_outer:D
\name_primitive:NN \setlanguage           \tex_setlanguage:D
\name_primitive:NN \globaldefs            \tex_globaldefs:D
\name_primitive:NN \afterassignment       \tex_afterassignment:D
\name_primitive:NN \aftergroup            \tex_aftergroup:D
\name_primitive:NN \expandafter           \tex_expandafter:D
\name_primitive:NN \noexpand              \tex_noexpand:D
\name_primitive:NN \begingroup            \tex_begingroup:D
\name_primitive:NN \endgroup              \tex_endgroup:D
\name_primitive:NN \halign                \tex_halign:D
\name_primitive:NN \valign                \tex_valign:D
\name_primitive:NN \cr                    \tex_cr:D
\name_primitive:NN \crcr                  \tex_crcr:D
\name_primitive:NN \noalign               \tex_noalign:D
\name_primitive:NN \omit                  \tex_omit:D
\name_primitive:NN \span                  \tex_span:D
\name_primitive:NN \tabskip               \tex_tabskip:D
\name_primitive:NN \everycr               \tex_everycr:D
\name_primitive:NN \if                    \tex_if:D
\name_primitive:NN \ifcase                \tex_ifcase:D
\name_primitive:NN \ifcat                 \tex_ifcat:D
\name_primitive:NN \ifnum                 \tex_ifnum:D
\name_primitive:NN \ifodd                 \tex_ifodd:D
\name_primitive:NN \ifdim                 \tex_ifdim:D
\name_primitive:NN \ifeof                 \tex_ifeof:D
\name_primitive:NN \ifhbox                \tex_ifhbox:D
\name_primitive:NN \ifvbox                \tex_ifvbox:D
\name_primitive:NN \ifvoid                \tex_ifvoid:D
\name_primitive:NN \ifx                   \tex_ifx:D
\name_primitive:NN \iffalse               \tex_iffalse:D
\name_primitive:NN \iftrue                \tex_iftrue:D
\name_primitive:NN \ifhmode               \tex_ifhmode:D
\name_primitive:NN \ifmmode               \tex_ifmmode:D
\name_primitive:NN \ifvmode               \tex_ifvmode:D
\name_primitive:NN \ifinner               \tex_ifinner:D
\name_primitive:NN \else                  \tex_else:D
\name_primitive:NN \fi                    \tex_fi:D
\name_primitive:NN \or                    \tex_or:D
\name_primitive:NN \immediate             \tex_immediate:D
\name_primitive:NN \closeout              \tex_closeout:D
\name_primitive:NN \openin                \tex_openin:D
\name_primitive:NN \openout               \tex_openout:D
\name_primitive:NN \read                  \tex_read:D
\name_primitive:NN \write                 \tex_write:D
\name_primitive:NN \closein               \tex_closein:D
\name_primitive:NN \newlinechar           \tex_newlinechar:D
\name_primitive:NN \input                 \tex_input:D
\name_primitive:NN \endinput              \tex_endinput:D
\name_primitive:NN \inputlineno           \tex_inputlineno:D
\name_primitive:NN \errmessage            \tex_errmessage:D
\name_primitive:NN \message               \tex_message:D
\name_primitive:NN \show                  \tex_show:D
\name_primitive:NN \showthe               \tex_showthe:D
\name_primitive:NN \showbox               \tex_showbox:D
\name_primitive:NN \showlists             \tex_showlists:D
\name_primitive:NN \errhelp               \tex_errhelp:D
\name_primitive:NN \errorcontextlines     \tex_errorcontextlines:D
\name_primitive:NN \tracingcommands       \tex_tracingcommands:D
\name_primitive:NN \tracinglostchars      \tex_tracinglostchars:D
\name_primitive:NN \tracingmacros         \tex_tracingmacros:D
\name_primitive:NN \tracingonline         \tex_tracingonline:D
\name_primitive:NN \tracingoutput         \tex_tracingoutput:D
\name_primitive:NN \tracingpages          \tex_tracingpages:D
\name_primitive:NN \tracingparagraphs     \tex_tracingparagraphs:D
\name_primitive:NN \tracingrestores       \tex_tracingrestores:D
\name_primitive:NN \tracingstats          \tex_tracingstats:D
\name_primitive:NN \pausing               \tex_pausing:D
\name_primitive:NN \showboxbreadth        \tex_showboxbreadth:D
\name_primitive:NN \showboxdepth          \tex_showboxdepth:D
\name_primitive:NN \batchmode             \tex_batchmode:D
\name_primitive:NN \errorstopmode         \tex_errorstopmode:D
\name_primitive:NN \nonstopmode           \tex_nonstopmode:D
\name_primitive:NN \scrollmode            \tex_scrollmode:D
\name_primitive:NN \end                   \tex_end:D
\name_primitive:NN \csname                \tex_csname:D
\name_primitive:NN \endcsname             \tex_endcsname:D
\name_primitive:NN \ignorespaces          \tex_ignorespaces:D
\name_primitive:NN \relax                 \tex_relax:D
\name_primitive:NN \the                   \tex_the:D
\name_primitive:NN \mag                   \tex_mag:D
\name_primitive:NN \language              \tex_language:D
\name_primitive:NN \mark                  \tex_mark:D
\name_primitive:NN \topmark               \tex_topmark:D
\name_primitive:NN \firstmark             \tex_firstmark:D
\name_primitive:NN \botmark               \tex_botmark:D
\name_primitive:NN \splitfirstmark        \tex_splitfirstmark:D
\name_primitive:NN \splitbotmark          \tex_splitbotmark:D
\name_primitive:NN \fontname              \tex_fontname:D
\name_primitive:NN \escapechar            \tex_escapechar:D
\name_primitive:NN \endlinechar           \tex_endlinechar:D
\name_primitive:NN \mathchoice            \tex_mathchoice:D
\name_primitive:NN \delimiter             \tex_delimiter:D
\name_primitive:NN \mathaccent            \tex_mathaccent:D
\name_primitive:NN \mathchar              \tex_mathchar:D
\name_primitive:NN \mskip                 \tex_mskip:D
\name_primitive:NN \radical               \tex_radical:D
\name_primitive:NN \vcenter               \tex_vcenter:D
\name_primitive:NN \mkern                 \tex_mkern:D
\name_primitive:NN \above                 \tex_above:D
\name_primitive:NN \abovewithdelims       \tex_abovewithdelims:D
\name_primitive:NN \atop                  \tex_atop:D
\name_primitive:NN \atopwithdelims        \tex_atopwithdelims:D
\name_primitive:NN \over                  \tex_over:D
\name_primitive:NN \overwithdelims        \tex_overwithdelims:D
\name_primitive:NN \displaystyle          \tex_displaystyle:D
\name_primitive:NN \textstyle             \tex_textstyle:D
\name_primitive:NN \scriptstyle           \tex_scriptstyle:D
\name_primitive:NN \scriptscriptstyle     \tex_scriptscriptstyle:D
\name_primitive:NN \nonscript             \tex_nonscript:D
\name_primitive:NN \eqno                  \tex_eqno:D
\name_primitive:NN \leqno                 \tex_leqno:D
\name_primitive:NN \abovedisplayshortskip \tex_abovedisplayshortskip:D
\name_primitive:NN \abovedisplayskip      \tex_abovedisplayskip:D
\name_primitive:NN \belowdisplayshortskip \tex_belowdisplayshortskip:D
\name_primitive:NN \belowdisplayskip      \tex_belowdisplayskip:D
\name_primitive:NN \displaywidowpenalty   \tex_displaywidowpenalty:D
\name_primitive:NN \displayindent         \tex_displayindent:D
\name_primitive:NN \displaywidth          \tex_displaywidth:D
\name_primitive:NN \everydisplay          \tex_everydisplay:D
\name_primitive:NN \predisplaysize        \tex_predisplaysize:D
\name_primitive:NN \predisplaypenalty     \tex_predisplaypenalty:D
\name_primitive:NN \postdisplaypenalty    \tex_postdisplaypenalty:D
\name_primitive:NN \mathbin               \tex_mathbin:D
\name_primitive:NN \mathclose             \tex_mathclose:D
\name_primitive:NN \mathinner             \tex_mathinner:D
\name_primitive:NN \mathop                \tex_mathop:D
\name_primitive:NN \displaylimits         \tex_displaylimits:D
\name_primitive:NN \limits                \tex_limits:D
\name_primitive:NN \nolimits              \tex_nolimits:D
\name_primitive:NN \mathopen              \tex_mathopen:D
\name_primitive:NN \mathord               \tex_mathord:D
\name_primitive:NN \mathpunct             \tex_mathpunct:D
\name_primitive:NN \mathrel               \tex_mathrel:D
\name_primitive:NN \overline              \tex_overline:D
\name_primitive:NN \underline             \tex_underline:D
\name_primitive:NN \left                  \tex_left:D
\name_primitive:NN \right                 \tex_right:D
\name_primitive:NN \binoppenalty          \tex_binoppenalty:D
\name_primitive:NN \relpenalty            \tex_relpenalty:D
\name_primitive:NN \delimitershortfall    \tex_delimitershortfall:D
\name_primitive:NN \delimiterfactor       \tex_delimiterfactor:D
\name_primitive:NN \nulldelimiterspace    \tex_nulldelimiterspace:D
\name_primitive:NN \everymath             \tex_everymath:D
\name_primitive:NN \mathsurround          \tex_mathsurround:D
\name_primitive:NN \medmuskip             \tex_medmuskip:D
\name_primitive:NN \thinmuskip            \tex_thinmuskip:D
\name_primitive:NN \thickmuskip           \tex_thickmuskip:D
\name_primitive:NN \scriptspace           \tex_scriptspace:D
\name_primitive:NN \noboundary            \tex_noboundary:D
\name_primitive:NN \accent                \tex_accent:D
\name_primitive:NN \char                  \tex_char:D
\name_primitive:NN \discretionary         \tex_discretionary:D
\name_primitive:NN \hfil                  \tex_hfil:D
\name_primitive:NN \hfilneg               \tex_hfilneg:D
\name_primitive:NN \hfill                 \tex_hfill:D
\name_primitive:NN \hskip                 \tex_hskip:D
\name_primitive:NN \hss                   \tex_hss:D
\name_primitive:NN \vfil                  \tex_vfil:D
\name_primitive:NN \vfilneg               \tex_vfilneg:D
\name_primitive:NN \vfill                 \tex_vfill:D
\name_primitive:NN \vskip                 \tex_vskip:D
\name_primitive:NN \vss                   \tex_vss:D
\name_primitive:NN \unskip                \tex_unskip:D
\name_primitive:NN \kern                  \tex_kern:D
\name_primitive:NN \unkern                \tex_unkern:D
\name_primitive:NN \hrule                 \tex_hrule:D
\name_primitive:NN \vrule                 \tex_vrule:D
\name_primitive:NN \leaders               \tex_leaders:D
\name_primitive:NN \cleaders              \tex_cleaders:D
\name_primitive:NN \xleaders              \tex_xleaders:D
\name_primitive:NN \lastkern              \tex_lastkern:D
\name_primitive:NN \lastskip              \tex_lastskip:D
\name_primitive:NN \indent                \tex_indent:D
\name_primitive:NN \par                   \tex_par:D
\name_primitive:NN \noindent              \tex_noindent:D
\name_primitive:NN \vadjust               \tex_vadjust:D
\name_primitive:NN \baselineskip          \tex_baselineskip:D
\name_primitive:NN \lineskip              \tex_lineskip:D
\name_primitive:NN \lineskiplimit         \tex_lineskiplimit:D
\name_primitive:NN \clubpenalty           \tex_clubpenalty:D
\name_primitive:NN \widowpenalty          \tex_widowpenalty:D
\name_primitive:NN \exhyphenpenalty       \tex_exhyphenpenalty:D
\name_primitive:NN \hyphenpenalty         \tex_hyphenpenalty:D
\name_primitive:NN \linepenalty           \tex_linepenalty:D
\name_primitive:NN \doublehyphendemerits  \tex_doublehyphendemerits:D
\name_primitive:NN \finalhyphendemerits   \tex_finalhyphendemerits:D
\name_primitive:NN \adjdemerits           \tex_adjdemerits:D
\name_primitive:NN \hangafter             \tex_hangafter:D
\name_primitive:NN \hangindent            \tex_hangindent:D
\name_primitive:NN \parshape              \tex_parshape:D
\name_primitive:NN \hsize                 \tex_hsize:D
\name_primitive:NN \lefthyphenmin         \tex_lefthyphenmin:D
\name_primitive:NN \righthyphenmin        \tex_righthyphenmin:D
\name_primitive:NN \leftskip              \tex_leftskip:D
\name_primitive:NN \rightskip             \tex_rightskip:D
\name_primitive:NN \looseness             \tex_looseness:D
\name_primitive:NN \parskip               \tex_parskip:D
\name_primitive:NN \parindent             \tex_parindent:D
\name_primitive:NN \uchyph                \tex_uchyph:D
\name_primitive:NN \emergencystretch      \tex_emergencystretch:D
\name_primitive:NN \pretolerance          \tex_pretolerance:D
\name_primitive:NN \tolerance             \tex_tolerance:D
\name_primitive:NN \spaceskip             \tex_spaceskip:D
\name_primitive:NN \xspaceskip            \tex_xspaceskip:D
\name_primitive:NN \parfillskip           \tex_parfillskip:D
\name_primitive:NN \everypar              \tex_everypar:D
\name_primitive:NN \prevgraf              \tex_prevgraf:D
\name_primitive:NN \spacefactor           \tex_spacefactor:D
\name_primitive:NN \shipout               \tex_shipout:D
\name_primitive:NN \vsize                 \tex_vsize:D
\name_primitive:NN \interlinepenalty      \tex_interlinepenalty:D
\name_primitive:NN \brokenpenalty         \tex_brokenpenalty:D
\name_primitive:NN \topskip               \tex_topskip:D
\name_primitive:NN \maxdeadcycles         \tex_maxdeadcycles:D
\name_primitive:NN \maxdepth              \tex_maxdepth:D
\name_primitive:NN \output                \tex_output:D
\name_primitive:NN \deadcycles            \tex_deadcycles:D
\name_primitive:NN \pagedepth             \tex_pagedepth:D
\name_primitive:NN \pagestretch           \tex_pagestretch:D
\name_primitive:NN \pagefilstretch        \tex_pagefilstretch:D
\name_primitive:NN \pagefillstretch       \tex_pagefillstretch:D
\name_primitive:NN \pagefilllstretch      \tex_pagefilllstretch:D
\name_primitive:NN \pageshrink            \tex_pageshrink:D
\name_primitive:NN \pagegoal              \tex_pagegoal:D
\name_primitive:NN \pagetotal             \tex_pagetotal:D
\name_primitive:NN \outputpenalty         \tex_outputpenalty:D
\name_primitive:NN \hoffset               \tex_hoffset:D
\name_primitive:NN \voffset               \tex_voffset:D
\name_primitive:NN \insert                \tex_insert:D
\name_primitive:NN \holdinginserts        \tex_holdinginserts:D
\name_primitive:NN \floatingpenalty       \tex_floatingpenalty:D
\name_primitive:NN \insertpenalties       \tex_insertpenalties:D
\name_primitive:NN \lower                 \tex_lower:D
\name_primitive:NN \moveleft              \tex_moveleft:D
\name_primitive:NN \moveright             \tex_moveright:D
\name_primitive:NN \raise                 \tex_raise:D
\name_primitive:NN \copy                  \tex_copy:D
\name_primitive:NN \lastbox               \tex_lastbox:D
\name_primitive:NN \vsplit                \tex_vsplit:D
\name_primitive:NN \unhbox                \tex_unhbox:D
\name_primitive:NN \unhcopy               \tex_unhcopy:D
\name_primitive:NN \unvbox                \tex_unvbox:D
\name_primitive:NN \unvcopy               \tex_unvcopy:D
\name_primitive:NN \setbox                \tex_setbox:D
\name_primitive:NN \hbox                  \tex_hbox:D
\name_primitive:NN \vbox                  \tex_vbox:D
\name_primitive:NN \vtop                  \tex_vtop:D
\name_primitive:NN \prevdepth             \tex_prevdepth:D
\name_primitive:NN \badness               \tex_badness:D
\name_primitive:NN \hbadness              \tex_hbadness:D
\name_primitive:NN \vbadness              \tex_vbadness:D
\name_primitive:NN \hfuzz                 \tex_hfuzz:D
\name_primitive:NN \vfuzz                 \tex_vfuzz:D
\name_primitive:NN \overfullrule          \tex_overfullrule:D
\name_primitive:NN \boxmaxdepth           \tex_boxmaxdepth:D
\name_primitive:NN \splitmaxdepth         \tex_splitmaxdepth:D
\name_primitive:NN \splittopskip          \tex_splittopskip:D
\name_primitive:NN \everyhbox             \tex_everyhbox:D
\name_primitive:NN \everyvbox             \tex_everyvbox:D
\name_primitive:NN \nullfont              \tex_nullfont:D
\name_primitive:NN \textfont              \tex_textfont:D
\name_primitive:NN \scriptfont            \tex_scriptfont:D
\name_primitive:NN \scriptscriptfont      \tex_scriptscriptfont:D
\name_primitive:NN \fontdimen             \tex_fontdimen:D
\name_primitive:NN \hyphenchar            \tex_hyphenchar:D
\name_primitive:NN \skewchar              \tex_skewchar:D
\name_primitive:NN \defaulthyphenchar     \tex_defaulthyphenchar:D
\name_primitive:NN \defaultskewchar       \tex_defaultskewchar:D
\name_primitive:NN \number                \tex_number:D
\name_primitive:NN \romannumeral          \tex_romannumeral:D
\name_primitive:NN \string                \tex_string:D
\name_primitive:NN \lowercase             \tex_lowercase:D
\name_primitive:NN \uppercase             \tex_uppercase:D
\name_primitive:NN \meaning               \tex_meaning:D
\name_primitive:NN \penalty               \tex_penalty:D
\name_primitive:NN \unpenalty             \tex_unpenalty:D
\name_primitive:NN \lastpenalty           \tex_lastpenalty:D
\name_primitive:NN \special               \tex_special:D
\name_primitive:NN \dump                  \tex_dump:D
\name_primitive:NN \patterns              \tex_patterns:D
\name_primitive:NN \hyphenation           \tex_hyphenation:D
\name_primitive:NN \time                  \tex_time:D
\name_primitive:NN \day                   \tex_day:D
\name_primitive:NN \month                 \tex_month:D
\name_primitive:NN \year                  \tex_year:D
\name_primitive:NN \jobname               \tex_jobname:D
\name_primitive:NN \everyjob              \tex_everyjob:D
\name_primitive:NN \count                 \tex_count:D
\name_primitive:NN \dimen                 \tex_dimen:D
\name_primitive:NN \skip                  \tex_skip:D
\name_primitive:NN \toks                  \tex_toks:D
\name_primitive:NN \muskip                \tex_muskip:D
\name_primitive:NN \box                   \tex_box:D
\name_primitive:NN \wd                    \tex_wd:D
\name_primitive:NN \ht                    \tex_ht:D
\name_primitive:NN \dp                    \tex_dp:D
\name_primitive:NN \catcode               \tex_catcode:D
\name_primitive:NN \delcode               \tex_delcode:D
\name_primitive:NN \sfcode                \tex_sfcode:D
\name_primitive:NN \lccode                \tex_lccode:D
\name_primitive:NN \uccode                \tex_uccode:D
\name_primitive:NN \mathcode              \tex_mathcode:D
%    \end{macrocode}
%
%
%
%
% Since \LaTeX3 requires at least the \eTeX{} extensions,
% we also rename the additional primitives. These are all
% given the prefix |\etex_|.
%    \begin{macrocode}
\name_primitive:NN \ifdefined             \etex_ifdefined:D
\name_primitive:NN \ifcsname              \etex_ifcsname:D
\name_primitive:NN \unless                \etex_unless:D
\name_primitive:NN \eTeXversion           \etex_eTeXversion:D
\name_primitive:NN \eTeXrevision          \etex_eTeXrevision:D
\name_primitive:NN \marks                 \etex_marks:D
\name_primitive:NN \topmarks              \etex_topmarks:D
\name_primitive:NN \firstmarks            \etex_firstmarks:D
\name_primitive:NN \botmarks              \etex_botmarks:D
\name_primitive:NN \splitfirstmarks       \etex_splitfirstmarks:D
\name_primitive:NN \splitbotmarks         \etex_splitbotmarks:D
\name_primitive:NN \unexpanded            \etex_unexpanded:D
\name_primitive:NN \detokenize            \etex_detokenize:D
\name_primitive:NN \scantokens            \etex_scantokens:D
\name_primitive:NN \showtokens            \etex_showtokens:D
\name_primitive:NN \readline              \etex_readline:D
\name_primitive:NN \tracingassigns        \etex_tracingassigns:D
\name_primitive:NN \tracingscantokens     \etex_tracingscantokens:D
\name_primitive:NN \tracingnesting        \etex_tracingnesting:D
\name_primitive:NN \tracingifs            \etex_tracingifs:D
\name_primitive:NN \currentiflevel        \etex_currentiflevel:D
\name_primitive:NN \currentifbranch       \etex_currentifbranch:D
\name_primitive:NN \currentiftype         \etex_currentiftype:D
\name_primitive:NN \tracinggroups         \etex_tracinggroups:D
\name_primitive:NN \currentgrouplevel     \etex_currentgrouplevel:D
\name_primitive:NN \currentgrouptype      \etex_currentgrouptype:D
\name_primitive:NN \showgroups            \etex_showgroups:D
\name_primitive:NN \showifs               \etex_showifs:D
\name_primitive:NN \interactionmode       \etex_interactionmode:D
\name_primitive:NN \lastnodetype          \etex_lastnodetype:D
\name_primitive:NN \iffontchar            \etex_iffontchar:D
\name_primitive:NN \fontcharht            \etex_fontcharht:D
\name_primitive:NN \fontchardp            \etex_fontchardp:D
\name_primitive:NN \fontcharwd            \etex_fontcharwd:D
\name_primitive:NN \fontcharic            \etex_fontcharic:D
\name_primitive:NN \parshapeindent        \etex_parshapeindent:D
\name_primitive:NN \parshapelength        \etex_parshapelength:D
\name_primitive:NN \parshapedimen         \etex_parshapedimen:D
\name_primitive:NN \numexpr               \etex_numexpr:D
\name_primitive:NN \dimexpr               \etex_dimexpr:D
\name_primitive:NN \glueexpr              \etex_glueexpr:D
\name_primitive:NN \muexpr                \etex_muexpr:D
\name_primitive:NN \gluestretch           \etex_gluestretch:D
\name_primitive:NN \glueshrink            \etex_glueshrink:D
\name_primitive:NN \gluestretchorder      \etex_gluestretchorder:D
\name_primitive:NN \glueshrinkorder       \etex_glueshrinkorder:D
\name_primitive:NN \gluetomu              \etex_gluetomu:D
\name_primitive:NN \mutoglue              \etex_mutoglue:D
\name_primitive:NN \lastlinefit           \etex_lastlinefit:D
\name_primitive:NN \interlinepenalties    \etex_interlinepenalties:D
\name_primitive:NN \clubpenalties         \etex_clubpenalties:D
\name_primitive:NN \widowpenalties        \etex_widowpenalties:D
\name_primitive:NN \displaywidowpenalties \etex_displaywidowpenalties:D
\name_primitive:NN \middle                \etex_middle:D
\name_primitive:NN \savinghyphcodes       \etex_savinghyphcodes:D
\name_primitive:NN \savingvdiscards       \etex_savingvdiscards:D
\name_primitive:NN \pagediscards          \etex_pagediscards:D
\name_primitive:NN \splitdiscards         \etex_splitdiscards:D
\name_primitive:NN \TeXXETstate           \etex_TeXXETstate:D
\name_primitive:NN \beginL                \etex_beginL:D
\name_primitive:NN \endL                  \etex_endL:D
\name_primitive:NN \beginR                \etex_beginR:D
\name_primitive:NN \endR                  \etex_endR:D
\name_primitive:NN \predisplaydirection   \etex_predisplaydirection:D
\name_primitive:NN \everyeof              \etex_everyeof:D
\name_primitive:NN \protected             \etex_protected:D
%    \end{macrocode}
%
%
%    All major distributions use
%    pdf\eTeX{} as engine so we add these names as well. Since the
%    pdf\TeX{} team has been very good at prefixing most primitives
%    with |pdf| (so far only five do not start with |pdf|) we do not
%    give then a double |pdf| prefix. The list below covers pdf\TeX
%    v~1.30.4.
%    \begin{macrocode}
%% integer registers:
\name_primitive:NN \pdfoutput             \pdf_output:D
\name_primitive:NN \pdfminorversion       \pdf_minorversion:D
\name_primitive:NN \pdfcompresslevel      \pdf_compresslevel:D
\name_primitive:NN \pdfdecimaldigits      \pdf_decimaldigits:D
\name_primitive:NN \pdfimageresolution    \pdf_imageresolution:D
\name_primitive:NN \pdfpkresolution       \pdf_pkresolution:D
\name_primitive:NN \pdftracingfonts       \pdf_tracingfonts:D
\name_primitive:NN \pdfuniqueresname      \pdf_uniqueresname:D
\name_primitive:NN \pdfadjustspacing      \pdf_adjustspacing:D
\name_primitive:NN \pdfprotrudechars      \pdf_protrudechars:D
\name_primitive:NN \efcode                \pdf_efcode:D
\name_primitive:NN \lpcode                \pdf_lpcode:D
\name_primitive:NN \rpcode                \pdf_rpcode:D
\name_primitive:NN \pdfforcepagebox       \pdf_forcepagebox:D
\name_primitive:NN \pdfoptionalwaysusepdfpagebox \pdf_optionalwaysusepdfpagebox:D
\name_primitive:NN \pdfinclusionerrorlevel\pdf_inclusionerrorlevel:D
\name_primitive:NN \pdfoptionpdfinclusionerrorlevel \pdf_optionpdfinclusionerrorlevel:D
\name_primitive:NN \pdfimagehicolor       \pdf_imagehicolor:D
\name_primitive:NN \pdfimageapplygamma    \pdf_imageapplygamma:D
\name_primitive:NN \pdfgamma              \pdf_gamma:D
\name_primitive:NN \pdfimagegamma         \pdf_imagegamma:D
%% dimen registers:
\name_primitive:NN \pdfhorigin            \pdf_horigin:D
\name_primitive:NN \pdfvorigin            \pdf_vorigin:D
\name_primitive:NN \pdfpagewidth          \pdf_pagewidth:D
\name_primitive:NN \pdfpageheight         \pdf_pageheight:D
\name_primitive:NN \pdflinkmargin         \pdf_linkmargin:D
\name_primitive:NN \pdfdestmargin         \pdf_destmargin:D
\name_primitive:NN \pdfthreadmargin       \pdf_threadmargin:D
%% token registers:
\name_primitive:NN \pdfpagesattr          \pdf_pagesattr:D
\name_primitive:NN \pdfpageattr           \pdf_pageattr:D
\name_primitive:NN \pdfpageresources      \pdf_pageresources:D
\name_primitive:NN \pdfpkmode             \pdf_pkmode:D
%% expandable commands:
\name_primitive:NN \pdftexrevision        \pdf_texrevision:D
\name_primitive:NN \pdftexbanner          \pdf_texbanner:D
\name_primitive:NN \pdfcreationdate       \pdf_creationdate:D
\name_primitive:NN \pdfpageref            \pdf_pageref:D
\name_primitive:NN \pdfxformname          \pdf_xformname:D
\name_primitive:NN \pdffontname           \pdf_fontname:D
\name_primitive:NN \pdffontobjnum         \pdf_fontobjnum:D
\name_primitive:NN \pdffontsize           \pdf_fontsize:D
\name_primitive:NN \pdfincludechars       \pdf_includechars:D
\name_primitive:NN \leftmarginkern        \pdf_leftmarginkern:D
\name_primitive:NN \rightmarginkern       \pdf_rightmarginkern:D
\name_primitive:NN \pdfescapestring       \pdf_escapestring:D
\name_primitive:NN \pdfescapename         \pdf_escapename:D
\name_primitive:NN \pdfescapehex          \pdf_escapehex:D
\name_primitive:NN \pdfunescapehex        \pdf_unescapehex:D
\name_primitive:NN \pdfstrcmp             \pdf_strcmp:D
\name_primitive:NN \pdfuniformdeviate     \pdf_uniformdeviate:D
\name_primitive:NN \pdfnormaldeviate      \pdf_normaldeviate:D
\name_primitive:NN \pdfmdfivesum          \pdf_mdfivesum:D
\name_primitive:NN \pdffilemoddate        \pdf_filemoddate:D
\name_primitive:NN \pdffilesize           \pdf_filesize:D
\name_primitive:NN \pdffiledump           \pdf_filedump:D
%% read-only integers:
\name_primitive:NN \pdftexversion         \pdf_texversion:D
\name_primitive:NN \pdflastobj            \pdf_lastobj:D
\name_primitive:NN \pdflastxform          \pdf_lastxform:D
\name_primitive:NN \pdflastximage         \pdf_lastximage:D
\name_primitive:NN \pdflastximagepages    \pdf_lastximagepages:D
\name_primitive:NN \pdflastannot          \pdf_lastannot:D
\name_primitive:NN \pdflastxpos           \pdf_lastxpos:D
\name_primitive:NN \pdflastypos           \pdf_lastypos:D
\name_primitive:NN \pdflastdemerits       \pdf_lastdemerits:D
\name_primitive:NN \pdfelapsedtime        \pdf_elapsedtime:D
\name_primitive:NN \pdfrandomseed         \pdf_randomseed:D
\name_primitive:NN \pdfshellescape        \pdf_shellescape:D
%% general commands:
\name_primitive:NN \pdfobj                \pdf_obj:D 
\name_primitive:NN \pdfrefobj             \pdf_refobj:D 
\name_primitive:NN \pdfxform              \pdf_xform:D
\name_primitive:NN \pdfrefxform           \pdf_refxform:D  
\name_primitive:NN \pdfximage             \pdf_ximage:D
\name_primitive:NN \pdfrefximage          \pdf_refximage:D
\name_primitive:NN \pdfannot              \pdf_annot:D
\name_primitive:NN \pdfstartlink          \pdf_startlink:D    
\name_primitive:NN \pdfendlink            \pdf_endlink:D              
\name_primitive:NN \pdfoutline            \pdf_outline:D  
\name_primitive:NN \pdfdest               \pdf_dest:D
\name_primitive:NN \pdfthread             \pdf_thread:D
\name_primitive:NN \pdfstartthread        \pdf_startthread:D      
\name_primitive:NN \pdfendthread          \pdf_endthread:D      
\name_primitive:NN \pdfsavepos            \pdf_savepos:D      
\name_primitive:NN \pdfinfo               \pdf_info:D 
\name_primitive:NN \pdfcatalog            \pdf_catalog:D  
\name_primitive:NN \pdfnames              \pdf_names:D
\name_primitive:NN \pdfmapfile            \pdf_mapfile:D  
\name_primitive:NN \pdfmapline            \pdf_mapline:D  
\name_primitive:NN \pdffontattr           \pdf_fontattr:D   
\name_primitive:NN \pdftrailer            \pdf_trailer:D  
\name_primitive:NN \pdffontexpand         \pdf_fontexpand:D
%%\name_primitive:NN \vadjust [<pre spec>] <filler> { <vertical mode material> } (h, m)
\name_primitive:NN \pdfliteral            \pdf_literal:D
%%\name_primitive:NN \special <pdfspecial spec>
\name_primitive:NN \pdfresettimer         \pdf_resettimer:D    
\name_primitive:NN \pdfsetrandomseed      \pdf_setrandomseed:D        
\name_primitive:NN \pdfnoligatures        \pdf_noligatures:D      
%    \end{macrocode}
%
% We're ignoring XeTeX and LuaTeX right 
% now except for a check whether they're in use: 
%    \begin{macrocode}
\name_primitive:NN \XeTeXversion          \xetex_version:D
\name_primitive:NN \directlua             \luatex_directlua:D
%    \end{macrocode}
%    
% XeTeX adds \cs{strcmp} to the set of primitives, with the same
% implementation as \cs{pdfstrcmp} but a different name. To avoid 
% having to worry about this later, the same internal name is used.
%    \begin{macrocode}
\etex_ifdefined:D \strcmp
  \etex_ifdefined:D \xetex_version:D
    \name_primitive:NN \strcmp \pdf_strcmp:D
  \tex_fi:D
\tex_fi:D
%    \end{macrocode}
%
% \subsection{\pkg{expl3} code switches}
%
%  \begin{macro}{\ExplSyntaxOn}
%  \begin{macro}{\ExplSyntaxOff}
%  \begin{macro}{\ExplSyntaxStatus}
%    Here we define functions that are used to turn on and off the
%    special conventions used in the kernel of \LaTeX3.
%
%    First of all, the space, tab and the return characters will all
%    be ignored inside \LaTeX3 code, the latter because endline is set
%    to a space instead. When space characters are needed in \LaTeX3
%    code the |~| character will be used for that purpose.
%
%   Specification of the desired behavior:
%   \begin{itemize}
%   \item ExplSyntax can be either On or Off.
%   \item The On switch is \meta{null} if ExplSyntax is on.
%   \item The Off switch is \meta{null} if ExplSyntax is off.
%   \item If the On switch is issued and not \meta{null}, it records
%   the current catcode scheme just prior to it being issued.
% \item An Off switch restores the catcode scheme to what it was just
% prior to the previous On switch.
%   \end{itemize}
%   
%    \begin{macrocode}
\tex_def:D\ExplSyntaxOn{
  \tex_ifodd:D \ExplSyntaxStatus \tex_relax:D
  \tex_else:D
    \tex_edef:D\ExplSyntaxOff{
      \etex_unexpanded:D{
        \tex_ifodd:D \ExplSyntaxStatus \tex_relax:D
          \tex_def:D \ExplSyntaxStatus{0}
      }
      \tex_catcode:D  126=\tex_the:D \tex_catcode:D 126 \tex_relax:D
      \tex_catcode:D  32=\tex_the:D \tex_catcode:D 32 \tex_relax:D
      \tex_catcode:D  9=\tex_the:D \tex_catcode:D 9 \tex_relax:D
      \tex_endlinechar:D  =\tex_the:D \tex_endlinechar:D \tex_relax:D
      \tex_catcode:D  95=\tex_the:D \tex_catcode:D 95 \tex_relax:D
      \tex_catcode:D  58=\tex_the:D \tex_catcode:D 58 \tex_relax:D
      \tex_noexpand:D \tex_fi:D
    }
    \tex_def:D\ExplSyntaxStatus{1}
    \tex_catcode:D  126=10 \tex_relax:D % tilde is a space char.
    \tex_catcode:D   32=9  \tex_relax:D % space is ignored
    \tex_catcode:D    9=9  \tex_relax:D % tab also ignored
    \tex_endlinechar:D =32 \tex_relax:D % endline is space
    \tex_catcode:D   95=11 \tex_relax:D % underscore letter
    \tex_catcode:D   58=11 \tex_relax:D % colon letter
  \tex_fi:D
}
%    \end{macrocode}
% At this point we better set the status. 
%    \begin{macrocode}
\tex_def:D\ExplSyntaxStatus{1}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
%  \begin{macro}{\ExplSyntaxNamesOn}
%  \begin{macro}{\ExplSyntaxNamesOff}
%    Sometimes we need to be able to use names from the kernel of
%    \LaTeX3 without adhering it's conventions according to space
%    characters. These macros provide the necessary settings.
%    \begin{macrocode}
\tex_def:D \ExplSyntaxNamesOn{
  \tex_catcode:D `\_=11\tex_relax:D
  \tex_catcode:D `\:=11\tex_relax:D
}
\tex_def:D \ExplSyntaxNamesOff{
  \tex_catcode:D `\_=8\tex_relax:D
  \tex_catcode:D `\:=12\tex_relax:D
}
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%
% \subsection{Package loading}
%
%
% \begin{macro}{\GetIdInfo}
% \begin{macro}{ \filedescription ,
%                \filename        ,
%                \fileversion     ,
%                \fileauthor      ,
%                \filedate        ,
%                \filenameext     ,
%                \filetimestamp   }
% \begin{macro}[aux]{\GetIdInfoAuxi:w}
% \begin{macro}[aux]{\GetIdInfoAuxii:w}
% \begin{macro}[aux]{\GetIdInfoAuxCVS:w}
% \begin{macro}[aux]{\GetIdInfoAuxSVN:w}
%   Extract all information from a cvs or svn field. The
%   formats are slightly different but at least the information is in
%   the same positions so we check in the date format so see if it
%   contains a "/" after the four-digit year. If it does it is cvs
%   else svn and we extract information. To be on the safe side we
%   ensure that spaces in the argument are seen.
%    \begin{macrocode}
\tex_def:D\GetIdInfo{
  \tex_begingroup:D
  \tex_catcode:D   32=10 \tex_relax:D % needed? Probably for now.
  \GetIdInfoMaybeMissing:w
}
%    \end{macrocode}
% 
%    \begin{macrocode}
\tex_def:D\GetIdInfoMaybeMissing:w$#1$#2{
  \tex_def:D \l_tmpa_tl {#1}
  \tex_def:D \l_tmpb_tl {Id}
  \tex_ifx:D \l_tmpa_tl \l_tmpb_tl
    \tex_def:D \l_tmpa_tl {
      \tex_endgroup:D
      \tex_def:D\filedescription{#2}
      \tex_def:D\filename      {[unknown~name]}
      \tex_def:D\fileversion   {000}
      \tex_def:D\fileauthor    {[unknown~author]}
      \tex_def:D\filedate      {0000/00/00}
      \tex_def:D\filenameext   {[unknown~ext]}
      \tex_def:D\filetimestamp {[unknown~timestamp]}
    }
  \tex_else:D
    \tex_def:D \l_tmpa_tl {\GetIdInfoAuxi:w$#1${#2}}
  \tex_fi:D
  \l_tmpa_tl
}          
%    \end{macrocode}
% 
%    \begin{macrocode}
\tex_def:D\GetIdInfoAuxi:w$#1~#2.#3~#4~#5~#6~#7~#8$#9{
  \tex_endgroup:D
  \tex_def:D\filename{#2}
  \tex_def:D\fileversion{#4}
  \tex_def:D\filedescription{#9}
  \tex_def:D\fileauthor{#7}
  \GetIdInfoAuxii:w #5\tex_relax:D
  #3\tex_relax:D#5\tex_relax:D#6\tex_relax:D
}
%    \end{macrocode}
% 
%    \begin{macrocode}
\tex_def:D\GetIdInfoAuxii:w #1#2#3#4#5#6\tex_relax:D{
  \tex_ifx:D#5/
    \tex_expandafter:D\GetIdInfoAuxCVS:w
  \tex_else:D
    \tex_expandafter:D\GetIdInfoAuxSVN:w
  \tex_fi:D
}
%    \end{macrocode}
% 
%    \begin{macrocode}
\tex_def:D\GetIdInfoAuxCVS:w #1,v\tex_relax:D
                             #2\tex_relax:D#3\tex_relax:D{
  \tex_def:D\filedate{#2}
  \tex_def:D\filenameext{#1}
  \tex_def:D\filetimestamp{#3}
%    \end{macrocode}
% When creating the format we want the information in the log straight
% away.
%    \begin{macrocode}
%<initex>\tex_immediate:D\tex_write:D-1
%<initex>  {\filename;~ v\fileversion,~\filedate;~\filedescription}
}
\tex_def:D\GetIdInfoAuxSVN:w #1\tex_relax:D#2-#3-#4
                             \tex_relax:D#5Z\tex_relax:D{
  \tex_def:D\filenameext{#1}
  \tex_def:D\filedate{#2/#3/#4}
  \tex_def:D\filetimestamp{#5}
%<-package>\tex_immediate:D\tex_write:D-1
%<-package>  {\filename;~ v\fileversion,~\filedate;~\filedescription}
}
%</initex|package>
%    \end{macrocode}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%  \end{macro}
%
% Finally some corrections in the case we are running over \LaTeXe.
%
% We want to set things up so that experimental packages and regular
% packages can coexist with the former using the \LaTeX3 programming
% catcode settings.  Since it cannot be the task of the end user to
% know how a package is constructed under the hood we make it so that
% the experimental packages have to identify themselves. As an example
% it can be done as
% \begin{verbatim}
% \RequirePackage{l3names}
% \ProvidesExplPackage{agent}{2007/08/28}{007}{bonding module}
% \end{verbatim}
% or by using the "\file"\meta{field} informations from "\GetIdInfo"
% as the packages in this distribution do like this:
% \begin{verbatim}
% \RequirePackage{l3names}
% \GetIdInfo$Id: l3names.dtx 1362 2009-05-28 20:19:21Z joseph $
%          {L3 Experimental Box module}
% \ProvidesExplPackage
%   {\filename}{\filedate}{\fileversion}{\filedescription}
% \end{verbatim}
%
%
% \begin{macro}{\ProvidesExplPackage}
% \begin{macro}{\ProvidesExplClass}
% First up is the identification. Rather trivial as we don't allow for
% options just yet.
%    \begin{macrocode}
%<*package>
\tex_def:D \ProvidesExplPackage#1#2#3#4{
  \ProvidesPackage{#1}[#2~v#3~#4]
  \ExplSyntaxOn
}
\tex_def:D \ProvidesExplClass#1#2#3#4{
  \ProvidesClass{#1}[#2~v#3~#4]
  \ExplSyntaxOn
}
%    \end{macrocode} 
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\@pushfilename}
% \begin{macro}{\@popfilename}
%   The idea behind the code is to record whether or not the \LaTeX3
%   syntax is on or off when about to load a file with class or
%   package extension. This status stored in the parameter
%   |\ExplSyntaxStatus| and set by |\ExplSyntaxOn| and
%   |\ExplSyntaxOff| to |1| and |0| respectively is pushed onto the
%   stack |\ExplSyntaxStack|. Then the catcodes are set back to
%   normal, the file loaded with its options and finally the stack is
%   popped again.  The whole thing is a bit problematical. So let's
%   take a look at what the desired behavior is: A package or class
%   which declares itself of Expl type by using |\ProvidesExplClass|
%   or |\ProvidesExplPackage| should automatically ensure the correct
%   catcode scheme as soon as the identification part is
%   over. Similarly, a package or class which uses the traditional
%   |\ProvidesClass| or |\ProvidesPackage| commands should go back to
%   the traditional catcode scheme. An example:
% \begin{verbatim}
% \RequirePackage{l3names}
% \ProvidesExplPackage{foobar}{2009/05/07}{0.1}{Foobar package}
% \cs_new:Nn \foo_bar:nn {#1,#2}
% ...
% \RequirePackage{array}
% ...
% \cs_new:Nn \foo_bar:nnn {#3,#2,#1}
% \end{verbatim}
%   Inside the \pkg{array} package, everything should behave as normal
%   under traditional \LaTeX\ but as soon as we are back at the top
%   level, we should use the new catcode regime.
%
%
%   Whenever \LaTeX\ inputs a package file or similar, it calls upon
%   |\@pushfilename| to push the name, the extension and the catcode
%   of @ of the file it was currently processing onto a file name
%   stack. Similarly, after inputting such a file, this file name
%   stack is popped again and the catcode of @ is set to what it was
%   before. If it is a package within package, @ maintains catcode 11
%   whereas if it is package within document preamble @ is reset to
%   what it was in the preamble (which is usually catcode 12). We wish
%   to adopt a similar technique. Every time an Expl package or class
%   is declared, they will issue an ExplSyntaxOn. Then whenever we are
%   about to load another file, we will first push this status onto a
%   stack and then turn it off again. Then when done loading a file,
%   we pop the stack and if ExplSyntax was On right before, so should
%   it be now. The only problem with this is that we cannot guarantee
%   that we get to the file name stack very early on. Therefore, if
%   the ExplSyntaxStack is empty when trying to pop it, we ensure to
%   turn ExplSyntax off again.
%
%   |\@pushfilename| is prepended with a small function pushing the
%   current ExplSyntaxStatus (true/false) onto a stack. Then the
%   current catcode regime is recorded and ExplSyntax is switched off.
%
%   |\@popfilename| is appended with a function for popping the
%   ExplSyntax stack. However, chances are we didn't get to hook into
%   the file stack early enough so \LaTeX\ might try to pop the file
%   name stack while the ExplSyntaxStack is empty. If the latter is
%   empty, we just switch off ExplSyntax.
%    \begin{macrocode}
\tex_edef:D \@pushfilename{
  \etex_unexpanded:D{
    \tex_edef:D \ExplSyntaxStack{ \ExplSyntaxStatus \ExplSyntaxStack }
    \ExplSyntaxOff
  }
  \etex_unexpanded:D\tex_expandafter:D{\@pushfilename }
}
\tex_edef:D \@popfilename{
  \etex_unexpanded:D\tex_expandafter:D{\@popfilename 
    \tex_if:D 2\ExplSyntaxStack 2
      \ExplSyntaxOff
    \tex_else:D
      \tex_expandafter:D\ExplSyntaxPopStack\ExplSyntaxStack\q_nil
    \tex_fi:D
  }
}
%    \end{macrocode} 
% \end{macro}
% \end{macro}
%
% \begin{macro}{\ExplSyntaxPopStack}
% \begin{macro}{\ExplSyntaxStack}
%   Popping the stack is simple: Take the first token which is either
%   0 (false) or 1 (true) and test if it is odd. Save the rest. The
%   stack is initially empty set to 0 signalling that before
%   \pkg{l3names} was loaded, the ExplSyntax was off.
%    \begin{macrocode}
\tex_def:D\ExplSyntaxPopStack#1#2\q_nil{
  \tex_def:D\ExplSyntaxStack{#2}
  \tex_ifodd:D#1\tex_relax:D
    \ExplSyntaxOn
  \tex_else:D
    \ExplSyntaxOff
  \tex_fi:D
}
\tex_def:D \ExplSyntaxStack{0}
%    \end{macrocode} 
% \end{macro}
% \end{macro}
%
% \subsection{Finishing up}
%
% A few of the `primitives' assigned above have already been stolen
% by \LaTeX, so assign them by hand to the saved real primitive.
%    \begin{macrocode}
\tex_let:D\tex_input:D        \@@input
\tex_let:D\tex_underline:D    \@@underline
\tex_let:D\tex_end:D          \@@end
\tex_let:D\tex_everymath:D    \frozen@everymath
\tex_let:D\tex_everydisplay:D \frozen@everydisplay
\tex_let:D\tex_italiccor:D    \@@italiccorr
\tex_let:D\tex_hyphen:D       \@@hyph
%    \end{macrocode}
%
% \TeX\ has a nasty habit of inserting a command with the name |\par|
% so we had better make sure that that command at least has a definition.
%    \begin{macrocode}
\tex_let:D\par          \tex_par:D
%    \end{macrocode}
%
% This is the end for \file{l3names} when used on top of \LaTeXe:
%
%    \begin{macrocode}
\tex_ifx:D\name_undefine:N\@gobble
  \tex_def:D\name_pop_stack:w{}
\tex_else:D
%    \end{macrocode}
%
% But if traditional \TeX\ code is disabled, do this\ldots
%
% As mentioned above, The \LaTeXe\ package mechanism will insert some code
% to handle the filename stack, and reset the package options, this
% code will die if the \TeX\ primitives have gone, so skip past it
% and insert some equivalent code that will work.
%
% First a version of |\ProvidesPackage| that can cope.
%    \begin{macrocode}
\tex_def:D\ProvidesPackage{
  \tex_begingroup:D
  \ExplSyntaxOff
  \package_provides:w}
%    \end{macrocode}
%
%    \begin{macrocode}
\tex_def:D\package_provides:w#1#2[#3]{
  \tex_endgroup:D
  \tex_immediate:D\tex_write:D-1{Package:~#1#2~#3}
  \tex_expandafter:D\tex_xdef:D
    \tex_csname:D ver@#1.sty\tex_endcsname:D{#1}}
%    \end{macrocode}
%
% In this case the catcode preserving stack is not maintained and
% |\ExplSyntaxOn| conventions stay in force once on. You'll need
% to turn then off explicitly with |\ExplSyntaxOff| (although as currently
% built on 2e, nothing except very experimental code will run in
% this mode!) Also note that |\RequirePackage| is a simple definition, just for
% one file, with no options.
%    \begin{macrocode}
\tex_def:D\name_pop_stack:w#1\relax{%
  \ExplSyntaxOff
  \tex_expandafter:D\@p@pfilename\@currnamestack\@nil
  \tex_let:D\default@ds\@unknownoptionerror
  \tex_global:D\tex_let:D\ds@\@empty
  \tex_global:D\tex_let:D\@declaredoptions\@empty}
%    \end{macrocode}
%
%    \begin{macrocode}
\tex_def:D\@p@pfilename#1#2#3#4\@nil{%
  \tex_gdef:D\@currname{#1}%
  \tex_gdef:D\@currext{#2}%
  \tex_catcode:D`\@#3%
  \tex_gdef:D\@currnamestack{#4}}
%    \end{macrocode}
%
%    \begin{macrocode}
  \tex_def:D\NeedsTeXFormat#1{}
  \tex_def:D\RequirePackage#1{
    \tex_expandafter:D\tex_ifx:D
      \tex_csname:D ver@#1.sty\tex_endcsname:D\tex_relax:D
        \ExplSyntaxOn
        \tex_input:D#1.sty\tex_relax:D
    \tex_fi:D}
\tex_fi:D
%    \end{macrocode}
%
%
% The |\futurelet| just forces the special end of file marker to vanish,
% so the argument of |\name_pop_stack:w| does not cause an end-of-file
% error. (Normally I use |\expandafter| for this trick, but here the next
% token is in fact |\let| and that may be undefined.)
%    \begin{macrocode}
\tex_futurelet:D\name_tmp:\name_pop_stack:w
%    \end{macrocode}
%
% \paragraph{\pkg{expl3} dependency checks}
% We want the \pkg{expl3} bundle to be loaded `as one'; this command is
% used to ensure that one of the "l3" packages isn't loaded on its own.
%    \begin{macrocode}
%<*!initex>
\tex_def:D \package_check_loaded_expl: {
  \@ifpackageloaded{expl3}{}{
    \PackageError{expl3}{Cannot~load~the~expl3~modules~separately}{
      The~expl3~modules~cannot~be~loaded~separately;\MessageBreak
      please~\protect\usepackage{expl3}~instead.
    }
  }
}
%</!initex>
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \subsection{Showing memory usage}
%
% This section is from some old code from 1993; it'd be good to work out
% how it should be used in our code today.
%
%    During the development of the \LaTeX3 kernel we need to be able
%    to keep track of the memory usage. Therefore we generate empty
%    pages while loading the kernel code, just to be able to check the
%    memory usage.
%
%    \begin{macrocode}
%<*showmemory>
\g_trace_statistics_status=2\scan_stop:
\cs_set_nopar:Npn\showMemUsage{
  \if_horizontal_mode:
     \tex_errmessage:D{Wrong~ mode~ H:~ something~ triggered~ 
                    hmode~ above}
  \else:
     \tex_message:D{Mode ~ okay}
  \fi:
  \tex_shipout:D\hbox:w{}
}
\showMemUsage
%</showmemory>
%    \end{macrocode}
%
% \end{implementation}
% \PrintIndex
%
% \endinput
