후행 공백을 제거하려면 할당에 %를 추가해야 합니까?

후행 공백을 제거하려면 할당에 %를 추가해야 합니까?

다음은 에서 가져온 코드 조각을 보여줍니다 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더 좋았을 것입니다.

\relax8번째 줄은 이전과 같은 이유로 끝에 있어야 합니다 . a가 아닙니다 . 할당이 수행되기 전에 %인수 가 확장을 트리거하기 때문 #2입니다 .2pt\multido@dimtonum

답변2

TeX가 차원을 검색할 때 저장되는 수량이 레지스터 형태로 표시되지 않는 한 공백이나 부적절한 문자에 도달할 때까지 계속해서 숫자와 단위를 찾습니다(길을 따라 확장됨). 공간이 제거됩니다. 따라서 기능적으로 표시한 대로 작성된 할당은 다음 공백을 제거할 때 제어 단어와 동일한 동작을 갖습니다. 물론, 측정기준이~이다레지스터를 사용하면 레지스터 이름은 제어 단어 자체가 되거나(따라서 공백을 삼키게 됩니다) TeX가 검색할 숫자가 됩니다.

즉,일부표시되는 할당 중 #2차원에 대한 인수(예: )를 사용합니다. 교활하거나 너무 영리한 사람이 이를 위해 레지스터를 사용할 수 있으며, 그러면 제어 단어를 읽기 전에 매크로 정의에 기록되기 때문에 공간이 차지되지 않습니다. 실제로 그러한 데이터가 프로그래머의 통제하에 있지 않은 경우에는 \relax.

관련 정보