在階乘符號之間切換

在階乘符號之間切換

我正在使用一本舊教科書,其中 $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為 false 時,我檢查<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}

在此輸入影像描述

相關內容