Update LuaTeX testfiles for ^@ change
[latex2e.git] / latex2e-20170101 / doc / latexchanges.tex
blob369ec3a3983a64871303b97fc8fbc138067ddd13
1 % \iffalse meta-comment
3 % Copyright 2015
4 % The LaTeX3 Project and any individual authors listed elsewhere
5 % in this file.
6 %
7 % This file is part of the LaTeX base system.
8 % -------------------------------------------
9 %
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
22 % information.
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.
28 % \fi
29 % Filename: latexchanges.tex
31 \NeedsTeXFormat{LaTeX2e}
33 \documentclass{ltxguide}
35 \title{Changes to the \LaTeXe{} format}
37 \author{\copyright~Copyright 2015--2017, \LaTeX3 Project Team.\\
38 All rights reserved.}
40 \date{24 January 2017}
42 % a few commands from doc
43 \newcommand\Lpack[1]{\mbox{\textsf{#1}}}
44 \newcommand\DescribeMacro[1]{\texttt{\string#1}}
46 \makeatletter % -- provide command introduced in new release
47 % so this typesets with an old format
49 \DeclareTextCommandDefault\textcommabelow[1]
50 {\hmode@bgroup\ooalign{\null#1\crcr\hidewidth\raise-.31ex
51 \hbox{\check@mathfonts\fontsize\ssf@size\z@
52 \math@fontsfalse\selectfont,}\hidewidth}\egroup}
53 \makeatother
55 \begin{document}
57 \maketitle
59 \tableofcontents
61 \newpage
63 \section{Introduction}
65 This document describes changes that have been made to the \LaTeX\ format since the 2014/05/01 \LaTeX\ release.
66 %This document details all the changes to documented functions since the 2014/05/01 \LaTeX\ release.
68 As announced in \LaTeX\ News~22, the 2015 \LaTeX, release adopts a new
69 policy. Improvements and bug fixes will be made to the format sources,
70 with the \Lpack{latexrelease} package being available to revert
71 changes to use definitions from an earlier format.
74 \section{Changes introduced in 2017/01/01 patch~2}
75 More adjustments for TU encoding, allowing for characters missing in
76 common system fonts. Additional \texttt{fd} files
77 for Latin Modern variants are included in the documented sources.
79 \section{Changes introduced in 2017/01/01 patch~1}
80 Fixes to TU encoding definitions for Lua\TeX\ and Xe\TeX.
82 \section{Changes introduced in 2017/01/01}
84 A new test is added during format making that e\TeX\ extensions are
85 available. As noted in \LaTeX\ news, e\TeX\ will now be required to
86 build \LaTeX.
88 Further updates tracking changes for Lua\TeX~1.0.
90 The definition of \verb|\showhyphens| is changed in formats built
91 with Xe\TeX, as the original version, inherited from plain \TeX\ does
92 not work with Xe-\TeX.
94 Changes to the default encoding used by Lua\TeX\ and Xe\TeX\ formats to
95 be TU (Unicode) rather than OT1 (7 bit legacy \TeX\ encoding).
97 \section{Changes introduced in 2016/03/31 patch~3}
98 Fixes to \verb|\newinsert| and \verb|\extrafloats|.
100 \section{Changes introduced in 2016/03/31 patch~2}
101 Adjustments to \verb|\c{g}| in OT1 encoding.
103 \section{Changes introduced in 2016/03/31 patch~1}
104 Adjust the upper limit for Character Class allocation in Xe-\TeX\ to
105 4096 to match a change in Xe-\TeX.
107 \section{Changes introduced in 2016/03/31}
108 Modify picture mode as suggested in latex/4452 to avoid leaders of
109 almost zero length.
111 Modify the checks in \verb|\DeclareMathSymbol| and related commands
112 so that they do not give errors with new Lua\TeX\ releases.
114 \section{Changes introduced in 2016/02/01}
115 Adjustments to Lua\TeX\ support to match changes to the Lua\TeX\ engine,
116 and to the character class allocation in Xe\TeX.
118 Load Unicode data from new generic \texttt{unicode-data} distribution.
120 \section{Changes introduced in 2015/10/01 patch~2}
122 This release fixes the behaviour of the allocation mechanism if the switch
123 from the standard to extended pool takes place within a group.
125 \section{Changes introduced in 2015/10/01 patch~1}
126 This release allows \Lpack{latexrelease} to revert the
127 Lua\TeX{}-specific
128 changes, in particular fixing an incorrect date in part of the mechanism and
129 adding a method to disable callback management entirely.
131 \section{Changes introduced in \LaTeX\ 2015/10/01}
133 \subsection{LuaTeX allocation}
134 Almost all changes at this release relate to incorporating allocation macros for luatex into the format
135 as done for etex and xetex in 2015/01/01. For details see |ltluatex.dtx| or \LaTeX\ News 22.
136 |ltluatex.dtx| now forms a new chapter (N) in the documented sources, |source2e.tex|.
139 \subsection{Increased number of floats}
140 The default float list has been increased from 18 to 52 registers if
141 e\TeX\ is available.
142 The list can be increased further using |\extrafloats| however this
143 default allocation uses classic registers below 256 so the registers are
144 also available for |\newinsert| as described below.
146 \subsection{Improved \texttt{\textbackslash newinsert}}
147 The command |\newinsert| has been extended to take registers from the lists of free float
148 registers once the classic register allocation is used up. This should make it highly unlikely
149 to get ``no room'' errors on register allocation assuming the format is used with
150 an e-\TeX\ based \TeX\ engine.
152 \subsection{New accent, \texttt{\textbackslash textcommabelow} (pr/4414)}
153 The command |\textcommabelow| has been added. This is mainly intended for Romanian letters
154 \textcommabelow{S}\,\textcommabelow{s}\,\textcommabelow{T}\,\textcommabelow{t}.
156 \subsection{Unicode 8}
157 The file |unicode-letters.def| used to initialise character data in
158 Unicode \TeX\ variants has been regenerated from data files updated
159 to Unicode~8.
161 \section{Changes introduced in 2015/01/01 patch~2}
162 There were no changes to the format at this release, but the sources were fixed to fix bug latex/4434
163 affecting bottom float positioning if the \Lpack{latexrelease} package was used.
165 \section{Changes introduced in 2015/01/01 patch~1}
166 This release re-introduces the ``Patch Level'' scheme for identifying
167 releases between main ``dated'' releases. Early \LaTeXe\ releases
168 included a mechanism whereby updates could be provided by a
169 \emph{patch
170 file}. This was mainly intended to allow updates to be made without
171 downloading the full sources again, which was an important
172 consideration with download speeds and costs at the time.
174 The new mechanism incorporates any changes directly into the sources,
175 but having the patch level identified in the banner allows the
176 \LaTeX\ release to be identified, even if (as in this case) most of the
177 changes do not affect the format but affect other base packages such
178 as \Lpack{latexrelease} and \Lpack{inputenc}. The patch level is shown
179 in the banner at the start of the job, but does not affect the date
180 handling of the |\IncludeInRelease| mechanism.
182 Apart from re-arranging the version banner, the only change in the
183 format is that |\newtoks| was accidentally defined twice, using the
184 old and new allocation scheme described in Section \ref{e@alloc}.
185 The old definition is now only in the \Lpack{latexrelease} package,
186 for use when emulating old formats.
191 \section
192 [Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01]
193 {Changes between \LaTeX\ releases 2014/05/01 and 2015/01/01\footnote{Much of this text
194 is taken from \Lpack{fixltx2e} package which was formerly used to make such changes available separately.}}
196 \subsection{Support for \LaTeX\ version changes}
197 \DescribeMacro{\includeInRelease}\arg{date}\oarg{date}\arg{label}\arg{message}\arg{code}
199 \smallskip
201 The |\includeInRelease| command has been added to support backward and
202 forward compatibility for the \LaTeX\ format. It supports the
203 declaration of conditional code that can be loaded based on options
204 given to the \Lpack{latexrelease} package. Its use is described in
205 detail in the \Lpack{latexrelease} package documentation.
207 \subsection{New Allocation Code\label{e@alloc}}
208 Previously |\newcount| and related commands were based on classic TeX
209 and only allocated in the range 0--255. This was extended (in
210 different ways) for e-\TeX\ in the |etex| package and in the
211 |xelatex.ini| and |lualatex.ini| files used in those formats. Related
212 to this the number of boxes allocated to store floats was
213 limited. This was extended to a certain extent in the |morefloats|
214 package (by Don Hosek and H.-Martin Muench) but the new allocation
215 incorporates float allocation directly and supports much larger float
216 lists using the extended registers.
218 The new code allocates registers in the full extended range (
219 $2^{15}-1$ for etex and xelatex, $2^{16}-1$ for lualatex.
220 In addition a new command |\extrafloats| is provided.
222 \DescribeMacro{\extrafloats}\arg{number}
223 \smallskip
225 This allocates additional registers for the \LaTeX\ float system to
226 hold figures and tables etc. Similar functionality has been
227 available via the \Lpack{morefloats} package but this is a different
228 implementation using extended e-\TeX\ registers when available so
229 allows many more registers to be reserved for floats as they are
230 allocated from a pool of 32 or 64 thousand rather than 256 registers,
231 depending on the engine in use.
233 \DescribeMacro{\newmarks}\arg{command}
234 \smallskip
236 e-\TeX\ only, previously available via the \Lpack{etex} package.
237 Allocates commands to use the extended e-\TeX\ mark mechanism.
239 \DescribeMacro{\newXeTeXintercharclass}\arg{command}
240 \smallskip
242 Xe-\TeX\ only, previously in the Xe-\LaTeX\ format, but added via
243 |xelatex.ini| not part of the core release.
244 Allocates commands to use the Xe-\TeX\ character class mechanism.
247 \subsection{e-\TeX\ tracing if available}
248 |\loggingall| (Usually used via |\tracingall|) is extended to enable
249 additional e-\TeX\ tracing if e-\TeX\ is available. (|\tracingall|
250 extension has been available as part of the |etex| package previously).
252 Also based on code from the |etex| package, a command |\tracingnone|
253 is added to reverse the effects of |\tracingall| and turn off all primitive
254 \TeX\ tracing. A new command |\hideoutput| has been added which resets the
255 tracing parameters set by |\showoutput|.
260 \subsection{\texttt{\textbackslash textsubscript} not defined in
261 latex.ltx (pr/3492)}
263 \begin{verbatim}
264 >>Number: 3492
265 >>Category: latex
266 >>Synopsis: \textsubscript not defined in latex.ltx
267 >>Arrival-Date: Tue Jan 14 23:01:00 CET 2003
268 >>Originator: Ionel Mugurel Ciobica
270 I use \textsubscript much more often than \textsuperscript, and
271 \textsubscript it is not defined in latex.ltx. Could you please
272 consider including the definition of \textsubscript in the latex.ltx
273 for the next versions of LaTeX. Thank you.
274 \end{verbatim}
276 \subsection{\texttt{\textbackslash @} discards spaces when moving
277 (pr/3039)}
279 \begin{verbatim}
280 >>Number: 3039
281 >>Category: latex
282 >>Synopsis: \@ discards spaces when moving
283 >>Arrival-Date: Sat May 22 09:01:06 1999
284 >>Originator: Donald Arseneau
285 >>Description:
286 The \@ command expands to \spacefactor\@m in auxiliary files,
287 which then ignores following spaces when it is reprocessed.
288 \end{verbatim}
290 \subsection{1-col fig can come before earlier 2-col fig
291 (pr/2346)}
293 \begin{verbatim}
294 >>Number: 2346
295 >>Category: latex
296 >>Synopsis: 2-col: 1-col fig can come before earlier 2-col fig
297 >>Arrival-Date: Wed Dec 18 15:41:07 1996
298 >>Originator: bil kleb
299 >>Description:
300 as documented in Lamport's book, p. 198, concerning figure
301 placement, "a figure will not be printed before an earlier
302 figure, and a table will not be printed before an earlier
303 table." however, there is a footnote stating, "However,
304 in two-column page style, a single-column figure can come before
305 an earlier double-column figure, and vice versa."
307 This twocolumn behavior is undesirable---at least by me and
308 most professional organizations i publish in. ed snyzter developed
309 a hack fix for 2.09 several years ago which links the two
310 counters, but i have not run across a similar "fix" for 2e...
311 \end{verbatim}
313 Originally fixed in package \Lpack{fix2col} which was merged into
314 this package. Documentation and code from this package have been
315 merged into this file.
317 \subsubsection{Notes on the Implementation Strategy}
319 The standard output routine maintains two lists of floats that have
320 been `deferred' for later consideration. One list for single column
321 floats, and one for double column floats (which are always
322 immediately put onto their deferred list). This mechanism means
323 that \LaTeX\ `knows' which type of float is contained in each box
324 by the list that it is processing, but having two lists means
325 that there is no mechanism for preserving the order between the
326 floats in each list.
328 The solution to this problem consists of two small changes to
329 the output routine.
331 Firstly, abandon the `double column float list' |\@dbldeferlist|
332 and change every command where it is used so that instead the
333 same |\@deferlist| is used as for single column floats.
334 That one change ensures that double and single column floats
335 stay in the same sequence, but as \LaTeX\ no longer `knows'
336 whether a float is double or single column, it will happily
337 insert a double float into a single column, overprinting the
338 other column, or the margin.
340 The second change is to provide an alternative mechanism for
341 recording the two column floats. \LaTeX\ already has a compact
342 mechanism for recording float information, an integer count register
343 assigned to each float records information about the `type' of float
344 `figure', `table' and the position information `htp' etc.
346 The type information is stored in the `high' bits, one bit position
347 (above `32') allocated to each float type. The `low' bits store
348 information about the allowed positions, one bit each allocated for
349 |h t b p|. In the \LaTeX2.09 system, the bit corresponding to `16'
350 formed a `boundary' between these two sets of information, and it
351 was never actually used by the system. Ed Sznyter's
352 \Lpack{fixfloats} package not unreasonably used this position to
353 store the double column information, setting the bit for double
354 column floats. Then at each point in the output routine at which a
355 float is committed to a certain region, an additional check must be
356 made to check that the float is (or is not) double column. If it
357 spans the wrong number of columns it is deferred rather than being
358 added.
360 Unfortunately the bit `16' is not available in \LaTeXe. It is used
361 to encode the extra float position possibility `|!|' that was added
362 in that system. It would be possible to use position `32' and to
363 move the flags for `table', `figure',\ldots\ up one position, to
364 start at 64, but this would mean that in principle one less float
365 type would be supported, and more importantly is likely to break
366 any other packages that assume anything about the output routine
367 internals. So here I instead use another mechanism for flagging
368 double column floats: By default all floats have depth 0pt.
369 This package arranges that double column ones have depth 1sp.
370 This information may then be used in the same manner as in
371 the \Lpack{fixfloats} package, to defer any floats that are not of
372 the correct column spanning type.
376 \subsection{Infinite glue found (pr/4023 and pr/2346)}
378 The fix for pr/2346 did not work as intended when used in conjunction
379 with |\enlargethispage| as the latter introduced an infinite negative
380 glue at the bottom of the page. That in turn make a |\vsplit|
381 operation to get at the column marks invalid.
383 \subsection{Wrong header for twocolumn (pr/2613)}
385 \begin{verbatim}
386 >>Number: 2613
387 >>Category: latex
388 >>Synopsis: wrong headline for twocolumn
389 >>Arrival-Date: Mon Sep 22 16:41:09 1997
390 >>Originator: Daniel Reischert
391 >>Description:
392 When setting the document in two columns
393 the headline shows the top mark of the second column,
394 but it should show the top mark of the first column.
395 \end{verbatim}
397 Originally fixed in package \Lpack{fix2col} which was merged into
398 this package. Documentation and code from this package have been
399 merged into this file.
401 \subsubsection{Notes on the Implementation Strategy}
403 The standard \LaTeX\ twocolumn system works internally by making
404 each column a separate `page' that is passed independently to \TeX's
405 page breaker. (Unlike say the \Lpack{multicol} package, where all
406 columns are gathered together and then split into columns later,
407 using |\vsplit|.) This means that the primitive \TeX\ marks that are
408 normally used for header information, are globally reset after the
409 first column. By default \LaTeX\ does nothing about this.
410 A good solution is provided by Piet van Oostrum (building on earlier
411 work of Joe Pallas) in his \Lpack{fixmarks} package.
413 After the first column box has been collected the mark information
414 for that box is saved, so that any |\firstmark| can be
415 `artificially' used to set the page-level marks after the second
416 column has been collected. (The second column |\firstmark| is not
417 normally required.) Unfortunately \TeX\ does not provide a direct
418 way of knowing if any marks are in the page, |\firstmark| always has a
419 value from previous pages, even if there is no mark in this page.
420 The solution is to make a copy of the box and then |\vsplit| it
421 so that any marks show up as |\splitfirstmark|.
423 The use of |\vsplit| does mean that the output routine will globally
424 change the value of |\splitfirstmark| and
425 |\splitbotmark|. The \Lpack{fixmarks} package goes to some trouble
426 to save and restore these values so that the output routine does
427 \emph{not} change the values. This part of \Lpack{fixmarks} is not
428 copied here as it is quite costly (having to be run on every page) and
429 there is no reason why anyone writing code using |\vsplit| should
430 allow the output routine to be triggered before the split marks have
431 been accessed.
435 \subsection{\texttt{\textbackslash setlength} produces error if
436 used with registers like \texttt{\textbackslash dimen0} (pr/3066)}
438 \begin{verbatim}
439 >>Number: 3066
440 >>Category: latex
441 >>Synopsis: \setlength{\dimen0}{10pt}
442 >>Arrival-Date: Tue Jul 6 15:01:06 1999
443 >>Originator: Heiko Oberdiek
444 >>Description:
445 The current implementation of \setlength causes an error,
446 because the length specification isn't terminated properly.
447 More safe:
448 \def\setlength#1#2{#1=#2\relax}
449 \end{verbatim}
451 \subsection{Fewer fragile commands}
453 \begin{verbatim}
454 >>Number: 3816
455 >>Category: latex
456 >>Synopsis: Argument of \@sect has an extra }.
457 >>Arrival-Date: Sat Oct 22 23:11:01 +0200 2005
458 >>Originator: Susanne Wunsch
460 Use of a \raisebox in \section{} produces the error message
461 mentioned in the subject.
463 PR latex/1738 described a similar problem, which has been solved
464 10 years ago. Protecting the \raisebox with \protect solved my
465 problem as well, but wouldn't it make sense to have a similar fix
466 as in the PR?
468 It is particularly confusing, that an unprotected \raisebox in a
469 \section*-environment works fine, while in a \section-environment
470 produces error.
471 \end{verbatim}
473 While not technically a bug, in this day and age there are few
474 reasons why commands taking optional arguments should not be robust.
476 \subsubsection{Notes on the implementation strategy}
478 Rather than changing the kernel macros to be robust, we have decided
479 to add the macro \DescribeMacro{\MakeRobust}|\MakeRobust| in
480 \Lpack{fixltx2e} so that users can easily turn fragile macros into
481 robust ones. A macro |\foo| is made robust by doing the simple
482 |\MakeRobust{\foo}|. \Lpack{fixltx2e} makes the following kernel
483 macros robust: |\(|, |\)|, |\[|, |\]|,
484 |\makebox|, |\savebox|,
485 |\framebox|, |\parbox|, |\rule| and |\raisebox|.
487 \ldots TODO \ldots fleqn vesion of |\[\]|
489 \subsection{\texttt{\textbackslash addpenalty} ruins flush-bottom (pr/3073)}
491 \begin{verbatim}
492 >>Number: 3073
493 >>Category: latex
494 >>Synopsis: \addpenalty ruins flush-bottom
495 >>Arrival-Date: Sat Jul 17 05:11:05 1999
496 >>Originator: Donald Arseneau
497 >>Description:
498 Just to keep in mind for further development eh?
499 A page break at an \addpenalty after \vspace does *not*
500 give a flush-bottom page. (The intent of \addpenalty is
501 apparently just to preserve the flush bottom by putting
502 the breakpoint `above' the skip.)
503 \end{verbatim}
505 \subsection{Within counters only reset next level down (pr4393)}
507 This is actually implicitly documented behavior in the \LaTeX{}
508 Manual that states that |\stepcounter| resets all counters marked
509 ``within''. However it means that if, for example, theorems are
510 numbered within sections and you start a new chapter in a book, the
511 section counter is reset to zero but the theorem counter is not
512 until the first section appears. Thus a theorem directly within the
513 chapter body (without a new section) would show an incremented
514 number relative to the last theorem of the previous chapter.
517 For this reason we are now resetting all levels of within in one go
518 even if that means that some of these resets may happen several times
519 unnecessarily.
522 \subsection{Check the optional arguments of floats}
524 By default LaTeX silently ignores unknown letters in the optional
525 arguments of floats. |\begin{figure}[tB]| the |B| is ignored so it
526 acts like |\begin{figure}[t]| However |\begin{figure}[B]| does
527 \emph{not} act like |\begin{figure}[]| as the check for an empty
528 argument, or unsupplied argument, is earlier. |[]| causes the
529 default float placement to be used, but |[B]| means that \emph{no}
530 float area is allowed and so the float will not be placed until the
531 next |\clearpage| or end of document, no warning is given.
533 This package adds a check on each letter, and if it not one of
534 |!tbhp| then an error is given and the code acts as if |p| had been
535 used, so that the float may be placed somewhere.
537 \subsection{\texttt{\textbackslash DeclareMathSizes} only take pts.
538 (pr/3693)}
540 \begin{verbatim}
541 >>Number: 3693
542 >>Category: latex
543 >>Synopsis: \DeclareMathSizes only take pts.
544 >>Arrival-Date: Fri Jun 11 16:21:00 CEST 2004
545 >>Originator: Morten Hoegholm
547 The last three arguments of \@DeclareMathSizes cannot take a dimension
548 as argument, making it inconsistent with the rest of the font changing
549 commands and itself, as the second argument can take a dimension
550 specification.
551 \end{verbatim}
553 \subsection{No hyphenation in first word after float environment (pr/3498)}
555 \begin{verbatim}
556 >>Number: 3498
557 >>Category: latex
558 >>Synopsis: No hyphenation in first word after float environment
559 >>Arrival-Date: Thu Jan 30 13:21:00 CET 2003
560 >>Originator: Harald Harders
562 If a float environment (figure, table) is written within a paragraph,
563 the first word after the environment is not hyphenated.
564 \end{verbatim}
566 \subsection{\texttt{\textbackslash fnsymbol} should use text symbols
567 (pr/3400)}
569 \begin{verbatim}
570 >>Number: 3400
571 >>Category: latex
572 >>Synopsis: \fnsymbol should use text symbols if possible
573 >>Arrival-Date: Fri Jan 04 20:41:00 CET 2002
574 >>Originator: Walter Schmidt
576 The \fnsymbol command can be used in both text and math
577 mode. The symbols produced are, however, always taken from
578 the math fonts. As a result, they may not match the text
579 fonts, even if the symbols are actually available, for
580 instance from the TS1 encoding. Since \fnsymbol is
581 primarily used for footnotes in text, this should be fixed,
582 IMO.
583 \end{verbatim}
589 \subsection{\texttt{\textbackslash footnotemark}[x] crashes with fixltx2e.sty
590 (pr/3752)}
592 \begin{verbatim}
593 >>Number: 3752
594 >>Category: tools
595 >>Synopsis: feature \footnotemark[x] crashes with fixltx2e.sty
596 >>Arrival-Date: Fri Dec 17 10:11:00 +0100 2004
597 >>Originator: Stefan Pofahl
599 If I use /fnsymbol together with fixltx2e.sty I can not use
600 optional parameter [num]
601 \footnotemark[1] is not showing the mark number 1 but
602 the mark \value{footnote}.
603 \end{verbatim}
604 This bug was related to pr/3400, where |\@fnsymbol| was made robust.
606 \subsubsection{Notes on the implementation strategy}
608 Pr/3400 made |\@fnsymbol| decide between text-mode and math-mode,
609 which requires a certain level of robustness somewhere as the
610 decision between text and math must be made at typesetting time and
611 not when inside |\protected@edef| or similar commands. One way of
612 dealing with this is to make sure the value seen by |\@fnsymbol| is
613 a fully expanded number, which could be handled by code such as
614 \begin{verbatim}
615 \def\fnsymbol#1{\expandafter\@fnsymbol
616 \expandafter{\the\csname c@#1\endcsname}}
617 \end{verbatim}
618 This would be a good solution if everybody used the high level
619 commands only by writing code like |\fnsymbol{footnote}|. Unfortunately
620 many classes (including the standard classes) and packages use the
621 internal forms directly as in |\@fnsymbol\c@footnote| so the easy
622 solution of changing |\fnsymbol| would break code that had worked for
623 the past 20~years.
625 Therefore the implementation here makes |\@fnsymbol| itself a
626 non-robust command again and instead uses a new robust command
627 \DescribeMacro{\TextOrMath}|\TextOrMath|, which will take care of
628 typesetting either the math or the text symbol. In order to do so,
629 we face an age old problem and unsolvable problem in \TeX: A
630 reliable test for math mode that doesn't destroy
631 kerning. Fortunately this problem can be solved when using e\TeX\ so
632 if you use this as engine for your \LaTeX\ format, as recommended by
633 the \LaTeX3 Project, you will get a fully functioning |\TextOrMath|
634 command with no side effects. If you use regular \TeX\ as engine for
635 your \LaTeX\ format then we have to choose between the lesser of two
636 evils: 1)~breaking ligatures and preventing kerning or 2)~face the
637 risk of choosing text-mode at the beginning of an alignment cell,
638 which was supposed to be math-mode. We have decided upon 1) as is
639 customary for regular robust commands in \LaTeX.
643 \end{document}