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>
|