1 % \iffalse meta-comment
4 % The LaTeX3 Project and any individual authors listed elsewhere
7 % This file is part of the LaTeX base system.
8 % -------------------------------------------
10 % It may be distributed and/or modified under the
11 % conditions of the LaTeX Project Public License, either version 1.3c
12 % of this license or (at your option) any later version.
13 % The latest version of this license is in
14 % http://www.latex-project.org/lppl.txt
15 % and version 1.3c or later is part of all distributions of LaTeX
16 % version 2005/12/01 or later.
18 % This file has the LPPL maintenance status "maintained".
20 % The list of all files belonging to the LaTeX base distribution is
21 % given in the file `manifest.txt'. See also `legal.txt' for additional
24 % The list of derived (unpacked) files belonging to the distribution
25 % and covered by LPPL is defined by the unpacking scripts (with
26 % extension .ins) which are part of the distribution.
29 % Filename: latexchanges.tex
31 \NeedsTeXFormat{LaTeX2e
}
33 \documentclass{ltxguide
}
35 \usepackage[T1]{fontenc}
37 \title{Changes to the
\LaTeXe{} format
}
39 \author{\copyright~Copyright
2015--
2017,
\LaTeX3 Project Team.\\
44 % a few commands from doc
45 \newcommand\Lpack[1]{\mbox{\textsf{#1}}}
46 \newcommand\DescribeMacro[1]{\texttt{\string#1}}
48 \makeatletter % -- provide command introduced in new release
49 % so this typesets with an old format
51 \DeclareTextCommandDefault\textcommabelow[1]
52 {\hmode@bgroup
\ooalign{\null#1\crcr\hidewidth\raise-
.31ex
53 \hbox{\check@mathfonts
\fontsize\ssf@size
\z@
54 \math@fontsfalse
\selectfont,
}\hidewidth}\egroup}
65 \section{Introduction
}
67 This
document describes changes that have been made to the
\LaTeX\ format since the
2014/
05/
01 \LaTeX\ release.
68 %This document details all the changes to documented functions since the 2014/05/01 \LaTeX\ release.
70 As announced in
\LaTeX\ News~
22, the
2015 \LaTeX{} release adopts a new
71 policy. Improvements and bug fixes will be made to the format sources,
72 with the
\Lpack{latexrelease
} package being available to revert
73 changes to use definitions from an earlier format.
75 \section{Changes introduced in
2017-
04-
15}
76 Optionally,
\LaTeX{} format and package dates may use ISO style dates with
77 \texttt{-
} rather than
\texttt{/
}.
79 For Unicode
\TeX{}s, made further adjustments to the composite accent
80 code in
\texttt{tuenc.def
}, and further updates tracking changes in
83 Previously defining an encoding-specific composite with an undeclared
84 accent (or an accent declared later) gave no error, but did nothing useful.
85 \LaTeX\ will now detect this and give the accent comamnd a default definition
86 as an error, allowing the declared composite to work as intended.
88 The definition of
\verb|\-| is adjusted to match the comments in
89 PR/
3855 to accomodate non standard settings of
\verb|
\hyphenchar|.
91 In parboxes and similar settings,
\verb|
\lineskiplimit| is now
92 reset (to the existing default value,
\verb|
\normallineskiplimit|).
93 See http://tex.stackexchange.com
\slash a
\slash 359934.
95 The code for verb|
\newpage| has been adjusted to add a test on the value of
96 \verb|
\prevdepth| so that the depth of the last line is preserved in
99 \section{Changes introduced in
2017/
01/
01 patch~
3}
100 Emergency patch to correct a typo in a change introduced in patch~
2.
102 \section{Changes introduced in
2017/
01/
01 patch~
2}
103 More adjustments for TU encoding, allowing for characters missing in
104 common system fonts. Additional
\texttt{fd
} files
105 for Latin Modern variants are included in the documented sources.
107 \section{Changes introduced in
2017/
01/
01 patch~
1}
108 Fixes to TU encoding definitions for Lua
\TeX\ and Xe
\TeX.
110 \section{Changes introduced in
2017/
01/
01}
112 A new test is added during format making that e
\TeX\ extensions are
113 available. As noted in
\LaTeX\ news, e
\TeX\ will now be required to
116 Further updates tracking changes for Lua
\TeX~
1.0.
118 The definition of
\verb|
\showhyphens| is changed in formats built
119 with Xe
\TeX, as the original version, inherited from plain
\TeX\ does
120 not work with Xe-
\TeX.
122 Changes to the default encoding used by Lua
\TeX\ and Xe
\TeX\ formats to
123 be TU (Unicode) rather than OT1 (
7 bit legacy
\TeX\ encoding).
125 \section{Changes introduced in
2016/
03/
31 patch~
3}
126 Fixes to
\verb|
\newinsert| and
\verb|
\extrafloats|.
128 \section{Changes introduced in
2016/
03/
31 patch~
2}
129 Adjustments to
\verb|
\c{g
}| in OT1 encoding.
131 \section{Changes introduced in
2016/
03/
31 patch~
1}
132 Adjust the upper limit for Character Class allocation in Xe-
\TeX\ to
133 4096 to match a change in Xe-
\TeX.
135 \section{Changes introduced in
2016/
03/
31}
136 Modify picture mode as suggested in latex/
4452 to avoid leaders of
139 Modify the checks in
\verb|
\DeclareMathSymbol| and related commands
140 so that they do not give errors with new Lua
\TeX\ releases.
142 \section{Changes introduced in
2016/
02/
01}
143 Adjustments to Lua
\TeX\ support to match changes to the Lua
\TeX\ engine,
144 and to the character class allocation in Xe
\TeX.
146 Load Unicode data from new generic
\texttt{unicode-data
} distribution.
148 \section{Changes introduced in
2015/
10/
01 patch~
2}
150 This release fixes the behaviour of the allocation mechanism if the switch
151 from the standard to extended pool takes place within a group.
153 \section{Changes introduced in
2015/
10/
01 patch~
1}
154 This release allows
\Lpack{latexrelease
} to revert the
156 changes, in particular fixing an incorrect date in part of the mechanism and
157 adding a method to disable callback management entirely.
159 \section{Changes introduced in
\LaTeX\
2015/
10/
01}
161 \subsection{LuaTeX allocation
}
162 Almost all changes at this release relate to incorporating allocation macros for luatex into the format
163 as done for etex and xetex in
2015/
01/
01. For details see |ltluatex.dtx| or
\LaTeX\ News
22.
164 |ltluatex.dtx| now forms a new chapter (N) in the documented sources, |source2e.tex|.
167 \subsection{Increased number of floats
}
168 The default float list has been increased from
18 to
52 registers if
170 The list can be increased further using |
\extrafloats| however this
171 default allocation uses classic registers below
256 so the registers are
172 also available for |
\newinsert| as described below.
174 \subsection{Improved
\texttt{\textbackslash newinsert
}}
175 The command |
\newinsert| has been extended to take registers from the lists of free float
176 registers once the classic register allocation is used up. This should make it highly unlikely
177 to get ``no room'' errors on register allocation assuming the format is used with
178 an e-
\TeX\ based
\TeX\ engine.
180 \subsection{New accent,
\texttt{\textbackslash textcommabelow
} (pr/
4414)
}
181 The command |
\textcommabelow| has been added. This is mainly intended for Romanian letters
182 \textcommabelow{S
}\,
\textcommabelow{s
}\,
\textcommabelow{T
}\,
\textcommabelow{t
}.
184 \subsection{Unicode
8}
185 The file |unicode-letters.def| used to initialise character data in
186 Unicode
\TeX\ variants has been regenerated from data files updated
189 \section{Changes introduced in
2015/
01/
01 patch~
2}
190 There were no changes to the format at this release, but the sources were fixed to fix bug latex/
4434
191 affecting bottom float positioning if the
\Lpack{latexrelease
} package was used.
193 \section{Changes introduced in
2015/
01/
01 patch~
1}
194 This release re-introduces the ``Patch Level'' scheme for identifying
195 releases between main ``dated'' releases. Early
\LaTeXe\ releases
196 included a mechanism whereby updates could be provided by a
198 file
}. This was mainly intended to allow updates to be made without
199 downloading the full sources again, which was an important
200 consideration with download speeds and costs at the time.
202 The new mechanism incorporates any changes directly into the sources,
203 but having the patch level identified in the banner allows the
204 \LaTeX\ release to be identified, even if (as in this case) most of the
205 changes do not affect the format but affect other base packages such
206 as
\Lpack{latexrelease
} and
\Lpack{inputenc}. The patch level is shown
207 in the banner at the start of the job, but does not affect the date
208 handling of the |
\IncludeInRelease| mechanism.
210 Apart from re-arranging the version banner, the only change in the
211 format is that |
\newtoks| was accidentally defined twice, using the
212 old and new allocation scheme described in Section
\ref{e@alloc
}.
213 The old definition is now only in the
\Lpack{latexrelease
} package,
214 for use when emulating old formats.
220 [Changes between
\LaTeX\ releases
2014/
05/
01 and
2015/
01/
01]
221 {Changes between
\LaTeX\ releases
2014/
05/
01 and
2015/
01/
01\footnote{Much of this text
222 is taken from
\Lpack{fixltx2e
} package which was formerly used to make such changes available separately.
}}
224 \subsection{Support for
\LaTeX\ version changes
}
225 \DescribeMacro{\includeInRelease}\arg{date
}\oarg{date
}\arg{label
}\arg{message
}\arg{code
}
229 The |
\includeInRelease| command has been added to support backward and
230 forward compatibility for the
\LaTeX\ format. It supports the
231 declaration of conditional code that can be loaded based on options
232 given to the
\Lpack{latexrelease
} package. Its use is described in
233 detail in the
\Lpack{latexrelease
} package documentation.
235 \subsection{New Allocation Code
\label{e@alloc
}}
236 Previously |
\newcount| and related commands were based on classic TeX
237 and only allocated in the range
0--
255. This was extended (in
238 different ways) for e-
\TeX\ in the |etex| package and in the
239 |xelatex.ini| and |lualatex.ini| files used in those formats. Related
240 to this the number of boxes allocated to store floats was
241 limited. This was extended to a certain extent in the |morefloats|
242 package (by Don Hosek and H.-Martin Muench) but the new allocation
243 incorporates float allocation directly and supports much larger float
244 lists using the extended registers.
246 The new code allocates registers in the full extended range (
247 $
2^
{15}-
1$ for etex and xelatex, $
2^
{16}-
1$ for lualatex.
248 In addition a new command |
\extrafloats| is provided.
250 \DescribeMacro{\extrafloats}\arg{number
}
253 This allocates additional registers for the
\LaTeX\ float system to
254 hold figures and tables etc. Similar functionality has been
255 available via the
\Lpack{morefloats
} package but this is a different
256 implementation using extended e-
\TeX\ registers when available so
257 allows many more registers to be reserved for floats as they are
258 allocated from a pool of
32 or
64 thousand rather than
256 registers,
259 depending on the engine in use.
261 \DescribeMacro{\newmarks}\arg{command
}
264 e-
\TeX\ only, previously available via the
\Lpack{etex
} package.
265 Allocates commands to use the extended e-
\TeX\ mark mechanism.
267 \DescribeMacro{\newXeTeXintercharclass}\arg{command
}
270 Xe-
\TeX\ only, previously in the Xe-
\LaTeX\ format, but added via
271 |xelatex.ini| not part of the core release.
272 Allocates commands to use the Xe-
\TeX\ character class mechanism.
275 \subsection{e-
\TeX\ tracing if available
}
276 |
\loggingall| (Usually used via |
\tracingall|) is extended to enable
277 additional e-
\TeX\ tracing if e-
\TeX\ is available. (|
\tracingall|
278 extension has been available as part of the |etex| package previously).
280 Also based on code from the |etex| package, a command |
\tracingnone|
281 is added to reverse the effects of |
\tracingall| and turn off all primitive
282 \TeX\ tracing. A new command |
\hideoutput| has been added which resets the
283 tracing parameters set by |
\showoutput|.
288 \subsection{\texttt{\textbackslash textsubscript
} not defined in
294 >>Synopsis:
\textsubscript not defined in latex.ltx
295 >>Arrival-Date: Tue Jan
14 23:
01:
00 CET
2003
296 >>Originator: Ionel Mugurel Ciobica
298 I use
\textsubscript much more often than
\textsuperscript, and
299 \textsubscript it is not defined in latex.ltx. Could you please
300 consider including the definition of
\textsubscript in the latex.ltx
301 for the next versions of LaTeX. Thank you.
304 \subsection{\texttt{\textbackslash @
} discards spaces when moving
310 >>Synopsis: \@ discards spaces when moving
311 >>Arrival-Date: Sat May
22 09:
01:
06 1999
312 >>Originator: Donald Arseneau
314 The \@ command expands to
\spacefactor\@m in auxiliary files,
315 which then ignores following spaces when it is reprocessed.
318 \subsection{1-col fig can come before earlier
2-col fig
324 >>Synopsis:
2-col:
1-col fig can come before earlier
2-col fig
325 >>Arrival-Date: Wed Dec
18 15:
41:
07 1996
326 >>Originator: bil kleb
328 as documented in Lamport's book, p.
198, concerning figure
329 placement, "a figure will not be printed before an earlier
330 figure, and a table will not be printed before an earlier
331 table." however, there is a footnote stating, "However,
332 in two-column page style, a single-column figure can come before
333 an earlier double-column figure, and vice versa."
335 This twocolumn behavior is undesirable---at least by me and
336 most professional organizations i publish in. ed snyzter developed
337 a hack fix for
2.09 several years ago which links the two
338 counters, but i have not run across a similar "fix" for
2e...
341 Originally fixed in package
\Lpack{fix2col
} which was merged into
342 this package. Documentation and code from this package have been
343 merged into this file.
345 \subsubsection{Notes on the Implementation Strategy
}
347 The standard output routine maintains two lists of floats that have
348 been `deferred' for later consideration. One list for single column
349 floats, and one for double column floats (which are always
350 immediately put onto their deferred list). This mechanism means
351 that
\LaTeX\ `knows' which type of float is contained in each box
352 by the list that it is processing, but having two lists means
353 that there is no mechanism for preserving the order between the
356 The solution to this problem consists of two small changes to
359 Firstly, abandon the `double column float list' |\@dbldeferlist|
360 and change every command where it is used so that instead the
361 same |\@deferlist| is used as for single column floats.
362 That one change ensures that double and single column floats
363 stay in the same sequence, but as
\LaTeX\ no longer `knows'
364 whether a float is double or single column, it will happily
365 insert a double float into a single column, overprinting the
366 other column, or the margin.
368 The second change is to provide an alternative mechanism for
369 recording the two column floats.
\LaTeX\ already has a compact
370 mechanism for recording float information, an integer count register
371 assigned to each float records information about the `type' of float
372 `figure', `table' and the position information `htp' etc.
374 The type information is stored in the `high' bits, one bit position
375 (above `
32') allocated to each float type. The `low' bits store
376 information about the allowed positions, one bit each allocated for
377 |h t b p|. In the
\LaTeX2.09 system, the bit corresponding to `
16'
378 formed a `boundary' between these two sets of information, and it
379 was never actually used by the system. Ed Sznyter's
380 \Lpack{fixfloats
} package not unreasonably used this position to
381 store the double column information, setting the bit for double
382 column floats. Then at each point in the output routine at which a
383 float is committed to a certain region, an additional check must be
384 made to check that the float is (or is not) double column. If it
385 spans the wrong number of columns it is deferred rather than being
388 Unfortunately the bit `
16' is not available in
\LaTeXe. It is used
389 to encode the extra float position possibility `|!|' that was added
390 in that system. It would be possible to use position `
32' and to
391 move the flags for `table', `figure',
\ldots\ up one position, to
392 start at
64, but this would mean that in principle one less float
393 type would be supported, and more importantly is likely to break
394 any other packages that assume anything about the output routine
395 internals. So here I instead use another mechanism for flagging
396 double column floats: By default all floats have depth
0pt.
397 This package arranges that double column ones have depth
1sp.
398 This information may then be used in the same manner as in
399 the
\Lpack{fixfloats
} package, to defer any floats that are not of
400 the correct column spanning type.
404 \subsection{Infinite glue found (pr/
4023 and pr/
2346)
}
406 The fix for pr/
2346 did not work as intended when used in conjunction
407 with |
\enlargethispage| as the latter introduced an infinite negative
408 glue at the bottom of the page. That in turn make a |
\vsplit|
409 operation to get at the column marks invalid.
411 \subsection{Wrong header for twocolumn (pr/
2613)
}
416 >>Synopsis: wrong headline for twocolumn
417 >>Arrival-Date: Mon Sep
22 16:
41:
09 1997
418 >>Originator: Daniel Reischert
420 When setting the
document in two columns
421 the headline shows the top mark of the second column,
422 but it should show the top mark of the first column.
425 Originally fixed in package
\Lpack{fix2col
} which was merged into
426 this package. Documentation and code from this package have been
427 merged into this file.
429 \subsubsection{Notes on the Implementation Strategy
}
431 The standard
\LaTeX\ twocolumn system works internally by making
432 each column a separate `page' that is passed independently to
\TeX's
433 page breaker. (Unlike say the
\Lpack{multicol
} package, where all
434 columns are gathered together and then split into columns later,
435 using |
\vsplit|.) This means that the primitive
\TeX\ marks that are
436 normally used for header information, are globally reset after the
437 first column. By default
\LaTeX\ does nothing about this.
438 A good solution is provided by Piet van Oostrum (building on earlier
439 work of Joe Pallas) in his
\Lpack{fixmarks
} package.
441 After the first column box has been collected the mark information
442 for that box is saved, so that any |
\firstmark| can be
443 `artificially' used to set the page-level marks after the second
444 column has been collected. (The second column |
\firstmark| is not
445 normally required.) Unfortunately
\TeX\ does not provide a direct
446 way of knowing if any marks are in the page, |
\firstmark| always has a
447 value from previous pages, even if there is no mark in this page.
448 The solution is to make a copy of the box and then |
\vsplit| it
449 so that any marks show up as |
\splitfirstmark|.
451 The use of |
\vsplit| does mean that the output routine will globally
452 change the value of |
\splitfirstmark| and
453 |
\splitbotmark|. The
\Lpack{fixmarks
} package goes to some trouble
454 to save and restore these values so that the output routine does
455 \emph{not
} change the values. This part of
\Lpack{fixmarks
} is not
456 copied here as it is quite costly (having to be run on every page) and
457 there is no reason why anyone writing code using |
\vsplit| should
458 allow the output routine to be triggered before the split marks have
463 \subsection{\texttt{\textbackslash setlength
} produces error if
464 used with registers like
\texttt{\textbackslash dimen0
} (pr/
3066)
}
469 >>Synopsis:
\setlength{\dimen0}{10pt
}
470 >>Arrival-Date: Tue Jul
6 15:
01:
06 1999
471 >>Originator: Heiko Oberdiek
473 The current implementation of
\setlength causes an error,
474 because the length specification isn't terminated properly.
476 \def\setlength#1#2{#1=
#2\relax}
479 \subsection{Fewer fragile commands
}
484 >>Synopsis: Argument of \@sect has an extra
}.
485 >>Arrival-Date: Sat Oct
22 23:
11:
01 +
0200 2005
486 >>Originator: Susanne Wunsch
488 Use of a
\raisebox in
\section{} produces the error message
489 mentioned in the subject.
491 PR latex/
1738 described a similar problem, which has been solved
492 10 years ago. Protecting the
\raisebox with
\protect solved my
493 problem as well, but wouldn't it make sense to have a similar fix
496 It is particularly confusing, that an unprotected
\raisebox in a
497 \section*-environment works fine, while in a
\section-environment
501 While not technically a bug, in this day and age there are few
502 reasons why commands taking optional arguments should not be robust.
504 \subsubsection{Notes on the implementation strategy
}
506 Rather than changing the kernel macros to be robust, we have decided
507 to add the macro
\DescribeMacro{\MakeRobust}|
\MakeRobust| in
508 \Lpack{fixltx2e
} so that users can easily turn fragile macros into
509 robust ones. A macro |
\foo| is made robust by doing the simple
510 |
\MakeRobust{\foo}|.
\Lpack{fixltx2e
} makes the following kernel
511 macros robust: |\(|, |\)|, |\
[|, |\
]|,
512 |
\makebox|, |
\savebox|,
513 |
\framebox|, |
\parbox|, |
\rule| and |
\raisebox|.
515 \ldots TODO
\ldots fleqn vesion of |\
[\
]|
517 \subsection{\texttt{\textbackslash addpenalty
} ruins flush-bottom (pr/
3073)
}
522 >>Synopsis:
\addpenalty ruins flush-bottom
523 >>Arrival-Date: Sat Jul
17 05:
11:
05 1999
524 >>Originator: Donald Arseneau
526 Just to keep in mind for further development eh?
527 A page break at an
\addpenalty after
\vspace does *not*
528 give a flush-bottom page. (The intent of
\addpenalty is
529 apparently just to preserve the flush bottom by putting
530 the breakpoint `above' the skip.)
533 \subsection{Within counters only reset next level down (pr4393)
}
535 This is actually implicitly documented behavior in the
\LaTeX{}
536 Manual that states that |
\stepcounter| resets all counters marked
537 ``within''. However it means that if, for example, theorems are
538 numbered within sections and you start a new chapter in a book, the
539 section counter is reset to zero but the theorem counter is not
540 until the first section appears. Thus a theorem directly within the
541 chapter body (without a new section) would show an incremented
542 number relative to the last theorem of the previous chapter.
545 For this reason we are now resetting all levels of within in one go
546 even if that means that some of these resets may happen several times
550 \subsection{Check the optional arguments of floats
}
552 By default LaTeX silently ignores unknown letters in the optional
553 arguments of floats. |
\begin{figure
}[tB
]| the |B| is ignored so it
554 acts like |
\begin{figure
}[t
]| However |
\begin{figure
}[B
]| does
555 \emph{not
} act like |
\begin{figure
}[]| as the check for an empty
556 argument, or unsupplied argument, is earlier. |
[]| causes the
557 default float placement to be used, but |
[B
]| means that
\emph{no
}
558 float area is allowed and so the float will not be placed until the
559 next |
\clearpage| or end of
document, no warning is given.
561 This package adds a check on each letter, and if it not one of
562 |!tbhp| then an error is given and the code acts as if |p| had been
563 used, so that the float may be placed somewhere.
565 \subsection{\texttt{\textbackslash DeclareMathSizes
} only take pts.
571 >>Synopsis:
\DeclareMathSizes only take pts.
572 >>Arrival-Date: Fri Jun
11 16:
21:
00 CEST
2004
573 >>Originator: Morten Hoegholm
575 The last three arguments of \@DeclareMathSizes cannot take a dimension
576 as argument, making it inconsistent with the rest of the font changing
577 commands and itself, as the second argument can take a dimension
581 \subsection{No hyphenation in first word after float environment (pr/
3498)
}
586 >>Synopsis: No hyphenation in first word after float environment
587 >>Arrival-Date: Thu Jan
30 13:
21:
00 CET
2003
588 >>Originator: Harald Harders
590 If a float environment (figure, table) is written within a paragraph,
591 the first word after the environment is not hyphenated.
594 \subsection{\texttt{\textbackslash fnsymbol
} should use text symbols
600 >>Synopsis:
\fnsymbol should use text symbols if possible
601 >>Arrival-Date: Fri Jan
04 20:
41:
00 CET
2002
602 >>Originator: Walter Schmidt
604 The
\fnsymbol command can be used in both text and math
605 mode. The symbols produced are, however, always taken from
606 the math fonts. As a result, they may not match the text
607 fonts, even if the symbols are actually available, for
608 instance from the TS1 encoding. Since
\fnsymbol is
609 primarily used for footnotes in text, this should be fixed,
617 \subsection{\texttt{\textbackslash footnotemark
}[x
] crashes with fixltx2e.sty
623 >>Synopsis: feature
\footnotemark[x
] crashes with fixltx2e.sty
624 >>Arrival-Date: Fri Dec
17 10:
11:
00 +
0100 2004
625 >>Originator: Stefan Pofahl
627 If I use /fnsymbol together with fixltx2e.sty I can not use
628 optional parameter
[num
]
629 \footnotemark[1] is not showing the mark number
1 but
630 the mark
\value{footnote
}.
632 This bug was related to pr/
3400, where |\@fnsymbol| was made robust.
634 \subsubsection{Notes on the implementation strategy
}
636 Pr/
3400 made |\@fnsymbol| decide between text-mode and math-mode,
637 which requires a certain level of robustness somewhere as the
638 decision between text and math must be made at typesetting time and
639 not when inside |
\protected@edef| or similar commands. One way of
640 dealing with this is to make sure the value seen by |\@fnsymbol| is
641 a fully expanded number, which could be handled by code such as
643 \def\fnsymbol#1{\expandafter\@fnsymbol
644 \expandafter{\the\csname c@
#1\endcsname}}
646 This would be a good solution if everybody used the high level
647 commands only by writing code like |
\fnsymbol{footnote
}|. Unfortunately
648 many classes (including the standard classes) and packages use the
649 internal forms directly as in |\@fnsymbol
\c@footnote| so the easy
650 solution of changing |
\fnsymbol| would break code that had worked for
653 Therefore the implementation here makes |\@fnsymbol| itself a
654 non-robust command again and instead uses a new robust command
655 \DescribeMacro{\TextOrMath}|
\TextOrMath|, which will take care of
656 typesetting either the math or the text symbol. In order to do so,
657 we face an age old problem and unsolvable problem in
\TeX: A
658 reliable test for math mode that doesn't destroy
659 kerning. Fortunately this problem can be solved when using e
\TeX\ so
660 if you use this as engine for your
\LaTeX\ format, as recommended by
661 the
\LaTeX3 Project, you will get a fully functioning |
\TextOrMath|
662 command with no side effects. If you use regular
\TeX\ as engine for
663 your
\LaTeX\ format then we have to choose between the lesser of two
664 evils:
1)~breaking ligatures and preventing kerning or
2)~face the
665 risk of choosing text-mode at the beginning of an alignment cell,
666 which was supposed to be math-mode. We have decided upon
1) as is
667 customary for regular robust commands in
\LaTeX.