26862
|
1 |
% underscore.sty 21-Sep-2005 Donald Arseneau asnd@triumf.ca
|
|
2 |
% Make the "_" character print as "\textunderscore" in text.
|
|
3 |
% Copyright 1998,2001,2005,2006 Donald Arseneau;
|
|
4 |
% License: LPPL version 1.2 or later.
|
|
5 |
% Instructions follow after the definitions.
|
|
6 |
|
|
7 |
\ProvidesPackage{underscore}[2006/09/13]
|
|
8 |
|
|
9 |
\begingroup
|
|
10 |
\catcode`\_=\active
|
|
11 |
\gdef _{% \relax % No relax gives a small vulnerability in alignments
|
|
12 |
\ifx\if@safe@actives\iftrue % must be outermost test!
|
|
13 |
\string_%
|
|
14 |
\else
|
|
15 |
\ifx\protect\@typeset@protect
|
|
16 |
\ifmmode \sb \else \BreakableUnderscore \fi
|
|
17 |
\else
|
|
18 |
\ifx\protect\@unexpandable@protect \noexpand_%
|
|
19 |
\else \protect_%
|
|
20 |
\fi\fi
|
|
21 |
\fi}
|
|
22 |
\global\let\ActiveUnderscore=_
|
|
23 |
\gdef\normalUnderscoreDef{\let_\ActiveUnderscore}
|
|
24 |
\endgroup
|
|
25 |
|
|
26 |
% At begin: set catcode; fix \long \ttdefault so I can use it in comparisons;
|
|
27 |
% reapply definition of active _ in output routine (\@firstofone to strip
|
|
28 |
% away braces, so avoiding deeper nesting).
|
|
29 |
\AtBeginDocument{%
|
|
30 |
{\immediate\write\@auxout{\catcode\number\string`\_ \string\active}}%
|
|
31 |
\catcode\string`\_\string=\active
|
|
32 |
\edef\ttdefault{\ttdefault}%
|
|
33 |
\output=\expandafter\expandafter\expandafter
|
|
34 |
{\expandafter\expandafter\expandafter\normalUnderscoreDef
|
|
35 |
\expandafter\@firstofone\the\output}%
|
|
36 |
}
|
|
37 |
|
|
38 |
\newcommand{\BreakableUnderscore}{\leavevmode\nobreak\hskip\z@skip
|
|
39 |
\ifx\f@family\ttdefault \string_\else \textunderscore\fi
|
|
40 |
\usc@dischyph\nobreak\hskip\z@skip}
|
|
41 |
|
|
42 |
\DeclareRobustCommand{\_}{%
|
|
43 |
\ifmmode \nfss@text{\textunderscore}\else \BreakableUnderscore \fi}
|
|
44 |
|
|
45 |
|
|
46 |
\let\usc@dischyph\@dischyph
|
|
47 |
\DeclareOption{nohyphen}{\def\usc@dischyph{\discretionary{}{}{}}}
|
|
48 |
\DeclareOption{strings}{\catcode`\_=\active}
|
|
49 |
|
|
50 |
\ProcessOptions
|
|
51 |
\ifnum\catcode`\_=\active\else \endinput \fi
|
|
52 |
|
|
53 |
%%%%%%%% Redefine commands that use character strings %%%%%%%%
|
|
54 |
|
|
55 |
\@ifundefined{UnderscoreCommands}{\let\UnderscoreCommands\@empty}{}
|
|
56 |
\expandafter\def\expandafter\UnderscoreCommands\expandafter{%
|
|
57 |
\UnderscoreCommands
|
|
58 |
\do\include \do\includeonly
|
|
59 |
\do\@input \do\@iinput \do\InputIfFileExists
|
|
60 |
\do\ref \do\pageref \do\newlabel
|
|
61 |
\do\bibitem \do\@bibitem \do\cite \do\nocite \do\bibcite
|
|
62 |
\do\Ginclude@graphics \do\@setckpt
|
|
63 |
}
|
|
64 |
|
|
65 |
% Macro to redefine a macro to pre-process its string argument
|
|
66 |
% with \protect -> \string.
|
|
67 |
\def\do#1{% Avoid double processing if user includes command twice!
|
|
68 |
\@ifundefined{US\string_\expandafter\@gobble\string#1}{%
|
|
69 |
\edef\@tempb{\meaning#1}% Check if macro is just a protection shell...
|
|
70 |
\def\@tempc{\protect}%
|
|
71 |
\edef\@tempc{\meaning\@tempc\string#1\space\space}%
|
|
72 |
\ifx\@tempb\@tempc % just a shell: hook into the protected inner command
|
|
73 |
\expandafter\do
|
|
74 |
\csname \expandafter\@gobble\string#1 \expandafter\endcsname
|
|
75 |
\else % Check if macro takes an optional argument
|
|
76 |
\def\@tempc{\@ifnextchar[}%
|
|
77 |
\edef\@tempa{\def\noexpand\@tempa####1\meaning\@tempc}%
|
|
78 |
\@tempa##2##3\@tempa{##2\relax}%
|
|
79 |
\edef\@tempb{\meaning#1\meaning\@tempc}%
|
|
80 |
\edef\@tempc{\noexpand\@tempd \csname
|
|
81 |
US\string_\expandafter\@gobble\string#1\endcsname}%
|
|
82 |
\if \expandafter\@tempa\@tempb \relax 12\@tempa % then no optional arg
|
|
83 |
\@tempc #1\US@prot
|
|
84 |
\else % There is optional arg
|
|
85 |
\@tempc #1\US@protopt
|
|
86 |
\fi
|
|
87 |
\fi
|
|
88 |
}{}}
|
|
89 |
|
|
90 |
\def\@tempd#1#2#3{\let#1#2\def#2{#3#1}}
|
|
91 |
|
|
92 |
\def\US@prot#1#2{\let\@@protect\protect \let\protect\string
|
|
93 |
\edef\US@temp##1{##1{#2}}\restore@protect\US@temp#1}
|
|
94 |
\def\US@protopt#1{\@ifnextchar[{\US@protarg#1}{\US@prot#1}}
|
|
95 |
\def\US@protarg #1[#2]{\US@prot{{#1[#2]}}}
|
|
96 |
|
|
97 |
\UnderscoreCommands
|
|
98 |
\let\do\relax \let\@tempd\relax % un-do
|
|
99 |
|
|
100 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
101 |
|
|
102 |
\endinput
|
|
103 |
|
|
104 |
underscore.sty 13-Sep-2006 Donald Arseneau
|
|
105 |
|
|
106 |
Features:
|
|
107 |
~~~~~~~~~
|
|
108 |
The "\_" command (which normally prints an underscore character or
|
|
109 |
facsimile) is altered so that the hyphenation of constituent words
|
|
110 |
is not affected, and hyphenation is permitted after the underscore.
|
|
111 |
For example, "compound\_fracture" hyphenates as com- pound\_- frac- ture.
|
|
112 |
If you prefer the underscore to break without a hyphen (but still with
|
|
113 |
the same rules for explicit hyphen-breaks) then use the [nohyphen]
|
|
114 |
package option.
|
|
115 |
|
|
116 |
A simple "_" acts just like "\_" in text mode, but makes a subscript
|
|
117 |
in math mode: activation_energy $E_a$
|
|
118 |
|
|
119 |
Both forms use an underscore character if the font encoding contains
|
|
120 |
one (e.g., "\usepackage[T1]{fontenc}" or typewriter fonts in any encoding),
|
|
121 |
but they use a rule if there is no proper character.
|
|
122 |
|
|
123 |
Deficiencies:
|
|
124 |
~~~~~~~~~~~~~
|
|
125 |
The skips and penalties ruin any kerning with the underscore character
|
|
126 |
(when a character is used). However, there doesn't seem to be much, if
|
|
127 |
any, such kerning in the ec fonts, and there is never any kerning with
|
|
128 |
a rule.
|
|
129 |
|
|
130 |
You must avoid "_" in file names and in cite or ref tags, or you must use
|
|
131 |
the babel package, with its active-character controls, or you must give
|
|
132 |
the [strings] option, which attempts to redefine several commands (and
|
|
133 |
may not work perfectly). Even without the [strings] option or babel, you
|
|
134 |
can use occasional underscores like: "\include{file\string_name}".
|
|
135 |
|
|
136 |
Option: [strings]
|
|
137 |
~~~~~~~~~~~~~~~~~
|
|
138 |
The default operation is quite simple and needs no customization; but
|
|
139 |
you must avoid using "_" in any place where LaTeX uses an argument as
|
|
140 |
a string of characters for some control function or as a name. These
|
|
141 |
include the tags for "\cite" and "\ref", file names for "\input",
|
|
142 |
"\include", and "\includegraphics", environment names, counter names,
|
|
143 |
and placement parameters (like "[t]"). The problem with these contexts
|
|
144 |
is that they are `moving arguments' but LaTeX does not `switch on' the
|
|
145 |
"\protect" mechanism for them.
|
|
146 |
|
|
147 |
If you need to use the underscore character in these places, the package
|
|
148 |
option [strings] is provided to redefine commands that take such a string
|
|
149 |
argument so that protection is applied (with "\protect" being "\string").
|
|
150 |
The list of commands is given in "\UnderscoreCommands", with "\do" before
|
|
151 |
each; plus several others covering "\input", "\includegraphics, "\cite",
|
|
152 |
"\ref", and their variants. Not included are many commands regarding font
|
|
153 |
names, everything with counter names, environment names, page styles, and
|
|
154 |
versions of "\ref" and "\cite" defined by external packages (e.g., "\vref"
|
|
155 |
and "\citeyear").
|
|
156 |
|
|
157 |
You can add to the list of supported commands by defining "\UnderscoreCommands"
|
|
158 |
before loading this package; e.g.
|
|
159 |
|
|
160 |
\usepackage{chicago}
|
|
161 |
\newcommand{\UnderscoreCommands}{% (\cite already done)
|
|
162 |
\do\citeNP \do\citeA \do\citeANP \do\citeN \do\shortcite
|
|
163 |
\do\shortciteNP \do\shortciteA \do\shortciteANP \do\shortciteN
|
|
164 |
\do\citeyear \do\citeyearNP
|
|
165 |
}
|
|
166 |
\usepackage[strings]{underscore}
|
|
167 |
|
|
168 |
Not all commands can be supported this way! Only commands that take a
|
|
169 |
string argument *first* can be protected. One optional argument before
|
|
170 |
the string argument is also permitted, as exemplified by "\cite": both
|
|
171 |
"\cite{tags}" and "\cite[text]{tags}" are allowed. A command like
|
|
172 |
"\@addtoreset" which takes two counter names as arguments could not
|
|
173 |
be protected by listing it in "\UnderscoreCommands".
|
|
174 |
|
|
175 |
*When you use the [strings] option, you must load this package
|
|
176 |
last* (or nearly last).
|
|
177 |
|
|
178 |
There are two reasons: 1) The redefinitions done for protection must come
|
|
179 |
after other packages define their customized versions of those commands.
|
|
180 |
2) The [strings] option requires the "_" character to be activated immediately
|
|
181 |
in order for the cite and ref tags to be read properly from the .aux file
|
|
182 |
as plain strings, and this catcode setting might disrupt other packages.
|
|
183 |
|
|
184 |
The babel package implements a protection mechanism for many commands,
|
|
185 |
and will be a complete fix for most documents without the [strings] option.
|
|
186 |
Many add-on packages are compatible with babel, so they will get the
|
|
187 |
strings protection also. However, there are several commands that are
|
|
188 |
not covered by babel, but can easily be supported by the [strings] and
|
|
189 |
"\UnderscoreCommands" mechanism. Beware that using both [strings] and
|
|
190 |
babel might lead to conflicts, but none are seen yet (load babel last).
|
|
191 |
|
|
192 |
Implementation Notes:
|
|
193 |
~~~~~~~~~~~~~~~~~~~~~
|
|
194 |
The first setting of "_" to be an active character is performed in a local
|
|
195 |
group so as to not interfere with other packages. The catcode setting
|
|
196 |
is repeated with "\AtBeginDocument" so the definition is in effect for the
|
|
197 |
text. However, the catcode setting is repeated immediately when the
|
|
198 |
[strings] option is detected.
|
|
199 |
|
|
200 |
The definition of the active "_" is essentially:
|
|
201 |
|
|
202 |
\ifmmode \sb \else \BreakableUnderscore \fi
|
|
203 |
|
|
204 |
where "\sb" retains the normal subscript meaning of "_" and where
|
|
205 |
"\BreakableUnderscore" is essentially "\_". The rest of the definition
|
|
206 |
handles the "\protect"ion without causing "\relax" to be inserted before
|
|
207 |
the character.
|
|
208 |
|
|
209 |
"\BreakableUnderscore" uses "\nobreak\hskip\z@skip" to separate the
|
|
210 |
underscore from surrounding words, thus allowing TeX to hyphenate them,
|
|
211 |
but preventing free breaks around the underscore. Next, it checks the
|
|
212 |
current font family, and uses the underscore character from tt fonts or
|
|
213 |
otherwise "\textunderscore" (which is a character or rule depending on
|
|
214 |
the font encoding). After the underscore, it inserts a discretionary
|
|
215 |
hyphenation point as "\usc@dischyph", which is usually just "\-"
|
|
216 |
except that it still works in the tabbing environment, although it
|
|
217 |
will give "\discretionary{}{}{}" under the [nohyphen] option. After
|
|
218 |
that, another piece of non-breaking interword glue is inserted.
|
|
219 |
Ordinarily, the comparison "\ifx\f@family\ttdefault" will always fail
|
|
220 |
because "\ttdefault" is `long' whereas "\f@family" is not (boooo hisss),
|
|
221 |
but "\ttdefault" is redefined to be non-long by "\AtBeginDocument".
|
|
222 |
|
|
223 |
The "\_" command is then defined to use "\BreakableUnderscore".
|
|
224 |
|
|
225 |
If the [strings] option is not given, then that is all!
|
|
226 |
|
|
227 |
Under the [strings] option, the list of special commands is processed to:
|
|
228 |
|
|
229 |
- retain the original command as "\US_"*command* (e.g., "\US_ref")
|
|
230 |
- redefine the command as "\US@prot\US_command" for ordinary commands
|
|
231 |
("\US@prot\US_ref") or as "\US@protopt\US_command" when an optional
|
|
232 |
argument is possible (e.g., "\US@protopt\US_bibitem").
|
|
233 |
- self-protecting commands ("\cite") retain their self-protection.
|
|
234 |
|
|
235 |
Diagnosing the state of the pre-existing command is done by painful
|
|
236 |
contortions involving "\meaning".
|
|
237 |
|
|
238 |
"\US@prot" and "\US@protopt" read the argument, process it with
|
|
239 |
"\protect" enabled, then invoke the saved "\US_command".
|
|
240 |
|
|
241 |
Modifications:
|
|
242 |
~~~~~~~~~~~~~~
|
|
243 |
13-Sep-2006 Reassert my definition in the output routine (listings).
|
|
244 |
21-Sep-2005 \includegraphics safe.
|
|
245 |
12-Oct-2001 Babel (safe@actives) compatibility and [nohyphen] option.
|
|
246 |
|
|
247 |
Test file integrity: ASCII 32-57, 58-126: !"#$%&'()*+,-./0123456789
|
|
248 |
:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
|