Wechseln zwischen Notationen für Fakultät

Wechseln zwischen Notationen für Fakultät

Ich arbeite mit einem alten Lehrbuch, in dem die Fakultät von $n$ mit $\varPi(n)$ bezeichnet wird. Ich möchte ein Dokument erstellen, in dem man in der Präambel wählen kann, ob man diese Notation oder die übliche $n!$ verwenden möchte. Also habe ich in die Präambel zwei Zeilen geschrieben, von denen eine auskommentiert werden sollte:

%\newcommand{\fac}[1]{{#1}!}
\newcommand{\fac}[1]{\varPi(#1)}

Ich habe nicht sofort gemerkt, dass ich mit diesem Schema in Schwierigkeiten gerate; denn wenn ich schreibe

\fac{n+1}

Dies ergibt $\varPi(n+1)$ in einer Notation, aber $n+1!$ in der anderen, was schlecht ist. Umgekehrt, wenn Sie Klammern hinzufügen

\fac{(n+1)}

Sie erhalten ein Klammernpaar zu viel in $\varPi((n+1))$.

Irgendwelche Vorschläge zur Lösung dieses Problems?

Bearbeiten: Nach einem Vorschlag (der inzwischen gelöscht wurde) begann ich, in die folgende Richtung zu denken: Ich könnte \fac{expr} für alles schreiben, was in beiden Versionen funktioniert, und ein zusätzliches Paar {} (oder eine andere Art von Token) um den Ausdruck hinzufügen, wenn ich ein zusätzliches Paar Klammern in der !-Notation benötige. Natürlich müsste das analysiert werden, und mir fehlen derzeit die Kenntnisse dazu.

Antwort1

Hier überprüfe ich zuerst, ob \ifoldfactorial„true“ zurückgegeben wird (standardmäßig wird „false“ zurückgegeben) und in diesem Fall wird „true \fac{<symbols>}“ ausgegeben \varpi(<symbols>}.

Wenn \ifoldfactorialfalse ist, überprüfe ich, ob <symbols>es sich um ein einzelnes Zeichen oder eine Ziffernfolge handelt und gebe in diesem Fall aus <symbols>!; andernfalls werden Klammern hinzugefügt.

Das folgende Beispiel setzt \ifoldfactorialmid-document nur zu Testzwecken. Für ein normales Dokument aktivieren oder deaktivieren Sie einfach \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}

Bildbeschreibung hier eingeben

verwandte Informationen