Latex3 verwendet Funktion nach Namen

Latex3 verwendet Funktion nach Namen

Ich habe mehrere Funktionen auf ähnliche Weise definiert und sie werden später unter dem Namen verwendetBasis + Argument.

Ich finde nicht \cs_use:c, aber es gibt \use:cund \cs_if_exist_use:c. Ist das die richtige Vorgehensweise oder sollte ich etwas anderes verwenden, wie \str_case:nn?

\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Nn \my_test_a:n
  {
    *#1*
  }
\cs_new_protected:Nn \my_test_b:n
  {
    +#1+
  }
\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:c { my_test_#1:n } { #2 }
  }
\ExplSyntaxOff

\begin{document}
\test{a}{abc}
\test{b}{abc}
\end{document}

Antwort1

Es hängt davon ab, was Sie tun möchten, wenn die zusammengesetzte Funktion nicht vorhanden ist.

Die Funktion \cs_if_exist_use:cist im Wesentlichen die gleiche wie \use:c: Sie sind Wrapper um \csname...\endcsname. Ersteres führt jedoch eine Prüfung durch, die Letzteres nicht tut.

Was ist dann der Grund dafür \cs_if_exist_use:c? Es ist Teil der Serie

\cs_if_exist_use:c \cs_if_exist_use:cT \cs_if_exist_use:cF \cs_if_exist_use:cTF

Wenn Sie tun

\test{a}{abc}
\test{b}{abc}
\test{c}{abc}

du erhältst

*abc* +abc+ abc

aber wahrscheinlich möchten Sie vor dem dritten Fall gewarnt werden oder vielleicht gar nichts ausgeben. Mit

\NewDocumentCommand { \test } { m m }
  {
    \cs_if_exist_use:cF { my_test_#1:n } { \use_none:n } { #2 }
  }

Die Ausgabe wäre

*abc* +abc+

weil \my_test_c:nexistiert nicht, also wird TeX angewiesen, \use_none:nin den Eingabestrom einzufügen, was das folgende nArgument verschlingt. Sie können vor eine geeignete Warnung oder Fehlermeldung einfügen \use_none:n.

Antwort2

Das \use:cstammt aus den frühen Tagen von expl3 und ist genau für diese Aufgabe gedacht (ohne jegliche Überprüfung in Situationen, in denen Sie wissen, dass Ihr Name gültig ist). Man hätte den Namen wohl auch \cs_use:cals Alias ​​verwenden können, aber er kann genauso gut für Token-Listenvariablen verwendet werden und wurde daher in die \use_...Namensfamilie aufgenommen.

verwandte Informationen