Betrachten Sie das folgende Muster:
\NewDocumentCommand{\mycommand}{m}{
\myinternalcommand:n{#1}
}
\cs_new:Nn \myinternalcommand:n{
\tl_if_single:nTF{#1}{TRUE}{FALSE}
}
und sagen wir, ich möchte verschiedene Dinge tun, je nachdem, ob \mycommand
ich eins control sequence
als Eingabe bekomme oder nicht: ich \mycommand{\mycs}
soll das eine tun, ich \mycommand{abcde}
soll das andere tun. Ich möchte insbesondere \mycommand{ \mycs }
arbeiten.
Meine Frage lautet: Wie kann ich \tl_trim_spaces
Leerzeichen um Steuersequenzen herum entfernen, ohne die Steuersequenz zu erweitern? (Im obigen Muster :n
kann die Form der Argumente geändert werden.)
Hinweis: Auch wenn diese Anwendung schlecht ist (in diesem Fall wüsste ich gerne, warum), interessiert mich dennoch die ursprüngliche Frage: Wie kann ich Leerzeichen verkleinern, ohne den Inhalt zu vergrößern?
Antwort1
Beim Erstellen eines Dokumentbefehls wird normalerweise die ltcmd
Prozessorschnittstelle verwendet:
\ExplSyntaxOn
\NewDocumentCommand \mycommand { > { \TrimSpaces } m }
{
\myinternalcommand:n {#1}
}
Wenn Sie Leerzeichen auf Codeebene kürzen möchten, wie in beschrieben, interface3
können Sie sich darauf verlassen, dass \tl_trim_spaces:n
eine weitere Expansion verhindert wird. So können Sie zum Beispiel
\cs_new:Npn \my_pkg_fn:n #1
{
\use:e { \tl_trim_spaces:n {#1} }
}
\my_pkg_fn:n { ~ \foo }
\foo
wird genau im Eingabestream belassen .
Aus der Frage geht hervor, dass Sie etwas tun möchten wie
\cs_new:Npn \myinternalcommand:n #1
{
\myinternalcommand_aux:e {#1}
}
\cs_new:Npn \myinternalcommand_aux:n #1
{
\tl_if_single:nTF{#1}{TRUE}{FALSE}
}
\cs_generate_variant:Nn \myinternalcommand_aux:n { e }
obwohl es sich wirklich so anfühlt, als ob Sie sich Sorgen machen überDokumentebeneEingabefelder ...