
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}
\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
그래서 당신은 알아야합니다왜당신은 그러한 정의를 하고 적절한 선택을 합니다. 의미가 결코 변하지 않는다고 확신한다면 두 호출은 거의 동일합니다. 1에는 2보다 한 단계 더 많은 확장 단계가 필요하기 \foo:nn
때문에 완전히 동일하지는 않습니다 .\bar:nn
메모.문제와 관련이 없지만 중요한 몇 가지 측면을 무시했습니다.
명명 규칙을 따르십시오
expl3
.\foo:nn
및 둘 다\bar:nn
나쁜 이름입니다.\makebox
"보호"되어야 하는 확장 불가능한 기능/매크로를 사용하는 기능 :\cs_new_protected:Npn \stephen_foo:nn #1#2 { \makebox[#1][s]{#2} }
더 좋을 것입니다.