summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-subverttoks.html
blob: 6becedead222ec66671f029e5566a196c3bd2500 (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 &ldquo;subvert&rdquo; 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{%
  &lt;stuff to do at the start of the token register&gt;%
}
\let\everypar\mypkg@everypar
</pre>

</blockquote><p>
As you can see, the package (<i>mypkg</i>)
<ul>
<li> creates an alias for the existing &ldquo;system&rdquo; <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 &ldquo;old&rdquo; <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>