나는 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
.
이러한 구문상의 차이 외에도 토큰 레지스터의 확장은 두 가지 중요한 측면에서 매크로와 다릅니다.
확장
\edef
및 기타 확장 전용 컨텍스트는 한 수준으로 제한됩니다.\def\tmp{aaa} \def\tmpb{xx \tmp} \toks@{xx \tmp} \edef\A{\tmpb} \edef\B{\the\toks@}
이제 동일한 토큰 목록을 포함
\tmpb
하지만 확장 가능한 토큰을 완전히 확장하여 정의되므로 정의가 있지만 반환된 토큰은 더 이상 확장되지 않으며 정의 도 있습니다 .\toks@
xx \tmp
\A
xx aaa
\the
\edef
\B
xx \tmp
두 번째 차이점은 토큰 레지스터에는 인수가 없기 때문에
#
레지스터를 정의하거나 확장할 때 특별할 필요가 없다는 것입니다.\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
).