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