Я работаю со старым учебником, где факториал $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>!
; в противном случае добавляются скобки.
Пример ниже устанавливает \ifoldfactorial
mid-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}