私は古い教科書を使っていますが、その中では $n$ の階乗は $\varPi(n)$ で表されます。この表記法を使用するか、通常の表記法である $n!$ を使用するかを序文で選択できるような文書を作りたいと思っています。そこで、序文に 2 行書きましたが、そのうち 1 行はコメント アウトする必要があります。
%\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
テスト用に mid-document を設定しています。通常のドキュメントの場合は、有効または無効にするだけです\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}