% \iffalse meta-comment
%
% Copyright 2023
% 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: ltnews38.tex
%
% This is issue 38 of LaTeX News.

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

\documentclass{ltnews}

%%  Maybe needed only for Chris' inadequate system:
\providecommand\Dash {\unskip \textemdash}

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

\usepackage[T1]{fontenc}

\usepackage{lmodern,url,hologo}

\usepackage{csquotes}
\usepackage{multicol}
\usepackage{color}

\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}
%% But Chris has to mostly disable \href for his TEXPAD app:
%%  \def\href #1{}  % Only For Chris' deficient TeX engine

% 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
     \else
       % githubissue preceding
       \vskip-\smallskipamount
       \vskip-\parskip
     \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


\let\finalpagebreak\pagebreak % for TUB (if they use it)

\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{2023}

\publicationissue{38}

\begin{document}

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

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

\setlength\rightskip{0pt plus 3em}

\medskip

%\section{Introduction}


\section{News from the \enquote{\LaTeX{} Tagged PDF} project}

The multi-year project to automatically tag \LaTeX{} documents in
order to make them accessible~\cite{38:blueprint} is progressing
steadily (at this point in time mainly as experimental
\texttt{latex-lab} code).

Just recently we added support for automatic tagging of tabular
structures including environments from \pkg{tabularx} and
\pkg{longtable}. The code is still in its early stages and lacks
configuration possibilities\Dash these will be added in the future.

\subsection{Approaching an important milestone}

Nevertheless, with this new addition we are more or less able to
automatically tag any document that confines itself to the commands
and environments described in Leslie Lamport's \emph{\LaTeX{}
Manual}~\cite{38:Lamport} by simply adding a single configuration line
at the top.

In addition, a number of extension packages that go beyond Lamport are
already supported, most importantly perhaps \pkg{amsmath} (providing
extended math capabilities) and \pkg{hyperref} (enhancing \LaTeX{}
with interactive hyperlinking features).
\finalpagebreak
Also already supported are
some of the major bibliography support packages such as \pkg{natbib}
and \pkg{biblatex}.

For now activation is done through the line
\begin{verbatim}
\DocumentMetadata
   {testphase={phase-III,math,table}}
\end{verbatim}
The math and the tabular support are not yet incorporated into
\texttt{phase-III} but need their own activation, so that we can
better experiment with additions and code adjustments.

The \texttt{latex-lab} bundle contains various (still untagged)
documentation files about the new code that can be accessed with
\verb|texdoc -l latex-lab|.

\subsection{A GitHub repository dedicated to the project}

We have also started a new GitHub repository mainly intended for
reporting issues, and offering a platform for discussions. For
example, there is one discussion on ways to extend the \LaTeX{}
\env{tabular} syntax to allow describing the logical structure of
tables (e.g., which cells are header cells, etc.).

Having all issues and discussions related to the project in a single
place instead of being spread across multiple repositories such as
\pkg{latex2e}, \pkg{latex3}, \pkg{tagpdf}, \pkg{hyperref},
\pkg{pdfresources}, etc., helps people to find information easily
and report any issue related to the project without needing to know in which
code repository the problematic code resides.

You find this repository at
\url{https://github.com/latex3/tagging-project} and the mentioned
discussion on \env{tabular} syntax at
\url{https://github.com/latex3/tagging-project/discussions/1}.

Your feedback is important and reporting what doesn't yet work is
beneficial to all users, so we hope to see you there and thank you for
any contribution, whether it is an issue or a post on a discussion
thread.


\section{Hooks, sockets and plugs}

In previous releases of \LaTeX{} we introduced the general concept of
hooks (both specific and generic ones). These are places in the
code into which different packages (or the user in the document
preamble) can safely add their own code to extend the functionality of
existing commands and environments without the need to overwrite or
patch them in incompatible ways. An important feature of such hooks is
that the code chunks added by different packages can be ordered by
rules, if necessary,
\finalpagebreak
thereby avoiding problems arising from
differences in package loading order. See \LaTeX{} News issues
32--34~\cite{38:ltnews} for more information.

However, sometimes you need a kind of \enquote{hook} into which only a
single chunk of code is placed at any time.\footnote{While this is in
theory possible to model with the existing hook mechanism, it is
inefficient and cumbersome.}  For example, there is code that
implements footnote placement in relation to bottom floats (above or
below them). But at any time in the document only one such placement
code can be in force. Or consider the extra code needed for making
\LaTeX{} documents accessible (e.g., adding tags to the PDF
output). Such code is either there (perhaps in alternative versions)
or not at all, but it cannot have code from other packages added at
the same point interfering with the algorithm.

For these use cases we now introduce the concept of sockets and plugs.
A socket is a place in the code into which one can put a plug (a
chunk of code with a name) after which the socket is in use; to put in
a different plug, the former one has to be taken out
first.\footnote{Think of electric outlets and plugging something into
them.} A socket may or may not have inputs that can then be used by
the plugs.
%
While this is technically not much different to putting a command in
the code and at some point alter its definition, the advantage is that
this offers a consistent interface, allows for status information,
supports tracing, etc.

You declare a new socket and possibly some plugs for it with
\begin{flushleft}
  \cs{NewSocket}\Arg{socket name}\Arg{\# of inputs} \\
  \cs{NewSocketPlug}\Arg{socket name}\Arg{plug name}\Arg{code}
\end{flushleft}
For example, after the declaration \verb=\NewSocket{foo}{0}= you can
immediately use this socket in your code with \verb=\UseSocket{foo}=.
The \cs{NewSocket} declaration automatically defines a simple plug
with the name \texttt{noop} for the socket and assigns it to the socket
(plugs it in), thus your \cs{UseSocket} sits idle doing
nothing\footnote{Sockets with one input also define an
\texttt{identity} plug and initially assign that to the socket\Dash
this means that their input is simply returned without processing.}
until you assign it a different plug, which is done with
\cs{AssignSocketPlug}. This takes the current plug out and puts the
new one in.
%
All the declarations and commands are also available in the \LaTeX3
programming layer as \cs{socket\_new:nn}, \cs{socket\_new\_plug:nnn},
etc.

With this concept we can, for example, add tagging support for the
\enquote{\LaTeX{} Tagged PDF} project to various packages without
altering their behavior if the tagging code is inactive. Activating
one or the other form of tagging then just means to assign named plugs
to the different sockets.

This is just a brief introduction to the mechanism; for more detailed
documentation see \texttt{texdoc ltsockets-doc}.


\finalpagebreak

\section{Document properties and cross-referencing}

Traditional \LaTeX{} uses \cs{label}\Arg{key} to record the values of two
\enquote{local} properties of the document: the textual
representations of the \emph{current page number} and the
\emph{current \textup{\cs{ref}} value} set by \cs{refstepcounter}
declarations~\cite[p.~209]{38:Lamport}.  (These declarations are
issued, for example, by sectioning commands, by numbered environments
like \env{equation}, and by \cs{item} in an \env{enumerate} or
similar environment.)

These two recorded values can then be accessed and typeset (from
anywhere in the next run of the document) by use of the
(non-expandable) commands \cs{ref} and \cs{pageref} using the
\emph{key} that was specified as the argument to \cs{label} when
recording these values.  This supported basic cross-referencing
(within a document), using these recorded values to provide both
page-related and counter-related information (such as the page xvii or
the subsection number 4.5.2).\footnote{In the Spring 2023 release of
\LaTeX{}, the \cs{label} command was extended to record, in addition,
both a title (such as the text used in a section head) and the
\emph{logical name} used for an associated link target provided these
have been set by packages such as \pkg{nameref} or \pkg{hyperref}.}


Over the years \LaTeX{} packages have appeared that extend
this basic \enquote{label-ref system} in various ways.
%
For example, the \pkg{refcount} package made a small but significant change
to the functions used to access recorded values, by making them expandable.
And the \pkg{smart-ref} package supports the storage of a larger
collection of counter values so that, for example, a cross-reference
can refer to the relevant chapter together with an equation tag.
The \pkg{cleveref} package stores (by means of a second, internal
\enquote{logical label}) extra information such as the name of the counter.
The \pkg{hyperref} package adds the \cs{autoref} command, which
tries to retrieve the name of a counter from the  \emph{logical name}
used for a link target.
The \pkg{tikzmarks} library records information about
 \emph{labelled positions} on the page when using \pkg{tikz}.
Finally, the \pkg{zref} package implements many related ideas, including a general
idea of properties and lists of properties, with methods to record, and
subsequently access, the value of any declared property.


Starting with this release, the \LaTeX{} kernel provides handling of
general document properties as a core functionality with standard
interfaces.
%
This is based on concepts introduced by the \pkg{zref} package but
with some differences in detail, particularly in the implementation.
It supports the declaration of new properties, and the recording of
the values of any list of properties. These values are retrieved
expandably.

To set up a new property that is the current chapter
number, for example, here is the declaration to use.
\begin{verbatim}
  \NewProperty{chapter}{now}{?}{\thechapter}
\end{verbatim}
\par\finalpagebreak\noindent
The second argument means that the property value will be recorded
immediately (\enquote{now}), and not \enquote{during the next
  \cs{shipout}}.  The third argument sets a default to be used when,
for example, an unknown label is supplied.
%
The final argument contains the code that will, as part of the
recording process, be expanded to obtain the value to record for this
property.

Then, to record the value of this new property,
together with others, use this command.
\begin{verbatim}
  \RecordProperties{mylabel}
                   {chapter,page,label}
\end{verbatim}
This records the current values for the properties \texttt{chapter},
\texttt{page}, and \texttt{label}, using \texttt{mylabel} as the
label, or \emph{key}, for the record.

To \emph{reference} (i.e., retrieve) this recorded value for use in a
cross-reference to this chapter, use the \cs{RefProperty} command with
two arguments: the label, or \emph{key}, and the property.
\begin{verbatim}
  \RefProperty{mylabel}{chapter}
\end{verbatim}

The
\LaTeX{} kernel itself contains
declarations for some generally useful properties,
including these:
\begin{description}
\item[\texttt{label}] the textual representation of the \emph{current
\textup{\cs{ref}} value}, see above;

\item[\texttt{page}] the textual representation of the page number for
  the page currently under construction;

\item[\texttt{title}] the title, if set by, e.g.,~\pkg{nameref};

\item[\texttt{target}] the logical name of the associated link target,
  if set by, e.g.,~\pkg{hyperref};

\item[\texttt{pagetarget}] the logical name of the target added by
  \pkg{hyperref} at the origin of each shipped out page;

\item[\texttt{pagenum}] the value of the \LaTeX{} counter
  \texttt{page} in Arabic numerals;

\item[\texttt{abspage}] the absolute page number of the page under
  construction, i.e., one more than the number of pages shipped out so
  far (thus it starts at 1 and is increased by 1 whenever a page is
  shipped out);

\item[\texttt{counter}] the name of the counter that produced the
  \emph{current \textup{\cs{ref}} value}, i.e., the counter that was
  stepped in the most recent \cs{refstepcounter} within the current
  scope;

\item[\texttt{xpos}, \texttt{ypos}] the position on the shipped out
  page as set by the most recent \cs{pdfsavepos}: recording these
  properties should be done as soon as possible after saving the
  position.
\end{description}

Both \LaTeXe{} commands (using camel-case names) and
\LaTeX3 programming layer commands are provided.
%
For a more complete documentation, see \texttt{texdoc ltproperties-doc}.



\finalpagebreak

\section{New or improved commands}

\subsection{Testing for the \LaTeX3 programming layer version: \cs{IfExplAtLeastTF}}

The integration of \pkg{expl3} (the \LaTeX3 programming layer)
into the kernel means that programmers can use all of the features
available without needing to load it explicitly. However, as \pkg{expl3}
is upgraded separately from \LaTeXe{} and is not a separate package, its
version is different from that of \LaTeXe{} and cannot be tested using
\cs{IfPackageAtLeastTF}. To date, low-level methods have therefore
been needed to check for the availability of features in
\pkg{expl3}. We have now added \cs{IfExplAtLeastTF} as a test working
in the same way as \cs{IfPackageAtLeastTF} but focused on the
pre-loaded programming layer.  Programmers can check the date of
\pkg{expl3} they are using in the \texttt{.log}, as it appears both at
the start and end in the format
\begin{verbatim}
  L3 programming layer <YYYY-MM-DD>
\end{verbatim}
just after the line which identifies the format (\texttt{LaTeX2e}, etc.).
%
\githubissue{1004}


\section{Code improvements}

\subsection{Support for tabs in \cs{verb*} and \env{verbatim*}}

\LaTeX{} converts a single tab to a single space, which is then treated like a
\enquote{real} space in typesetting. The same has been true to date inside
\cs{verb}, but was done in a way that meant that they remained as normal spaces
even in \cs{verb*}, etc. We have now adjusted the code so that tabs are
retained within the argument to \cs{verb} and \cs{verb*}, and the
\env{verbatim} and \env{verbatim*} environments, independently from
spaces, and are set up to print in the same way spaces do. This means that they
now generate visible spaces inside \cs{verb*} and \env{verbatim*}, and their
behavior can be adjusted if required to be different from that of spaces.
%
\githubissue{1085}


\subsection{Improved argument checking for box commands}
Previously if an alignment option had an unexpected value, such as
\verb|\makebox[4cm][x]{text}|,
no warning was given but the box content was silently discarded.
This will now produce a warning and act like the default \texttt{c} alignment.
\cs{framebox} and \cs{parbox} have a similar change.
%
\githubissue{1072}


\subsection{Aligning status of tilde with other active characters}

Some time ago we revised the definition of active characters in \pdfTeX{} to
allow the full range of UTF-8 codepoints to be used in for example labels,
file names, etc. However, \verb|~| was not changed at that point as it is active
independent of the engine in use. This has now been corrected: the definition
of \verb|~| is an engine-protected one which gives the string version of the
character if used inside a csname.

\finalpagebreak

\subsection{In the programming layer}

In the programming layer (\pkg{expl3}), we have revised the behavior of the
titlecasing function to enable this to either titlecase only the first word of
the input, or to titlecase every word. This should be transparent at the
document level but will be useful for programmers.

We have also added the ability to define variables and functions inside
\cs{fpeval} (at the \pkg{expl3} level this is \cs{fp\_eval:n}). This allows
programmers to create non-standard functions that can then be used inside
\cs{fpeval}. For example, this could be used to create a new function
\texttt{dinner}:
\begin{verbatim}
\ExplSyntaxOn
\fp_new_variable:n{duck}
\fp_new_function:n{dinner}
\fp_set_function:nnn{dinner}{duck}
                    {duck - 0.25 * duck}
\fp_set_variable:nn{duck}{1}
$\fp_eval:n{duck}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
$
\ExplSyntaxOff
\end{verbatim}

The computation above would then generate
\begin{quote}
\ExplSyntaxOn
\fp_new_variable:n{duck}
\fp_new_function:n{dinner}
\fp_set_function:nnn{dinner}{duck}
                    {duck - 0.25 * duck}
\fp_set_variable:nn{duck}{1}
$\fp_eval:n{duck}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
  \fp_set_variable:nn{duck}{dinner(duck)}
 >\fp_eval:n{dinner(duck)}
$
\ExplSyntaxOff
\end{quote}

Users will be able to access added functions without needing to use the
\pkg{expl3} layer. It is possible that a future release of \LaTeX{} will
add the ability to create and set floating point variables at the
document level: this will be examined based on feedback on the
utility of the programming layer change.


\section{\emph{Removed} kernel commands}

It is very rare that commands are removed from the \LaTeX{} kernel. However, in
this release we have elected to remove \cs{GetDocumentCommandArgSpec},
\cs{GetDocumentEnvironmentArgSpec}, \cs{ShowDocumentCommandArgSpec} and
\cs{ShowDocumentEnvironmentArgSpec} from the kernel. These commands have been
moved back to the \enquote{stub} \pkg{xparse} provided in \pkg{l3packages}. The
reason for this change is that the removed commands exposed implementation
details. They were essentially debugging tools which with hindsight should
not have been made available directly in the kernel.


% \section{Bug fixes}

\finalpagebreak

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

\subsection{\pkg{longtable}: correct p-column definition}

In general the \pkg{longtable} implementation follows the \pkg{array}
usage but the package didn't take over a change made 1992 in
\pkg{array} which adjusted the handling of the strut inserted at the
begin of p-columns. As a consequence there are a number of
inconsistencies in the output of p-columns between \pkg{tabular} and
\pkg{longtable}. This has been corrected; \pkg{longtable} now uses for
the strut the same definition as \pkg{array}.
%
\githubissue{1128}

\medskip
\tubcommand{\newpage}

\begin{thebibliography}{9}

%\fontsize{9.3}{11.3}\selectfont


\bibitem{38:Lamport}
Leslie Lamport.
\newblock \emph{{\LaTeX}: {A} Document Preparation System: User's Guide and Reference
  Manual}.
\newblock \mbox{Addison}-Wesley, Reading, MA, USA, 2nd edition, 1994.
\newblock ISBN 0-201-52983-1.
\newblock Reprinted with corrections in 1996.


\bibitem{38:ltnews} \LaTeX{} Project Team.
  \emph{\LaTeXe{} news 1--38}.\\
  \url{https://latex-project.org/news/latex2e-news/ltnews.pdf}

\bibitem{38: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/}



\end{thebibliography}

\end{document}
