在阶乘符号之间切换

在阶乘符号之间切换

我正在研究一本旧教科书,其中 $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}

在此处输入图片描述

相关内容