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 \ifoldfactorial
devuelve verdadero (por defecto devuelve falso) y en este caso \fac{<symbols>}
produce \varpi(<symbols>}
.
Cuando \ifoldfactorial
es 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 \ifoldfactorial
la 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}