將無括號標記儲存到變數中 — expl3

將無括號標記儲存到變數中 — expl3

我想用\token_if_eq_meaning:NN它來比較兩個標記的含義。

{\langle\rangle}我有這樣一個通過保存的令牌列表

\tl_set:Nn \my_tokens_list {\langle\rangle}

如何從變數\my_tokens_list中提取第一個無括號標記\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}

相關內容