summaryrefslogtreecommitdiff
path: root/macros/latex-dev/base/ltnews34.tex
blob: badd25b97cb95b5bb92761c6bd8fb17f9893f0d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
% \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}

%%  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}

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

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


This release of \LaTeX{} does not contain any major new modules, but
is focused around consolidation and improvements of the functionality
introduced in previous releases.  In addition, various smaller
enhancements and bug fixes have been added to the kernel and the core
packages.


\section{Hook business}

Since 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 this new functionality. One result 
of this increased activity has been a
number of queries which show that some of the documentation was not
precise enough and that some clarifications were needed; these 
deficiencies have now been addressed in the documentation. 
%
The increased usage has also revealed 
a small number of errors that we thought
should be corrected now, while the adoption rate is still relatively
small; the following problems have therefore been addressed in this release.


\subsection{Provide \cs{ActivateGenericHook}}

The hook management system offers a number of generic hooks, i.e.,
hooks whose names contain a variable component such as the name
of an environment. Predeclaring such hooks is not feasible, 
so these hooks use a different mechanism: they are
implicitly available, springing into life the moment a package, or 
the document preamble, adds any code to one by using \cs{AddToHook}.  
%
The kernel offers such hooks for environments
 (\texttt{env/...}) and commands (\texttt{cmd/...}), and also for files, 
 packages and classes (\texttt{file/...},
\texttt{include/...}, \texttt{package/...}, \texttt{class/...}).

It is also possible to offer such generic hooks in 
packages if, for example, hooks are needed that depend on the 
current language and therefore need the
language name as part of the hook name (but you probably 
don't know beforehand all the necessary names).

If you want to offer such generic hooks, you can now 
do this by using
\cs{UseHook} or \cs{UseOneTimeHook} in your (package) code, but
\emph{without declaring the hook} with \cs{NewHook}. However, without 
further work, a call to \cs{UseHook} with an undeclared hook name 
will do 
nothing; so, as an additional setup step, it is necessary to explicitly
activate the generic hook by using \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.}

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 \hook{babel/\meta{language}/afterextras} 
that enable a user
to add language specific declarations to these \enquote{extras}.  One can then write
\begin{verbatim}
   \ActivateGenericHook
          {babel/ngerman/afterextras}
   \AddToHook{babel/ngerman/afterextras}
          {\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{Standardized names for the generic hooks}

The initial set of generic hooks provided by the kernel had
two patterns of 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 the variable part was
supposed to go; and it also made the code more complicated and slower.

The file-related hooks have therefore been renamed 
so that the variable part of
the name is in the middle, as with all other hooks.  
The changes are listed here:
\smallskip
\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}
\smallskip
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; 
but 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{Some file hooks made one-time}

Classes, packages and included files can only be loaded once in a
\LaTeX{} document. For this reason, the hooks that are specific to loading such
files have been made one-time hooks. Beside being more efficient, this
supports the following important use case
{\hfuzz=1pt \begin{verbatim}
  \AddToHook{package/varioref/after}
   {... apply when the package gets loaded, 
    or apply now (if it is already loaded) ...}
\end{verbatim}
}
\noindent
without the need to first test whether the package is already loaded.
%
\githubissue{623}


\subsection{Clearing extra hook code for the next invocation}

There are a few use cases where it is 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 now provided.
%
\githubissue{565}



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

Some hooks are meant to be used only once in a document, and any
further attempt to add code to one of these will 
cause 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 cases (such as the \hook{begindocument} hook) but it causes
trouble if the one-time hook was intended, for example, as an
initialization hook that is used just once (when a command is first
called) but is then ignored in further calls.

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


\subsection{\cs{RemoveFromHook} with a missing code label}

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

The implementation has now been changed, so that 
\cs{RemoveFromHook} removes only code
labels that already exist in a hook: it will display a 
warning if there is no such code label.

Note that, whereas when working with a single package
you should use \cs{RemoveFromHook} to remove a code label, 
when working with more than one package, the
\texttt{voids} relation should preferably be used.  
%
This is best because this relation is non-destructive 
(meaning that it can be reverted later by using another relation), 
and it is also truly independent of package loading order. 
%
\githubissue{625}

\subsection{Patching commands with parameter tokens}

In the last release, \LaTeX's hook mechanism was extended to add
support for hooking into commands using generic \hook{cmd} hooks
(see~\cite{34:ltnews33}).  That version of the extension had a bug: the
patching of some commands that contained a parameter token
(normally \verb|#|) in
their definition would fail with a low-level \TeX{} error.  This has now
been fixed so that patching now works for those commands as well.
%
\githubissue{697}



\section{New or improved commands}

\subsection{\cs{NewCommandCopy} and \cs{ShowCommand} extended}

Since the 2020-10-01 release (see~\cite{34:ltnews32}), \LaTeX{} 
has provided \cs{NewCommandCopy} to copy robust commands, 
and \cs{ShowCommand} to show their definitions on the terminal.  
%
In that same release, the \pkg{xparse} package was integrated 
into the kernel (as \pkg{ltcmd}) to offer \cs{NewDocumentCommand}, etc.  
%
However, the extended support for \cs{NewCommandCopy} and
\cs{ShowCommand} was not implemented in \pkg{ltcmd}.  The present
\LaTeX{} release implements this support, so now commands
defined with \cs{NewDocumentCommand} and friends can also be copied, and their definitions
can be easily shown on the terminal without the need for ``\cs{csname} gymnastics''.
%
\githubissue{569}


\subsection{Undo math alphabet allocations if necessary}

\TeX{}, or more exactly the 8-bit versions of \TeX, such as \pdfTeX{},
have a hard limit of 16 on the number of different math font groups
(\cs{fam} or \cs{mathgroup}) that can be used in a single formula. For each symbol font
declared (by a package or in the preamble) an extra math group is allocated, 
and the same happens for each math alphabet, (such as \cs{mathbf})
once it
gets used anywhere in the document. Up to now, these math
alphabet allocations were permanent, even if they were 
used only once;
the result was that in complex documents you
could easily run out of available math font groups. 
The only remedy for this was to
define your own math version, which is a complicated and cumbersome process.

This situation has now been improved by the introduction of a new counter
\texttt{localmathalphabets}: this counter governs how many of 
the math group slots are assigned locally when a new math 
alphabet (and a new math group) is needed.  
%
Once the current formula is finished, every such further (local) 
allocation is undone, giving you a fighting chance of being 
able to use different new math alphabets in the next formula. 

The default value of \texttt{localmathalphabets} is 2,
but if you need more local alphabets because of the complexity of your
document, you can set this to a higher value such as 4 or 5. 
Setting it even higher is possible, but this would seldom 
be useful because many group slots will be taken up by 
symbol fonts and such slots are always permanently allocated,
whether used or not.
%
\githubissue{676}


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

In 2021 all \TeX{} engines were enhanced so that \cs{tracinglostchars} 
supported the value \texttt{3} to turn missing
characters into errors and not just warnings. 
%
This engine change made us
realize that \LaTeX{} should set a better default value for this parameter
(previously, the warning was written only to the transcript file).
Using the now available value of \texttt{3} as the default
would be ideal, but for
compatibility reasons we have only increased it to \texttt{2} in the kernel.
%
However, we recommend setting \cs{tracinglostchars}\texttt{=3}, 
in either a package or the
preamble of your documents: this is because having missing glyphs 
in the output is definitely an error and should therefore be 
flagged as such (to ensure that it gets proper attention).
Further reasons, related especially to Unicode engines, for making 
this recommended change are explained later in this newsletter 
(in connection with the misuse of text accents in math mode).



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

\LaTeX{} offers these three commands: \cs{PackageError} to signal errors that 
stop the processing; \cs{PackageWarning} to generate a warning message on the
terminal but continue with the processing; and \cs{PackageInfo}
to provide some information that is only written to the \texttt{.log}
file but not sent to the terminal.
%
What has not existed up to now is a way to provide 
information on the terminal that identifies itself as coming from
a specific package but which does not claim to be a warning. 
(Packages that wanted to write to the terminal used \cs{PackageWarning}
even though the information was not in fact a warning.)  

We have therefore now added \cs{PackageNote} (and the closely 
related \cs{PackageNoteNoLine}); these identify
themselves as \enquote{informational}, but they still go to the terminal and
not only to the  \texttt{.log} file.
%
Similar commands exist for classes and so there too we have 
new commands: \cs{ClassNote} and \cs{ClassNoteNoLine}.
%
\githubissue{613}


\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 in
understanding 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 the contents of a float register, 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{New argument for \cs{counterwithin}/\texttt{without}}

The commands \cs{counterwithout} and \cs{counterwithin} each now has
an additional optional argument, similar to that of the command 
 \cs{numberwithin} from \pkg{amsmath}, 
for which these are now the preferred replacements.
This optional argument 
specifies the format of the counter, such as \cs{roman};
the default value is \cs{arabic}.


\subsection{Tests for package and class loading}

To test whether a package has been 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 whether 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 one or more options in 
the \meta{option-list} were
not specified when loading the package, or if the package 
has never been loaded.
%
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, with \texttt{Package} replaced by
\texttt{Class} in the name, are provided.
%
\githubissue{621}


\subsection{Better handling for a misuse of \cs{include}}

The command \cs{include} has by now been used quite often, but 
erroneously, to input a variety of files in the preamble of the document  
(before \verb|\begin{document}|).
%
Therefore \LaTeX\ now warns about such bad use of \cs{include}.
As a recovery action it will nevertheless input the specified file 
if it exists (this is as before).  Note, however, that this is now done 
without any adjustments to the \texttt{.aux} file settings and 
without running the \cs{include} file hooks (only the generic 
file hooks from \cs{InputIfFileExists} are run).
% 
\githubissue{645}



\section{Code improvements}


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


\subsection{Additional Extended Latin characters predefined}
More characters, such as \'k (U+1E131), are now pre-defined and
do not need a \verb|\DeclareUnicodeCharacter| declaration.
%
\githubissue{593}


\subsection{Check \cs{endfoo} in \cs{NewDocumentEnvironment}}

The \cs{newenvironment} command has always checked that neither \cs{foo} nor
\cs{endfoo} exists before creating a \texttt{foo} environment. 
In contrast (for historical reasons) the more recently introduced
command \cs{NewDocumentEnvironment} 
checked only for \cs{foo}.
%
The behavior of \cs{NewDocumentEnvironment} now aligns with that 
of \cs{newenvironment}, except that it gives distinct errors
concerning the existence of \cs{foo} and \cs{endfoo}.


\subsection{Improve the error 
     message \texttt{\textup{\cs{begin} ended by \textellipsis}}}

In the past it was possible to get an error message along the lines
of ``\verb=\begin{foo} ended by \end{foo}=''. This could happen when the
environment name was partly hidden inside a macro. It happened because 
the test was comparing the literal strings, whereas in the error message 
these got fully expanded. 
%
This has now been changed to show a more sensible error
message.
%
\githubissue{587}


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

A \cs{contentsline} command in the \texttt{.toc} file is always followed by
four arguments, the last one being empty except when using the
\pkg{hyperref} package. The \cs{contentsline} command itself only used the
first three arguments and it relied on the fourth being empty (and thus
doing no harm). 
%
But this assumption is not always correct: e.g., if
you at first decide to load \pkg{hyperref} but then later you remove 
this loading from the preamble.
%
So now all four arguments are picked up, with the 
fourth being saved away so that it can be used by \pkg{hyperref}.
%
\githubissue{633}


\subsection{Allow dropping a math list in \LuaTeX\ callback}

The \LuaTeX\ callbacks \texttt{pre\_mlist\_to\_hlist\_filter}
and \texttt{post\_mlist\_to\_hlist\_filter} no longer create an error when 
the callback handler indicates removal of the entire math list.
%
\githubissue{644}

\subsection{Extended label handling in package code}

Since 2020, as noted in \LaTeX\ News 32~\cite{34:ltnews32}, \LaTeX\ has
recorded the name of the counter associated with the current label in
the internal command \cs{@currentcounter}.  This facility (originally
from the \pkg{zref} package of Heiko Oberdiek) can be used to generate
prefixes such as \enquote{Figure} before the reference text,
as long as the counter is not counting different objects in a single sequence (e.g., lemmas and theorems).
%
In the most 
common cases the current label is set by \cs{refstepcounter}, which
automatically stores the counter name; but some constructs (alignments
and footnotes) may need to store the current label directly and so for 
these it is useful to update additionally \cs{@currentcounter} so as to 
store this counter name.

In this release both the footnote command in the kernel and 
also some of the environments in the \pkg{amsmath} package 
have been updated in this way.  
%
We encourage the maintainers of any class or
package files that define \cs{@currentlabel} to also set
\cs{@currentcounter} at the same point.
%
\githubissue{300, 687}


\subsection{Better message if text accent used in math mode}

Using text accents like \verb|\^| in math does not work 
(and \TeX{} explicitly provides math accents such as \cs{hat} 
for accessing such symbols in math mode). Therefore \LaTeX\ issued a 
warning when such a wrongly placed accent was encountered 
and this was often followed by a strange, and apparently 
unrelated, low-level error.  
%
This has now been changed so that the message from this 
error is at least about accents, which we hope is less puzzling. 

Discussion of such warnings or errors reminds us to reinforce 
here a recommendation from earlier in this newsletter, as part 
of the item on the value of \cs{tracinglostchars}.
%
Using \TeX\ implementations from 2020 onwards, any warning that 
concerns missing characters can be
converted to an error by setting \cs{tracinglostchars} to 3; we therefore 
now recommend changing this setting to 3, especially for 
Unicode engines where such missing characters are common (because 
no font supports the full Unicode range).
%
\githubissue{643}


\section{Bug fixes}

\subsection[Replicate argument processors for all
     embellishments in command declarations]
           {Replicate argument processors for all embellishments in command declarations}

There was a bug in \pkg{ltcmd} (formerly \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 and thus leading to unpredictable
behavior.  This bug has been fixed by applying the same argument
processors to all the embellishments in a set, so that 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 changing of \cs{ij} and \cs{IJ}}


The ligatures \enquote{\ij} and \enquote{\IJ}, as used in Dutch,
are available (for most \TeX{} fonts) only 
when the commands \cs{ij} or
\cs{IJ} are used, or when you enter them as the Unicode 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 using the \texttt{OT1} encoding).
%
\githubissue{658}



\subsection{Legacy font series default 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:
with this declaration you can alter the default for individual meta
font families by, for example, changing the bold setting only 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, this alters the setting
for all meta families in one go. This alteration cannot be done when the
\cs{renewcommand} happens and it 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} in 
the meantime was overwritten; thus, these two approaches didn't
work well in combination.
There was a problem because older font packages
use the legacy method while newer ones use
\cs{DeclareFontSeriesDefault}. 

This has now been resolved by changing
\cs{DeclareFontSeriesDefault} to do any necessary resetting prior to
setting the new defaults.
%
\githubissue{663}


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



\section{Changes to packages in the \pkg{amsmath} category}
\subsection{Improved compatibility with \pkg{hyperref}}

This change in \pkg{amsmath} fixes a spacing problem caused by the
method used in \pkg{hyperref} to change the \env{equation} environment.
%
For simplicity, an explicit, low-level (hence possibly temporary) 
patch has been added to \pkg{amsmath}: this consists 
of an extra, empty (hence invisible)
\cs{mathopen} atom (with no mathematical meaning) at the start of the 
environment's mathematical content.
%
\githubissue{652}



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


\subsection{\pkg{graphicx}:\ New key, for alt text}

A new key, \texttt{alt}, has been added to \cs{includegraphics} to
support the addition of descriptive text that is important for
accessibility.  This key is unused by default; it can be deployed by
extension packages and it will provide useful support for other future
possibilities.
%
\githubissue{651}


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

\subsection{\pkg{array}: No \cs{mathsurround} around a \env{tabular}}

A \env{tabular} environment is typeset (internally) as an \env{array}
environment with special settings, and it therefore uses (hidden) math mode. 
Since it is not in fact a math formula, 
no extra space from \cs{mathsuround} should be added 
(the spacing around the \env{tabular} should not get changed). 
%
Note that this bug has been present ``forever'', which shows that  \cs{mathsurround} 
is never used, or at least its use is never noticed.  
At any rate, this bug has now finally been fixed.
%
\githubissue{614}


\subsection{\pkg{longtable}: Improvements after a section heading}
The \env{longtable} environment now sets the \cs{@nobreakfalse} flag 
to correct the typesetting when a table immediately follows a heading. 
Previously the spacing and indentation changes that are required 
immediately after a section heading were incorrectly triggered 
within the next paragraph (if any)
following the table.  
%
A similar test for
\cs{if@noskipsec} has been added, so that a table is correctly placed after 
a run-in heading rather than appearing before that heading.
%
\githubissue[s]{131 and 173}


\subsection{\pkg{multicol}: Better column break control}

From version 1.9 onwards \cs{columnbreak} accepts an optional
argument (like \cs{pagebreak}) in which you can specify the
desirability of breaking the column after the current line: supported values are
\texttt{0} to \texttt{4}, with higher numbers indicating increased desirability.
This version also adds \cs{newcolumn},
which forces a break but runs the column short (comparable to
\cs{newpage} for pages). 
%
\githubissue{682}


\subsection{\pkg{varioref}: Improved handling of missing labels}

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, this data structure changes to having five
arguments; this could cause low-level errors in some cases. 
The code has therefore now been changed to avoid these errors.
%
\sxissue{603948}


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

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

\end{thebibliography}



\end{document}