Move a tag
[latex2e.git] / latex2e-20160201 / required / tools / xspace.dtx
blob75d6426d335cae09b276831b6a9de1604b41796d
1 % \iffalse meta-comment
3 % Copyright 1993-2014
5 % The LaTeX3 Project and any individual authors listed elsewhere
6 % in this file.
8 % This file is part of the Standard LaTeX `Tools Bundle'.
9 % -------------------------------------------------------
11 % It may be distributed and/or modified under the
12 % conditions of the LaTeX Project Public License, either version 1.3c
13 % of this license or (at your option) any later version.
14 % The latest version of this license is in
15 %    http://www.latex-project.org/lppl.txt
16 % and version 1.3c or later is part of all distributions of LaTeX
17 % version 2005/12/01 or later.
19 % The list of all files belonging to the LaTeX `Tools Bundle' is
20 % given in the file `manifest.txt'.
22 % \fi
23 % \iffalse
24 %% File: xspace.dtx Copyright (C) 1991-1997 David Carlisle
25 %% File: xspace.dtx Copyright (C) 2004-2006 David Carlisle,
26 %%                                          Morten H\o gholm
28 %<*dtx>
29           \ProvidesFile{xspace.dtx}
30 %</dtx>
31 %<package>\NeedsTeXFormat{LaTeX2e}
32 %<package>\ProvidesPackage{xspace}
33 %<driver>\ProvidesFile{xspace.drv}
34 % \fi
35 %         \ProvidesFile{xspace.dtx}
36           [2014/10/28 v1.13 Space after command names (DPC,MH)]
38 % \iffalse
39 %<*driver>
40 \documentclass{ltxdoc}
41 \makeatletter
42 \providecommand*\eTeX{{%
43   \if b\expandafter\@car\f@series\@nil\boldmath\fi$\m@th
44   \varepsilon$-\TeX}}
45 \makeatother
46 \usepackage{xspace}[2006/05/08]
47 \begin{document}
48 \DocInput{xspace.dtx}
49 \end{document}
50 %</driver>
51 % \fi
53 % \GetFileInfo{xspace.dtx}
54 % \title{The \textsf{xspace} package\thanks{This file
55 %        has version number \fileversion, last
56 %        revised \filedate.}}
57 % \author{David Carlisle \and Morten H\o gholm}
58 % \date{\filedate}
59 % \MaintainedByLaTeXTeam{tools}
60 % \maketitle
62 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
64 % \CheckSum{218}
66 % \changes{v1.00}{1991/08/30}{Initial version}
67 % \changes{v1.01}{1992/06/26}{Re-issue for the new doc and docstrip}
68 % \changes{v1.02}{1994/01/31}{Re-issue for LaTeX2e (no change to
69 %   code)}
70 % \changes{v1.07}{2004/12/07}{Make extensible. tools/3712}
71 % \changes{v1.07}{2004/12/07}{Fix active characters. tools/3747}
72 % \changes{v1.07}{2004/12/07}{Update documentation}
73 % \changes{v1.08}{2005/05/07}{Better fix for active characters}
74 % \changes{v1.09}{2005/07/26}{Improve test by exiting if
75 %   \cs{@let@token} is a letter}
76 % \changes{v1.10}{2005/10/04}{Use higher level functions for
77 % conditional processing}
78 % \changes{v1.10}{2005/10/04}{Improve expansion method}
80 % \begin{abstract}
81 % |\xspace| should be used at the end of a macro designed to
82 % be used mainly in text. It adds a space unless the macro is
83 % followed by certain punctuation characters.
84 % \end{abstract}
86 % \section{Introduction}
87 % \newcommand{\gb}{Great Britain\xspace}\DescribeMacro{\xspace}
88 % After defining |\newcommand{\gb}{Great Britain\xspace}|,
89 % the command |\gb| will determine when to insert a space
90 % after itself and when not. Thus the input
91 % \begin{quote}
92 % |\gb is a very nice place to live.\\| \\
93 % |\gb, a small island off the coast of France.\\|\\
94 % |\gb\footnote{The small island off the coast of France.}|\\
95 % |is a very nice place to live.|
96 % \end{quote}
97 % results in the output
98 % \begin{quote}
99 % \gb is a very nice place to live. \\
100 % \gb, a small island off the coast of France.\\
101 % \gb\footnote{The small island off the coast of France.}
102 % is a very nice place to live.
103 % \end{quote}
104 % |\xspace| saves the user from having to type \verb*+\ + or
105 % |{}| after most occurrences of a macro name in text.
106 % However if either of these constructions follows |\xspace|,
107 % a space is not added by |\xspace|. This means that it is
108 % safe to add |\xspace| to the end of an existing macro
109 % without making too many changes in your document. In particular,
110 % |\xspace| will always insert a space if the thing following it is
111 % a normal letter which is the usual case.
113 % Sometimes |\xspace| may make the wrong decision, and add a
114 % space when it is not required. There may be different
115 % reasons for this behavior but it can always be handled by
116 % following the macro with |{}|, as this has the effect of
117 % suppressing the space.
120 % \subsection{Adding new exceptions}
122 % One of the most common reasons for |\xspace| to add an
123 % unwanted space is when it is followed by a macro not on its
124 % list of exceptions.
125 % \DescribeMacro{\xspaceaddexceptions}%
126 % With |\xspaceaddexceptions| you can add new commands or
127 % characters to be recognized by |\xspace|'s scanning
128 % mechanism. Users of advanced footnote packages like
129 % \textsf{manyfoot} will often define new footnote macros
130 % that should not cause a command ``enhanced'' with |\xspace|
131 % to insert a space. If you define the additional footnote
132 % macros |\footnoteA| and |\footnoteB|, simply add the
133 % following line to your preamble:
134 % \begin{quote}
135 % |\xspaceaddexceptions{\footnoteA \footnoteB}|
136 % \end{quote}
139 % \subsection{Support for active characters}
142 % The other common instance of |\xspace| not working quite right
143 % happens with active characters. Generally this package must be
144 % loaded \emph{after} any language (or other) packages that make
145 % punctuation characters `active'. This makes it difficult for
146 % \textsf{xspace} to work flawlessly with the popular \textsf{babel}
147 % package especially since the punctuation characters can switch
148 % between being `active' and `other'. Starting at \textsf{xspace}
149 % version~1.08 there are two different ways to handle this depending
150 % on which engine your \LaTeX-format uses:
151 % \begin{description}
152 %   \item[\TeX] The punctuation characters are added to the
153 %   exception list in both their normal and active states thus
154 %   ensuring that they are always recognized.
155 %   \item[\eTeX] The characters are re-read when going through
156 %   the exception list which means the internal comparison will test
157 %   against the current state of the character. This works for
158 %   whatever category code tricks some packages may use.
159 % \end{description}
161 % At the time of writing all major \TeX\ distributions are using
162 % \eTeX\ as engine for \LaTeX\ so usually everything should work out
163 % of the box. If you find that you're running normal \TeX\ and
164 % |\xspace| seems to be making the wrong choice then either use |{}|
165 % as described above to fix it or add the character to the list but
166 % with the desired category code. See the implementation for an example
167 % of how to do that.
169 % \subsection{Still not satisfied?}
171 % Some people don't like the default list of exceptions so they can
172 % remove one item at a time with the command
173 % \DescribeMacro{\xspaceremoveexception}^^A
174 % \cs{xspaceremoveexception}\marg{token}.  Furthermore the command
175 % \DescribeMacro{\@xspace@hook}\cs{@xspace@hook} can be redefined to
176 % scan forward in the input stream in case you want to check more
177 % tokens. It is called after \cs{xspace} has determined if it needed
178 % to insert a space or if an exception was found (the default
179 % definition is for \cs{@xspace@hook} to be empty). Hence you can use
180 % \cs{unskip} to remove the space inserted if \cs{@let@token} matches
181 % something special. Below is an example of how one can make sure an
182 % endash gets a space inserted before it but a single dash not.
183 % \begin{verbatim}
184 % \xspaceremoveexception{-}
185 % \makeatletter
186 % \renewcommand*\@xspace@hook{%
187 %   \ifx\@let@token-%
188 %     \expandafter\@xspace@dash@i
189 %   \fi
190 % }
191 % \def\@xspace@dash@i-{\futurelet\@let@token\@xspace@dash@ii}
192 % \def\@xspace@dash@ii{%
193 %   \ifx\@let@token-%
194 %   \else
195 %     \unskip
196 %   \fi
197 %   -%
198 % }
199 % \makeatother
200 % \end{verbatim}
203 % \StopEventually{}
205 % \section{The Macros}
207 % |\xspace| peeks ahead for the next token. If the token is in our
208 % exception list we break the loop and do nothing; else we try to
209 % expand the token once and start over again. If this leads us to an
210 % unexpandable token without finding one of the exceptions we insert a
211 % space.
213 %    \begin{macrocode}
214 %<*package>
215 %    \end{macrocode}
217 % \begin{macro}{\xspace}
218 % |\xspace| just looks ahead, and then calls |\@xspace|.
219 % \changes{v1.03}{1994/11/15}{Make robust}
220 %    \begin{macrocode}
221 \DeclareRobustCommand\xspace{\@xspace@firsttrue
222   \futurelet\@let@token\@xspace}
223 %    \end{macrocode}
224 % \end{macro}
226 % \begin{macro}{\if@xspace@first}
227 % \changes{v1.11}{2006/02/12}{Added macro}
228 % \begin{macro}{\@xspace@simple}
229 % \changes{v1.11}{2006/02/12}{Added macro}
230 % Some helpers to avoid multiple calls of |\@xspace@eTeX@setup|.
231 %    \begin{macrocode}
232 \newif\if@xspace@first
233 \def\@xspace@simple{\futurelet\@let@token\@xspace}
234 %    \end{macrocode}
235 % \end{macro}
236 % \end{macro}
238 % \begin{macro}{\@xspace@exceptions@tlp}
239 % \changes{v1.07}{2004/12/07}{Added macro}
240 % The exception list. If the scanning mechanism finds one of
241 % these, it won't insert a space after the command. The
242 % \texttt{tlp} in the name means `token list pointer.'
243 %    \begin{macrocode}
244 \def\@xspace@exceptions@tlp{%
245   ,.'/?;:!~-)\ \/\bgroup\egroup\@sptoken\space\@xobeysp
246   \footnote\footnotemark
247   \xspace@check@icr
249 %    \end{macrocode}
250 % And here we get the non-empty definition of \cs{check@icr}.
251 % \changes{v1.13}{2009/10/20}{fix for "tools/3895": `text font commands fool xspace'}
252 %    \begin{macrocode}
253 \begingroup
254   \text@command\relax
255   \global\let\xspace@check@icr\check@icr
256 \endgroup
257 %    \end{macrocode}
258 % \end{macro}
260 % \begin{macro}{\xspaceaddexceptions}
261 % \changes{v1.07}{2004/12/07}{Added macro}
262 % The user command, which just adds tokens to the list.
263 %    \begin{macrocode}
264 \newcommand*\xspaceaddexceptions{%
265   \g@addto@macro\@xspace@exceptions@tlp
267 %    \end{macrocode}
268 % \end{macro}
269 % \begin{macro}{\xspaceremoveexception}
270 % \changes{v1.10}{2005/10/04}{Use higher level functions for
271 % conditional processing}
272 % This command removes an exception globally.
273 %    \begin{macrocode}
274 \newcommand*\xspaceremoveexception[1]{%
275 %    \end{macrocode}
276 % First check that it is in the list at all.
277 %    \begin{macrocode}
278   \def\reserved@a##1#1##2##3\@@{%
279     \@xspace@if@q@nil@NF##2{%
280 %    \end{macrocode}
281 % It's in the list, remove it.
282 %    \begin{macrocode}
283       \def\reserved@a####1#1####2\@@{%
284         \gdef\@xspace@exceptions@tlp{####1####2}}%
285       \expandafter\reserved@a\@xspace@exceptions@tlp\@@
286     }%
287   }%
288   \expandafter\reserved@a\@xspace@exceptions@tlp#1\@xspace@q@nil\@@
290 %    \end{macrocode}
291 % \end{macro}
293 % \begin{macro}{\@xspace@break@loop}
294 % \changes{v1.08}{2005/04/28}{Added macro}
295 % \changes{v1.10}{2005/10/04}{Use quark instead}
296 % To stop the loop.
297 %    \begin{macrocode}
298 \def\@xspace@break@loop#1\@nil{}
299 %    \end{macrocode}
300 % \end{macro}
302 % \begin{macro}{\@xspace@hook}
303 % \changes{v1.09}{2005/07/26}{Added macro}
304 % A hook for users with special needs.
305 %    \begin{macrocode}
306 \providecommand*\@xspace@hook{}
307 %    \end{macrocode}
308 % \end{macro}
310 % Now we check if we're running \eTeX. We can't use \cs{@ifundefined}
311 % as that will lock catcodes and we need to change some of those.
312 % As there is a small risk that someone already set \cs{eTeXversion}
313 % to \cs{relax} by accident we make sure we check for that case but
314 % without setting it to \cs{relax} if it wasn't already.
315 %    \begin{macrocode}
316 \begingroup\expandafter\expandafter\expandafter\endgroup
317   \expandafter\ifx\csname eTeXversion\endcsname\relax
318 %    \end{macrocode}
319 % If we are running normal \TeX\ we add the most common cases of active
320 % punctuation characters. First we make them active.
321 %    \begin{macrocode}
322   \begingroup
323     \catcode`\;=\active  \catcode`\:=\active
324     \catcode`\?=\active  \catcode`\!=\active
325 %    \end{macrocode}
326 %  The \texttt{alltt} environment also makes |,|, |'|, and |-| active
327 %  so we add them as well.
328 %    \begin{macrocode}
329     \catcode`\,=\active  \catcode`\'=\active  \catcode`\-=\active
330     \xspaceaddexceptions{;:?!,'-}
331   \endgroup
332   \let\@xspace@eTeX@setup\relax
333 %    \end{macrocode}
334 % \begin{macro}{\@xspace@eTeX@setup}
335 % \changes{v1.10}{2005/10/04}{Added macro}
336 % \changes{v1.12}{2006/05/08}{Bug fix for verbatim in output routine}
337 % When we're running \eTeX, we have the advantage of \cs{scantokens}
338 % which will rescan tokens with current catcodes. This little
339 % expansion trick makes sure that the exception list is redefined to
340 % itself but with the contents of it exposed to the current catcode
341 % regime. That is why we must make sure the catcode of space is 10,
342 % since we have a \verb*|\ | inside the list.
343 %    \begin{macrocode}
344 \else
345   \def\@xspace@eTeX@setup{%
346     \begingroup
347       \everyeof{}%
348       \endlinechar=-1\relax
349       \catcode`\ =10\relax
350       \makeatletter
351 %    \end{macrocode}
352 % We may also be so unfortunate that the re-reading of the list takes
353 % place when the catcodes of |\|, |{| and |}| are ``other,'' e.g., if
354 % it takes place in a header and the output routine was called in the
355 % middle of a \texttt{verbatim} environment.
356 %    \begin{macrocode}
357       \catcode`\\\z@
358       \catcode`\{\@ne
359       \catcode`\}\tw@
360       \scantokens\expandafter{\expandafter\gdef
361         \expandafter\@xspace@exceptions@tlp
362         \expandafter{\@xspace@exceptions@tlp}}%
363     \endgroup
364   }
366 %    \end{macrocode}
367 % \end{macro}
368 % \begin{macro}{\@xspace}
369 % \changes{v1.03}{1994/11/15}{Add exclamation mark}
370 % \changes{v1.04}{1996/05/17}{Add slash}
371 % \changes{v1.05}{1996/12/06}{Add space for alltt etc. tools/2322}
372 % \changes{v1.06}{1997/10/13}{Add normal space. tools/2632}
373 % \changes{v1.07}{2004/12/07}{Now runs through a list of exceptions}
374 % \changes{v1.07}{2004/12/07}{Added \cs{footnote} and
375 % \cs{footnotemark}}
376 % \changes{v1.08}{2005/05/07}{Use recursive loop instead of \cs{@tfor}}
377 % \changes{v1.09}{2005/07/26}{Only check non-letters and add hook}
378 % \changes{v1.10}{2005/10/04}{Use higher level functions for
379 % conditional processing}
380 % \changes{v1.10}{2005/10/04}{Improve expansion method}
381 % If the next token is one of a specified list of characters,
382 % do nothing, otherwise add a space. With version~1.07 the
383 % approach was altered dramatically to run through the
384 % exception list |\@xspace@exceptions@tlp| and check each
385 % token one at a time.
386 %    \begin{macrocode}
387 \def\@xspace{%
388 %    \end{macrocode}
389 % Before we start checking the exception list it makes sense to
390 % perform a quick check on the token in question. Most of the time
391 % \cs{xspace} is used in regular text so \cs{@let@token} is set equal
392 % to a letter. In that case there is no point in checking the list
393 % because it will definitely not contain any tokens with catcode~11.
395 % You may wonder why there are special functions here instead of
396 % simpler \cs{ifx} conditionals. The reason is that a)~this way we
397 % don't have to add many, many \cs{expandafter}s to get the nesting
398 % right and b)~we don't get into trouble when \cs{@let@token} has been
399 % let equal to \cs{if} etc.
400 %    \begin{macrocode}
401   \@xspace@lettoken@if@letter@TF \space{%
402 %    \end{macrocode}
403 % Otherwise we start testing after setting up a few things. If running
404 % \eTeX{} we rescan the catcodes but only the first time around.
405 %    \begin{macrocode}
406     \if@xspace@first
407       \@xspace@firstfalse
408       \let\@xspace@maybespace\space
409       \@xspace@eTeX@setup
410     \fi
411     \expandafter\@xspace@check@token
412       \@xspace@exceptions@tlp\@xspace@q@nil\@nil
413 %    \end{macrocode}
414 % If an exception was found \cs{@xspace@maybespace} is let to
415 % \cs{relax} and we do nothing.
416 %    \begin{macrocode}
417     \@xspace@token@if@equal@NNT \space \@xspace@maybespace
418 %    \end{macrocode}
419 % Otherwise we check to see if we found something expandable and try
420 % again with that token one level expanded. If no expandable token is
421 % found we insert a space and then execute the hook.
422 %    \begin{macrocode}
423     {%
424       \@xspace@lettoken@if@expandable@TF
425       {\expandafter\@xspace@simple}%
426       {\@xspace@maybespace\@xspace@hook}%
427     }%
428   }%
430 %    \end{macrocode}
431 % \end{macro}
433 % \begin{macro}{\@xspace@check@token}
434 % \changes{v1.07}{2004/12/07}{Added macro}
435 % \changes{v1.08}{2005/05/07}{Made function recursive}
436 % \changes{v1.10}{2005/10/04}{Use higher level functions for
437 % conditional processing}
438 % \changes{v1.11}{2006/02/12}{Modified so the \cs{@let@token} can be
439 %   \cs{outer}}
440 % This macro just checks the current item in the exception list
441 % against the \cs{@let@token}. If they are equal we make sure that no
442 % space is inserted and break the loop.
443 %    \begin{macrocode}
444 \def\@xspace@check@token #1{%
445   \ifx\@xspace@q@nil#1%
446     \expandafter\@xspace@break@loop
447   \fi
448   \expandafter\ifx\csname @let@token\endcsname#1%
449     \let\@xspace@maybespace\relax
450     \expandafter\@xspace@break@loop
451   \fi
452   \@xspace@check@token
454 %    \end{macrocode}
455 % \end{macro}
457 % That's all, folks! That is, if we were running \LaTeX3. In that case
458 % we would have had nice functions for all the conditionals but here
459 % we must define them ourselves. We also optimize them here as
460 % \cs{@let@token} will always be the argument in some cases.
462 % \begin{macro}{\@xspace@if@lettoken@letter@TF}
463 % \begin{macro}{\@xspace@if@lettoken@expandable@TF}
464 % \begin{macro}{\@xspace@cs@if@equal@NNF}
465 % First a few comparisons.
466 %    \begin{macrocode}
467 \def\@xspace@lettoken@if@letter@TF{%
468   \ifcat\noexpand\@let@token @% letter
469     \expandafter\@firstoftwo
470   \else
471     \expandafter\@secondoftwo
472   \fi}
473 \def\@xspace@lettoken@if@expandable@TF{%
474   \expandafter\ifx\noexpand\@let@token\@let@token%
475     \expandafter\@secondoftwo
476   \else
477     \expandafter\@firstoftwo
478   \fi
480 \def\@xspace@token@if@equal@NNT#1#2{%
481   \ifx#1#2%
482     \expandafter\@firstofone
483   \else
484     \expandafter\@gobble
485   \fi}
486 %    \end{macrocode}
487 % \end{macro}
488 % \end{macro}
489 % \end{macro}
490 % \begin{macro}{\@xspace@q@nil}
491 % \begin{macro}{\@xspace@if@q@nil@NF}
492 % Some macros dealing with quarks.
493 %    \begin{macrocode}
494 \def\@xspace@q@nil{\@xspace@q@nil}
495 \def\@xspace@if@q@nil@NF#1{%
496   \ifx\@xspace@q@nil#1%
497     \expandafter\@gobble
498   \else
499     \expandafter\@firstofone
500   \fi}
501 %    \end{macrocode}
502 % \end{macro}
503 % \end{macro}
504 %    \begin{macrocode}
505 %</package>
506 %    \end{macrocode}
508 % \Finale