1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
<head>
<title>UK TeX FAQ -- question label activechars</title>
</head><body>
<h3>Defining characters as macros</h3>
<p/>Single characters can act as macros (defined commands), and both
Plain TeX and LaTeX define the character
“<code>~</code>” as a “non-breakable space”. A
character is made definable, or “active”, by setting its
<em>category code</em> (catcode) to be <code>\</code><code>active</code> (13):
<code>\catcode‘_=\active</code>.
<p/>Any character could, in principle, be activated this way and defined
as a macro (<code>\</code><code>def</code><code>_{</code><code>\</code><code>_</code><code>}</code> — the simple answer to
<a href="FAQ-underscore.html">using underscores</a>), but you must be
wary: whereas people expect an active tilde, other active characters
may be unexpected and interact badly with other macros. Furthermore,
by defining an active character, you preclude the character’s use for
other purposes, and there are few characters “free” to be subverted
in this way.
<p/>To define the character “<code>z</code>” as a command, one would say something
like:
<blockquote>
<pre>
\catcode`\z=\active
\def z{Yawn, I'm tired}%
</pre>
</blockquote><p>
and each subsequent “<code>z</code>” in the text would become a yawn. This would be
an astoundingly bad idea for most documents, but might have special
applications. (Note that, in “<code>\def z</code>”, “<code>z</code>” is no longer interpreted as
a letter; the space is therefore not necessary — “<code>\defz</code>” would do; we
choose to retain the space, for what little clarity we can manage.)
Some LaTeX packages facilitate such definitions. For example, the
<i>shortvrb</i> package with its <code>\</code><code>MakeShortVerb</code> command.
<p/>TeX uses category codes to interpret characters as they are read
from the input.
<em>Changing a catcode value will not affect characters that have already been read</em>.
Therefore, it is best if characters have fixed category codes for the
duration of a document. If catcodes are changed for particular
purposes (the <code>\</code><code>verb</code> command does this), then the altered
characters will not be interpreted properly when they appear in the
argument to another command (as, for example, in
“<a href="FAQ-verbwithin.html"><code>\</code><code>verb</code> in command arguments</a>”).
An exemplary case is the <i>doc</i> package, which processes .dtx
files using the <i>shortvrb</i> package to define
<code>|...|</code> as a shorthand for
<code>\</code><code>verb</code><code>|...|</code>. But <code>|</code> is
also used in the preambles of tabular environments, so that tables in
<code>.dtx</code> files can only have vertical line separation between
columns by employing special measures of some sort.
<p/>Another consequence is that catcode assignments made
in macros often don’t work as expected
(see “<a href="FAQ-actinarg.html">Active characters in command arguments</a>”).
For example, the definition
<blockquote>
<pre>
\def\mistake{%
\catcode`_=\active
\def_{\textunderscore\-}%
}
</pre>
</blockquote><p>
does not work because it attempts to define an ordinary <code>_</code> character:
When the macro is used, the category change does not apply to the
underscore character already in the macro definition. Instead, one may
use:
<blockquote>
<pre>
\begingroup
\catcode`_=\active
\gdef\works{% note the global \gdef
\catcode`_=\active
\def_{\textunderscore\-}%
}
\endgroup
</pre>
</blockquote><p>
The alternative (“tricksy”) way of creating such an isolated
definition depends on the curious properties of <code>\</code><code>lowercase</code>, which
changes characters without altering their catcodes. Since there is
always <em>one</em> active character (“<code>~</code>”), we
can fool <code>\</code><code>lowercase</code> into patching up a definition without ever
explicitly changing a catcode:
<blockquote>
<pre>
\begingroup
\lccode`\~=`\_
\lowercase{\endgroup
\def~{\textunderscore\-}%
}%
</pre>
</blockquote><p>
The two definitions have the same overall effect (the character is
defined as a command, but the character does not remain active),
except that the first defines a <code>\</code><code>global</code> command.
<p/>For active characters to be used only in maths mode, it is much better
to leave the character having its ordinary catcode, but assign it a
special active <em>maths code</em>, as with
<blockquote>
<pre>
\begingroup
\lccode`~=`x
\lowercase{\endgroup
\def~{\times}%
}%
\mathcode`x="8000
</pre>
</blockquote><p>
The special character does not need to be redefined whenever it is
made active — the definition of the command persists even if the
character’s catcode reverts to its original value; the definition
becomes accessible again if the character once again becomes active.
<dl>
<dt><tt><i>doc.sty</i></tt><dd>Distributed as part of the source of LaTeX, <a href="ftp://cam.ctan.org/tex-archive/macros/latex/base.zip">macros/latex/base</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/base.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/base/">browse</a>)
<dt><tt><i>shortvrb.sty</i></tt><dd>Distributed as part of <a href="ftp://cam.ctan.org/tex-archive/macros/latex/required/tools.zip">macros/latex/required/tools</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/required/tools.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/required/tools/">browse</a>)
</dl>
<p/><p/><p>This question on the Web: <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=activechars">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=activechars</a>
</body>
|