
Im MWE:
\documentclass{article}
\setlength{\fboxsep}{0pt}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn \foo:nn #1#2
{
\makebox[#1][s]{#2}
}
% \cs_new:Npn \bar:nn #1#2 { \foo:nn #1#2 }
\let \bar:nn \foo:nn
\fbox{\foo:nn {3cm} {a~b~c~d}}\par
\fbox{\bar:nn {3cm} {a~b~c~d}}
\ExplSyntaxOff
\end{document}
Wenn ich \cs_new:Npn
anstelle von verwende \let
, wird die Fehlermeldung „ungültige Maßeinheit“ ausgegeben. Warum? Wie kann ich das beheben?
Antwort1
Es ist ein Problem der TeX-Syntax:
\cs_new:Npn \foo:nn #1#2 { ... }
Ich zeige Ihnendefinieren \foo:nn
Aber wenn SieAnrufes, müssen Sie tun
\foo:nn {<argument 1>}{<argument 2>}
und die Klammern können weggelassen werden, wenn das Argument aus einem einzelnen Token besteht.
Bei Ihrem Versuch \bar:nn {3cm}{abcd}
erhalten Sie
\foo:nn 3cmabcd
so #1
ist 3
und #2
ist c
, was zu
\makebox[3][s]{c}mabcd
was definitiv nicht das ist, was Sie wollen. Mit
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
Sie erhalten das gewünschte.
Wir haben festgestellt, dass „ \let
nicht verwendet werden sollte“, wo es \cs_new_eq:NN
sich um den richtigen Aufruf handelt. Vergleichen wir nun die folgenden Aufrufe:
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
\cs_new_eq:NN \bar:nn \foo:nn
Gibt es Unterschiede? Viele. Beim ersten Aufruf \bar:nn
wird die Bedeutung von verwendet, \foo:nn
die zum Aufrufzeitpunkt aktuell ist; beim zweiten Aufruf \bar:nn
wird die Bedeutung von verwendet, die \foo:nn
zum Definitionszeitpunkt aktuell ist. Sie müssen also wissenWarumman führt eine solche Definition durch und trifft die entsprechende Wahl. Wenn man sicher ist, dass \foo:nn
sich die Bedeutung nie ändert, sind die beiden Aufrufe nahezu gleichwertig: nicht ganz gleich, denn bei 1 \bar:nn
ist ein Expansionsschritt mehr erforderlich als bei 2.
Notiz.Ich habe einige Aspekte außer Acht gelassen, die für das Problem nicht relevant, aber wichtig sind.
expl3
Versuchen Sie, die Namenskonventionen einzuhalten : Sowohl\foo:nn
als auch\bar:nn
sind schlechte Namen.Funktionen, die nicht erweiterbare Funktionen/Makros verwenden, wie beispielsweise
\makebox
:\cs_new_protected:Npn \stephen_foo:nn #1#2 { \makebox[#1][s]{#2} }
wäre besser.