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