Typos from KB
[latex2e.git] / latex2e-20151001 / base / ltspace.dtx
blob84ec4431dfa33a829835f5bfe2413d7a1949d5d4
1 % \iffalse meta-comment
3 % Copyright 1993-2015
4 % The LaTeX3 Project and any individual authors listed elsewhere
5 % in this file.
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
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
30 % \iffalse
31 %%% From File: ltspace.dtx
32 %<*driver>
33 % \fi
34 \ProvidesFile{ltspace.dtx}
35              [2015/01/14 v1.3e LaTeX Kernel (spacing)]
36 % \iffalse
37 \documentclass{ltxdoc}
38 \GetFileInfo{ltspace.dtx}
39 \title{\filename}
40 \date{\filedate}
41  \author{%
42   Johannes Braams\and
43   David Carlisle\and
44   Alan Jeffrey\and
45   Leslie Lamport\and
46   Frank Mittelbach\and
47   Chris Rowley\and
48   Rainer Sch\"opf}
49 \begin{document}
50  \MaintainedByLaTeXTeam{latex}
51  \maketitle
52  \DocInput{\filename}
53 \end{document}
54 %</driver>
55 % \fi
57 % \CheckSum{578}
59 % \changes{v1.1a}{1994/05/16}{(ASAJ) Split from ltinit.dtx.}
60 % \changes{v1.2f}{1995/05/25}{Macros moved to ltlists.dtx}
61 % \changes{v1.2n}{1996/04/22}{Documentation Improvements}
62 % \changes{v1.2o}{1996/06/22}{Documentation of problems added}
63 % \changes{v1.2q}{1996/07/27}{Further documentation of problems}
64 % \changes{v1.2r}{1996/07/27}{Correct documentation of problems}
65 % \changes{v1.2w}{1998/08/17}{Documentation fixes.}
68 % \section{Spacing}
70 % This section deals with spacing, and line- and page-breaking.
72 % \subsection{User Commands}
74 % \DescribeMacro\nopagebreak\oarg{i} : \meta{i} = 0,...,4.
76 % Default argument = 4.  Puts a penalty into the vertical list
77 % output as follows:\\
78 %                   0 : penalty = 0\\
79 %                   1 : penalty = |\@lowpenalty|\\
80 %                   2 : penalty = |\@medpenalty|\\
81 %                   3 : penalty = |\@highpenalty|\\
82 %                   4 : penalty = 10000
84 % \DescribeMacro\pagebreak\oarg{i} :
85 %          same as \nopagebreak except negatives of its penalty
87 % \DescribeMacro\linebreak\oarg{i} : analog of the above
89 % \DescribeMacro\nolinebreak\oarg{i} : analog of the above
91 % \DescribeMacro\samepage :
92 % inhibits page breaking most places by setting the
93 % following penalties to 10000:\\
94 %                    |\interlinepenalty|\\
95 %                    |\postdisplaypenalty|\\
96 %                    |\interdisplaylinepenalty|\\
97 %                    |\@beginparpenalty|\\
98 %                    |\@endparpenalty|\\
99 %                    |\@itempenalty|\\
100 %                    |\@secpenalty|\\
101 %                    |\interfootnotelinepenalty|
103 % \DescribeMacro{\\}         : initially defined to be |\newline|
105 % |\\|\oarg{length} : initially defined to be
106 %              |\vspace|\marg{length}|\newline|\\
107 %              Note: |\\*| adds a |\vadjust{\penalty 10000}|
109 % OBSOLETE COMMANDS (which never made it into the manual):
111 % |\obeycr|    : defines <CR> == |\\\relax|\\
112 % |\restorecr| : restores <CR> to its usual meaning.
115 % \StopEventually{}
117 % \subsection{Chris' comments}
119 % There are several aspects of the handling of space in horizontal
120 % mode that are inconsistent or do not work well in some cases.
121 % These are largely concerned with ignoring the effect of space
122 % tokens that would otherwise typeset an inter-word space.
124 % Negating the effect of such space tokens is achieved by two
125 % mechanisms:
126 % \begin{itemize}
127 % \item |\unskip| is used to remove the glue just added by
128 % a space that has already had its effect; it is sometimes
129 % invoked after an |\ifdim| test on |\lastskip| (see below);
130 % \item |\ignorespaces| is used to ignore space-tokens yet to come.
131 % \end{itemize}
133 % The test done on |\lastskip| is sometimes for equality with zero and
134 % sometimes for being positive.  Recall also that the test is only on
135 % the natural length of the glue and that no glue cannot be
136 % distinguished from glue whose natural length is zero: to summarise,
137 % a pretty awful test.  It is not clear why these tests are not all
138 % the same; I think that they should all be for equality.  One place
139 % where |\unskip| is often used is just before a |\par| (which itself
140 % internally does an |\unskip|) and one bit of code (in |\@item|) even
141 % has two |\unskips| before a |\par|.  These uses may be fossil code
142 % but if they are necessary, maybe |\@killglue| would be even safer.
144 % Such removal of glue by |\unskip| may sometimes have the wrong result,
145 % removing not the glue from a space-token but other explicit glue;
146 % this is sometimes not what is intended.
148 % A common way to prevent such removal is to add an |\hskip\z@| after
149 % the glue that should not be removed.  This protects that glue
150 % against one |\unskip| with no test but not against more than one.
151 % It does work for `tested |\unskip|s'.   This is used
152 % by |\hspace*| but not by |\hspace|; this is inconsistent as the star
153 % is supposed to prevent removal only at the beginning of a line, not
154 % at the end, or in a tabular, etc.
156 % If this reason for removing glue were the only consideration then a
157 % tested-|\unskip| and protection by |\hskip\z@| would suffice but
158 % would need to be consistently implemented.
160 % However, the class of invisibles, commands and environments tries to
161 % be even cleverer: one of these tries to leave only one inter-word
162 % space whenever there is one before it and one after it; and it does
163 % this quite well.
165 % But problems can arise when there is not a space-token on
166 % both sides of it; in particular, when an invisible appears at the
167 % beginning or end of a piece of text the method still leaves one space
168 % token whereas usually in these cases it should leave none.
170 % Also, the current rules do not work well when more than one such
171 % command appears consecutively, separated by space-tokens; it leaves
172 % glue between every other invisible.
174 % There is also a question about what these commands should do when
175 % they occur next to spaces that do not come from space tokens but,
176 % for example, from |\hspace|.  Should they still produce `just one
177 % space'?  If so, which one?  It is good to note that the manual
178 % is sufficiently cautious about invisibles that we are not obliged to
179 % make anything work.
181 % Another interesting side-road to explore is whether the space-tokens
182 % either side of an |\hspace{...}| should be ignored.
184 % One alternative to the current algorithm that is often suggested is
185 % that all glue around the invisible  should be consolidated into a
186 % space after it (usually without stating how much glue should be put
187 % there).  The command |\nolinebreak| is implemented this way (and
188 % |\linebreak| should also be). This does not work correctly for the
189 % following common case:
190 % \begin{verbatim}
191 %   ... some text
192 %   \index{some-word}
193 %   some-word and more text.
194 % \end{verbatim}
195 % This is optimal coding since it is normal to index a word that gets
196 % split across a page-break on its starting page.  This would, on the
197 % other hand, fix another common (and documented) failure of the
198 % current system: when the invisible is the last thing in a paragraph
199 % the space before it is not removed and, worse, it is also hidden
200 % from the paragraph-ending mechanism so that an `empty' line can be
201 % created at the end of the paragraph.
203 % Another deficiency (I think) of the current system is that the
204 % following is treated as having the |\index| command between the
205 % paragraphs, which is probably not what the author intended (since
206 % there is no empty line after it).
207 % \begin{verbatim}
209 %   \index{beginnings}
210 %   Beginnings of paragraphs ...
211 % \end{verbatim}
213 % I know of no algorithm that will handle satisfactorily even
214 % all the most common cases; note that it could be that the best
215 % algorithm may be different for different invisibles since,
216 % for example, the common uses and expected behaviour of
217 % |\index|, |\marginpar|, |\linebreak|, |\pagebreak| and
218 % |\vspace| are somewhat different.  [For example, is
219 % |\vspace| ever used in the middle of a paragraph?]
221 % One method that can (and is) used to make invisible commands produce
222 % no space when used at the beginning of text is to put in some glue
223 % that is nearly enough the same as no glue or glue of zero length in
224 % all respects except for the precise test for not being exactly equal
225 % to zero; examples of such glue are |\hskip 1sp| and, possibly better
226 % but more complex, |\hskip -1sp \hskip 1sp|.  However, this only works
227 % when it is known that user-supplied text is about to start.
229 % Some similar concerns apply to the handling of space and penalties
230 % in vertical mode; there is an extra hurdle here as |\unskip| does
231 % not work on the main vertical list.  The complexity of the tests done
232 % by |\addvspace| have never been explained.
234 % The implementation of space hacks etc for vertical mode is another
235 % major area that needs further attention; my earlier experiments
236 % did not produce much improvement over the current unsatisfactory
237 % situation.
239 % One particular problem is what happens when the following very
240 % natural coding is used (part of the problem here is that this looks
241 % like an hmode problem, but it is not):
242 % \begin{verbatim}
243 %   ... end of text.
245 %   \begin{enumerate}
246 %     \item \label{item:xxx} Item text.
247 %   \end{enumerate}
248 % \end{verbatim}
250 % \subsection{Some immediate actions}
252 % \begin{itemize}
253 % \item Fix bug in |\linebreak|.
254 % \item Fix bug in |\\*|.
255 % \item Reimplement |\\|, etc, removing extra |\vadjust|s and getting
256 % better error trapping (this seems to involve a lot more tokens).
257 % \item Investigate whether |\\|, etc need to be errors in vmode; I
258 % think that they could be noops (maybe with a warning).
259 % \item Make all(?) |\unskips| include test for zero skip (rather than
260 %   other tests or no test).
261 % \item Consider replacing |\hskip 1sp| by something better (here
262 %   called an `infinitesimal' skip).
263 % \item Look at all |\hskip\z@| (or similar) to see if they should be
264 %   changed to an `infinitesimal' skip.
265 % \item Resolve the inconsistency between |\hspace| and |\hspace*|.
266 % \item Remove unnecessary |\unskips|.
267 % \item Investigate and rationalise the `newline' code.
268 % \item Find better algorithms for all sorts of things or, easier(?),
269 %   fix \TeX{} itself.
270 % \end{itemize}
272 % \subsection{The code}
274 %    \begin{macrocode}
275 %<*2ekernel>
276 \message{spacing,}
277 %    \end{macrocode}
279 %  \begin{macro}{\pagebreak}
280 %  \begin{macro}{\nopagebreak}
281 % \changes{v1.2h}{1995/07/05}{Reimplemented both using \cs{@no@pgbk}}
282 % \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911}
283 %    \begin{macrocode}
284 \def\pagebreak{\@testopt{\@no@pgbk-}4}
285 \def\nopagebreak{\@testopt\@no@pgbk4}
286 %    \end{macrocode}
287 %  \end{macro}
288 %  \end{macro}
291 %  \begin{macro}{\@no@pgbk}
292 % \changes{v1.2h}{1995/07/05}{Macro replaces \cs{@pgbk}
293 %                 and \cs{@nopgbk}}
294 %    \begin{macrocode}
295 \def\@no@pgbk #1[#2]{%
296   \ifvmode
297     \penalty #1\@getpen{#2}%
298   \else
299     \@bsphack
300     \vadjust{\penalty #1\@getpen{#2}}%
301     \@esphack
302   \fi}
303 %    \end{macrocode}
304 %  \end{macro}
306 %  \begin{macro}{\linebreak}
307 %  \begin{macro}{\nolinebreak}
308 % \changes{v1.2u}{1996/10/29}{Reimplemented both using \cs{@no@lnbk}}
309 % \changes{v1.2j}{1995/10/16}{(DPC) Use \cs{@testopt} /1911}
310 %    \begin{macrocode}
311 \def\linebreak{\@testopt{\@no@lnbk-}4}
312 \def\nolinebreak{\@testopt\@no@lnbk4}
313 %    \end{macrocode}
314 %  \end{macro}
315 %  \end{macro}
316 %  \begin{macro}{\@no@lnbk}
317 % \changes{v1.2u}{1996/10/29}{Macro replaces \cs{@lnbk}
318 %                 and \cs{@nolnbk}}
319 %    \begin{macrocode}
320 \def\@no@lnbk #1[#2]{%
321   \ifvmode
322     \@nolnerr
323   \else
324     \@tempskipa\lastskip
325     \unskip
326     \penalty #1\@getpen{#2}%
327     \ifdim\@tempskipa>\z@
328       \hskip\@tempskipa
329       \ignorespaces
330     \fi
331   \fi}
332 %    \end{macrocode}
333 %  \end{macro}
335 %  \begin{macro}{\samepage}
336 %    \begin{macrocode}
337 \def\samepage{\interlinepenalty\@M
338    \postdisplaypenalty\@M
339    \interdisplaylinepenalty\@M
340    \@beginparpenalty\@M
341    \@endparpenalty\@M
342    \@itempenalty\@M
343    \@secpenalty\@M
344    \interfootnotelinepenalty\@M}
345 %    \end{macrocode}
346 %  \end{macro}
349 %  \begin{macro}{\\}
350 % \changes{v1.2a}{1994/11/11}{(DPC) Make robust}
351 % \changes{v1.2d}{1994/11/14}{(DPC) Macro modified}
353 % \changes{v1.2u}{1996/10/29}{Corrected and rationalised code}
354 % The purpose of the new code is to fix a few bugs; however, it also
355 % attempts to optimize the following, in order of priority:
356 %     \begin{enumerate}
357 %       \item efficient execution of plain |\\|;
358 %       \item efficient execution of |\\[...]|;
359 %       \item memory use;
360 %       \item name-space use.
361 %     \end{enumerate}
362 % The changes should make no difference to the typeset output.
363 % It appears to be safe to use |\reserved@e| and |\reserved@f| here
364 % (other reserved macros are somewhat disastrous).
366 % These changes made |\newline| even less robust than it had been,
367 % so now it is explicitly robust, like |\\|.
368 %  \begin{macro}{\@normalcr}
369 % The internal definition of the `normal' definition of |\\|.
370 %    \begin{macrocode}
371 \DeclareRobustCommand\\{%
372   \let \reserved@e \relax
373   \let \reserved@f \relax
374   \@ifstar{\let \reserved@e \vadjust \let \reserved@f \nobreak
375              \@xnewline}%
376           \@xnewline}
377 \expandafter\let\expandafter\@normalcr
378      \csname\expandafter\@gobble\string\\ \endcsname
379 %    \end{macrocode}
380 %  \end{macro}
381 %  \end{macro}
382 %  \begin{macro}{\newline}
383 % A simple form of the `normal' definition of |\\|.
384 % \changes{v1.2v}{1997/05/07}{Made completely robust.}
385 %    \begin{macrocode}
386 \DeclareRobustCommand\newline{\@normalcr\relax}
387 %    \end{macrocode}
388 %  \end{macro}
390 %  \begin{macro}{\@xnewline}
391 %    \begin{macrocode}
392 \def\@xnewline{\@ifnextchar[% ] bracket matching
393                   \@newline
394                  {\@gnewline\relax}}
395 %    \end{macrocode}
396 %  \end{macro}
398 %  \begin{macro}{\@newline}
399 %    \begin{macrocode}
400 \def\@newline[#1]{\let \reserved@e \vadjust
401                    \@gnewline {\vskip #1}}
402 %    \end{macrocode}
403 %  \end{macro}
405 %  \begin{macro}{\@gnewline}
406 % \changes{v1.2u}{1996/10/29}{Added macro}
407 % The |\nobreak| added to prevent null lines when |\\|
408 % ends an overfull line.  Change made 24 May 89 as suggested by
409 % Frank Mittelbach and Rainer Sch\"opf
410 % \changes{v1.2h}{1995/07/05}{Use \cs{break}}
411 %    \begin{macrocode}
412 \def\@gnewline #1{%
413   \ifvmode
414     \@nolnerr
415   \else
416     \unskip \reserved@e {\reserved@f#1}\nobreak \hfil \break
417   \fi}
418 %    \end{macrocode}
419 %  \end{macro}
422 % \begin{macro}{\@getpen}
423 %    \begin{macrocode}
424 \def\@getpen#1{\ifcase #1 \z@ \or \@lowpenalty\or
425          \@medpenalty \or \@highpenalty
426          \else \@M \fi}
427 %    \end{macrocode}
428 %  \end{macro}
431 % \begin{macro}{\if@nobreak}
432 % \changes{v1.2p}{1996/07/26}{put \cs{global} inside definition}
433 % Switch used to avoid page breaks caused by |\label| after a
434 %      section heading, etc. It should be \textbf{GLOBALLY} set true
435 %      after the  |\nobreak| and \textbf{globally} set false by the
436 %      next invocation of |\everypar|.
438 %      Commands that reset |\everypar| should globally set it false if
439 %      appropriate.
440 %    \begin{macrocode}
441 \def\@nobreakfalse{\global\let\if@nobreak\iffalse}
442 \def\@nobreaktrue {\global\let\if@nobreak\iftrue}
443 \@nobreakfalse
444 %    \end{macrocode}
445 % \end{macro}
449 % \begin{macro}{\@savsk}
450 % \begin{macro}{\@savsf}
451 % Registers used to save the space factor and last skip.
452 %    \begin{macrocode}
453 \newdimen\@savsk
454 \newcount\@savsf
455 %    \end{macrocode}
456 % \end{macro}
457 % \end{macro}
462 %  \begin{macro}{\@bsphack}
463 % \changes{LaTeX2e}{1993/12/08}
464 %         {Command reimplemented; late birthday present for Chris}
465 % \changes{LaTeX2e}{1993/12/08}{Command reimplemented}
466 % \changes{LaTeX2e}{1993/12/16}{Corrected optimisation :-)}
467 %  |\@bsphack| and |\@esphack|
468 %  used by macros such as |\index| and
469 % |\begin{@float}| \ldots |\end{@float}|
470 %  that want to be invisible --- i.e.,
471 %  not leave any extra space when used in the middle of text.  Such
472 %  a macro should begin with |\@bsphack| and end with |\@esphack|
473 %  The macro in question should not create any text, nor change the
474 %  mode.
476 % Before giving the current definition we give an extended definition
477 % that is currently not used (because it doesn't work as advertised:-)
479 %    These are generalised hacks which attempt to do sensible things
480 %    when `invisible commands' appear in vmode too.
482 %    They need to cope with space in both hmode (plus spacefactor) and
483 %    vmode, and also cope with breaks etc.  In vmode this means
484 %    ensuring that any following |\addvspace|, etc sees the correct
485 %    glue in |\lastskip|.
487 %    In fact, these improved versions should be used for other cases
488 %    of `whatsits, thingies etc' which should be invisible.  They are
489 %    only for commands, not environments (see notes on |\@Esphack|).
491 %    BTW, anyone know why the standard hacks are surrounded by
492 %    |\ifmmode\else| rather than simply |\ifhmode|?
494 %    And are there any cases where saving the spacefactor is
495 %    essential?  I have some extensions where it is, but it does not
496 %    appear to be so in the standard uses.
497 %\begin{verbatim}
498 %\def \@bsphack{%
499 %  \relax \ifvmode
500 %    \@savsk \lastskip
501 %    \ifdim \lastskip=\z@
502 %    \else
503 %      \vskip -\lastskip
504 %    \fi
505 %  \else
506 %    \ifhmode
507 %      \@savsk \lastskip
508 %      \@savsf \spacefactor
509 %    \fi
510 %  \fi
512 %\end{verbatim}
513 %    I think that, in vmode, it is the safest to put
514 %    in a |\nobreak| immediately after such things since writes,
515 %    inserts etc followed by glue give valid breakpoints and, in
516 %    general, it is possible to create breaks but impossible to
517 %    destroy them.
518 %\begin{verbatim}
519 %\def \@esphack{%
520 %   \relax \ifvmode
521 %     \nobreak
522 %     \ifdim \@savsk=\z@
523 %     \else
524 %       \vskip\@savsk
525 %     \fi
526 %   \else
527 %     \ifhmode
528 %       \spacefactor \@savsf
529 %       \ifdim \@savsk>\z@
530 %         \ignorespaces
531 %       \fi
532 %     \fi
533 %   \fi
535 %\end{verbatim}
536 %    For the moment we are going to ignore the vertical versions until
537 %    they are correct.
538 % \changes{LaTeX2e}{1993/12/19}{There seem to be problems with selfmade
539 %                           birthday presents}
540 %    \begin{macrocode}
541 \def\@bsphack{%
542   \relax
543   \ifhmode
544     \@savsk\lastskip
545     \@savsf\spacefactor
546   \fi}
547 %    \end{macrocode}
548 % \end{macro}
550 % \begin{macro}{\@esphack}
551 % Companion to |\@bsphack|.
552 % \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}
553 %    \begin{macrocode}
554 %</2ekernel>
555 %<latexrelease>\IncludeInRelease{2015/01/01}%
556 %<latexrelease>                 {\@esphack}{hyphenation after space hack}%
557 %<*2ekernel|latexrelease>
558 \def\@esphack{%
559   \relax
560   \ifhmode
561     \spacefactor\@savsf
562     \ifdim\@savsk>\z@
563       \nobreak \hskip\z@skip
564       \ignorespaces
565     \fi
566   \fi}%
567 %</2ekernel|latexrelease>
568 %<latexrelease>\EndIncludeInRelease
569 %<latexrelease>\IncludeInRelease{0000/00/00}%
570 %<latexrelease>                 {\@esphack}{hyphenation after space hack}%
571 %<latexrelease>\def\@esphack{%
572 %<latexrelease>  \relax
573 %<latexrelease>  \ifhmode
574 %<latexrelease>    \spacefactor\@savsf
575 %<latexrelease>    \ifdim\@savsk>\z@
576 %<latexrelease>      \ignorespaces
577 %<latexrelease>    \fi
578 %<latexrelease>  \fi}%
579 %<latexrelease>\EndIncludeInRelease
580 %<*2ekernel>
581 %    \end{macrocode}
582 % \end{macro}
584 % \begin{macro}{\@Esphack}
585 % A variant of |\@esphack| that sets the |@ignore| switch to
586 %     true (as |\@esphack| used to do previously).
587 % This is currently used only for floats and similar environments.
588 % \changes{v1.2s}{1996/08/02}{Remove \cs{global} before \cs{@ignore...}}
589 % \changes{v1.3d}{2015/01/11}{Allow hyphenation (Donald Arseneau pr/3498) (latexrelease)}w
590 %    \begin{macrocode}
591 %</2ekernel>
592 %<latexrelease>\IncludeInRelease{2015/01/01}%
593 %<latexrelease>                 {\Eesphack}{hyphenation after space hack}%
594 %<*2ekernel|latexrelease>
595 \def\@Esphack{%
596   \relax
597   \ifhmode
598     \spacefactor\@savsf
599     \ifdim\@savsk>\z@
600       \nobreak \hskip\z@skip
601       \@ignoretrue
602       \ignorespaces
603     \fi
604    \fi}%
605 %</2ekernel|latexrelease>
606 %<latexrelease>\EndIncludeInRelease
607 %<latexrelease>\IncludeInRelease{0000/00/00}%
608 %<latexrelease>                 {\@Esphack}{hyphenation after space hack}%
609 %<latexrelease>\def\@Esphack{%
610 %<latexrelease>  \relax
611 %<latexrelease>  \ifhmode
612 %<latexrelease>    \spacefactor\@savsf
613 %<latexrelease>    \ifdim\@savsk>\z@
614 %<latexrelease>      \@ignoretrue
615 %<latexrelease>      \ignorespaces
616 %<latexrelease>    \fi
617 %<latexrelease>   \fi}%
618 %<latexrelease>\EndIncludeInRelease
619 %<*2ekernel>
620 %    \end{macrocode}
621 %  \end{macro}
624 %  \begin{macro}{\@vbsphack}
625 % \changes{LaTeX2e}{1993/12/08}{Command added}
626 %    Another variant which is useful for invisible things which should
627 %    not live in vmode (this is how some people feel about marginals).
629 %    If it occurs in vmode then it enters hmode and ensures that
630 %    |\@savsk| is nonzero so that the |\ignorespaces| is put in later.
631 %    It is not used at present.
632 % \changes{v1.2f}{1995/05/25}{(CAR) not used so `removed'.}
633 %\begin{verbatim}
634 % \def \@vbsphack{ %
635 %    \relax \ifvmode
636 %      \leavevmode
637 %      \@savsk 1sp
638 %      \@savsf \spacefactor
639 %    \else
640 %      \ifhmode
641 %        \@savsk \lastskip
642 %        \@savsf \spacefactor
643 %      \fi
644 %    \fi
645 % }
646 %\end{verbatim}
647 %  \end{macro}
650 % \subsection{Vertical spacing}
653 % \LaTeX\ supports the plain \TeX\ commands
654 % |\smallskip|, |\medskip| and |\bigskip|.
655 % However, it redefines them using |\vspace| instead of |\vskip|.
657 % Extra vertical space is added by the command
658 % |\addvspace|\marg{skip},
659 % which adds a vertical skip of \meta{skip} to the document.
660 % The sequence\\
661 %         |\addvspace|\marg{s1} |\addvspace|\marg{s2}
662 % is equivalent to\\
663 %         |\addvspace|\marg{maximum of s1, s2}.
665 % |\addvspace| should be used only in vertical mode, and gives an
666 % error if it's not.  The |\addvspace| command does \emph{not} add
667 % vertical space if |@minipage| is true. The minipage environment uses
668 % this to inhibit the addition of extra vertical space at the beginning.
670 % Penalties are put into the vertical list with the
671 % |\addpenalty|\marg{penalty}
672 % command.  It works properly when |\addpenalty| and |\addvspace|
673 % commands are mixed.
675 % The |@nobreak| switch is set true used when in vertical mode and no
676 % page break should occur.  (Right now, it is used only by the section
677 % heading commands to inhibit page breaking after a heading.)
680 %\begin{verbatim}
681 % \addvspace{SKIP} ==
682 %  BEGIN
683 %   if vmode
684 %     then if @minipage
685 %            else if \lastskip =0
686 %                    then  \vskip SKIP
687 %                    else  if \lastskip < SKIP
688 %                             then  \vskip -\lastskip
689 %                                   \vskip SKIP
690 %                             else if SKIP < 0 and \lastskip >= 0
691 %                                    then \vskip -\lastskip
692 %                                         \vskip \lastskip + SKIP
693 %          fi      fi       fi      fi
694 %     else useful error message (CAR).
695 %   fi
696 %  END
697 %\end{verbatim}
699 % \begin{macro}{\@xaddvskip}
700 % Internal macro for |\vspace| handling the case that space has
701 % previously been added.
702 %    \begin{macrocode}
703 \def\@xaddvskip{%
704   \ifdim\lastskip<\@tempskipb
705     \vskip-\lastskip
706     \vskip\@tempskipb
707   \else
708     \ifdim\@tempskipb<\z@
709       \ifdim\lastskip<\z@
710       \else
711         \advance\@tempskipb\lastskip
712         \vskip-\lastskip
713         \vskip \@tempskipb
714       \fi
715     \fi
716   \fi}
717 %    \end{macrocode}
718 % \end{macro}
721 %  \begin{macro}{\addvspace}
722 % \changes{v1.2b}{1994/11/12}{Corrected error message}
723 % \changes{v1.2c}{1994/11/13}{Recorrected error message}
724 %  Add vertical space taking into account space already added, as
725 %  described above.
726 %    \begin{macrocode}
727 \def\addvspace#1{%
728   \ifvmode
729      \if@minipage\else
730        \ifdim \lastskip =\z@
731          \vskip #1\relax
732        \else
733        \@tempskipb#1\relax
734          \@xaddvskip
735        \fi
736      \fi
737   \else
738     \@noitemerr
739   \fi}
740 %    \end{macrocode}
741 %  \end{macro}
743 %  \begin{macro}{\addpenalty}
744 % \changes{v1.2b}{1994/11/12}{Corrected error message}
745 % \changes{v1.2c}{1994/11/13}{Recorrected error message}
746 % \changes{v1.1h}{2015/01/09}{Donald Arseneau's fix from PR/377703 (latexrelease)}
747 %    \begin{macrocode}
748 %</2ekernel>
749 %<latexrelease>\IncludeInRelease{2015/01/01}%
750 %<latexrelease>                 {\addpenalty}{\addpenalty}%
751 %<*2ekernel|latexrelease>
752 %    \end{macrocode}
753 %   Fix provided by Donald (though the original fix was not good
754 %   enough).  In 2005 Plamen Tanovski discovered that this fix wasn't
755 %   good enough either as the \cs{vskip} kept getting bigger if
756 %   several \cs{addpenalty} commands followed each other. Donald
757 %   kindly send a new fix.
758 %    \begin{macrocode}
759 \def\addpenalty#1{%
760   \ifvmode
761     \if@minipage
762     \else
763       \if@nobreak
764       \else
765         \ifdim\lastskip=\z@
766           \penalty#1\relax
767         \else
768           \@tempskipb\lastskip
769 %    \end{macrocode}
770 %    We have to make sure the final \cs{vskip} seen by \TeX\ is the
771 %    correct one, namely \cs{@tempskipb}. However we may have to
772 %    adjust for \cs{prevdepth} when placing the penalty but that
773 %    should not affect the skip we pass on to \TeX.
774 % \changes{v1.3e}{2015/01/14}{Avoid adding redundant skips (DPC)}
775 %    \begin{macrocode}
776           \begingroup
777             \@tempskipa\@tempskipb
778             \advance \@tempskipb
779               \ifdim\prevdepth>\maxdepth\maxdepth\else
780 %    \end{macrocode}
781 %    If |\prevdepth| is -1000pt due to |\nointerlineskip| we better
782 %    not add it!
783 %    \begin{macrocode}
784                  \ifdim \prevdepth = -\@m\p@ \z@ \else \prevdepth \fi
785                \fi
786              \vskip -\@tempskipb
787              \penalty#1%
788              \ifdim\@tempskipa=\@tempskipb
789 %    \end{macrocode}
790 % Do nothing if the |\prevdepth| check made no adjustment.
791 %    \begin{macrocode}
792              \else
793 %    \end{macrocode}
794 % Combine the prevdepth adjustment into a single skip.
795 %    \begin{macrocode}
796                \advance\@tempskipb -\@tempskipa
797                \vskip \@tempskipb
798              \fi
799 %    \end{macrocode}
800 % The final skip is always the specified length.
801 %    \begin{macrocode}
802              \vskip \@tempskipa
803           \endgroup
804         \fi
805       \fi
806     \fi
807   \else
808     \@noitemerr
809   \fi}%
810 %    \end{macrocode}
812 %    \begin{macrocode}
813 %</2ekernel|latexrelease>
814 %<latexrelease>\EndIncludeInRelease
815 %<latexrelease>\IncludeInRelease{0000/00/00}%
816 %<latexrelease>                 {\addpenalty}{\addpenalty}%
817 %<latexrelease>\def\addpenalty#1{%
818 %<latexrelease>  \ifvmode
819 %<latexrelease>    \if@minipage
820 %<latexrelease>    \else
821 %<latexrelease>      \if@nobreak
822 %<latexrelease>      \else
823 %<latexrelease>        \ifdim\lastskip=\z@
824 %<latexrelease>          \penalty#1\relax
825 %<latexrelease>        \else
826 %<latexrelease>          \@tempskipb\lastskip
827 %<latexrelease>          \vskip -\lastskip
828 %<latexrelease>          \penalty#1%
829 %<latexrelease>          \vskip\@tempskipb
830 %<latexrelease>        \fi
831 %<latexrelease>      \fi
832 %<latexrelease>    \fi
833 %<latexrelease>  \else
834 %<latexrelease>    \@noitemerr
835 %<latexrelease>  \fi}%
836 %<latexrelease>\EndIncludeInRelease
837 %<*2ekernel>
838 %    \end{macrocode}
839 %  \end{macro}
841 % \begin{macro}{\vspace}
842 % \changes{v1.2m}{1996/01/20}{Made robust}
843 % \begin{macro}{\@vspace}
844 % \begin{macro}{\@vspacer}
845 % \changes{v1.2f}{1995/05/25}
846 %         {(CAR) macros modified to be more efficient}
847 % \changes{v1.2f}{1995/05/25}{(CAR) \cs{@restorepar} added to avoid
848 %   possible infinite tail recursion caused by a typo in the argument.}
849 %    The new code for these commands depends on the following facts:
850 %    \begin{itemize}
851 %      \item The value of prevdepth is changed only when a box or rule
852 %        is created and added to a vertical list;
853 %      \item The value of prevdepth is used only when a box is created
854 %        and added to a vertical list;
855 %      \item The value of prevdepth is always local to the building of
856 %        one vertical list.
857 %    \end{itemize}
858 %    \begin{macrocode}
859 \DeclareRobustCommand\vspace{\@ifstar\@vspacer\@vspace}
860 \def\@vspace #1{%
861   \ifvmode
862     \vskip #1
863     \vskip\z@skip
864    \else
865      \@bsphack
866      \vadjust{\@restorepar
867               \vskip #1
868               \vskip\z@skip
869               }%
870      \@esphack
871    \fi}
872 %    \end{macrocode}
874 %    \begin{macrocode}
875 \def\@vspacer#1{%
876   \ifvmode
877     \dimen@\prevdepth
878     \hrule \@height\z@
879     \nobreak
880     \vskip #1
881     \vskip\z@skip
882     \prevdepth\dimen@
883   \else
884     \@bsphack
885     \vadjust{\@restorepar
886              \hrule \@height\z@
887              \nobreak
888              \vskip #1
889              \vskip\z@skip}%
890     \@esphack
891   \fi}
892 %    \end{macrocode}
893 % \end{macro}
894 % \end{macro}
895 % \end{macro}
897 % \begin{macro}{\smallskip}
898 % \begin{macro}{\medskip}
899 % \begin{macro}{\bigskip}
900 %    \begin{macrocode}
901 \def\smallskip{\vspace\smallskipamount}
902 \def\medskip{\vspace\medskipamount}
903 \def\bigskip{\vspace\bigskipamount}
904 %    \end{macrocode}
905 % \end{macro}
906 % \end{macro}
907 % \end{macro}
909 % \begin{macro}{\smallskipamount}
910 % \begin{macro}{\medskipamount}
911 % \begin{macro}{\bigskipamount}
912 %    \begin{macrocode}
913 \newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt
914 \newskip\medskipamount   \medskipamount  =6pt plus 2pt minus 2pt
915 \newskip\bigskipamount   \bigskipamount =12pt plus 4pt minus 4pt
916 %    \end{macrocode}
917 % \end{macro}
918 % \end{macro}
919 % \end{macro}
923 % \subsection{Horizontal space (and breaks)}
925 % \begin{macro}{\nobreakdashes}
926 % \changes{v1.3}{2004/02/04}{(Macro added}
927 % \changes{v1.3a}{2004/02/15}{(Added spacefactor setting}
928 %    This idea is borrowed from the \textsf{amsmath} package but
929 %    here we define a robust command.
931 %    This command is a low-level command designed for use only before
932 %    hyphens or dashes (such as |-|, |--|, or |---|).
934 %    It could probably be better implemented: it may need its own
935 %    private token register and temporary command.
937 %    Setting the hyphen in a box and then unboxing it means that the
938 %    normal penalty will not be added after it---and if the penalty is
939 %    not there a break will not be taken (unless an explicit penalty
940 %    or glue follows, thus the final \verb=\nobreak=).
942 %    Note that even if it is not followed by a `-', it still leaves
943 %    vmode and sets the spacefactor; so use it carefully!
945 %    \begin{macrocode}
946 \DeclareRobustCommand{\nobreakdashes}{%
947   \leavevmode
948   \toks@{}%
949   \def\reserved@a##1{\toks@\expandafter{\the\toks@-}%
950                      \futurelet\@let@token \reserved@b}%
951   \def\reserved@b   {\ifx\@let@token -%
952                         \expandafter\reserved@a
953                      \else
954                        \setbox\z@ \hbox{\the\toks@\nobreak}%
955                        \unhbox\z@
956                        \spacefactor\sfcode`\-
957                      \fi}%
958   \futurelet\@let@token \reserved@b
960 %    \end{macrocode}
961 % \end{macro}
963 % \begin{macro}{\nobreakspace}
964 % \changes{v1.2k}{1995/12/04}{(Macro added}
965 % \begin{macro}{\@xobeysp}
966 % \changes{v1.2t}{1996/09/28}{Moved from ltmiscen.dtx and redefined to
967 %                 use \cs{nobreakspace }}
969 %   This is a robust command that produces a horizontal space at
970 %   which, in paragraph-mode, a line-break is not possible.  We then
971 %   define an active |~| to expand to it since this is the documented
972 %   behaviour of |~|.  One reason for introducing this is that some
973 %   8-bit input encodings have a slot for such a space and we do not
974 %   want to use active characters as the \LaTeX{} internal commands.
976 %   The braces in the definition of |~| are needed to ensure that a
977 %   following space is preserved when reading to/from internal files.
978 % \changes{v1.2l}{1995/12/04}{(braces added to definition of tilde}
980 %   We need to keep \cs{@xobeysp} as it is widely used; so here it is
981 %   let to the non-robust command \cs{nobreakspace }.
983 %    \begin{macrocode}
984 \DeclareRobustCommand{\nobreakspace}{%
985    \leavevmode\nobreak\ }
986 \catcode `\~=13
987 \def~{\nobreakspace{}}
988 \expandafter\let\expandafter\@xobeysp\csname nobreakspace \endcsname
989 %    \end{macrocode}
990 % \end{macro}
991 % \end{macro}
993 %    \begin{macrocode}
994 %    \end{macrocode}
997 % \begin{macro}{\,}
998 %   Used in paragraph mode produces a |\thinspace|.  It has the
999 %   ordinary definition in math mode.  Useful for quotes inside quotes,
1000 %   as in  |``\,`Foo', he said.''|
1001 % \changes{v1.0o}{1994/05/11}{Use \cs{DeclareRobustCommand}. ASAJ.}
1002 %    \begin{macrocode}
1003 \DeclareRobustCommand{\,}{%
1004    \relax\ifmmode\mskip\thinmuskip\else\thinspace\fi
1006 %    \end{macrocode}
1007 % \end{macro}
1009 % \begin{macro}{\@}
1010 %     Placed before a '.', makes it a sentence-ending period.  Does the
1011 %     right thing for other punctuation marks as well.  Does this by
1012 %     setting spacefactor to 1000.
1013 % \changes{v1.3b}{2014/12/30}{\cs{@} discards spaces when moving
1014 %             (pr3039)(latexrelease)}
1015 %    \begin{macrocode}
1016 %</2ekernel>
1017 %<latexrelease>\IncludeInRelease{2015/01/01}%
1018 %<latexrelease>                 {\@}{Space after \@}%
1019 %<*2ekernel|latexrelease>
1020 %    \end{macrocode}
1021 %    \begin{macrocode}
1022 \def\@{\spacefactor\@m{}}%
1023 %</2ekernel|latexrelease>
1024 %<latexrelease>\EndIncludeInRelease
1025 %<latexrelease>\IncludeInRelease{0000/00/00}%
1026 %<latexrelease>                 {\@}{Space after \@}%
1027 %<latexrelease>\def\@{\spacefactor\@m}%
1028 %<latexrelease>\EndIncludeInRelease
1029 %<*2ekernel>
1030 %    \end{macrocode}
1031 % \end{macro}
1034 % \begin{macro}{\hspace}
1035 % \changes{v1.0o}{1994/05/11}{Use \cs{DeclareRobustCommand}. ASAJ.}
1036 %    \begin{macrocode}
1037 \DeclareRobustCommand\hspace{\@ifstar\@hspacer\@hspace}
1038 %    \end{macrocode}
1039 % \end{macro}
1041 % \begin{macro}{\@hspace}
1042 % \changes{LaTeX2e}{1993/08/05}
1043 %    {(RmS) Removed superfluous \cs{leavevmode} in \cs{@hspace} and
1044 %               \cs{@hspacer}, as suggested by CAR.}
1045 %    \begin{macrocode}
1046 \def\@hspace#1{\hskip #1\relax}
1047 %    \end{macrocode}
1048 % \end{macro}
1051 % \begin{macro}{\@hspacer}
1052 % extra |\hskip 0pt| added 1985/17/12 to guard
1053 % against a following |\unskip|
1054 % |\relax| added 13 Oct 88 for usual \TeX\ lossage
1055 % replaced both changes by |\hskip\z@skip| 27 Nov 91
1056 %    \begin{macrocode}
1057 \def\@hspacer#1{\vrule \@width\z@\nobreak
1058                 \hskip #1\hskip \z@skip}
1059 %    \end{macrocode}
1060 % \end{macro}
1064 % \begin{macro}{\fill}
1065 %    \begin{macrocode}
1066 \newskip\fill
1067 \fill = 0pt plus 1fill
1068 %    \end{macrocode}
1069 % \end{macro}
1073 % \begin{macro}{\stretch}
1074 %    \begin{macrocode}
1075 \def\stretch#1{\z@ \@plus #1fill\relax}
1076 %    \end{macrocode}
1077 % \end{macro}
1082 % \begin{macro}{\thinspace}
1083 % \begin{macro}{\negthinspace}
1084 % \begin{macro}{\enspace}
1085 %    \begin{macrocode}
1086 \def\thinspace{\kern .16667em }
1087 \def\negthinspace{\kern-.16667em }
1088 \def\enspace{\kern.5em }
1089 %    \end{macrocode}
1090 % \end{macro}
1091 % \end{macro}
1092 % \end{macro}
1094 % \begin{macro}{\enskip}
1095 % \begin{macro}{\quad}
1096 % \begin{macro}{\qquad}
1097 %    \begin{macrocode}
1098 \def\enskip{\hskip.5em\relax}
1099 \def\quad{\hskip1em\relax}
1100 \def\qquad{\hskip2em\relax}
1101 %    \end{macrocode}
1102 % \end{macro}
1103 % \end{macro}
1104 % \end{macro}
1106 % \begin{macro}{\obeycr}
1107 % \begin{macro}{\restorecr}
1108 % The following definitions will probably get deleted or moved to
1109 % compatibility mode soon.
1111 % \changes{v1.2g}{1995/06/11}
1112 %                {(CAR) \cs{relax} added to stop silent eating of *.}
1113 %    \begin{macrocode}
1114 {\catcode`\^^M=13 \gdef\obeycr{\catcode`\^^M13 \def^^M{\\\relax}%
1115     \@gobblecr}%
1116 {\catcode`\^^M=13 \gdef\@gobblecr{\@ifnextchar
1117 \@gobble\ignorespaces}}
1118 \gdef\restorecr{\catcode`\^^M5 }}
1119 %    \end{macrocode}
1120 % \end{macro}
1121 % \end{macro}
1123 %    \begin{macrocode}
1124 %</2ekernel>
1125 %    \end{macrocode}
1127 % \Finale
1128 \endinput