다음은 에서 가져온 코드 조각을 보여줍니다 multido.tex
. 과제가 으로 끝나지 않는 것을 확인했습니다 %
.
\dimen@=#1\advance\dimen@#2
을 참조하십시오\def\multido@step@d#1#2{% \dimen@=#1\advance\dimen@#2 \edef#1{\number\dimen@ sp}}%
\count@=#1\advance\count@ by #2
다음에서 다시 보기\def\multido@step@i#1#2{% \count@=#1\advance\count@ by #2 \edef#1{\the\count@}}
다시 확인 하세요
\dimen@=#1pt
.\dimen@=#2pt
\dimen@=#1pt\advance\dimen@#2
\def\multido@init@r#1#2#3{% \dimen@=#1pt \multido@dimtonum\dimen@#3% \dimen@=#2pt \ifnum\multido@count<\z@\dimen@=-\dimen@\fi \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}} \def\multido@step@r#1#2{% \dimen@=#1pt\advance\dimen@#2 \multido@dimtonum\dimen@#1}
할당이 로 끝나야 하는 후행 공백을 생성합니까 %
?
답변1
실시예 1
\def\multido@step@d#1#2{%
\dimen@=#1\advance\dimen@#2
\edef#1{\number\dimen@ sp}}%
이후 #2
에는 \relax
. 실제로 #2
가 레지스터이거나 \z@
또는 와 같은 매개변수인 경우 \lineskip
줄 끝에서 제공되는 공간은~ 아니다무시당하다. 이 경우 %
다음 토큰은 확장할 수 없으므로( \edef
)을 사용할 수도 있습니다. 다음에서 가져온 토큰 목록은 \multido@step@d{\x}{2pt}
다음과 같습니다(공간 토큰은 •으로 나타냄).
\dimen@=\x\advance\dimen@2pt•\edef\x{\number\dimen@ sp}
앞의 공백은 \edef
무시됩니다. 그러나 `\multido@step@d{\x}{\parindent}를 사용하면
\dimen@=\x\advance\dimen@\parindent•\edef\x{\number\dimen@ sp}
공간 토큰은~ 아니다무시당하다. 제어 단어를 따른다는 사실은 부적합합니다. 토큰화 단계가 이미 발생했습니다. 이후 \relax
에는 공간 토큰 대신에 #2
있을 것입니다 .\relax
실시예 2
그것은 똑같습니다. \relax
이후에도 있어야지#2
실시예 3
명확성을 위해 줄에 번호를 매기겠습니다.
1 \def\multido@init@r#1#2#3{%
2 \dimen@=#1pt
3 \multido@dimtonum\dimen@#3%
4 \dimen@=#2pt
5 \ifnum\multido@count<\z@\dimen@=-\dimen@\fi
6 \multido@addtostep{\do\multido@step@r{\do#3}{\number\dimen@ sp}}}
7 \def\multido@step@r#1#2{%
8 \dimen@=#1pt\advance\dimen@#2
9 \multido@dimtonum\dimen@#1}
; 로 라인 2와 4를 종료할 필요가 없습니다 %
. 실제로 %
라인 4의 끝에 있는 a는 잘못된 것입니다. 왜냐하면 TeX는 \ifnum
할당을 수행하기 전에 확장을 시작하기 때문입니다 \dimen@
(이 특별한 경우에는 아마도 무해할 것입니다).
이전과 같은 문제는 3행에 있습니다. %
다음 토큰은 \dimen@
확장할 수 없기 때문에 여기서는 좋습니다. \relax
더 좋았을 것입니다.
\relax
8번째 줄은 이전과 같은 이유로 끝에 있어야 합니다 . a가 아닙니다 . 할당이 수행되기 전에 %
인수 가 확장을 트리거하기 때문 #2
입니다 .2pt
\multido@dimtonum
답변2
TeX가 차원을 검색할 때 저장되는 수량이 레지스터 형태로 표시되지 않는 한 공백이나 부적절한 문자에 도달할 때까지 계속해서 숫자와 단위를 찾습니다(길을 따라 확장됨). 공간이 제거됩니다. 따라서 기능적으로 표시한 대로 작성된 할당은 다음 공백을 제거할 때 제어 단어와 동일한 동작을 갖습니다. 물론, 측정기준이~이다레지스터를 사용하면 레지스터 이름은 제어 단어 자체가 되거나(따라서 공백을 삼키게 됩니다) TeX가 검색할 숫자가 됩니다.
즉,일부표시되는 할당 중 #2
차원에 대한 인수(예: )를 사용합니다. 교활하거나 너무 영리한 사람이 이를 위해 레지스터를 사용할 수 있으며, 그러면 제어 단어를 읽기 전에 매크로 정의에 기록되기 때문에 공간이 차지되지 않습니다. 실제로 그러한 데이터가 프로그래머의 통제하에 있지 않은 경우에는 \relax
.