% \iffalse meta-comment
%
% Copyright (C) 2019-2025
% The LaTeX Project and any individual authors listed elsewhere
% in this file.
%
% This file is part of the LaTeX base system.
% -------------------------------------------
%
% It may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3c
% of this license or (at your option) any later version.
% The latest version of this license is in
%    https://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008 or later.
%
% This file has the LPPL maintenance status "maintained".
%
% The list of all files belonging to the LaTeX base distribution is
% given in the file `manifest.txt'. See also `legal.txt' for additional
% information.
%
% The list of derived (unpacked) files belonging to the distribution
% and covered by LPPL is defined by the unpacking scripts (with
% extension .ins) which are part of the distribution.
%
% \fi
% Filename: ltnews31.tex
%
% This is issue 31 of LaTeX News.

\NeedsTeXFormat{LaTeX2e}[2020-02-02]

\documentclass{ltnews}
\usepackage[T1]{fontenc}

\usepackage{lmodern,url,hologo}

\usepackage{csquotes}
\usepackage{multicol}

\providecommand\meta[1]{$\langle$\textit{#1}$\rangle$}
\providecommand\option[1]{\texttt{#1}}
\providecommand\env[1]{\texttt{#1}}
\providecommand\file[1]{\texttt{#1}}
\providecommand\pkg[1]{\texttt{#1}}


\providecommand\XeTeX{\hologo{XeTeX}}
\providecommand\LuaTeX{\hologo{LuaTeX}}
\providecommand\pdfTeX{\hologo{pdfTeX}}
\providecommand\MiKTeX{\hologo{MiKTeX}}
\providecommand\CTAN{\textsc{ctan}}
\providecommand\TL{\TeX\,Live}
\providecommand\githubissue[2][]{\ifhmode\unskip\fi
     \quad\penalty500\strut\nobreak\hfill
     \mbox{\small\slshape(%
       \href{https://github.com/latex3/latex2e/issues/\getfirstgithubissue#2 \relax}%
          	    {github issue#1 #2}%
           )}%
     \par\smallskip}

% simple solution right now (just link to the first issue if there are more)
\def\getfirstgithubissue#1 #2\relax{#1}

\providecommand\sxissue[1]{\ifhmode\unskip\fi
     \quad\penalty500\strut\nobreak\hfill
     \mbox{\small\slshape(\url{https://tex.stackexchange.com/#1})}\par}

\providecommand\gnatsissue[2]{\ifhmode\unskip\fi
     \quad\penalty500\strut\nobreak\hfill
     \mbox{\small\slshape(%
       \href{https://www.latex-project.org/cgi-bin/ltxbugs2html?pr=#1\%2F#2}%
          	    {gnats issue #1/#2}%
           )}%
     \par}

\let\cls\pkg
\providecommand\env[1]{\texttt{#1}}

\vbadness=1400  % accept slightly empty columns


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\iffalse % only for TUB production
\usepackage{graphicx}
\makeatletter
% Xe\TeX{} requires reflecting the first E, hence we complain if the
% graphics package is not present.  (For plain documents, this can be
% loaded via Eplain.)  Also, at Barbara's suggestion, if the current
% font is slanted, we rotate by 180 instead of reflecting so there is at
% least a chance to look ok.  (The magic values here seem more or less
% ok for \texttt{cmsl} and \texttt{cmti}.)
%
%    \begin{macrocode}
\def\tubreflect#1{%
  \@ifundefined{reflectbox}{%
    \TBerror{A graphics package must be loaded for \string\XeTeX}%
  }{%
    \ifdim \fontdimen1\font>0pt
      \raise 1.6ex \hbox{\kern.1em\rotatebox{180}{#1}}\kern-.1em
    \else
      \reflectbox{#1}%
    \fi
  }%
}
\def\tubhideheight#1{\setbox0=\hbox{#1}\ht0=0pt \dp0=0pt \box0 }
\def\XekernbeforeE{-.125em}
\def\XekernafterE{-.1667em}
\DeclareRobustCommand{\Xe}{\leavevmode
  \tubhideheight{\hbox{X%
    \setbox0=\hbox{\TeX}\setbox1=\hbox{E}%
    \ifdim \fontdimen1\font>0pt \def\XekernbeforeE{0em}\fi
    \lower\dp0\hbox{\raise\dp1\hbox{\kern\XekernbeforeE\tubreflect{E}}}%
    \kern\XekernafterE}}}
\def\XeTeX{\Xe\TeX}
\def\XeLaTeX{\Xe{\kern.11em \LaTeX}}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\publicationday{02}
\publicationmonth{February}
\publicationyear{2020}

\publicationissue{31}

\begin{document}

%\addtolength\textheight{4.2pc}   % only for TUB

\maketitle
{\hyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000 \tableofcontents}

\setlength\rightskip{0pt plus 3em}


\medskip


%\section{Introduction}
%
%This document is under construction \ldots


\section{Experiences with the \LaTeX\ \texttt{-dev} formats}

As reported in the previous \emph{\LaTeX{} News}, we have made a pre-release
version of the \LaTeX{} kernel available as \LaTeX\texttt{-dev}. Overall, the
approach of having an explicit testing release has been positive: it is now
readily available in \TeX{} systems and is getting real use\\
beyond the team.

The current
release has been tested by a number of people, and we have had valuable feedback
on a range of the new ideas. This has allowed us to fix issues in several of the
new features, as described below.


We wish to thank all the dedicated users who have been
trying out the development formats, and we encourage others to do so. Pre-testing
in this way does mean that, for the vast majority of users, problems are solved
before they even appear!


\section{Concerning this release \ldots (Lua\LaTeX{} engine)}

The new LuaHB\TeX{} engine is Lua\TeX{} with an embedded HarfBuzz library.
HarfBuzz can be used by setting a suitable renderer in the font
declaration. A basic interface for that is provided by \pkg{fontspec}.
This additional font renderer will greatly improve the shaping of
various scripts when using Lua\LaTeX{}, many of which are currently handled correctly only by
\XeTeX{}, which always uses HarfBuzz.

To simplify testing of the new engine, binaries have
already been added to MiK\TeX{} and \TeX{}~Live 2019 and both distributions have already now changed
the Lua\LaTeX-dev format to use it.

Going forward, Lua\LaTeX\ (and Lua\LaTeX-dev) will both use the LuaHB\TeX{}
engine.
The timing of the switch to the LuaHB\TeX{} engine
depends on the distribution you use
(for \TeX{}~Live this will be with \TeX{}~Live 2020).




\section{Improved load-times for \pkg{expl3}}

The \LaTeX3 programming layer, \pkg{expl3}, has over the past decade moved from
being largely experimental to broadly stable. It is now used in a significant
number of third-party packages, most notably \pkg{xparse}, for defining
interfaces in cases where no \pkg{expl3} code is \enquote{visible}. In addition, most
\LaTeX{} documents compiled using \XeTeX{} or \LuaTeX{} load \pkg{fontspec},
which is written using \pkg{expl3}.

The \pkg{expl3} layer contains a non-trivial number of macros, and when used
with the \XeTeX{} and \LuaTeX{} engines, it also loads a large body of Unicode data.
This means that even on a fast computer, there is a relatively large load time when
using \pkg{expl3}.

For this release, the team have made adjustments in the \LaTeXe{} kernel to
pre-load a significant portion of \pkg{expl3} when the format is built. This is
transparent to the user, other than the significant decrease in document
processing time: there will be no \enquote{pause} whilst loading the Unicode data
files. Loading \pkg{expl3} in documents and packages can continue to be done as usual;
eventually, it will be possible to omit
\begin{verbatim}
\RequirePackage{expl3}
\end{verbatim}
entirely but, to support older formats, this is still recommended at present.


\section[Improvements to \LaTeX{} font selection: NFSS]
        {Improvements to \LaTeX{}'s font selection\\ mechanism (NFSS)}


\subsection{Extending the shape management in NFSS}

Over time, more and more fonts have become available for use with
\LaTeX{}. Many such font families offer additional shapes such as small
caps italic (\texttt{scit}), small caps slanted (\texttt{scsl}) or
swash (\texttt{sw}).
By using \cs{fontshape} those shapes can
be explicitly selected. For the swash shapes there is also
\cs{swshape} and \cs{textsw} available.

In the original font selection implementation a request to select a new shape
always overrode the current shape. With the 2020 release of \LaTeX{}
this has changed and \cs{fontshape} can now be used to combine small
capitals with italic, slanted or swash letters, either by explicitly
asking for \texttt{scit}, etc., or by asking for italics when typesetting
already in small caps, and so forth.

Using \cs{upshape} will still change italics or slanted back to an
upright shape but will not any longer alter the small caps setting. To
change small capitals back to upper/lower case you can now use
\cs{ulcshape} (or \cs{textulc}) which in turn will not change the font
with respect to italics, slanted or swash.
%
There is one exception: for compatibility reasons \cs{upshape} will
change small capitals back to upright (\texttt{n} shape), if the
current shape is \texttt{sc}. This is done so that something like
\cs{scshape}\allowbreak\texttt{...}\allowbreak\cs{upshape} continues
to work as before, but we suggest that you don't use that deprecated method in
new documents.


Finally, if you want to
reset the shape back to normal you can use \cs{normalshape} which is a
shorthand for \cs{upshape}\cs{ulcshape}.

The way that shapes combine with each other is not hardwired; it is
customizable and extensible if there is ever a need for this. The
mappings
are defined through \cs{DeclareFontShapeChangeRule} and the
details for developers are documented in \file{source2e.pdf}.

The ideas for this interface extension have been pioneered in
\pkg{fontspec} by Will Robertson for Unicode engines, and in
\pkg{fontaxes} by Andreas Bühmann and Michael Ummels for \pdfTeX{};
they are by now used in many font support packages.


\subsection{Extending the font series management in NFSS}

Many of the newer font families also come provided with additional
weights (thin, semi-bold, ultra-bold, etc.)\ or several running widths,
such as condensed or extra-condensed.  In some cases the number of
different values for series (weight plus width) is really impressive:
for example, Noto Sans
offers 36 fonts, from ultra-light extra condensed to ultra-bold medium width.

Already in its original design, NFSS supported 9 weight levels, from
ultra-light (\texttt{ul}) to ultra-bold (\texttt{ub}), and also 9 width
levels, from ultra-condensed (\texttt{uc}) to ultra-expanded
(\texttt{ux}):  more than enough, even for a font family like Noto
Sans. Unfortunately, some font support packages nevertheless invented
their own names, so in recent years you have been able to find all kinds of
non-standard series names (\texttt{k}, \texttt{i}, \texttt{j} and
others), making it impossible to combine different fonts successfully
using the standard NFSS mechanisms.

Over the course of the last year a small number of individuals,
notably, Bob Tennent, Michael Sharpe and Marc Penninga, have worked hard to
bring this unsatisfactory situation back under control; so today we are
happy to report that the internal font support files for more than a
hundred font families are all back to following the standard NFSS conventions.
Combining them is now again rather nice and easy, and from a technical
perspective they can now be easily matched; but, of course,
there is still the task of choosing combinations that visually work
well together.

In the original font selection implementation, a request to select a new series
always overrode the current one. This was reasonable because there
were nearly no fonts available that offered anything other than a
medium or a bold series. Now that this has changed and families such
as Noto Sans are available, combining weight and width into a single
attribute is no longer appropriate. With the 2020 release of \LaTeX{},
the management of series therefore changed to allow independent
settings of the weight and the width attributes of the series.

For most users this change will be largely transparent as \LaTeX{}
offers only \cs{textbf} or \cs{bfseries} to select a bolder face (and
\cs{textmd} and \cs{mdseries} to return to a medium series): there is no
high-level command for selecting a condensed face, etc. However, using
the NFSS low-level interface it is now possible to ask for, say,
\verb=\fontseries{c}\selectfont= to get a condensed
face (suitable for a marginal note) and that would still allow
the use of \cs{textbf} inside the note, which would
select a bold-condensed face (and not a rather odd-looking
bold-extended face in the middle of condensed type).

The expectation is that this functionality will be used largely by
class and package designers but, given that the low-level NFSS
commands are usable on the document level and that they are not really
difficult to apply, there are probably also a number of users who will
enjoy using these new possibilities that bring \LaTeX{} back into the
premier league for font usage.

The ways in which the different series values combine with each other is not
hardwired but is again customizable and extensible. The mappings are
defined through \cs{DeclareFontSeriesChangeRule} and the details for
developers are documented in \file{source2e.pdf}.


\subsection{Font series defaults per document family}

With additional weights and widths now being available in
many font families, it is more likely that somebody will want to
match, say, a medium weight serif family with a semi-light sans serif
family, or that with one family one wants to use the bold-extended
face when \cs{textbf} is used, while with another it should be bold
(not extended) or semibold, etc.

In the past this kind of extension was provided by Bob Tennent's
\pkg{mweights} package, which has been used in many font
support packages.
With the 2020 release of \LaTeX{} this feature is now available out
of the box.  In addition we also offer a document-level interface to adjust the
behavior of the high-level series commands \cs{textbf}, \cs{textmd}, and of their
declaration forms \cs{bfseries} and \cs{mdseries}, so that they can
have different effects for the serif, sans serif and typewriter
families used in a document.

For example, specifying
\begin{verbatim}
  \DeclareFontSeriesDefault[rm]{bf}{sb}
  \DeclareFontSeriesDefault[tt]{md}{lc}
\end{verbatim}
in the document preamble would result in \cs{textbf} producing
semi-bold (\texttt{sb}) when typesetting in a roman typeface.
The second line says that the
typewriter default face (i.e., the medium series \texttt{md}) should be
a light-condensed face. The optional argument here can be either
\texttt{rm}, \texttt{sf} or \texttt{tt} to indicate one of the three
main font families in a document; if omitted you will change the
overall document default instead.  In the first mandatory argument you
specify either \texttt{md} or \texttt{bf} and the second mandatory
argument then gives the desired series value in NFSS nomenclature.


\subsection{Handling of nested emphasis}

In previous releases of \LaTeX{}, nested \cs{emph} commands
automatically alternated between italics and upright.  This mechanism
has now been generalised so that you can now specify for arbitrary nesting
levels how emphasis should be handled.

The declaration \cs{DeclareEmphSequence} expects a comma separated
list of font declarations corresponding to increasing levels of
emphasis. For example,
\begin{verbatim}
  \DeclareEmphSequence{\itshape,%
               \upshape\scshape,\itshape}
\end{verbatim}
uses italics for the first, small capitals for the second, and italic
small capitals for the third level (provided you use a font that
supports these shapes).  If there are more nesting levels than
provided, \LaTeX{} uses the declarations stored in \cs{emreset} (by
default \cs{ulcshape}\cs{upshape}) for the next level and then
restarts the list.

The mechanism tries to be \enquote{smart} by verifying that the given
declarations actually alter the current font. If not, it continues and
tries the next level---the assumption being that there was already a
manual font change in the document to the font that is now supposed to
be used for emphasis.
%
Of course, this only works if the declarations in the list's entries
actually change the font and not, for example, just the color. In such
a scenario one has to add \cs{emforce} to the entry, which directs the
mechanism to use the entry, even if the font attributes appear to be
unchanged.


\subsection{Providing font family substitutions}

Given that \pdfTeX{} can only handle fonts with up to 256 glyphs, a
single font encoding can only support a few languages. The \texttt{T1}
encoding, for example, does support many Latin-based scripts,
but if you want to write in Greek or Cyrillic then you will need to switch
encodings to \texttt{LGR} or \texttt{T2A}. Given that not every font
family offers glyphs in such encodings, you may end up with some
default family (e.g., Computer Modern) that doesn’t blend in well
with the chosen document font.  For such cases NFSS now offers
\cs{DeclareFontFamilySubstitution}, for example:
\begin{verbatim}
  \DeclareFontFamilySubstitution{LGR}
       {Montserrat-LF}{IBMPlexSans-TLF}
\end{verbatim}
tells \LaTeX{} that if you are typesetting in the sans serif font
\texttt{Montserrat-LF} and the Greek encoding \texttt{LGR} is asked
for, then \LaTeX{} should use \texttt{IBMPlexSans-TLF} to fulfill
the encoding request.

The code is based on ideas from the \pkg{substitutefont}
package by Günter Milde, but the implementation is different.


\subsection{Providing all text companion symbols by default}

The text companion encoding \texttt{TS1} was originally not available
by default, but only when the \pkg{textcomp} package was loaded. The
main reason for this was limited availability of fonts with this encoding other than
Computer Modern; another was the memory restrictions back in the nineties.
These days neither limitation remains, so with the 2020 release all
the symbols provided with the \pkg{textcomp} package are available out
of the box.

Furthermore, an intelligent substitution mechanism has been
implemented so that glyphs missing in some fonts are automatically
substituted with default glyphs that are sans serif if you typeset in
\cs{textsf} and monospaced if you typeset using \cs{texttt}. In the
past they were always taken from Computer Modern Roman if substitution
was necessary.


\typeout{^^J^^J******************************************}
\typeout{** This example needs LaTeX 2020-02-02 or later}
\typeout{** to come out correctly !!}
\typeout{******************************************^^J^^J}

\textsf{This is most noticeable with \cs{oldstylenums} which are now
  taken from \texttt{TS1} so that you no longer get
  \textrm{\oldstylenums{1234}} but \oldstylenums{1234} when typesetting
  in sans serif fonts}\texttt{ and \oldstylenums{1234} when using
  typewriter fonts.}

If there ever is a need to use the original (inferior) definition,
then that remains available as \cs{legacyoldstylenums}; and to fully
revert to the old behavior there is also
\cs{UseLegacyTextSymbols}. The latter declaration reverts \cs{oldstylenums}
and also changes the footnote symbols, such as \cs{textdagger},
\cs{textparagraph}, etc., to pick up their glyphs from the math
fonts instead of the current text font (this means they always keep
the same shape and do not nicely blend in with the text font).

With the text companion symbols as part of the kernel, it is normally
no longer necessary to load the \pkg{textcomp} package, but for
backwards compatibility this package will remain available.  There is,
however, one use case where it remains useful: if you load the package
with the option \option{error} or \option{warn} then substitutions
will change their behavior and result in a \LaTeX{} error or a
\LaTeX{} warning (on the terminal), respectively. Without the package
the substitution information only appears in the \texttt{.log}
file. If you use the option \option{quiet}, then even the information in
the transcript is suppressed (which is not really recommended).



\subsection{New \texttt{alias} size function for use in \texttt{.fd} files}


Most of the newer fonts supported in \TeX{} have been set up with the
\texttt{autoinst} tool by Marc Penninga. In the past, this program
set up each font  using the face name chosen by that font's designer,
e.g., \enquote{\texttt{regular}}, \enquote{\texttt{bold}}, etc.
These face names were then mapped by substitution to
the standard NFSS series names, i.e., \enquote{\texttt{m}}
or \enquote{\texttt{b}}.
As a result one got unnecessary substitution warnings such as
\enquote{\texttt{Font T1/abc/bold/n not found, using T1/abc/b/n instead}}.

%FMi the message above is actually different and longer but ...

We now provide a new NFSS  size function, \texttt{alias}, that can
and will be used by \texttt{autoinst} in the future. It provides the
same functionality as the \texttt{subst} function but is less vocal
about its actions, so that only significant font substitutions show
up as warnings.


\subsection{Suppress unnecessary font substitution warnings}

Many sans serif fonts do not have real italics but usually only
oblique/slanted shapes, so the substitution of slanted for italics is
natural and in fact many designers talk about italic sans serif faces
even if in reality they are oblique.

With nearly all sans serif font families, the \LaTeX{} support files
therefore silently substitute slanted if you ask for \cs{itshape} or
\cs{textit}.  This is also true for Computer Modern in \texttt{T1}
encoding but in \texttt{OT1} you got a warning on the terminal even
though there is nothing you can do about it. This has now been changed
to an information message only, written to the \texttt{.log} file.  %
\githubissue{172}

\vspace{-\smallskipamount}
\pagebreak

\section{Other changes to the \LaTeX{} kernel}


\subsection{UTF-8 characters in package descriptions}

In 2018 we made UTF-8 the default input encoding for \LaTeX{} but we
overlooked the case of non-ASCII characters in the short
package descriptions used in declarations, e.g., in the optional argument to
\cs{ProvidesPackage}.
They worked (sometimes) before, but the switch to UTF-8 made them always
generate an error.
This has been corrected.
%
\githubissue{52}


\subsection[Fix inconsistent hook setting when\texorpdfstring{\\}{} loading packages]%
           {Fix inconsistent hook setting when loading packages}

As part of loading a package, the command
\texttt{\textbackslash}\textit{package}\texttt{.sty-h@@k} gets
defined.  However, attempting to load a package a second time resulted
in this hook becoming undefined again.  Now the hook remains defined
so that extra loading attempts do not change the state of
\LaTeX{} (relevant only to package developers).
%
\githubissue{198}


\subsection{Avoid spurious warning if \texttt{LY1} is made the default encoding}

Making \texttt{LY1} the default encoding, as is done by some font support
packages, gave a spurious warning even if \cs{rmdefault} was changed first.
This was corrected.
%
\githubissue{199}

\enlargethispage{-\smallskipamount}
\vspace{-\medskipamount}

\subsection{Ensure that \cs{textbackslash} remains robust}

In the last release we made most document-level commands robust, but
\cs{textbackslash} became fragile again
whenever  \cs{raggedright} or similar typesetting
was used. This has been fixed.
%
\githubissue{203}


\subsection{Make math delimiters robust in a different way}

Making math delimiters robust caused an issue in some situations. This
has been corrected. This also involved a correction to \pkg{amsmath}.
%
\githubissue{251}


\subsection{Allow more write streams with \env{filecontents} in \LuaTeX}

Most \TeX{} engines only support a maximum of sixteen concurrently
open write streams, and when those have been used up, then
\texttt{filecontents} or any other code trying to open one
will fail.
In \LuaTeX{} more write streams are available and those can
also now be utilised.
%
\githubissue{238}

\subsection{Allow spaces in \env{filecontents} option list}

Leaving spaces or newlines in the option list prevented the options
from being correctly recognized. This\\
has been corrected.
%
\githubissue{256}


\subsection{New \texttt{reverselist} Lua callback type}

A new callback type, \texttt{reverselist}, was added:\\
\texttt{post\_mlist\_to\_hlist\_filter} and \texttt{post\_linebreak\_filter}
are now of this type.


\section{Changes to packages in the \pkg{graphics} category}

\subsection[Make \pkg{color}/\pkg{graphics} user-level commands robust]
           {Make \pkg{color} \& \pkg{graphics} user-level commands robust}

Some of the user-level commands in \pkg{color}, \pkg{graphics} and
\pkg{graphicx},
%\pagebreak
such as \cs{textcolor} or \cs{includegraphics}, were
still fragile so didn't work in moving arguments.\\
All of these are now robust.
%
\githubissue{208}


\section{Changes to packages in the \pkg{tools} category}

\subsection{Fixed column depth in boxed \env{multicols}}

The \env{multicols} environment was setting \cs{maxdepth} when
splitting boxes; but, due to the way the internal interfaces of \LaTeX{} are
designed, it should have used \cs{@maxdepth} instead. As a result,
balanced boxed multicols sometimes ended up having different heights
even if they had exactly the same content.
%
\githubissue{190}


\subsection{Ensure that \env{multicols} does not lose text}

The \env{multicols} environment needs a set of consecutively numbered boxes to
collect column material. The way those got allocated could result in
disaster if other packages allocated most boxes below box~255 (which
\TeX{} always uses for the output page).  In the original
implementation that problem was avoided because one could only
allocate box numbers below~255, but nowadays the \LaTeX{} allocation routine
allows allocating box numbers both below and above~255. So the assumption that
when asking for, say, 20~boxes you always get a consecutive sequence of~20 box
register numbers became no longer true:
some of the column material could
end up in box~255, where it would get overwritten. This has now been corrected by
allocating all necessary boxes with numbers above~255 whenever there aren't enough
lower-numbered registers available.
%
\githubissue{237}

\subsection{Allow spaces in \cs{hhline} arguments}

The \verb|\hhline| command, which allows the
specification of rule segments in \env{tabular} environments, now
allows (but ignores) spaces between its tokens: so
\verb|\hhline{: = : =}| is now allowed and is equivalent to
\verb|\hhline{:=:=}|. This matches similar token arguments in \LaTeX{}
such as the \verb|[h t p]| argument on floats.  A similar change has
been made to the extended \verb|\hhline| command in the
\pkg{colortbl} package.
%
\githubissue{242}



\section{\LaTeX{} requirements on engine primitives}

Since the finalization of \eTeX{} in 1999, a number of additional `utility'
primitives have been added to \pdfTeX{}. Several of these are broadly useful
and have been required by \pkg{expl3} for some time, most notably
\cs{pdfstrcmp}. Over time, a common set of these `post-\eTeX{}' primitives have
been incorporated into \XeTeX{} and (u)p-\TeX{}; they were  already available in
\LuaTeX{}.

A number of these additional primitives are needed to support new or improved
functionality in \LaTeX{}. This is seen for example in the improved UTF-8 handling,
which uses \cs{ifincsname}. The following primitive
functionality (which in \LuaTeX{} may be achieved using Lua code)
will therefore be \emph{required} by the \LaTeX{} kernel and core\\
packages from the start of 2021:
%
\begingroup\setlength\columnsep{0pt}
\begin{multicols}{2}
\fontsize{9.3}{11.3}\selectfont
\begin{itemize}
  \item \cs{expanded}
  \item \cs{ifincsname}
  \item \cs{ifpdfprimitive}
  \item \cs{pdfcreationdate}
  \item \cs{pdfelapsedtime}
  \item \cs{pdffiledump}
  \item \cs{pdffilemoddate}
  \item \cs{pdffilesize}
  \item \cs{pdflastxpos}
  \item \cs{pdflastypos}
  \item \cs{pdfmdfivesum}
  \item \cs{pdfnormaldeviate}
  \item \cs{pdfpageheight}
  \item \cs{pdfpagewidth}
%\end{itemize}
%\end{multicols}
%
% very manual! multicol needs update to detect that it is used
% inside twocolumn!
%
%\begin{multicols}{2}
%\begin{itemize}
  \item \cs{pdfprimitive}
  \item \cs{pdfrandomseed}
  \item \cs{pdfresettimer}
  \item \cs{pdfsavepos}
  \item \cs{pdfsetrandomseed}
  \item \cs{pdfshellescape}
  \item \cs{pdfstrcmp}
  \item \cs{pdfuniformdeviate}
\end{itemize}
\end{multicols}
\endgroup
For ease of reference, these primitives will be referred to as the
`\pdfTeX{} utilities'. With the exception of \cs{expanded}, these have been
present in \pdfTeX{} since the release of version 1.40.0 in 2007; \cs{expanded}
was added for \TeX{}~Live 2019. Similarly, the full set of these utility primitives
has been available in \XeTeX{} from the 2019 \TeX{}~Live release, and has
always been available in \LuaTeX{} (some by Lua emulation).
%
The Japanese p\TeX{} and
up\TeX{} gained all of the above (except \cs{ifincsname}) for \TeX{}~Live
2019 and will both have that primitive also from the 2020 release onward.

At the same time, engines which are fully Unicode-capable must provide
the following three primitives:

\vspace{-\smallskipamount}
\begingroup\setlength\columnsep{0pt}
\begin{multicols}{2}
\fontsize{9.3}{11.3}\selectfont
\begin{itemize}
  \item \cs{Uchar}
  \quad \textbullet{}\hspace{\labelsep}\cs{Ucharcat}
  \item \cs{Umathcode}
\end{itemize}
\end{multicols}
\vspace{-\smallskipamount}
\endgroup
%
Note that it has become standard practice to check for Unicode-aware engines
by using the existence of the \cs{Umathcode} primitive. As such, this is already
a requirement: engines lacking these primitives cannot use Unicode features
of the \LaTeXe{} kernel or \pkg{expl3}. Note also that up\TeX{} can
handle Unicode but it is not classed as a Unicode engine by the
base \LaTeX\ code.

\enlargethispage*{\baselineskip}
\vspace{3.9pt}               % manual adjustment to align the bottom


\begin{thebibliography}{9}

\fontsize{9.3}{11.3}\selectfont

\bibitem{31:devformat} Frank Mittelbach:
  \emph{The
  \LaTeX{} release workflow and the \LaTeX{} dev formats}.
  In: TUGboat, 40\#2, 2019.
  \url{https://latex-project.org/publications/}

\bibitem{31:fntguide} \LaTeX{} Project Team:
  \emph{\LaTeXe{} font selection}.\\
  \url{https://latex-project.org/help/documentation/fntguide.pdf}

\bibitem{31:site-doc}
  \emph{\LaTeX{} documentation on the \LaTeX{} Project Website}.\\
  \url{https://latex-project.org/help/documentation/}

\end{thebibliography}


\end{document}
