我一直在尝试理解 TeX 中的递归概念 - 鉴于我的背景是 LaTeX 中的高级内容,这并不容易。我能(几乎)理解的唯一示例是非常基本的 for 循环构造,但我真的不觉得我对扩展是什么或它如何工作有一个概念。
我想编写一个函数,以一个组作为参数
{{#1}{#2}...{#n}}
其中 n 可以取任意正整数值,并返回一对组
{#1}{{#2}...{#n}},
当 n 至少为 2 时,{#1}
否则。
这看起来应该相当简单,但我不知道该如何去做。
编辑:我想在 beamer 中使用此功能逐步覆盖 AMSMath 环境内的线条,以便
- 保留垂直间距;
- 方程编号(如适用)与方程数组的显示行同时出现,并在覆盖之间保留(即不增加)。
答案1
\catcode`@=11
\def\splitarg#1{\@splitarg#1\@nil}
\def\@splitarg#1#2\@nil{{#1}\if\relax\detokenize{#2}\relax\else{#2}\fi}
\catcode`@=12
\edef\x{\splitarg{{a}{b}{c}}}\show\x
\edef\x{\splitarg{{a}}}\show\x
需要 e-TeX,因此您必须使用 pdftex、xetex 或 luatex(而不是 Knuth 的 tex)处理示例。\if\relax\detokenize{#2}\relax
当 #2 为空(即,当您传递给 的列表中只有一个元素时)并且 e-TeX 在“true”部分中找不到任何内容时,测试为真\splitarg
;否则 e-TeX 会用括号括住原始列表中剩余的内容。