계승에 대한 표기법 간 전환

계승에 대한 표기법 간 전환

나는 $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}

여기에 이미지 설명을 입력하세요

관련 정보