
En el 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}
Si uso \cs_new:Npn
en lugar de \let
, arrojará un error de "unidad de medida ilegal". ¿Por qué? ¿Cómo puedo arreglar esto?
Respuesta1
Es un problema de sintaxis TeX:
\cs_new:Npn \foo:nn #1#2 { ... }
te muestrodefinir \foo:nn
. Pero cuando tullamareso, tienes que hacerlo
\foo:nn {<argument 1>}{<argument 2>}
y las llaves se pueden omitir si el argumento consta de un solo token.
En tu intento, de \bar:nn {3cm}{abcd}
ti obtienes
\foo:nn 3cmabcd
así #1
es 3
y #2
es c
, resultando en
\makebox[3][s]{c}mabcd
que definitivamente no es lo que quieres. Con
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
obtienes lo deseado.
Observé que \let
no se debe usar dónde \cs_new_eq:NN
está la llamada correcta, comparemos las siguientes llamadas:
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
\cs_new_eq:NN \bar:nn \foo:nn
¿Hay alguna diferencia? Infinidad. Con la primera llamada, \bar:nn
se utilizará el significado \foo:nn
actual en el momento de la llamada; con la segunda llamada, \bar:nn
utilizará el significado de \foo:nn
actual en el momento de la definición. Entonces necesitas saberpor quéhaces esa definición y haces la elección adecuada. Si estás seguro de que \foo:nn
nunca cambia de significado, las dos llamadas son casi equivalentes: no completamente iguales, porque con 1 \bar:nn
requiere un paso de expansión más que con 2.
Nota.Descarté algunos aspectos que no son relevantes para el tema, pero son importantes.
Intente seguir las
expl3
convenciones de nomenclatura: ambos\foo:nn
y\bar:nn
son malos nombres.Funciones que emplean funciones/macros no expandibles, como las que
\makebox
deberían estar “protegidas”:\cs_new_protected:Npn \stephen_foo:nn #1#2 { \makebox[#1][s]{#2} }
seria mejor.