% \iffalse meta-comment
%
% Copyright 2019-2021
% 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: ltnews34.tex
%
% This is issue 34 of LaTeX News.

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

\documentclass{ltnews}

%%CCC  Temporary definitions:
\providecommand\Dash {\unskip ---}



%% NOTE:  Chris' preferred hyphens!
%%\showhyphens{parameters}
\hyphenation{because parameters parameter}

\usepackage[T1]{fontenc}

\usepackage{lmodern,url,hologo}

\usepackage{csquotes}
\usepackage{multicol}

\providecommand\hook[1]{\texttt{#1}}

\providecommand\meta[1]{$\langle$\textrm{\itshape#1}$\rangle$}
\providecommand\option[1]{\texttt{#1}}
\providecommand\env[1]{\texttt{#1}}
\providecommand\Arg[1]{\texttt\{\meta{#1}\texttt\}}


\providecommand\eTeX{\hologo{eTeX}}
\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\getfirstgithubissue#2 \relax}%
          	    {gnats issue #1/#2}%
           )}%
     \par}

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

\vbadness=1400  % accept slightly empty columns


\makeatletter
% maybe not the greatest design but normally we wouldn't have subsubsections
\renewcommand{\subsubsection}{%
   \@startsection      {subsubsection}{2}{0pt}{1.5ex \@plus 1ex \@minus .2ex}%
      {-1em}{\@subheadingfont\colonize}%
}
\providecommand\colonize[1]{#1:}
\makeatother

\let\finalvspace\vspace          % for document layout fixes

% Undo ltnews's \verbatim@font with active < and >
\makeatletter
\def\verbatim@font{%
  \normalsize\ttfamily}
\makeatletter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\providecommand\tubcommand[1]{}
\tubcommand{\input{tubltmac}}

\publicationmonth{November}
\publicationyear{2021 --- Draft Version (with many unfinished blocks)} 

\publicationissue{34}

\begin{document}

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

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

\setlength\rightskip{0pt plus 3em}


\medskip


\section{Introduction}

\emph{write}

\section{???}

\emph{write}




\section{Hook business}

After the introduction of the hook management system in the 2020
release of \LaTeX{}~\cite{34:ltnews32} package developers have started
to make more and more use of the new functionality. This resulted in a
number of queries showing that some of the documentation was not
precise enough and that one or the other clarification was
needed. This has now been addressed in the documentation. The extended
usage also showed a small number of deficiencies that we thought
should be corrected now while the adoption rate is still relatively
small. These are addressed in this release and documented below.


\subsection{Providing \cs{ActivateGenericHook}}

The hook management system offers a number of generic hooks, i.e.,
hooks whose names contain a variable component, for example the name
of an environment. Predeclaring such hooks as not really feasible
which is why these hooks use a different mechanism: they are
implicitly available end spring into life the moment a package or the
user in the preamble adds code to them using \cs{AddToHook}.  The
kernel offers such hooks for environments \texttt{env/...}, commands
\texttt{cmd/...}, and files, package or classes, \texttt{file/...},
\texttt{include/...}, \texttt{package/...}, and \texttt{class/...}.

It is possible to offer generic hooks in packages, e.g., if you have
hooks that depend on the current language and therefore need the
language name as part of the hook name and you don't know all possible
names beforehand.

If you want to offer your generic hooks you do this by using
\cs{UseHook} or \cs{UseOneTimeHook} in your (package) code, but
\emph{without declaring the hook} with \cs{NewHook}. Without any
further work a call to \cs{UseHook} with an undeclared hook name does
nothing. So as an additional setup step, it is necessary to explicitly
activate the generic hook with \cs{ActivateGenericHook}.\footnote{Note
  that in the previous release we offered \cs{ProvideHook} as a means
  to achieve this effect, but the name was badly chosen so we decided
  to deprecate it and now offer \cs{ActivateGenericHook} instead
  because that is what it is meant for.}

Assuming
that you don't know all the different hook names up front it will
remain the task of the users of your package to activate the hook
themselves before adding code to it. For example, Babel offers hooks
such as \texttt{babel/afterextras/\meta{language}} enabling the user
to add language specific declarations there. They can then write
\begin{verbatim}
\ActivateGenericHook
          {babel/afterextras/ngerman}
\AddToHook{babel/afterextras/ngerman}
          {\color{blue}}
\end{verbatim}
after which all German words would be colored blue in the text.

Note that a generic hook produced in this way is always a normal hook.




\subsection{Clear extra hook code for next invocation}

There are a few use cases where it would be helpful if one can cancel
an earlier use of \cs{AddToHookNext}, for example, when a page is
discarded with \cs{DiscardShipoutBox} because only some pages of the
document are printed. For such situations the new command
\cs{ClearHookNext} is provided.
%
\githubissue{565}



\subsection{Clean up after \cs{UseOneTimeHook}}

Some hooks are meant to be used only once in a document, and any
further attempt to add code to them causes the code to be executed
immediately instead of being added to the hook.  The initial implementation of
this concept was very simple and didn't anticipate that packages may try to
execute a one-time hook several times resulting in the hook code
being executed repeatedly.  Thus, the implementation was fine for
simple usages (e.g., the \hook{begindocument} hook), but caused
trouble if the one-time hook was intended, for example, as an
initialization hook that is used once when a command is first
called, but then ignored in further calls.

This deficiency has been addressed, and now a one-time hook will only be executed once
and the hook code is removed after usage to free up the memory.
%
\githubissue{565}



\subsection{Class, package, and include hook improvements}

Classes, packages and include files can only be loaded once in a
\LaTeX{} document. For that reasons hooks that are specific to such
files have been made one-time hooks. Beside being more efficient this
supports the following important use case
\begin{verbatim}
\AddToHook{package/varioref/after}
  { ... apply my customizations if the package
      gets loaded (or was loaded already) ... }
\end{verbatim}
without the need to first test if the package was already loaded
before.
%
\githubissue{623}


\subsection{Standardizing generic hook names}

The initial set of generic hooks provided by the \LaTeXe{} kernel had
two patterns of hook names:  ones like
\verb|env/|\meta{name}\verb|/after|, with the variable (\meta{name})
part in the middle position, and ones like
\verb|file/after/|\meta{name}, with the variable part in the third
position.  The coexistence of these two types caused confusion, because
the user had to remember in which position was the variable part
supposed to go, and made the code more complicated and slower.

The file-related hooks have been renamed so that the variable part of
their is in the middle, as with other hooks.  The changes were:
\begin{center}
  \small\ttfamily
  \begin{tabular}{l@{\;$\rightarrow$\;}l}
    \hline
    \multicolumn{1}{l}{Old name} & \rmfamily New name \\
    \hline
    file/before/\meta{name}    & file/\meta{name}/before \\
    file/after/\meta{name}     & file/\meta{name}/after \\
    package/before/\meta{name} & package/\meta{name}/before \\
    package/after/\meta{name}  & package/\meta{name}/after \\
    class/before/\meta{name}   & class/\meta{name}/before \\
    class/after/\meta{name}    & class/\meta{name}/after \\
    include/before/\meta{name} & include/\meta{name}/before \\
    include/end/\meta{name}    & include/\meta{name}/end \\
    include/after/\meta{name}  & include/\meta{name}/after \\
    \hline
  \end{tabular}
\end{center}

Since this is a breaking change, the old names will still work for a
while, so that users and package authors have enough time to adjust, and
a warning will be issued when the old names are used.  Eventually the
deprecated names will be turned into errors and then removed completely.
%
\githubissue{648}



\subsection{Changed how \cs{RemoveFromHook} treats code that isn't in the hook}

In the first version of \cs{RemoveFromHook}, in case the code label
being removed didn't exist in the hook, a ``removal order'' would be
queued, and the next time something tried to add that label to the hook,
the \cs{AddToHook} would be cancelled by the removal order, and no code
would be added that once.  This was so that in principle package loading
order wouldn't matter.  However this implementation didn't work quite as
intended, because while two \cs{AddToHook} to a given label would be
removed by a single \cs{RemoveFromHook}, one \cs{RemoveFromHook} could
not cancel two \cs{AddToHook} to that label, and this asymmetry caused
confusion and was a recipe for further problems.

The implementation was changed and now \cs{RemoveFromHook} only removes
labels that already exist in a hook, and will display a warning if they
don't.  For usage across packages, for removing code in a hook, the
\texttt{voids} relation should be used instead:  this relation is
non-destructive (meaning it can be later reverted with another one), and
it is truly independent of package loading order, so it should be
preferred.
%
\githubissue{625}




\subsection{???}

%
\githubissue{000}




\section{New or improved commands}


\subsection{Added \cs{PackageNote} and \cs{ClassNote}}

\LaTeX{} offers \cs{PackageError} to signal errors that stop
processing, \cs{PackageWarning} that generates a warning message on the
terminal, but continues with the processing and also \cs{PackageInfo}
to provide some information that is only written to the \texttt{.log}
file. What hasn't existed up to now is a way to provide some
information on the terminal that is identifying itself as coming from
a specific package but which isn't claiming to be a warning. Thus,
packages that wanted to write to the terminal used \cs{PackageWarning}
even though the information wasn't really warning the user.  For this
we now have \cs{PackageNote} and \cs{PackageNoteNoLine}, that identify
themselves as \enquote{informational}, but still go to the terminal and
not only to the transcript.

Similar commands exist for classes and there we have added the missing
\cs{ClassNote} and \cs{ClassNoteNoLine} as well.
%
\githubissue{613}


\subsection{New implementation for \cs{counterwithin}}

New implementation for \cs{counterwithout} and \cs{counterwithin} with
an additional optional arg so it becomes a drop-in replacement for
amsmath \cs{numberwithin}.

\emph{write appropriate description}



\subsection{New default for \cs{tracinglostchars}}

In 2021 the \TeX{} engines got enhanced so that \cs{tracinglostchars}
is now also supporting the value \texttt{3}, turning missing
characters into errors and not just warnings. This change made us
realize that \LaTeX{} should use a better default for this parameter
(so far the warning was only written to the transcript file).
Using the now available \texttt{3} would really be the best, but for
compatibility reasons we only set it to \texttt{2} in the kernel.
However, we recommend adding \cs{tracinglostchars}\texttt{=3} to the
preamble of documents, because missing glyphs in the output are an
error and should therefore be properly looked at.






\subsection{Provide tests for package and class loading}

To test if a package was loaded you can now use \cs{IfPackageLoadedTF}
\Arg{package} \Arg{true} \Arg{false} and based on the result execute
different code. It is also possible to check if the package was loaded
with certain options. This is done with
\cs{IfPackageLoadedWithOptionsTF}. It takes four arguments:
\Arg{package}\Arg{option-list}\Arg{true}\Arg{false}. It uses the
\meta{false} code if at least one option in the \meta{option-list} has
not been used during loading or if the package hasn't been loaded at
all.
%
Both commands can be used anywhere in the document, i.e., they are not
restricted to the preamble.\footnote{This is now also true for the
  corresponding internal commands, e.g., \cs{@ifpackageloaded}, that
  had this restriction in the past.}

For classes similar commands (\texttt{Package} replaced by
\texttt{Class} in the name) are provided.
%
\githubissue{621}









\subsection{New \cs{ShowFloat} command}

The package \pkg{fltrace} offers a (fairly low-level but very
detailed) way to trace \LaTeX's float mechanism. This can help to
understand why a certain float is placed into a certain region or why
it shows up unexpectedly on a later page.  \LaTeX{} stores floats in
registers named \cs{bx@A}, \cs{bx@B}, etc., and these names show up in
the tracing information.
%
To display their contents you can now say
\verb=\ShowFloat{=\textit{identifier}\verb=}= where
\textit{identifier} is the uppercase letter (or letters) after
\texttt{bx@} in the register name shown in the tracing.  If additional
registers have been allocated with \cs{extrafloats}, the
\textit{identifier} can also be a number. The command is generally
available, whether or not you have loaded \pkg{fltrace}, because it is
also useful when interpreting the tracing output of the
\pkg{fewerfloatpages} package.


\subsection{Add \pkg{ltcmd} support for \cs{NewCommandCopy} and \cs{ShowCommand}}

Since the 2020-10-01 release (see~\cite{34:ltnews32}), \LaTeX{} provides
\cs{NewCommandCopy} to copy robust commands, and \cs{ShowCommand} to
show their definition in the terminal.  In the same release, the
\pkg{xparse} package was integrated in the kernel (now called
\pkg{ltcmd}).  However, the extended support for \cs{NewCommandCopy} and
\cs{ShowCommand} was not implemented in \pkg{ltcmd}.  The present
\LaTeX{} release ships with that support implemented, so now commands
defined with \pkg{xparse}/\pkg{ltcmd} can be copied and their definition
can be easily shown in the terminal without \cs{csname} gymnastics.
%
\githubissue{569}





\subsection{???}

%
\githubissue{000}




\section{Code improvements}

\subsection{Detect ``\cs{endfoo}'' when using \cs{NewDocumentEnvironment}}

The \cs{newenvironment} command has always checked that both \cs{foo} and
\cs{endfoo} do not exist before creating a \texttt{foo} environment. In
contrast, \cs{NewDocumentEnvironment} has only to date checked for \cs{foo};
this reflects the fact that historically the code was designed around the
target of an entirely new format. The behavior of \cs{NewDocumentEnvironment}
now aligns with \cs{newenvironment}, except that it gives separate errors
for the existence of \cs{foo} and \cs{endfoo}.

\subsection{Improve ``\cs{begin} ended by'' error message}

In the past it was possible to get an error message stating something
like \verb=\begin{foo} ended by \end{foo}=. This could happen when the
environment name was partly hidden inside a macro, because the test was
comparing the literal strings while the error message expanded the
strings fully. This has now been changed to show a more sensible error
message in this instance.
%
\githubissue{587}



\subsection{Additional Extended Latin characters predefined}
Some additional characters such as \'k (U+1E131) are now pre-defined and
will work without needing \verb|\DeclareUnicodeCharacter| declarations.
%
\githubissue{593}


\subsection{Use OpenType version of Latin Modern Upright Italic}
When Latin Modern is used with the TU encoding under \XeTeX\ or \LuaTeX\
and fontshape \texttt{ui} is requested, \LaTeX\ now uses the OpenType
version instead of substituting the (T1 encoded) Type 1 version.


\subsection{Pick up all arguments to \cs{contentsline}}

The \cs{contentsline} commands in the TOC file are always followed by
four arguments, the last one being empty by default and only used by
\pkg{hyperref}. The \cs{contentsline} command itself only used the
first three arguments and relied on the fourth being empty (and thus
doing no harm). But this assumption is not always correct, e.g., if
you use \pkg{hyperref} and then remove it from the preamble.

So now we pick up all four arguments and save the last one away, so
that it can be used by \pkg{hyperref}.
%
\githubissue{633}


\subsection{Fix dropping math lists in \LuaTeX\ callbacks}

The \LuaTeX\ callbacks \texttt{pre\_mlist\_to\_hlist\_filter}
and \texttt{post\_mlist\_to\_hlist\_filter} no longer create an error if
the callback handler indicates to remove the entire math block.
%
\githubissue{644}




\subsection{???}

%
\githubissue{000}




\section{Bug fixes}

\subsection{Replicate argument processors for all embellishments}

There was a bug in \pkg{ltcmd} (former \pkg{xparse}) that caused
commands to misbehave if they were defined with embellishments and
argument processors.  In that case, only one (possibly void) argument
processor would be added to the full set of embellishment arguments,
resulting in too few processors in some cases, leading to unpredictable
behavior.  This bug has been fixed by applying the same argument
processors to all the embellishments in a set, so a declaration like:
\begin{verbatim}
\NewDocumentCommand\foo{>{\TrimSpaces}e{_^}}
  {(#1)[#2]}
\foo^{ a }_{ b }
\end{verbatim}
will now correctly apply \cs{TrimSpaces} to both arguments.
%
\githubissue{639}



\subsection{Correct case changes for \cs{ij} and \cs{IJ}}


The ligatures \enquote{\ij} and \enquote{\IJ}, as used in Dutch,
are only available in most \TeX{} fonts, if the commands \cs{ij} or
\cs{IJ} are used or when you enter them as UTF-8 characters U+0133 or
U+0132.
%
However, when using \texttt{OT1} or \texttt{T1} encoded fonts in
\pdfTeX, the upper or lower casing with \cs{MakeUppercase} and
\cs{MakeLowercase} would always fail regardless of the input method.
This has now been corrected. At the same time we improved the
hyphenation results for words containing this ligature (when
typesetting is done in \texttt{OT1} encoding).
%
\githubissue{658}



\subsection{Improve handling of legacy \cs{bfdefault} changes}

In the past, changes to the font series defaults were made by directly
altering \cs{bfdefault} or \cs{mddefault}.  Since 2020 there is now
\cs{DeclareFontSeriesDefault} that allows more granular control,
i.e., with that declaration you can alter the default for individual meta
font families, for example, by only altering the bold settings for the
sans serif family without changing it for \cs{rmfamily} or \cs{ttfamily}.
See~\cite{34:ltnews31} for more details.

For backwards compatibility, changing \cs{bfdefault} with
\cs{renewcommand} remained possible. If used, it alters the setting
for all meta families in one go. This cannot be done when the
\cs{renewcommand} happens and was therefore delayed until the next
time \cs{bfseries} or \cs{mdseries} was executed.

However, the problem with that
approach was that any call to \cs{DeclareFontSeriesDefault} that
happened in the mean time was overwritten---the two approaches didn't
work well side by side.  This is a problem because older font packages
use the legacy method while newer ones use
\cs{DeclareFontSeriesDefault}. This has now been corrected by changing
\cs{DeclareFontSeriesDefault} to do any necessary resetting prior to
setting new defaults.
%
\githubissue{663}


\subsection{Use of \# in \cs{textbf} and similar commands}
Previously you could not use the macro parameter character \# in inline functions
in the argument of \cs{texbf} and similar text font commands.
An internal definition is now guarded with \cs{unexpanded}
so that \# does not generate an error.
%
\githubissue{665}


\subsection{???}

%
\githubissue{000}






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


\subsection{Key for alt text}
A new key \texttt{alt} has been added to \verb|\includegraphics| allowing specification
of an alternative text for accessibility.
This is unused by default but may be used by extension packages and possible future use.
%
\githubissue{651}



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

\subsection{\pkg{varioref}: Improve missing label handling}

If an undefined label is referenced, \pkg{varioref} makes a default
definition so that later processing finds the right structure (two
brace groups inside \cs{r@}\meta{label}) However, if \pkg{nameref} or
\pkg{hyperref} is loaded, the data structure changes to five
arguments, resulting in low-evel errors in some cases. The code has
been changed to avoid these errors.
%
\sxissue{603948}


\subsection{\pkg{array}: Cancel  \cs{mathsurround} for \env{tabular}}

A \env{tabular} environment is internally typeset as an \env{array}
environment with special settings and therefore in math mode. This
math group should not get any \cs{mathsuround} added as it isn't a
real formula because otherwise the spacing around the \env{tabular}
changes. This bug has been there forever (which means not many people
use \cs{mathsurround} or noticed the difference). Anyhow, this now got
fixed.
%
\githubissue{614}

\subsection{\pkg{longtable}: Improve behavior after a section heading}
The \env{longtable} environment now sets the \cs{@nobreakfalse} flag so that
spacing and indentation changes after a section heading are not triggered by
a paragraph which follows a table which starts a section. Similarly a test for
\cs{if@noskipsec} added so that a table follows a run-in heading
rather than appearing before it.
%
\githubissue[s]{131 and 173}

\subsection{???}

%
\githubissue{000}


\section{Changes to packages in the \pkg{amsmath} category}
\subsection{Improve compability with hyperref}

When \pkg{hyperref} is used, incrementing a counter creates anchors and this can affect spacing.
For a long time \pkg{hyperref} patched the \env{equation} environment to 
avoid some of the side effects. This patch has now been moved directly into \pkg{amsmath}.
Additionally,
a \cs{mathopen} has been added to avoid that the anchor affects a following unary symbol.
%
\githubissue{652}

\subsection{???}

%
\githubissue{000}




\medskip

\begin{thebibliography}{9}

\fontsize{9.3}{11.3}\selectfont

\bibitem{34:blueprint} Frank Mittelbach and Chris Rowley:
  \emph{\LaTeX{} Tagged PDF \Dash A blueprint for a large project}.\\
  \url{https://latex-project.org/publications/indexbyyear/2020/}

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

\bibitem{34:ltnews31} \LaTeX{} Project Team:
  \emph{\LaTeXe{} news 31}.\\
  \url{https://latex-project.org/news/latex2e-news/ltnews31.pdf}

\bibitem{34:ltnews32} \LaTeX{} Project Team:
  \emph{\LaTeXe{} news 32}.\\
  \url{https://latex-project.org/news/latex2e-news/ltnews32.pdf}

\end{thebibliography}



\end{document}
