分类
LaTeX

TeX中递归调用命令二例

例子1. 定义广义乘法.

分析中, Hamilton发明了所谓的Sharp算子, 即用来表示乘积, 其系数是有界的。 例如$A# B$表示$A$与$B$和某个有界函数的乘积. 那么问题是, 如何在TeX中定义一个命令使得很方便写这种乘积呢?

这就是本文的重点:递归调用命令。

\makeatletter
\newcommand{\multi}[1]{#1\checknextchar}
\newcommand{\checknextchar}{\@ifnextchar\bgroup{\#\multi}{}}
\makeatother

用法如下

\multi{\phi}
\multi{\phi_1}{\phi_2}{\phi_3}

解释下, 上面我们定义了一个\multi命令, 它只接收一个参数, 效果是:首先原样输出接收的参数, 然后用\checknextchar检查后面还有没有参数. 而\checknextchar中, 我们使用了内置的(这也是为啥我们定义的命令要放到 \makeatletter\makeatother 之间)字符匹配函数\@ifnextchar, 而\bgroup就是表示的{字符, 如果第一个参数后面是{字符, 则输出\#\multi;注意这里递归调用了\multi命令, 即不断的做上述操作, 直到后一个字符不是{, 这时我们啥也不做。

如果利用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

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据