我正在研究一本旧教科书,其中 $n$ 的阶乘用 $\varPi(n)$ 表示。我想制作一份文档,让读者在前言中选择是使用此符号还是通常的 $n!$。因此,我在前言中写了两行,其中一行应该注释掉:
%\newcommand{\fac}[1]{{#1}!}
\newcommand{\fac}[1]{\varPi(#1)}
我没有立即意识到我遇到了这个方案的麻烦;因为如果我写
\fac{n+1}
这在一种表示法中给出了 $\varPi(n+1)$,但在另一种表示法中给出了 $n+1!$,这是不好的。相反,如果你添加括号
\fac{(n+1)}
在 $\varPi((n+1))$ 中括号太多了。
关于如何解决这个问题有什么建议吗?
编辑:根据一个建议(现已删除),我开始按照以下思路思考:我可以为任何在两个版本中都有效的内容编写 \fac{expr},如果我需要在 ! 符号中多加一对括号,则可以在表达式周围添加一对额外的 {}(或其他类型的标记)。当然,这必须进行解析,而我目前不具备这样做的知识。
答案1
这里我首先检查是否\ifoldfactorial
返回 true (默认情况下返回 false )并且在这种情况下\fac{<symbols>}
产生\varpi(<symbols>}
。
当\ifoldfactorial
为假时,我会检查是<symbols>
单个字符还是一串数字,在这种情况下输出<symbols>!
;否则会添加括号。
下面的示例设置了\ifoldfactorial
中间文档,仅用于测试。对于普通文档,您只需启用或禁用即可\oldfactorialtrue
。
\documentclass{article}
\newif\ifoldfactorial
\ExplSyntaxOn
\NewDocumentCommand{\fac}{m}
{
\legacy_if:nTF { oldfactorial }
{% old style
\varpi(#1)
}
{% modern style
\tom_factorial:n { #1 }
}
}
\cs_new_protected:Nn \tom_factorial:n
{
\tl_if_single:nTF { #1 }
{% just one token
#1!
}
{% else, we need more
\regex_match:nnTF { \A (?:[[:digit:]]* | ._. | ._\{[^\}]*\}) \Z } { #1 }
{% only digits
#1!
}
{% parentheses needed
(#1)!
}
}
}
\ExplSyntaxOff
\begin{document}
\textbf{Modern notation}\par\medskip
$\fac{0}+\fac{1}+\fac{11}+\fac{n}+\fac{n+1}$
$\fac{n_k}+\fac{n_{k+1}}$
$\fac{\alpha_1}+\fac{\alpha_{12}}+\fac{\alpha_1+\alpha_2}$
\bigskip
\textbf{Older notation}\par\medskip
\oldfactorialtrue
$\fac{0}+\fac{1}+\fac{11}+\fac{n}+\fac{n+1}$
$\fac{n_k}+\fac{n_{k+1}}$
$\fac{\alpha_1}+\fac{\alpha_{12}}+\fac{\alpha_1+\alpha_2}$
\end{document}