diff options
Diffstat (limited to 'macros/latex/base/ltnews38.tex')
-rw-r--r-- | macros/latex/base/ltnews38.tex | 602 |
1 files changed, 602 insertions, 0 deletions
diff --git a/macros/latex/base/ltnews38.tex b/macros/latex/base/ltnews38.tex new file mode 100644 index 0000000000..04ffe1a0ed --- /dev/null +++ b/macros/latex/base/ltnews38.tex @@ -0,0 +1,602 @@ +% \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 --- DRAFT version for upcoming release} +\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,tabular}} +\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} |