나는 $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>}
.
false인 경우 단일 문자인지 숫자 문자열인지 \ifoldfactorial
확인 하고 이 경우 출력 ; 그렇지 않으면 괄호가 추가됩니다.<symbols>
<symbols>!
아래 예에서는 \ifoldfactorial
테스트용으로 중간 문서를 설정합니다. 일반 문서의 경우 \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}