Estou trabalhando com um livro antigo onde o fatorial de $n$ é denotado por $\varPi(n)$. Gostaria de fazer um documento onde se pudesse escolher no preâmbulo se usaria esta notação ou a usual $n!$. Então escrevi duas linhas no preâmbulo, uma das quais deveria ser comentada:
%\newcommand{\fac}[1]{{#1}!}
\newcommand{\fac}[1]{\varPi(#1)}
Não percebi imediatamente que tive problemas com esse esquema; pois se eu escrever
\fac{n+1}
Isso dá $\varPi(n+1)$ em uma notação, mas $n+1!$ na outra, o que é ruim. Por outro lado, se você adicionar colchetes
\fac{(n+1)}
Você obtém um par de colchetes a mais em $\varPi((n+1))$.
Alguma sugestão de como resolver isso?
Editar: Seguindo uma sugestão (que já foi excluída), comecei a pensar nas seguintes linhas: eu poderia escrever \fac{expr} para qualquer coisa que funcionasse em ambas as versões e adicionar um par extra de {} (ou outro tipo de token) em torno da expressão se eu precisar de um par extra de colchetes na notação! É claro que isso teria que ser analisado e atualmente não tenho conhecimento para fazê-lo.
Responder1
Aqui primeiro verifico se \ifoldfactorial
retorna verdadeiro (por padrão retorna falso) e neste caso \fac{<symbols>}
produz \varpi(<symbols>}
.
Quando \ifoldfactorial
é falso, verifico se <symbols>
é um único caractere ou uma sequência de dígitos e, neste caso, a saída <symbols>!
; caso contrário, serão adicionados parênteses.
O exemplo abaixo define \ifoldfactorial
o meio do documento apenas para teste. Para um documento normal, basta ativar ou desativar o \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}