\toks 레지스터 사용

\toks 레지스터 사용

나는 TeX 프로그래밍에 대한 이 튜토리얼을 읽고 있었습니다:

http://pgfplots.sourceforge.net/TeX-programming-notes.pdf

두 번째 답변에서 권장되는 사항은 다음과 같습니다.LaTeX 프로그래밍은 어디서 시작하나요?

그것은 말한다:

\toks<number>특수 문자열 변수로 생각할 수 있는 255개의 토큰 레지스터도 있습니다. 물론 모든 매크로 할당 \def\macro{ content }도 일종의 문자열 변수이지만 토큰 레지스터는 특별합니다. \the\toks숫자와 함께 사용하면 해당 내용이 확장되지 않습니다. 이는 세분화된 확장 제어에 사용될 수 있습니다. 아래 섹션 2.3을 참조하세요.

그러나 레지스터를 사용하는 예는 없습니다 \toks. "특수 문자열 변수"란 무엇을 의미합니까? 이전 2가지 종류의 레지스터에 대해 다음 값을 할당할 수 있습니다.

\count0=12
\dimen0=1.102pt

그리고 인쇄하세요:

Value1: \the\count0
Value2: \the\dimen0

하지만 어떻게 사용하는지 이해가 되지 않습니다 \toks.

답변1

토큰 레지스터는 인수가 없는 매크로와 매우 유사하지만 구문과 확장 규칙에 차이가 있습니다.

\toks@for 의 일반 및 라텍스 정의를 사용하면 다음을 통해 \toks 0 토큰을 저장할 수 있습니다.abc

\toks@{abc}

또는

\def\tmp{abc}

매크로에는 매크로를 설정하는 특정 명령이 있습니다(\def 또는 그 주위의 래퍼 \newcommand)를 설정하는 특정 명령이 있지만 토큰 레지스터는 레지스터 이름 뒤에균형이 잡힌텍스트 그룹.

반대로 이름을 참조하여 확장하는 매크로와 달리 토큰 레지스터는 다른 레지스터와 마찬가지로 확장할 수 없으며 해당 내용은 확장을 통해 액세스됩니다 \the.

그래서

\the\toks@

그리고

\tmp

각각은 으로 확장됩니다 abc.

이러한 구문상의 차이 외에도 토큰 레지스터의 확장은 두 가지 중요한 측면에서 매크로와 다릅니다.

  1. 확장 \edef및 기타 확장 전용 컨텍스트는 한 수준으로 제한됩니다.

    \def\tmp{aaa}
    
    \def\tmpb{xx \tmp}
    
    \toks@{xx \tmp}
    
    \edef\A{\tmpb}
    
    \edef\B{\the\toks@}
    

    이제 동일한 토큰 목록을 포함 \tmpb하지만 확장 가능한 토큰을 완전히 확장하여 정의되므로 정의가 있지만 반환된 토큰은 더 이상 확장되지 않으며 정의 도 있습니다 .\toks@xx \tmp\Axx aaa\the\edef\Bxx \tmp

  2. 두 번째 차이점은 토큰 레지스터에는 인수가 없기 때문에 #레지스터를 정의하거나 확장할 때 특별할 필요가 없다는 것입니다.

    \toks@{#1}
    

    는 두 개의 토큰 목록으로 구성된 토큰 레지스터일 뿐입니다 #.1

\g@addto@macro이것은 LaTeX의 매크로 에서 사용됩니다 .

\g@addto@macro@\foo{abc}

abc의 현재 정의 끝에 추가해야 합니다 \foo.

간단한(그리고 내가 정확하게 원본을 기억한다면) 정의는 다음과 같습니다.

\makeatletter

\gdef\foo{123}

\def\gaA#1#2{%
  \expandafter\gdef\expandafter#1\expandafter{#1#2}}

\gaA\foo{abc}

\show\foo

그것은 잘 작동하고 정의를 다음과 같이 표시합니다 123abc. 그러나 시도해보십시오

\gaA\foo{#}

그리고 당신은 얻습니다

! Illegal parameter number in definition of \foo.

#그러나 우리는 toks 레지스터에서 특별하지 않고 레지스터 내용이 한 번만 확장된다는 사실을 사용할 수 있습니다.

\long\def\g@addto@macro#1#2{%
  \begingroup
    \toks@\expandafter{#1#2}%
    \xdef#1{\the\toks@}%
  \endgroup}

먼저 \toks@레지스터는 첫 번째 인수에 전달된 매크로의 확장을 포함하고 두 번째 인수의 내용을 포함하도록 정의됩니다. #toks 과제에 사용해도 안전합니다. 그런 다음 매크로는 토큰 이 포함되어 있더라도 추가 확장 없이 \thetoks정확히 내용이 확장되도록 전역적으로 정의됩니다.\toks@#

\makeatletter

\gdef\foo{123}

\g@addto@macro\foo{abc}

\show\foo

\g@addto@macro\foo{#}

\show\foo

생산하다

> \foo=macro:
->123abc.
l.7 \show\foo
             
? 
> \foo=macro:
->123abc##.
l.11 \show\foo

#의도한 대로 추가된 위치 (한 개만 #추가되었으며 두 배로 늘어난 것은 를 ##사용한 인공물입니다 \show).

관련 정보