summaryrefslogtreecommitdiff
path: root/macros/generic/multiexpand/README.md
blob: decdfd06ff8a14e248cf0402320586f3c7355e4b (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
Variations on the `\expandafter` TeX primitive
==============================================
* E-mail: blflatex@gmail.com
* Released under the LaTeX Project Public License v1.3c or later
  See http://www.latex-project.org/lppl.txt

The package defines `\multiexpand`, `\multiexpandafter`, `\MultiExpand`
and `\MultiExpandAfter`, replacing large chains of `\expandafter`.
These four commands take as an argument the number of expansion to be
done.  If eTeX is available, this number is evaluated using `\numexpr`.

Say we want to expand `\C` five times before `\A` and `\B` in `\A\B\C`.
The traditional approach would be to insert 31 `\expandafter` before
`\A` and the same number before `\B`.  With this package one can use
any of

    \expandafter\A\expandafter\B\romannumeral\multiexpand{5}\C

    \expandafter\A\romannumeral\multiexpandafter{5}\B\C

    \MultiExpandAfter{2}\A\MultiExpandAfter{5}\B\C

    \MultiExpandAfter{2}\A\MultiExpandAfter{2}\B\MultiExpand{5}\C

In one step of expansion (triggered by the `\expandafter`'s),
`\romannumeral\multiexpand{5}` expands the following token 5 times,
whereas `\romannumeral\multiexpandafter{5}` expands the token after
that 5 times.  The macros `\MultiExpandAfter` and `\MultiExpand`
take two steps of expansion, but do not require `\romannumeral`.
Another example is that in two steps of expansion,

    \MultiExpandAfter{2}\a\MultiExpandAfter{3}{%
      \MultiExpandAfter{9}\b\MultiExpandAfter{10}\c\d}

expands `\d` 10 times, then `\c` 7 times (9-2), then `\b` once (3-2).

The package can be built from the file `multiexpand.dtx' by running

    pdflatex multiexpand.dtx
    pdflatex multiexpand.dtx