% \iffalse meta-comment % % Copyright 2024-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: ltnews41.tex % % This is issue 41 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} \usepackage[T1]{fontenc} \usepackage{lmodern,url,hologo} \usepackage{csquotes} \usepackage{multicol} \usepackage{color} \providecommand\hook[1]{\texttt{#1}} \providecommand\socket[1]{\texttt{#1}} \providecommand\plug[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\taggingissue[2][]{\ifhmode\unskip\fi \quad\penalty500\strut\nobreak\hfill \mbox{\small\slshape(% \href{https://github.com/latex3/tagging-project/issues/\getfirstgithubissue#2 \relax}% {tagging-project issue#1 #2}% )}% \par\smallskip} \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) \let\finalvspace\vspace % for document layout fixes \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 % Undo ltnews's \verbatim@font with active < and > \makeatletter \def\verbatim@font{\normalsize\ttfamily} \makeatother %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \providecommand\tubcommand[1]{} \tubcommand{\input{tubltmac}} \publicationmonth{June} \publicationyear{2025 --- DRAFT version for upcoming release} \publicationissue{41} \begin{document} \maketitle {\hyphenpenalty=10000 \exhyphenpenalty=10000 \spaceskip=3.33pt \hbadness=10000 \tableofcontents} \setlength\rightskip{0pt plus 3em} \medskip \section{Introduction} \emph{to write} \section{Replacement for the legacy mark mechanism} \LaTeX{}'s legacy mechanism only supported two classes (left and right marks) and setting the left mark (with \cs{markboth}) always altered the state of the right mark as well, i.e., they were far from independent. For generating running headers with \enquote{chapter titles} on the left and \enquote{section titles} on the right they work reasonably well but without much flexibility, e.g., \cs{leftmark} always generated the first \enquote{left}-mark on the page, while \cs{rightmark} always generated the last \enquote{right}-mark. A few releases ago~\cite{41:ltnews35} we therefore introduced a new mark mechanism for \LaTeX{} that supports arbitrary many truly independent mark classes and also offers querying the state at the top of the page, something that wasn't available in \LaTeX{} at all. Up to now, both mechanisms coexisted with completely separate implementations. With this release we have retired the legacy code and instead implement its public interfaces by using the new concepts, i.e., \cs{markboth}, \cs{markright}, \cs{leftmark}, and \cs{rightmark} remain supported but internally use \cs{InsertMark}, etc. Existing document classes or documents using the interfaces will therefore continue to work without any modifications but use a single underlying implementation and new documents can benefit from the additional flexibility, e.g., by displaying not only the last right-mark (\cs{leftmark} or \verb=\LastMark{2e-right}=) but also the first right-mark (\verb=\FirstMark{2e-right}=) or the top right-mark (\verb=\TopMark{2e-right}=), etc. See~\cite{41:ltmarks} for details on the extended functionality. \section{Configurable output routine} For nearly 40 years \LaTeX's output routine (the mechanism to paginate the document and attach footnotes, floats and headers \& footers) was a largely hardwired algorithm with a limited number of configuration possibilities. Packages that attempted to alter one or the other aspect of the process had to overwrite the internals with the usual problems: incompatibilities and out of date code whenever something was changed in \LaTeX{}. To improve this situation and to support the production of accessible PDF documents we started to refactor the output routine and added a number of hooks and sockets, so that packages that want to adjust the output routine can do so safely without the dangers associated with that in the past. For packages, we implemented the following hooks: \begin{description} \item[\hook{build/page/before}, \hook{build/page/after}] These two hooks enable packages to prepend or append code to the page processing in the output routine. They are implemented as mirrored hooks. Technically, they are executed at the start and the end of the internal \LaTeXe{} \cs{@outputpage} command, respectively. A number of packages alter that command to place code in exactly these two places\Dash they can now simply add their code to the hooks instead. \item[\hook{build/page/reset}] Packages that set up special conventions for text in the main galley (such as catcode changes, etc.)\ can use this hook to undo these changes within the output routine, so that they aren't applied to unrelated material, e.g., the text for running header or footers. \item[\hook{build/column/before}, \hook{build/column/after}] These two hooks enable packages to prepend or append code to the column processing in the output routine. They are implemented as mirrored hooks. Technically, they are executed at the start and the end of the internal \LaTeXe{} \cs{@makecol} command, respectively. A number of packages alter \cs{@makecol} to place code in exactly these two places\Dash they can now simply add their code to the hooks instead. \end{description} We also added a number of sockets for configuring the algorithm and to support tagging. One socket that is of interest for class files but also for user in the document preamble is \socket{build/column/outputbox}. It defines how the column text, the column floats (top and bottom) and the footnotes are combined, i.e. their order and spacing. To change the layout all one has to do is to assign a different predefined plug to the socket with \begin{flushleft} \verb= \AssignSocketPlug{build/column/outputbox}= \verb= {=\meta{plug-name}\verb=}= \end{flushleft} The predeclared plugs are the following: \begin{description} \item[\plug{space-footnotes-floats}] After the galley text there is a vertical \cs{vfill} followed by the footnotes, followed by the bottom floats, if any. \item[\plug{footnotes-space-floats}] As before but the \cs{vfill} is between footnotes and floats. \item[\plug{floats-space-footnotes}] Floats are directly after the text, then a space and then footnotes at the bottom. \item[\plug{space-floats-footnotes}] Both floats and footnotes are pushed to the bottom with footnotes coming last.\footnote{There are two more permutations, but neither of them has ever been requested so they aren't set up by default --- doing that in a class would be trivial though.} \item[\plug{floats-footnotes}] All excess space is distributed across the existing glue on the page, e.g., within the text galley, the separation between blocks, etc. The order is text, floats, footnotes. \item[\plug{footnotes-floats}] As the previous one but floats and footnotes are swapped. This is the \LaTeX{} default for newer documents, i.e., this plug is assigned to the socket when \cs{DocumentMetadata} is used. \item[\plug{footnotes-floats-legacy}] As the previous one but \LaTeX{}'s bottom skip bug is not corrected, i.e., in ragged bottom designs where footnotes are supposed to be directly attached to the text, they suddenly appear at the bottom of the page when the page is ended with \cs{newpage} or \cs{clearpage}. While this is clearly a bug, it was the case since the days of \LaTeX~2.09; thus for compatibility we continue to support this behavior. \end{description} There are more configuration possibilities, mainly for class developers; more documentation on those can be found in \cite[\S54 ltoutput.dtx]{41:source2e}. \section{News from Tagged PDF project} The \texttt{testphase} key now takes also the value \texttt{latest}. This will load all modules that we recommend so that it is not necessary to specify individual modules. The list of loaded modules will be adjusted as needed when the project progresses. For reference, it is also written to the log. \emph{to write} \subsection{Setting up math tagging} With the \LuaTeX{} engine there are now various options for accessible math described in full details in latex-lab-math.pdf. To simplify the setup a new key \texttt{math/setup} can be used that accepts a comma list with the values \texttt{mathml-SE} (add MathML structure element), \texttt{mathml-AF} (attach MathML associated file) or \texttt{tex-AF} (attach the TeX source). \subsection{Promoting PDF 2.0} PDF 2.0 is a requirement for accessible PDF containing math as the MathML name spaces isn't supported by earlier PDF versions. \LaTeX{} will therefore set PDF 2.0 as default version if \cs{DocumentMetadata} is used. A different PDF version can be set with the \texttt{pdfversion} key. \subsection{Fixing the spacing after display math} When \LaTeX{} produces an accessible (tagged) PDF it has to add structure data into the PDF to mark (i.e., tag) individual elements. If the \pdfTeX{} engine is used this has to be done with the help of \cs{pdfliteral}s which are whatsit nodes like \cs{special} or \cs{write}. This means that they should be added only in places, where these extra nodes are not affecting the spacing\Dash \TeX{} can't, for example, look backwards past such a whatsit node so consecutive spaces that are normally collapsed into one, suddenly appear both, if such a node separates them. The situation is especially complicated with math displays, because there \TeX{} adds penalties and spaces with low-level procedures, that are not directly accessible from the macro level, and the tagging structures have to appear somewhere in the middle of that to ensure that the formula and the PDF structures are not separated by page break. Because of this it is necessary to use some fairly complex methods (essentially disable \TeX's mechanisms and reprogram them on the macro level) to get the structure data in the right places. Our first attempt in doing that was slightly faulty and resulted in some cases in an extra space (an additional \cs{parskip} space when there shouldn't be one). This has now corrected and the gymnastics to achieve this are rather an \enquote{interesting} study in obfuscated \TeX{} coding. In \LuaTeX{} the situation is much better because there the structures can be added later when the formula processing has already finished. % \taggingissue{762} \section{New or improved commands} \subsection{Socket and plug conditionals} It is sometimes necessary/helpful to know if a particular socket or plug exists (or is assigned to a certain socket) and based on that take different actions. With the current release we added conditionals, such as \cs{IfSocketExistsTF}, to support such scenarios. Corresponding L3 programming layer conditionals are also provided. % \githubissue{1577} \subsection{Accessing the current counter} Counter commands such as \cs{alph}, \cs{stepcounter}, may now have the argument \texttt{*} to denote the current counter (as used by \cs{label}). This is compatible with the package \pkg{enumitem} use of \verb|\alph*| in item labels but is generally available. Not all commands accept \verb|*|, for example \verb|\counterwithin| and \verb|\counterwithout| require counter names as before. % \githubissue{1632} \subsection{Collecting environment bodies verbatim} The mechanisms in \pkg{ltcmd} (\enquote{\pkg{xparse}}) offer a powerful way to specify a range of types of document command and environment syntax. This includes the ability to collect the entire body of an environment, for cases where treating it as a standard argument is useful. It is also possible in \pkg{ltcmd} to define arguments which grab their content verbatim, another specialist argument form. To date, however, it was not possible to combine these two ideas. In this release, a new specifier~\texttt{c} is introduced, which collects the body of an environment in a verbatim-like way. Like the existing \texttt{+v}~specification, each separate line is marked by the special \cs{obeyedline} marker, which as standard issues a normal paragraph. Thus, this new specifier is usable both for typesetting and collecting file contents (the letter~\texttt{c} indicates \enquote{collect code}). Thus, we may use \begin{verbatim} \NewDocumentEnvironment {MyVerbatim}{!O{\ttfamily} c} {\begin{center}#1 #2\end{center}} {} \begin{MyVerbatim}[\ttfamily\itshape] % Some code is shown here $y = mx + c$ \end{MyVerbatim} \end{verbatim} to obtain % We can't actually use ... %\NewDocumentEnvironment{MyVerbatim}{!O{\ttfamily} c} % {\begin{center} #1 #2\end{center}} {} % ... as this would prevent LaTeX News 41 being processed with LaTeX before % 2025-06-01! % So instead ... \begin{center} \makeatletter \def\@verbatim{% \trivlist \centering \let \do \@makeother \dospecials \obeylines \normalfont \ttfamily \itshape \@noligs } \begin{verbatim} % Some code is shown here $y = mx + c$ \end{verbatim} \end{center} \section{Code improvements} \subsection{Refinement of \cs{MakeTitlecase}} We introduced \cs{MakeTitlecase} as a late addition to the June 2022 release, making use of the improved case code in \pkg{expl3}. Unlike upper and lowercasing, making text titlecased is more tricky to get right: this can apply either to the whole text or on a word-by-word basis. A subtle issue was reported against the \pkg{expl3} repository (\url{https://github.com/latex3/latex3/issues/1316}) which links to how we deal with the question of case changing \enquote{words} but shows up if you titlecase text stored in a command. We have looked again at how to implement \cs{MakeTitlecase} to be as predictable as possible, and have made a change in this release. The command no longer tries to lowercase text before applying titlecasing, and gives the correct result for text stored in commands. We have also added an additional key to the optional argument to \cs{MakeTitlecase} which allows the user to decide if this will apply only to the first word (the default) or to all words. \subsection{Tab character as a special} In \LaTeX{} News~38, we described the extension of \cs{verb}, etc., to cover the tab character as equivalent to a space. We have now added tabs to the standard list of characters covered by \cs{dospecials}. This allows them to be used in for example a \texttt{v}~specification document command without additional steps. \subsection{Refinement of \texttt{v}~specification category codes} Work on verbatim argument handling has highlighted that storing all characters as \enquote{other} (category code~12) when using a \texttt{v}~specification in \pkg{ltcmd} was problematic. We have now revised this to capture letters with their original cateogry code. \subsection{Logging text command and symbol declarations} For thirty years the documentation claimed that \cs{DeclareTextSymbol}, \cs{DeclareTextCommand}, and friends log their changes, but in contrast to their math counterparts they never did. This has now finally changed. % \githubissue{1242} \subsection{Improvement of the NFSS font series management} \LaTeX's font selection mechanism (NFSS) supports 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}). With the February~2020 release, this mechanism was extended so that requests to set the weight or the width attributes of the series are combined in a sensible way~\cite{41:ltnews31}: E.g., if you typeset a paragraph in a condensed face using \verb+\fontseries{c}\selectfont+ and then use \cs{textbf} inside the paragraph, a bold condensed face is selected. The combination of the series values is done by consulting a simple lookup table whose entries are defined with \cs{DeclareFontSeriesChangeRule}. Until now, this lookup table was missing some entries, especially with regard to rarely used width values. In such cases, the series values were not combined as expected. This has been fixed (thanks to Maurice Hansen) by adding numerous \cs{DeclareFontSeriesChangeRule} entries so that the full range of weights (from \texttt{ul} to \texttt{ub}) and widths (from \texttt{uc} to \texttt{ux}) is now supported when combining font series values. % \githubissue{1396} \subsection{Supporting the \texttt{ssc} and \texttt{sw} shapes} The \texttt{ssc} shape (spaced small capitals) is supported in \LaTeX{} through the commands \cs{sscshape} and \cs{textssc}. However, until this release there where no font shape change rules defined for this admittely seldom available shape, so that \begin{verbatim} \sscshape\itshape \end{verbatim} changed unconditionally to \texttt{it} (italics) rather than to \texttt{sscit} (spaced small italic capitals). Thanks to Michael Ummels, the missing declarations have now been added so that shape changes in font families that support spaced small capitals work properly. At the same time we took the opportunity to improve the fallbacks for the \texttt{sw} (swash) shapes, which are accessible through the commands \cs{swshape} or \cs{textsw}. If an \texttt{sw} combination is not available, the rules now try to replace \texttt{sw} with \texttt{it} rather than falling back to \texttt{n}. % \githubissue{1581} \subsection{Improving the handling of \cs{label}, \cs{index}, and \cs{glossary}} In standard \LaTeX{}, the three commands \cs{label}, \cs{index}, and \cs{glossary} take exactly one mandatory argument, e.g., \verb=\index{=\meta{entry}\verb=}=. In some extension packages, for example, in \pkg{index} or \pkg{cleveref}, they are augmented to accept an optional argument and in case of \cs{index} also a star form. These extensions conflict with \LaTeX's way of disabling the commands within the table of contents or within the running header, because there, they were redefined to expect just a mandatory argument and then do nothing. We have now changed that behavior so that the redefinitions in these places accept an extended syntax. % \githubissue{311} \section{Bug fixes} \subsection{Fix the use of \texttt{localmathalpabets}} In 2021 we introduced a method to overcome the problem that classic \TeX{} engines (but not the Unicode engines) have only a limited number of math alphabets available that got easily fill up simply by loading math font packages, even if their symbols got used only occasionally. The idea was to avoid allocating all math alphabets globally, but instead allow a number of them (defined by counter \texttt{localmathalpabets}) to vary from one formula to the next. This way different formulas can make use of different alphabets and chances are much higher that the processing a complex the document succeeds. See~\cite{41:ltnews34} for details. Unfortunately, the approach taken failed in some cases of nested formulas with the result that the wrong symbol glyphs were used. This has now been corrected. % \githubissue[s]{1101 1028} \subsection{\pkg{docstrip}:\ Error if \texttt{.ins} file is problematical} If a file to generate had the same name as a preamble declared with \cs{declarepreamble} the preamble definition was overwritten because the macro used to store it was reused for denoting the output stream. The same problem happened with postambles declared with \cs{declarepostamble}. This is now detected and an error message is issued. To circumvent the issue in that case, simply use a different macro name for the preamble or postamble. % \githubissue{1150} \subsection{Prevent \texttt{cmd} hook from defining an undefined command} Using \verb=\AddToHook{cmd/FOO/...}= when the command \cs{FOO} was undefined resulted in the command becoming \cs{relax}. Thus, if used, it no longer raised an \enquote{Undefined control sequence} error but silently did nothing. This behavior has been corrected and if the command \cs{FOO} isn't defined later, e.g., in a package, it now raises an error if it is used in the document. % \githubissue{1591} \subsection{Process global options once per package} In 2022, we introduced key--value (keyval) option processing in the kernel~\cite{41:ltnews35}. This also added the idea that keys could have scope: load-only, preamble-only and general use. However, we overlooked that an option given globally (in the optional argument to \cs{documentclass}) would be repeatedly processed and could therefore lead to spurious warnings. This has now been corrected: global options are seen exactly once per package by the keyval-based option handling system. % \githubissue{1619} \subsection{Make \cs{label}, \cs{index}, and \cs{glossary} truely invisible in running headers} \LaTeX{} has had a bug since its initial implementation, in that it correctly ignored any \cs{label}, \cs{index}, or \cs{glossary} appearing in a mark, but neglected to handle the spaces around the command. As a result one could end up with two spaces in the running header when only one should be present. This was detected as part of working on issue~311 and has now been corrected. % \githubissue{1638} \subsection{Correct the float placement algorithm} When floats are added to the current or next page, \LaTeX{} makes several tests to find an area that can receive the float. One of these tests calculates how much space is already used on the page and how much additional space is needed to place the float in a particular area. This means that it looks not only at the height of the float but also at the values from \cs{intextsep} (for \texttt{h} floats) or \cs{textfloatsep} and \cs{floatsep} (for \texttt{t} and \texttt{b} floats). The resulting space requirement is then stored in an internal variable and compared to the space still available on the page. If the test fails, the algorithm tries the next area. Unfortunately, it was reusing the value in that internal variable as the starting point for the next test without removing the added space for the float separation (\cs{intextsep}, \cs{floatsep}, or \cs{textfloatsep}). Thus the comparison was being made with the wrong value (i.e., too high); therefore the test may have incorrectly concluded that a float doesn't fit, even though in fact it did. This has now been corrected. % \githubissue{1645} \subsection{Correct \cs{CheckEncodingSubset}} In \cite{41:ltnews36} and again in \cite{41:ltnews39} we suggested that font maintainers should place an appropriate \cs{DeclareEncodingSubset} declaration into each \texttt{ts1\meta{family}.fd} file so that it is tied to the font definition and available if a font family is explicitly selected through \cs{fontfamily}\texttt{\{\meta{name}\}} instead of using some font support package. Unfortunately, doing this could result in incorrectly selected glyphs when the font encoding subset setting was evaluated before the \texttt{.fd} file was loaded (because then subset 9 was assumed). This has now been corrected and \cs{CheckEncodingSubset} now first loads the \texttt{.fd} file, if necessary. % \githubissue{1669} \section{Documentation} \subsection{Clarifying space handling of \cs{textcolor}} In contrast to other \cs{text}-commands like \cs{textbf} or \cs{textrm}, the command \cs{textcolor} gobbles spaces at the start of its argument, so \verb*=Hello\textcolor{red}{ World}= will output Hello\textcolor{red}{ World}. There are technical as well as compatibility reasons for this, so the behavior will not change. This has now been clarified in the documentation. % \githubissue{1474} %\section{Changes to packages in the \pkg{amsmath} category} \section{Changes to packages in the \pkg{graphics} category} \subsection{More accessibility keys in \pkg{graphicx}} The \cs{includegraphics} command now accepts \verb|actualtext| and \verb|artifact| keys, which by default do nothing but are used by the tagging code to provide an ActualText string and a boolean flag that the graphic is an artifact. % \githubissue{1552} \section{Changes to packages in the \pkg{tools} category} \subsection{\pkg{multicol}:\ Full support for extended marks} In 2022 we introduced a new mark mechanism for \LaTeX{}~\cite{41:ltnews35}. However, the initial implementation only covered the standard output routine of \LaTeX{}. As a result the extended marks were not available within columns produced with the \pkg{multicol} package (where they would be especially useful). This limitation has finally been lifted and the new mechanism is now fully supported. % \githubissue{1421} \subsection{\pkg{array}:\ Improve preamble setup code for \texttt{p} and friends} While the preamble of a \env{tabular} or \env{array} is being built the arguments to \texttt{p}, \texttt{m}, or \texttt{b} columns got expanded several times. This is normally harmless because that argument contains usually just a dimension. However, in a case like \verb=p{\fpeval{15}pt}= this resulted in an error, because \cs{fpeval} was expanded a few times, but not often enough to result in a single number. This has now been corrected and the argument is not expanded at all to allow for such edge cases as well as the extension available with the \pkg{calc} package, such as \verb=p{\widthof{AAAAAA}}= (the latter was possible before but needed to be taken into account while the correction was implemented). % \githubissue{1585} \subsection[\pkg{varioref}:\ How to make \cs{reftex...}\ empty] {\pkg{varioref}:\ How to make \cs{reftexfaceafter}, etc.\ empty} In the case that one wants to make a command such as \cs{reftextfaceafter} produce nothing, one has to get rid of the space that is automatically placed in front of the command. This can be done by simply defining the command to remove it, e.g., \begin{verbatim} \renewcommand\reftextfaceafter{\unskip} \end{verbatim} The \pkg{varioref} package does not test if such strings are empty, because that would require a lot of tests each time \cs{vref} is used, and it would nearly always find that the text is not empty. However, as shown above, the solution for this uncommon case is simple, and it is now explicitly documented in the package documentation. % \githubissue{1622} %\section{Changes to files in the \pkg{cyrillic} category} \begin{thebibliography}{9}\frenchspacing %\fontsize{9.3}{11.3}\selectfont \bibitem{41: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{41:ltnews} \LaTeX{} Project Team. \emph{\LaTeXe{} news 1--41}. June, 2025. \url{https://latex-project.org/news/latex2e-news/ltnews.pdf} \bibitem{41:ltnews31} \LaTeX{} Project Team. \emph{\LaTeXe{} news 31}. February 2020. \url{https://latex-project.org/news/latex2e-news/ltnews31.pdf} \bibitem{41:ltnews34} \LaTeX{} Project Team. \emph{\LaTeXe{} news 34}. November 2021. \url{https://latex-project.org/news/latex2e-news/ltnews34.pdf} \bibitem{41:ltnews35} \LaTeX{} Project Team. \emph{\LaTeXe{} news 35}. June 2022. \url{https://latex-project.org/news/latex2e-news/ltnews35.pdf} \bibitem{41:ltnews36} \LaTeX{} Project Team. \emph{\LaTeXe{} news 36}. November 2022. \url{https://latex-project.org/news/latex2e-news/ltnews36.pdf} \bibitem{41:ltnews39} \LaTeX{} Project Team. \emph{\LaTeXe{} news 39}. June 2024. \url{https://latex-project.org/news/latex2e-news/ltnews39.pdf} \bibitem{41:ltnews40} \LaTeX{} Project Team. \emph{\LaTeXe{} news 40}. November 2024. \url{https://latex-project.org/news/latex2e-news/ltnews40.pdf} \bibitem{41:ltmarks} Frank Mittelbach, \LaTeX{} Project Team. \emph{The \texttt{ltmarks.dtx} code}. June 2025. \url{https://latex-project.org/help/documentation/ltmarks-doc.pdf} \bibitem{41:source2e} \LaTeX{} Project Team. \emph{The \LaTeXe{} Sources}. June 2025. \url{https://latex-project.org/help/documentation/source2e.pdf} \end{thebibliography} \end{document}