summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/multiexpand
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-09-20 22:31:12 +0000
committerKarl Berry <karl@freefriends.org>2015-09-20 22:31:12 +0000
commit9280f63533af6460c33dbfcf486a5e5368afed53 (patch)
tree4d9646df783056a13bfdfe201d510c6fe07c5858 /Master/texmf-dist/doc/generic/multiexpand
parentbf941dd6fd9a67534bf00d114908c151b5fd1606 (diff)
multiexpand (20sep15)
git-svn-id: svn://tug.org/texlive/trunk@38416 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/generic/multiexpand')
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/README.md41
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/multiexpand.pdfbin0 -> 376183 bytes
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/multiexpand001.lvt116
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/multiexpand001.tlg40
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/multiexpand002.lvt117
-rw-r--r--Master/texmf-dist/doc/generic/multiexpand/multiexpand002.tlg40
6 files changed, 354 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/multiexpand/README.md b/Master/texmf-dist/doc/generic/multiexpand/README.md
new file mode 100644
index 00000000000..decdfd06ff8
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/README.md
@@ -0,0 +1,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
+
diff --git a/Master/texmf-dist/doc/generic/multiexpand/multiexpand.pdf b/Master/texmf-dist/doc/generic/multiexpand/multiexpand.pdf
new file mode 100644
index 00000000000..5ae7d2171e2
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/multiexpand.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.lvt b/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.lvt
new file mode 100644
index 00000000000..6e886043334
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.lvt
@@ -0,0 +1,116 @@
+%%
+%% This is file `multiexpand001.lvt',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% multiexpand.dtx (with options: `lvt')
+%% ----------------------------------------------------------------
+%% multiexpand --- trigger multiple expansions in one expansion step.
+%% E-mail: blflatex@gmail.com
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%%
+ \input regression-test.tex\relax
+ \START
+ \AUTHOR{Bruno Le Floch}
+ \input multiexpand.sty\relax
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Introduce commands that expand to each other, to count how many times
+ % things were expanded.
+ \OMIT
+ \def\i{}
+ \def\v{\i\i\i\i}
+ \def\x{\i\i\i\i\v}
+ \def\l{\i\i\i\i\v\x\x\x\x}
+ \def\c{\i\i\i\i\v\x\x\x\x\l}
+ \def\d{\i\i\i\i\v\x\x\x\x\l\c\c\c\c}
+ \def\m{\i\i\i\i\v\x\x\x\x\l\c\c\c\c\d}
+ \TIMO
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % We test |\MultiExpand|, which needs two expansions. In particular, we see
+ % that the implementation is reasonably quick, and we get the $2345$-th
+ % expansion of |\m\m\m\m|.
+ % 4000-2345 = 1655 = mdclv
+ \TEST{MultiExpand many times (vlcdm)}{%
+ \toks0\expandafter\expandafter\expandafter{\MultiExpand{2345}\m\m\m\m}%
+ \TYPE{\the\toks0.}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Test |\MultiExpandAfter|, two expansions to get the specified expansion.
+ % The results indirectly show that expansions happen in the expected order.
+ % 100 = c
+ % 100-(27-2) = 75 = lxxv
+ % 100-(14-2) = 88 = lxxxviii
+ % 100-38 = 62 = lxii
+ \TEST{MultiExpandAfter chain (c vxxl iiivxxxl iixl)}{%
+ \toks0\expandafter\expandafter\expandafter{%
+ \MultiExpandAfter{27}\c
+ \MultiExpandAfter{14}\c
+ \MultiExpandAfter{38}\c\c}%
+ \TYPE{\the\toks0.}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Test the order of expansion. The example was given in the original
+ % question that led to writing this package. For the record, this
+ % package (at some point) used 32 |\expandafter| to do the expansion
+ % in the right order, which was better than other approaches; however
+ % this counting ignores the large overheads due to other primitives.
+ \OMIT
+ \def\a#1.{#1}
+ \def\b#1:{#1.}
+ \def\c#1,{#1:}
+ \def\d{Hello world!,}
+ \TIMO
+ %
+ \TEST{MultiExpandAfter order}{%
+ \toks0\MultiExpandAfter{3}{%
+ \MultiExpandAfter{3}\a
+ \MultiExpandAfter{3}\b
+ \MultiExpandAfter{1}\c
+ \d}%
+ \TYPE{\the\toks0}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % The other example from the same question (expanding seven tokens once
+ % each in the reverse order) takes 74 \expandafter.
+ \OMIT
+ \def\b.{.b} \def\c.{.c} \def\d.{.d}
+ \def\e.{.e} \def\f.{.f} \def\g.{.g}
+ \TIMO
+ %
+ \TEST{MultiExpandAfter order (2)}{%
+ \toks0\MultiExpandAfter{2}{%
+ \MultiExpandAfter3\a \MultiExpandAfter3\b
+ \MultiExpandAfter3\c \MultiExpandAfter3\d
+ \MultiExpandAfter3\e \MultiExpandAfter1\f\g.}%
+ \TYPE{\the\toks0}%
+ }
+
+ \END
+%%
+%% Copyright (C) 2011-2015 by Bruno Le Floch <blflatex@gmail.com>
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Bruno Le Floch.
+%%
+%% This work consists of the file multiexpand.dtx
+%% and the derived files multiexpand.ins,
+%% multiexpand.pdf and
+%% multiexpand.sty.
+%%
+%%
+%% End of file `multiexpand001.lvt'.
diff --git a/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.tlg b/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.tlg
new file mode 100644
index 00000000000..d8059b4c79f
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/multiexpand001.tlg
@@ -0,0 +1,40 @@
+This is a generated file for the l3build validation system.
+Don't change this file in any respect.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+Author: Bruno Le Floch
+(multiexpand.sty)
+============================================================
+TEST 1: MultiExpand many times (vlcdm)
+============================================================
+\v \l \c \d \m .
+============================================================
+============================================================
+TEST 2: MultiExpandAfter chain (c vxxl iiivxxxl iixl)
+============================================================
+\c \v \x \x \l \i \i \i \v \x \x \x \l \i \i \x \l .
+============================================================
+============================================================
+TEST 3: MultiExpandAfter order
+============================================================
+Hello world!
+============================================================
+============================================================
+TEST 4: MultiExpandAfter order (2)
+============================================================
+\a .bcdefg
+============================================================
diff --git a/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.lvt b/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.lvt
new file mode 100644
index 00000000000..8271c1347c2
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.lvt
@@ -0,0 +1,117 @@
+%%
+%% This is file `multiexpand002.lvt',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% multiexpand.dtx (with options: `lvt,lvt002')
+%% ----------------------------------------------------------------
+%% multiexpand --- trigger multiple expansions in one expansion step.
+%% E-mail: blflatex@gmail.com
+%% Released under the LaTeX Project Public License v1.3c or later
+%% See http://www.latex-project.org/lppl.txt
+%% ----------------------------------------------------------------
+%%
+ \input regression-test.tex\relax
+ \START
+ \AUTHOR{Bruno Le Floch}
+ \let\numexpr\relax
+ \input multiexpand.sty\relax
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Introduce commands that expand to each other, to count how many times
+ % things were expanded.
+ \OMIT
+ \def\i{}
+ \def\v{\i\i\i\i}
+ \def\x{\i\i\i\i\v}
+ \def\l{\i\i\i\i\v\x\x\x\x}
+ \def\c{\i\i\i\i\v\x\x\x\x\l}
+ \def\d{\i\i\i\i\v\x\x\x\x\l\c\c\c\c}
+ \def\m{\i\i\i\i\v\x\x\x\x\l\c\c\c\c\d}
+ \TIMO
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % We test |\MultiExpand|, which needs two expansions. In particular, we see
+ % that the implementation is reasonably quick, and we get the $2345$-th
+ % expansion of |\m\m\m\m|.
+ % 4000-2345 = 1655 = mdclv
+ \TEST{MultiExpand many times (vlcdm)}{%
+ \toks0\expandafter\expandafter\expandafter{\MultiExpand{2345}\m\m\m\m}%
+ \TYPE{\the\toks0.}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Test |\MultiExpandAfter|, two expansions to get the specified expansion.
+ % The results indirectly show that expansions happen in the expected order.
+ % 100 = c
+ % 100-(27-2) = 75 = lxxv
+ % 100-(14-2) = 88 = lxxxviii
+ % 100-38 = 62 = lxii
+ \TEST{MultiExpandAfter chain (c vxxl iiivxxxl iixl)}{%
+ \toks0\expandafter\expandafter\expandafter{%
+ \MultiExpandAfter{27}\c
+ \MultiExpandAfter{14}\c
+ \MultiExpandAfter{38}\c\c}%
+ \TYPE{\the\toks0.}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % Test the order of expansion. The example was given in the original
+ % question that led to writing this package. For the record, this
+ % package (at some point) used 32 |\expandafter| to do the expansion
+ % in the right order, which was better than other approaches; however
+ % this counting ignores the large overheads due to other primitives.
+ \OMIT
+ \def\a#1.{#1}
+ \def\b#1:{#1.}
+ \def\c#1,{#1:}
+ \def\d{Hello world!,}
+ \TIMO
+ %
+ \TEST{MultiExpandAfter order}{%
+ \toks0\MultiExpandAfter{3}{%
+ \MultiExpandAfter{3}\a
+ \MultiExpandAfter{3}\b
+ \MultiExpandAfter{1}\c
+ \d}%
+ \TYPE{\the\toks0}%
+ }
+
+ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ % The other example from the same question (expanding seven tokens once
+ % each in the reverse order) takes 74 \expandafter.
+ \OMIT
+ \def\b.{.b} \def\c.{.c} \def\d.{.d}
+ \def\e.{.e} \def\f.{.f} \def\g.{.g}
+ \TIMO
+ %
+ \TEST{MultiExpandAfter order (2)}{%
+ \toks0\MultiExpandAfter{2}{%
+ \MultiExpandAfter3\a \MultiExpandAfter3\b
+ \MultiExpandAfter3\c \MultiExpandAfter3\d
+ \MultiExpandAfter3\e \MultiExpandAfter1\f\g.}%
+ \TYPE{\the\toks0}%
+ }
+
+ \END
+%%
+%% Copyright (C) 2011-2015 by Bruno Le Floch <blflatex@gmail.com>
+%%
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License (LPPL), either
+%% version 1.3c of this license or (at your option) any later
+%% version. The latest version of this license is in the file:
+%%
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This work is "maintained" (as per LPPL maintenance status) by
+%% Bruno Le Floch.
+%%
+%% This work consists of the file multiexpand.dtx
+%% and the derived files multiexpand.ins,
+%% multiexpand.pdf and
+%% multiexpand.sty.
+%%
+%%
+%% End of file `multiexpand002.lvt'.
diff --git a/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.tlg b/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.tlg
new file mode 100644
index 00000000000..d8059b4c79f
--- /dev/null
+++ b/Master/texmf-dist/doc/generic/multiexpand/multiexpand002.tlg
@@ -0,0 +1,40 @@
+This is a generated file for the l3build validation system.
+Don't change this file in any respect.
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%%
+Author: Bruno Le Floch
+(multiexpand.sty)
+============================================================
+TEST 1: MultiExpand many times (vlcdm)
+============================================================
+\v \l \c \d \m .
+============================================================
+============================================================
+TEST 2: MultiExpandAfter chain (c vxxl iiivxxxl iixl)
+============================================================
+\c \v \x \x \l \i \i \i \v \x \x \x \l \i \i \x \l .
+============================================================
+============================================================
+TEST 3: MultiExpandAfter order
+============================================================
+Hello world!
+============================================================
+============================================================
+TEST 4: MultiExpandAfter order (2)
+============================================================
+\a .bcdefg
+============================================================