
В МВЭ:
\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}
Если я использую \cs_new:Npn
вместо \let
, то выдаст ошибку "недопустимая единица измерения". Почему? Как это исправить?
решение1
Это проблема синтаксиса TeX:
\cs_new:Npn \foo:nn #1#2 { ... }
Я покажу тебеопределять \foo:nn
. Но когда вывызовэто, вам нужно сделать
\foo:nn {<argument 1>}{<argument 2>}
и фигурные скобки можно опустить, если аргумент состоит из одного токена.
В вашей попытке, от \bar:nn {3cm}{abcd}
вас получить
\foo:nn 3cmabcd
так #1
есть 3
и #2
есть c
, в результате чего
\makebox[3][s]{c}mabcd
что определенно не то, что вам нужно. С
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
вы получаете желаемую вещь.
Замечено, что \let
не следует использовать там, где \cs_new_eq:NN
правильный вызов, давайте сравним следующие вызовы:
\cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
\cs_new_eq:NN \bar:nn \foo:nn
Есть ли какие-то различия? Множество. При первом вызове \bar:nn
будет использоваться значение, \foo:nn
которое является текущим во время вызова; при втором вызове \bar:nn
будет использоваться значение, которое является \foo:nn
текущим во время определения. Так что вам нужно знатьпочемувы делаете такое определение и делаете соответствующий выбор. Если вы уверены, что \foo:nn
никогда не меняет смысла, два вызова почти эквивалентны: не полностью одинаковы, потому что с 1 \bar:nn
требуется на один шаг расширения больше, чем с 2.
Примечание.Я проигнорировал несколько аспектов, которые не имеют отношения к проблеме, но они важны.
Постарайтесь следовать
expl3
правилам именования: и «»\foo:nn
и\bar:nn
«» — плохие имена.Функции, использующие нерасширяемые функции/макросы, такие как
\makebox
:\cs_new_protected:Npn \stephen_foo:nn #1#2 { \makebox[#1][s]{#2} }
было бы лучше.