Alternar entre notações para fatorial

Alternar entre notações para fatorial

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 \ifoldfactorialretorna 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 \ifoldfactorialo 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}

insira a descrição da imagem aqui

informação relacionada