TeX中递归调用命令二例
例子1. 定义广义乘法.
分析中, Hamilton发明了所谓的Sharp算子, 即用来表示乘积, 其系数是有界的。 例如$A# B$表示$A$与$B$和某个有界函数的乘积. 那么问题是, 如何在TeX中定义一个命令使得很方便写这种乘积呢?
这就是本文的重点:递归调用命令。
1 2 3 4 |
\makeatletter \newcommand{\multi}[1]{#1\checknextchar} \newcommand{\checknextchar}{\@ifnextchar\bgroup{\#\multi}{}} \makeatother |
用法如下
1 2 |
\multi{\phi} \multi{\phi_1}{\phi_2}{\phi_3} |
解释下, 上面我们定义了一个\multi
命令, 它只接收一个参数, 效果是:首先原样输出接收的参数, 然后用\checknextchar
检查后面还有没有参数. 而\checknextchar
中, 我们使用了内置的(这也是为啥我们定义的命令要放到 \makeatletter
与 \makeatother
之间)字符匹配函数\@ifnextchar
, 而\bgroup
就是表示的{
字符, 如果第一个参数后面是{
字符, 则输出\#\multi
;注意这里递归调用了\multi
命令, 即不断的做上述操作, 直到后一个字符不是{
, 这时我们啥也不做。
如果利用xparse包的话, 则上述命令可以如下实现:
1 2 |
\usepackage{xparse} \NewDocumentCommand{\multi}{mg}{#1\IfNoValueTF{#2}{}{\#\multi{#2}}} |
例子2. 递归李括号.
仿照上述例子, 试试如何产生
$[A,[B,[C,D]]]]$
其实我也不知道, 答案见How to make a recursive Latex macro with comma separated argument list。
本作品采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循署名-非商业用途-保持一致的创作共用协议.
发表回复