blob: cb8a2813e203350012c806d9356881ef0abdb785 (
plain)
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
|
<head>
<title>UK TeX FAQ -- question label subverttoks</title>
</head><body>
<h3>Subverting a token register</h3>
<p>A common requirement is to “subvert” a token register that other
macros may use. The requirement arises when you want to add something
to a system token register (<code>\</code><code>output</code> or <code>\</code><code>every*</code>), but know
that other macros use the token register, too. (A common requirement
is to work on <code>\</code><code>everypar</code>, but LaTeX changes <code>\</code><code>everypar</code> at
every touch and turn.)
<p>The following technique, due to David Kastrup, does what you need, and
allows an independent package to play the exact same game:
<blockquote>
<pre>
\let\mypkg@@everypar\everypar
\newtoks\mypkg@everypar
\mypkg@everypar\expandafter{\the\everypar}
\mypkg@@everypar{\mypkgs@ownstuff\the\mypkg@everypar}
\def\mypkgs@ownstuff{%
<stuff to do at the start of the token register>%
}
\let\everypar\mypkg@everypar
</pre>
</blockquote><p>
As you can see, the package (<i>mypkg</i>)
<ul>
<li> creates an alias for the existing “system” <code>\</code><code>everypar</code>
(which is frozen into any surrounding environment, which will carry
on using the original);
<li> creates a token register to subvert <code>\</code><code>everypar</code> and
initialises it with the current contents of <code>\</code><code>everypar</code>;
<li> sets the “old” <code>\</code><code>everypar</code> to execute its own extra code,
as well as the contents of its own token register;
<li> defines the macro for the extra code; and
<li> points the token <code>\</code><code>everypar</code> at the new token register.
</ul>
and away we go.
<p>The form <code>\</code><code>mypkg@...</code> is (sort of) blessed for LaTeX package
internal names, which is why this example uses macros of that form.
<p><p>This question on the Web: <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=subverttoks">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=subverttoks</a>
</body>
|