| 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{|}~
 |