Cambiar entre notaciones para factorial

Cambiar entre notaciones para factorial

Estoy trabajando con un libro de texto antiguo donde el factorial de $n$ se denota por $\varPi(n)$. Me gustaría hacer un documento donde se pueda elegir en el preámbulo si usar esta notación o la habitual $n!$. Así que escribí dos líneas en el preámbulo, una de las cuales debería comentarse:

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

No me di cuenta inmediatamente de que tenía problemas con este plan; por si escribo

\fac{n+1}

Esto da $\varPi(n+1)$ en una notación, pero $n+1!$ en la otra, lo cual es malo. Por el contrario, si agrega corchetes

\fac{(n+1)}

Obtienes un par de corchetes de más en $\varPi((n+1))$.

¿Alguna sugerencia sobre cómo solucionar esto?

Editar: Siguiendo una sugerencia (que desde entonces ha sido eliminada) comencé a pensar en lo siguiente: podría escribir \fac{expr} para cualquier cosa que funcione en ambas versiones y agregar un par extra de {} (u otro tipo de token) alrededor de la expresión si necesito un par de corchetes adicionales en la notación! Por supuesto, eso habría que analizarlo y actualmente no tengo los conocimientos para hacerlo.

Respuesta1

Aquí primero compruebo si \ifoldfactorialdevuelve verdadero (por defecto devuelve falso) y en este caso \fac{<symbols>}produce \varpi(<symbols>}.

Cuando \ifoldfactoriales falso, compruebo si <symbols>es un solo carácter o una cadena de dígitos y, en este caso, la salida <symbols>!; de lo contrario, se añaden paréntesis.

El siguiente ejemplo establece \ifoldfactorialla mitad del documento solo para realizar pruebas. Para un documento normal, simplemente habilite o deshabilite \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}

ingrese la descripción de la imagen aquí

información relacionada