\cs_new:Npn вызывает ошибку неверной единицы измерения или измерения, а \let — нет.

\cs_new:Npn вызывает ошибку неверной единицы измерения или измерения, а \let — нет.

В МВЭ:

\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правильный вызов, давайте сравним следующие вызовы:

  1. \cs_new:Npn \bar:nn #1#2 { \foo:nn {#1}{#2} }
  2. \cs_new_eq:NN \bar:nn \foo:nn

Есть ли какие-то различия? Множество. При первом вызове \bar:nnбудет использоваться значение, \foo:nnкоторое является текущим во время вызова; при втором вызове \bar:nnбудет использоваться значение, которое является \foo:nnтекущим во время определения. Так что вам нужно знатьпочемувы делаете такое определение и делаете соответствующий выбор. Если вы уверены, что \foo:nnникогда не меняет смысла, два вызова почти эквивалентны: не полностью одинаковы, потому что с 1 \bar:nnтребуется на один шаг расширения больше, чем с 2.

Примечание.Я проигнорировал несколько аспектов, которые не имеют отношения к проблеме, но они важны.

  1. Постарайтесь следовать expl3правилам именования: и «» \foo:nnи \bar:nn«» — плохие имена.

  2. Функции, использующие нерасширяемые функции/макросы, такие как \makebox:

    \cs_new_protected:Npn \stephen_foo:nn #1#2 { \makebox[#1][s]{#2} }
    

    было бы лучше.

Связанный контент