Переключение между обозначениями для факториала

Переключение между обозначениями для факториала

Я работаю со старым учебником, где факториал $n$ обозначается как $\varPi(n)$. Я хотел бы сделать документ, в преамбуле которого можно было бы выбрать, использовать ли эту нотацию или обычную $n!$. Поэтому я написал в преамбуле две строки, одну из которых нужно закомментировать:

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

Я не сразу понял, что сталкиваюсь с проблемами при использовании этой схемы; если я напишу

\fac{n+1}

Это дает $\varPi(n+1)$ в одной нотации, но $n+1!$ в другой, что плохо. Наоборот, если вы добавите скобки

\fac{(n+1)}

В $\varPi((n+1))$ вы получили лишнюю пару скобок.

Есть ли какие-нибудь предложения, как решить эту проблему?

Редактировать: Следуя предложению (которое с тех пор было удалено), я начал думать в следующем направлении: я мог бы написать \fac{expr} для всего, что работает в обеих версиях, и добавить дополнительную пару {} (или другой вид токена) вокруг выражения, если мне нужна дополнительная пара скобок в !-нотации. Конечно, это должно быть проанализировано, и в настоящее время у меня нет знаний, чтобы сделать это.

решение1

Здесь я сначала проверяю, \ifoldfactorialвозвращает ли true (по умолчанию возвращается false), и в этом случае \fac{<symbols>}выдает \varpi(<symbols>}.

Если \ifoldfactorialзначение равно false, я проверяю, <symbols>является ли это одним символом или строкой цифр, и в этом случае вывожу <symbols>!; в противном случае добавляются скобки.

Пример ниже устанавливает \ifoldfactorialmid-document только для тестирования. Для обычного документа вы просто включаете или отключаете \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}

введите описание изображения здесь

Связанный контент