
조건에서 각 토큰을 직접 확인하지 않고도 토큰이 구분 기호(예 (
: )
, , |
, \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