Nicht geschweiftes Token in Variable speichern – expl3

Nicht geschweiftes Token in Variable speichern – expl3

Ich möchte \token_if_eq_meaning:NNdie Bedeutung von nur zwei Token vergleichen.

Ich habe eine solche Token-Liste {\langle\rangle}, die gespeichert ist über

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

Wie kann ich das erste Token ohne Klammern aus \my_tokens_listder \my_first_tokenVariable extrahieren und den Vergleich durchführen?

\token_if_eq_meaning:NN \my_first_token \langle

Antwort1

Sie können jedes gewünschte Element extrahieren (sofern es im Bereich liegt) und den Vergleich durchführen.

\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}

Die einzige Komplikation besteht darin, dass die eErweiterung das Ergebnis in Klammern liefert, die wir jedoch mit einer Hilfsfunktion entfernen können.

Bildbeschreibung hier eingeben

Antwort2

Offensichtlich kann man kein einzelnes Token ohne Klammern speichern, aber man kann es so ändern, \token_if_eq_meaning:NNdass es das Argument selbst ohne Klammern speichern kann.

\tl_set:Nx \first_token { \tl_head:n {\langle\rangle} }
\exp_last_unbraced:NV \token_if_eq_meaning:NNTF \first_token \langle {Tr}{Fl}

Oder auch in einer Zeile

\exp_last_unbraced:Nx \token_if_eq_meaning:NNTF { \tl_head:n {\langle\rangle} } \langle {Tr}{Fl}

verwandte Informationen