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 \title{Changes to the
\LaTeXe{} format
}
37 \author{\copyright~Copyright
2015,
\LaTeX3 Project Team.\\
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}
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.
73 \section{Changes introduced in
2015/
10/
01 patch~
2}
75 This release fixes the behaviour of the allocation mechanism if the switch
76 from the standard to extended pool takes place within a group.
78 \section{Changes introduced in
2015/
10/
01 patch~
1}
79 This release allows
\Lpack{latexrelease
} to revert the
81 changes, in particular fixing an incorrect date in part of the mechanism and
82 adding a method to disable callback management entirely.
84 \section{Changes introduced in
\LaTeX\
2015/
10/
01}
86 \subsection{LuaTeX allocation
}
87 Almost all changes at this release relate to incorporating allocation macros for luatex into the format
88 as done for etex and xetex in
2015/
01/
01. For details see |ltluatex.dtx| or
\LaTeX\ News
22.
89 |ltluatex.dtx| now forms a new chapter (N) in the documented sources, |source2e.tex|.
92 \subsection{Increased number of floats
}
93 The default float list has been increased from
18 to
52 registers if
95 The list can be increased further using |
\extrafloats| however this
96 default allocation uses classic registers below
256 so the registers are
97 also available for |
\newinsert| as described below.
99 \subsection{Improved
\texttt{\textbackslash newinsert
}}
100 The command |
\newinsert| has been extended to take registers from the lists of free float
101 registers once the classic register allocation is used up. This should make it highly unlikely
102 to get ``no room'' errors on register allocation assuming the format is used with
103 an e-
\TeX\ based
\TeX\ engine.
105 \subsection{New accent,
\texttt{\textbackslash textcommabelow
} (pr/
4414)
}
106 The command |
\textcommabelow| has been added. This is mainly intended for Romanian letters
107 \textcommabelow{S
}\,
\textcommabelow{s
}\,
\textcommabelow{T
}\,
\textcommabelow{t
}.
109 \subsection{Unicode
8}
110 The file |unicode-letters.def| used to initialise character data in
111 Unicode
\TeX\ variants has been regenerated from data files updated
114 \section{Changes introduced in
2015/
01/
01 patch~
2}
115 There were no changes to the format at this release, but the sources were fixed to fix bug latex/
4434
116 affecting bottom float positioning if the
\Lpack{latexrelease
} package was used.
118 \section{Changes introduced in
2015/
01/
01 patch~
1}
119 This release re-introduces the ``Patch Level'' scheme for identifying
120 releases between main ``dated'' releases. Early
\LaTeXe\ releases
121 included a mechanism whereby updates could be provided by a
123 file
}. This was mainly intended to allow updates to be made without
124 downloading the full sources again, which was an important
125 consideration with download speeds and costs at the time.
127 The new mechanism incorporates any changes directly into the sources,
128 but having the patch level identified in the banner allows the
129 \LaTeX\ release to be identified, even if (as in this case) most of the
130 changes do not affect the format but affect other base packages such
131 as
\Lpack{latexrelease
} and
\Lpack{inputenc}. The patch level is shown
132 in the banner at the start of the job, but does not affect the date
133 handling of the |
\IncludeInRelease| mechanism.
135 Apart from re-arranging the version banner, the only change in the
136 format is that |
\newtoks| was accidentally defined twice, using the
137 old and new allocation scheme described in Section
\ref{e@alloc
}.
138 The old definition is now only in the
\Lpack{latexrelease
} package,
139 for use when emulating old formats.
145 [Changes between
\LaTeX\ releases
2014/
05/
01 and
2015/
01/
01]
146 {Changes between
\LaTeX\ releases
2014/
05/
01 and
2015/
01/
01\footnote{Much of this text
147 is taken from
\Lpack{fixltx2e
} package which was formerly used to make such changes available separately.
}}
149 \subsection{Support for
\LaTeX\ version changes
}
150 \DescribeMacro{\includeInRelease}\arg{date
}\oarg{date
}\arg{label
}\arg{message
}\arg{code
}
154 The |
\includeInRelease| command has been added to support backward and
155 forward compatibility for the
\LaTeX\ format. It supports the
156 declaration of conditional code that can be loaded based on options
157 given to the
\Lpack{latexrelease
} package. Its use is described in
158 detail in the
\Lpack{latexrelease
} package documentation.
160 \subsection{New Allocation Code
\label{e@alloc
}}
161 Previously |
\newcount| and related commands were based on classic TeX
162 and only allocated in the range
0--
255. This was extended (in
163 different ways) for e-
\TeX\ in the |etex| package and in the
164 |xelatex.ini| and |lualatex.ini| files used in those formats. Related
165 to this the number of boxes allocated to store floats was
166 limited. This was extended to a certain extent in the |morefloats|
167 package (by Don Hosek and H.-Martin Muench) but the new allocation
168 incorporates float allocation directly and supports much larger float
169 lists using the extended registers.
171 The new code allocates registers in the full extended range (
172 $
2^
{15}-
1$ for etex and xelatex, $
2^
{16}-
1$ for lualatex.
173 In addition a new command |
\extrafloats| is provided.
175 \DescribeMacro{\extrafloats}\arg{number
}
178 This allocates additional registers for the
\LaTeX\ float system to
179 hold figures and tables etc. Similar functionality has been
180 available via the
\Lpack{morefloats
} package but this is a different
181 implementation using extended e-
\TeX\ registers when available so
182 allows many more registers to be reserved for floats as they are
183 allocated from a pool of
32 or
64 thousand rather than
256 registers,
184 depending on the engine in use.
186 \DescribeMacro{\newmarks}\arg{command
}
189 e-
\TeX\ only, previously available via the
\Lpack{etex
} package.
190 Allocates commands to use the extended e-
\TeX\ mark mechanism.
192 \DescribeMacro{\newXeTeXintercharclass}\arg{command
}
195 Xe-
\TeX\ only, previously in the Xe-
\LaTeX\ format, but added via
196 |xelatex.ini| not part of the core release.
197 Allocates commands to use the xe-
\TeX\ character class mechanism.
200 \subsection{e-
\TeX\ tracing if available
}
201 |
\loggingall| (Usually used via |
\tracingall|) is extended to enable
202 additional e-
\TeX\ tracing if e-
\TeX\ is available. (|
\tracingall|
203 extension has been available as part of the |etex| package previously).
205 Also based on code from the |etex| package, a command |
\tracingnone|
206 is added to reverse the effects of |
\tracingall| and turn off all primitive
207 \TeX\ tracing. A new command |
\hideoutput| has been added which resets the
208 tracing parameters set by |
\showoutput|.
213 \subsection{\texttt{\textbackslash textsubscript
} not defined in
219 >>Synopsis:
\textsubscript not defined in latex.ltx
220 >>Arrival-Date: Tue Jan
14 23:
01:
00 CET
2003
221 >>Originator: Ionel Mugurel Ciobica
223 I use
\textsubscript much more often than
\textsuperscript, and
224 \textsubscript it is not defined in latex.ltx. Could you please
225 consider including the definition of
\textsubscript in the latex.ltx
226 for the next versions of LaTeX. Thank you.
229 \subsection{\texttt{\textbackslash @
} discards spaces when moving
235 >>Synopsis: \@ discards spaces when moving
236 >>Arrival-Date: Sat May
22 09:
01:
06 1999
237 >>Originator: Donald Arseneau
239 The \@ command expands to
\spacefactor\@m in auxiliary files,
240 which then ignores following spaces when it is reprocessed.
243 \subsection{1-col fig can come before earlier
2-col fig
249 >>Synopsis:
2-col:
1-col fig can come before earlier
2-col fig
250 >>Arrival-Date: Wed Dec
18 15:
41:
07 1996
251 >>Originator: bil kleb
253 as documented in Lamport's book, p.
198, concerning figure
254 placement, "a figure will not be printed before an earlier
255 figure, and a table will not be printed before an earlier
256 table." however, there is a footnote stating, "However,
257 in two-column page style, a single-column figure can come before
258 an earlier double-column figure, and vice versa."
260 This twocolumn behavior is undesirable---at least by me and
261 most professional organizations i publish in. ed snyzter developed
262 a hack fix for
2.09 several years ago which links the two
263 counters, but i have not run across a similar "fix" for
2e...
266 Originally fixed in package
\Lpack{fix2col
} which was merged into
267 this package. Documentation and code from this package have been
268 merged into this file.
270 \subsubsection{Notes on the Implementation Strategy
}
272 The standard output routine maintains two lists of floats that have
273 been `deferred' for later consideration. One list for single column
274 floats, and one for double column floats (which are always
275 immediately put onto their deferred list). This mechanism means
276 that
\LaTeX\ `knows' which type of float is contained in each box
277 by the list that it is processing, but having two lists means
278 that there is no mechanism for preserving the order between the
281 The solution to this problem consists of two small changes to
284 Firstly, abandon the `double column float list' |\@dbldeferlist|
285 and change every command where it is used so that instead the
286 same |\@deferlist| is used as for single column floats.
287 That one change ensures that double and single column floats
288 stay in the same sequence, but as
\LaTeX\ no longer `knows'
289 whether a float is double or single column, it will happily
290 insert a double float into a single column, overprinting the
291 other column, or the margin.
293 The second change is to provide an alternative mechanism for
294 recording the two column floats.
\LaTeX\ already has a compact
295 mechanism for recording float information, an integer count register
296 assigned to each float records information about the `type' of float
297 `figure', `table' and the position information `htp' etc.
299 The type information is stored in the `high' bits, one bit position
300 (above `
32') allocated to each float type. The `low' bits store
301 information about the allowed positions, one bit each allocated for
302 |h t b p|. In the
\LaTeX2.09 system, the bit corresponding to `
16'
303 formed a `boundary' between these two sets of information, and it
304 was never actually used by the system. Ed Sznyter's
305 \Lpack{fixfloats
} package not unreasonably used this position to
306 store the double column information, setting the bit for double
307 column floats. Then at each point in the output routine at which a
308 float is committed to a certain region, an additional check must be
309 made to check that the float is (or is not) double column. If it
310 spans the wrong number of columns it is deferred rather than being
313 Unfortunately the bit `
16' is not available in
\LaTeXe. It is used
314 to encode the extra float position possibility `|!|' that was added
315 in that system. It would be possible to use position `
32' and to
316 move the flags for `table', `figure',
\ldots\ up one position, to
317 start at
64, but this would mean that in principle one less float
318 type would be supported, and more importantly is likely to break
319 any other packages that assume anything about the output routine
320 internals. So here I instead use another mechanism for flagging
321 double column floats: By default all floats have depth
0pt.
322 This package arranges that double column ones have depth
1sp.
323 This information may then be used in the same manner as in
324 the
\Lpack{fixfloats
} package, to defer any floats that are not of
325 the correct column spanning type.
329 \subsection{Infinite glue found (pr/
4023 and pr/
2346)
}
331 The fix for pr/
2346 did not work as intended when used in conjunction
332 with |
\enlargethispage| as the latter introduced an infinite negative
333 glue at the bottom of the page. That in turn make a |
\vsplit|
334 operation to get at the column marks invalid.
336 \subsection{Wrong header for twocolumn (pr/
2613)
}
341 >>Synopsis: wrong headline for twocolumn
342 >>Arrival-Date: Mon Sep
22 16:
41:
09 1997
343 >>Originator: Daniel Reischert
345 When setting the
document in two columns
346 the headline shows the top mark of the second column,
347 but it should show the top mark of the first column.
350 Originally fixed in package
\Lpack{fix2col
} which was merged into
351 this package. Documentation and code from this package have been
352 merged into this file.
354 \subsubsection{Notes on the Implementation Strategy
}
356 The standard
\LaTeX\ twocolumn system works internally by making
357 each column a separate `page' that is passed independently to
\TeX's
358 page breaker. (Unlike say the
\Lpack{multicol
} package, where all
359 columns are gathered together and then split into columns later,
360 using |
\vsplit|.) This means that the primitive
\TeX\ marks that are
361 normally used for header information, are globally reset after the
362 first column. By default
\LaTeX\ does nothing about this.
363 A good solution is provided by Piet van Oostrum (building on earlier
364 work of Joe Pallas) in his
\Lpack{fixmarks
} package.
366 After the first column box has been collected the mark information
367 for that box is saved, so that any |
\firstmark| can be
368 `artificially' used to set the page-level marks after the second
369 column has been collected. (The second column |
\firstmark| is not
370 normally required.) Unfortunately
\TeX\ does not provide a direct
371 way of knowing if any marks are in the page, |
\firstmark| always has a
372 value from previous pages, even if there is no mark in this page.
373 The solution is to make a copy of the box and then |
\vsplit| it
374 so that any marks show up as |
\splitfirstmark|.
376 The use of |
\vsplit| does mean that the output routine will globally
377 change the value of |
\splitfirstmark| and
378 |
\splitbotmark|. The
\Lpack{fixmarks
} package goes to some trouble
379 to save and restore these values so that the output routine does
380 \emph{not
} change the values. This part of
\Lpack{fixmarks
} is not
381 copied here as it is quite costly (having to be run on every page) and
382 there is no reason why anyone writing code using |
\vsplit| should
383 allow the output routine to be triggered before the split marks have
388 \subsection{\texttt{\textbackslash setlength
} produces error if
389 used with registers like
\texttt{\textbackslash dimen0
} (pr/
3066)
}
394 >>Synopsis:
\setlength{\dimen0}{10pt
}
395 >>Arrival-Date: Tue Jul
6 15:
01:
06 1999
396 >>Originator: Heiko Oberdiek
398 The current implementation of
\setlength causes an error,
399 because the length specification isn't terminated properly.
401 \def\setlength#1#2{#1=
#2\relax}
404 \subsection{Fewer fragile commands
}
409 >>Synopsis: Argument of \@sect has an extra
}.
410 >>Arrival-Date: Sat Oct
22 23:
11:
01 +
0200 2005
411 >>Originator: Susanne Wunsch
413 Use of a
\raisebox in
\section{} produces the error message
414 mentioned in the subject.
416 PR latex/
1738 described a similar problem, which has been solved
417 10 years ago. Protecting the
\raisebox with
\protect solved my
418 problem as well, but wouldn't it make sense to have a similar fix
421 It is particularly confusing, that an unprotected
\raisebox in a
422 \section*-environment works fine, while in a
\section-environment
426 While not technically a bug, in this day and age there are few
427 reasons why commands taking optional arguments should not be robust.
429 \subsubsection{Notes on the implementation strategy
}
431 Rather than changing the kernel macros to be robust, we have decided
432 to add the macro
\DescribeMacro{\MakeRobust}|
\MakeRobust| in
433 \Lpack{fixltx2e
} so that users can easily turn fragile macros into
434 robust ones. A macro |
\foo| is made robust by doing the simple
435 |
\MakeRobust{\foo}|.
\Lpack{fixltx2e
} makes the following kernel
436 macros robust: |\(|, |\)|, |\
[|, |\
]|,
437 |
\makebox|, |
\savebox|,
438 |
\framebox|, |
\parbox|, |
\rule| and |
\raisebox|.
440 \ldots TODO
\ldots fleqn vesion of |\
[\
]|
442 \subsection{\texttt{\textbackslash addpenalty
} ruins flush-bottom (pr/
3073)
}
447 >>Synopsis:
\addpenalty ruins flush-bottom
448 >>Arrival-Date: Sat Jul
17 05:
11:
05 1999
449 >>Originator: Donald Arseneau
451 Just to keep in mind for further development eh?
452 A page break at an
\addpenalty after
\vspace does *not*
453 give a flush-bottom page. (The intent of
\addpenalty is
454 apparently just to preserve the flush bottom by putting
455 the breakpoint `above' the skip.)
458 \subsection{Within counters only reset next level down (pr4393)
}
460 This is actually implicitly documented behavior in the
\LaTeX{}
461 Manual that states that |
\stepcounter| resets all counters marked
462 ``within''. However it means that if, for example, theorems are
463 numbered within sections and you start a new chapter in a book, the
464 section counter is reset to zero but the theorem counter is not
465 until the first section appears. Thus a theorem directly within the
466 chapter body (without a new section) would show an incremented
467 number relative to the last theorem of the previous chapter.
470 For this reason we are now resetting all levels of within in one go
471 even if that means that some of these resets may happen several times
475 \subsection{Check the optional arguments of floats
}
477 By default LaTeX silently ignores unknown letters in the optional
478 arguments of floats. |
\begin{figure
}[tB
]| the |B| is ignored so it
479 acts like |
\begin{figure
}[t
]| However |
\begin{figure
}[B
]| does
480 \emph{not
} act like |
\begin{figure
}[]| as the check for an empty
481 argument, or unsupplied argument, is earlier. |
[]| causes the
482 default float placement to be used, but |
[B
]| means that
\emph{no
}
483 float area is allowed and so the float will not be placed until the
484 next |
\clearpage| or end of
document, no warning is given.
486 This package adds a check on each letter, and if it not one of
487 |!tbhp| then an error is given and the code acts as if |p| had been
488 used, so that the float may be placed somewhere.
490 \subsection{\texttt{\textbackslash DeclareMathSizes
} only take pts.
496 >>Synopsis:
\DeclareMathSizes only take pts.
497 >>Arrival-Date: Fri Jun
11 16:
21:
00 CEST
2004
498 >>Originator: Morten Hoegholm
500 The last three arguments of \@DeclareMathSizes cannot take a dimension
501 as argument, making it inconsistent with the rest of the font changing
502 commands and itself, as the second argument can take a dimension
506 \subsection{No hyphenation in first word after float environment (pr/
3498)
}
511 >>Synopsis: No hyphenation in first word after float environment
512 >>Arrival-Date: Thu Jan
30 13:
21:
00 CET
2003
513 >>Originator: Harald Harders
515 If a float environment (figure, table) is written within a paragraph,
516 the first word after the environment is not hyphenated.
519 \subsection{\texttt{\textbackslash fnsymbol
} should use text symbols
525 >>Synopsis:
\fnsymbol should use text symbols if possible
526 >>Arrival-Date: Fri Jan
04 20:
41:
00 CET
2002
527 >>Originator: Walter Schmidt
529 The
\fnsymbol command can be used in both text and math
530 mode. The symbols produced are, however, always taken from
531 the math fonts. As a result, they may not match the text
532 fonts, even if the symbols are actually available, for
533 instance from the TS1 encoding. Since
\fnsymbol is
534 primarily used for footnotes in text, this should be fixed,
542 \subsection{\texttt{\textbackslash footnotemark
[x
]} crashes with fixltx2e.sty
548 >>Synopsis: feature
\footnotemark[x
] crashes with fixltx2e.sty
549 >>Arrival-Date: Fri Dec
17 10:
11:
00 +
0100 2004
550 >>Originator: Stefan Pofahl
552 If I use /fnsymbol together with fixltx2e.sty I can not use
553 optional parameter
[num
]
554 \footnotemark[1] is not showing the mark number
1 but
555 the mark
\value{footnote
}.
557 This bug was related to pr/
3400, where |\@fnsymbol| was made robust.
559 \subsubsection{Notes on the implementation strategy
}
561 Pr/
3400 made |\@fnsymbol| decide between text-mode and math-mode,
562 which requires a certain level of robustness somewhere as the
563 decision between text and math must be made at typesetting time and
564 not when inside |
\protected@edef| or similar commands. One way of
565 dealing with this is to make sure the value seen by |\@fnsymbol| is
566 a fully expanded number, which could be handled by code such as
568 \def\fnsymbol#1{\expandafter\@fnsymbol
569 \expandafter{\the\csname c@
#1\endcsname}}
571 This would be a good solution if everybody used the high level
572 commands only by writing code like |
\fnsymbol{footnote
}|. Unfortunately
573 many classes (including the standard classes) and packages use the
574 internal forms directly as in |\@fnsymbol
\c@footnote| so the easy
575 solution of changing |
\fnsymbol| would break code that had worked for
578 Therefore the implementation here makes |\@fnsymbol| itself a
579 non-robust command again and instead uses a new robust command
580 \DescribeMacro{\TextOrMath}|
\TextOrMath|, which will take care of
581 typesetting either the math or the text symbol. In order to do so,
582 we face an age old problem and unsolvable problem in
\TeX: A
583 reliable test for math mode that doesn't destroy
584 kerning. Fortunately this problem can be solved when using e
\TeX\ so
585 if you use this as engine for your
\LaTeX\ format, as recommended by
586 the
\LaTeX3 Project, you will get a fully functioning |
\TextOrMath|
587 command with no side effects. If you use regular
\TeX\ as engine for
588 your
\LaTeX\ format then we have to choose between the lesser of two
589 evils:
1)~breaking ligatures and preventing kerning or
2)~face the
590 risk of choosing text-mode at the beginning of an alignment cell,
591 which was supposed to be math-mode. We have decided upon
1) as is
592 customary for regular robust commands in
\LaTeX.