![Latex3 verwendet Funktion nach Namen](https://rvso.com/image/420048/Latex3%20verwendet%20Funktion%20nach%20Namen.png)
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:c
und \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:c
ist 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:n
existiert nicht, also wird TeX angewiesen, \use_none:n
in den Eingabestrom einzufügen, was das folgende n
Argument verschlingt. Sie können vor eine geeignete Warnung oder Fehlermeldung einfügen \use_none:n
.
Antwort2
Das \use:c
stammt 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:c
als Alias verwenden können, aber er kann genauso gut für Token-Listenvariablen verwendet werden und wurde daher in die \use_...
Namensfamilie aufgenommen.