
\token_if_eq_meaning:NN
나는 단지 두 개의 토큰의 의미를 비교하는 것을 사용하고 싶습니다 .
{\langle\rangle}
다음 을 통해 저장된 토큰 목록이 있습니다.
\tl_set:Nn \my_tokens_list {\langle\rangle}
\my_tokens_list
첫 번째 unbraced 토큰을 변수 로 추출 \my_first_token
하고 비교를 수행하려면 어떻게 해야 합니까?
\token_if_eq_meaning:NN \my_first_token \langle
답변1
원하는 항목을 추출하고(범위 내에 있는 경우) 비교할 수 있습니다.
\documentclass{article}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\comparetokenTF}{sO{1}mmmm}
{
% #2 = position
% #3 = token to compare with
% #4 = token list
% #5 = true text
% #6 = false text
\IfBooleanTF{#1}
{
\antshar_comparetoken:nnVnn { #2 } { #3 } #4 { #5 } { #6 }
}
{
\antshar_comparetoken:nnnnn { #2 } { #3 } { #4 } { #5 } { #6 }
}
}
\cs_new:Nn \antshar_comparetoken:nnnnn
{
\int_compare:nTF { 1 <= #1 <= \tl_count:n { #3 } }
{
\__antshar_comparetoken:Nenn #2 { \tl_item:nn { #3 } { #1 } } { #4 } { #5 }
}
{
Exceeded~range
}
}
\cs_generate_variant:Nn \antshar_comparetoken:nnnnn { nnV }
\cs_new:Nn \__antshar_comparetoken:Nnnn
{
\token_if_eq_meaning:NNTF #1 #2 { #3 } { #4 }
}
\cs_generate_variant:Nn \__antshar_comparetoken:Nnnn { Ne }
\ExplSyntaxOff
\begin{document}
\comparetokenTF{\langle}{\langle\rangle}{T}{F} should give T
\comparetokenTF{\rangle}{\langle\rangle}{T}{F} should give F
\comparetokenTF[2]{\rangle}{\langle\rangle}{T}{F} should give T
\newcommand{\mytl}{\langle\rangle}
\comparetokenTF*{\langle}{\mytl}{T}{F} should give T
\comparetokenTF*{\rangle}{\mytl}{T}{F} should give F
\comparetokenTF*[2]{\rangle}{\mytl}{T}{F} should give T
\comparetokenTF*[3]{\rangle}{\mytl}{T}{F} (exceeded)
\end{document}
유일한 복잡한 점은 e
확장이 중괄호 안에 결과를 제공하지만 보조 함수를 사용하여 이를 제거할 수 있다는 것입니다.
답변2
\token_if_eq_meaning:NN
분명히, 브레이싱되지 않은 단일 토큰을 저장할 수는 없지만, 인수 자체를 언브레이싱할 수 있도록 수정하는 것이 가능합니다.
\tl_set:Nx \first_token { \tl_head:n {\langle\rangle} }
\exp_last_unbraced:NV \token_if_eq_meaning:NNTF \first_token \langle {Tr}{Fl}
아니면 한줄이라도
\exp_last_unbraced:Nx \token_if_eq_meaning:NNTF { \tl_head:n {\langle\rangle} } \langle {Tr}{Fl}