구분 기호 감지

구분 기호 감지

조건에서 각 토큰을 직접 확인하지 않고도 토큰이 구분 기호(예 (: ), , |, \vert, \langle, 등) 인지 여부를 확인할 수 있나요 ?\rangle

구분 기호의 구조는 여기에 잘 설명되어 있습니다.https://tex.stackexchange.com/a/296650/213149. \delimiter명령을 사용하는 것 같습니다.

그래서 제 질문은 순수 TeX나 LaTeX3을 사용하여 다소 다양한 방식으로 이러한 구분 기호를 감지할 수 있는 방법입니다.

\isDelimiter{...}예를 들어, 인수가 각각 구분 기호인지 아닌지에 따라 인쇄하거나 true문서 false에 사용자 정의 매크로를 만들고 싶습니다 .

답변1

이것이 귀하의 문제에 도움이 될지 잘 모르겠습니다 \veca. 그래도…

\documentclass{article}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\isDelimiterTF}{mmm}
 {
  \antshar_isdel:Nnn #1 { #2 } { #3 }
 }

% first check whether #1 is a control sequence
\cs_new:Nn \antshar_isdel:Nnn
 {
  \token_if_cs:NTF #1
   {
    \__antshar_isdel_cs:Nnn #1 { #2 } { #3 }
   }
   {
    \__antshar_isdel_char:Nnn #1 { #2 } { #3 }
   }
 }

% it is a control sequence; first check the two exceptional cases \{ and \}
% which return true; otherwise go on: if the token is not expandable return false
\cs_new:Nn \__antshar_isdel_cs:Nnn
 {
  \str_case:nnF { #1 }
   {
    {\{}{#2}
    {\}}{#2}
   }
   {
    \token_if_expandable:NTF #1
     {
      \__antshar_isdel_csexp:Nnn #1 { #2 } { #3 }
     }
     {
      #3
     }
  }
 }

% the token is expandable, access its expansion
\cs_new:Nn \__antshar_isdel_csexp:Nnn
 {
  \__antshar_isdel_exp:onn { #1 } { #2 } { #3 }
 }

% if the expansion begins with \delimiter return true, otherwise false
\cs_new:Nn \__antshar_isdel_exp:nnn
 {
  \__antshar_isdel_exp_aux:w #1 \q_nil \q_stop { #2 } { #3 }
 }
\cs_generate_variant:Nn \__antshar_isdel_exp:nnn { o }

\cs_new:Npn \__antshar_isdel_exp_aux:w #1 #2 \q_stop #3 #4
 {
  \token_if_eq_meaning:NNTF #1 \delimiter { #3 } { #4 }
 }

% when the token is a character, look at its \delcode;
% if positive return true, otherwise false
\cs_new:Nn \__antshar_isdel_char:Nnn
 {
  \int_compare:nTF { \delcode`#1 > 0 } { #2 } { #3 }
 }

\ExplSyntaxOff

\begin{document}

\verb|a|: \isDelimiterTF{a}{T}{F}

\verb|(|: \isDelimiterTF{(}{T}{F}

\verb|]|: \isDelimiterTF{]}{T}{F}

\verb|\langle|: \isDelimiterTF{\langle}{T}{F}

\verb-\|-: \isDelimiterTF{\|}{T}{F}

\verb|\{|: \isDelimiterTF{\{}{T}{F}

\verb|\lbrace|: \isDelimiterTF{\lbrace}{T}{F}

\verb|\mbox|: \isDelimiterTF{\mbox}{T}{F}

\end{document}

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

제어 시퀀스가 ​​구분 기호인지 어떻게 알 수 있나요? 첫 번째 레벨 확장은 문자로 시작해야 하며 \delimiter, 문자인 경우 \delcode양수여야 합니다.

따라서 문자 확인은 분명합니다. 제어 시퀀스의 경우 먼저 확장 가능한지 여부를 확인해야 합니다. 그러나 또한 우리가 처리해야 할 일이 \{있고 \}그것은 다소 특별하기 때문에 이러한 경우는 스스로 해결됩니다.

우리가 검사하고 있는 제어 시퀀스가 ​​확장 가능하지 않다면 이는 구분 기호가 아닙니다(일부 글꼴 패키지에 및 와 같은 다른 예외가 추가되어야 할 수도 있음 \{) \}. 확장 가능한 경우 호출을 통해 첫 번째 수준 확장을 살펴봅니다.

\__antshar_isdel_exp:onn { #1 } { #2 } { #3 }

따라서 o인수 유형은 필요한 한 수준 확장을 수행합니다. 이것은 될 것이다

\__antshar_isdel_exp_aux:w #1 \q_nil \q_stop { #2 } { #3 }

의 정의 \__antshar_isdel_exp_aux:w

\cs_new:Npn \__antshar_isdel_exp_aux:w #1 #2 \q_stop #3 #4
 {
  \token_if_eq_meaning:NNTF #1 \delimiter { #3 } { #4 }
 }

따라서 우리가 조사하고 있는 제어 시퀀스 확장의 첫 번째 토큰은 가 되고 #1나머지 토큰은 가 \q_nil됩니다 #2. 나머지, 즉 #3및 는 #4에 대한 참 및 거짓 텍스트입니다 \isDelimiterTF. 첫 번째 인수는 제한이 없으므로 입력 스트림의 첫 번째 토큰을 인수로 사용합니다. 두 번째 인수는 TeX가 를 찾을 때 끝납니다 \q_stop.

이상한 점은 확장팩에 아무 것도 없을 것이기 \q_nil때문입니다 . \isDelimiter{\empty}{T}{F}이 경우에는 비어 있는 것으로 \q_nil간주됩니다 . 하지만 가 아니기 때문에 모든 것이 통과됩니다.#1#2\q_nil\delimiter

관련 정보