Verwenden von \toks-Registern

Verwenden von \toks-Registern

Ich habe dieses Tutorial zur TeX-Programmierung gelesen:

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

empfohlen in der 2. Antwort hier:Wo beginne ich mit der LaTeX-Programmierung?

Es sagt:

\toks<number>Es gibt auch 255 Token-Register, die man sich als spezielle String-Variablen vorstellen kann. Natürlich ist jede Makrozuweisung \def\macro{ content }auch eine Art String-Variable, aber Token-Register sind etwas Besonderes: Ihr Inhalt wird nicht erweitert, wenn sie mit \the\toksnumber verwendet werden. Dies kann für eine feinkörnige Erweiterungssteuerung verwendet werden, siehe Abschnitt 2.3 unten.

Aber keine Beispiele für die Verwendung \toksvon Registern. Was meint er mit „spezielle Stringvariablen“? Für die beiden vorherigen Registertypen konnte ich den Wert zuweisen:

\count0=12
\dimen0=1.102pt

Und drucken Sie es aus:

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

Aber ich verstehe nicht, wie man es benutzt \toks.

Antwort1

Ein Token-Register ist einem Makro ohne Argumente sehr ähnlich, es gibt jedoch Unterschiede in Syntax und Erweiterungsregeln.

Mit der einfachen und Latex-Definition von \toks@for \toks 0 können Sie die Token speichern abcüber

\toks@{abc}

oder

\def\tmp{abc}

Beachten Sie, dass ein Makro einen bestimmten Befehl zum Setzen des Makros hat ( \defoder Wrapper darum, wie z. B. \newcommand), aber Token-Register verwenden einfach den Registernamen gefolgt von einemausgewogenTextgruppe.

Im Gegensatz zu Makros, die allein durch die Referenzierung ihres Namens erweitert werden, sind Token-Register, wie andere Register auch, nicht erweiterbar und auf ihre Inhalte kann durch Erweitern zugegriffen werden \the.

Also

\the\toks@

Und

\tmp

jeweils erweitern auf abc.

Abgesehen von diesen syntaktischen Unterschieden unterscheidet sich die Erweiterung von Token-Registern in zwei wichtigen Punkten von Makros.

  1. Die Erweiterung in \edefund anderen Nur-Erweiterungskontexten ist auf eine Ebene beschränkt:

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

    Jetzt \tmpbund \toks@enthalten die gleiche Tokenliste , werden xx \tmpaber \Adurch vollständig expandierende erweiterbare Token definiert und haben daher die Definition, xx aaaaber die von zurückgegebenen Token \thewerden in der nicht weiter erweitert und haben \edefdaher die Definition\Bxx \tmp

  2. Der zweite Unterschied besteht darin, dass Token-Register keine Argumente haben und daher #beim Definieren oder Erweitern des Registers nicht speziell sein müssen (und es auch nicht ist).

    \toks@{#1}
    

    ist nur ein Token-Register, das aus einer Liste von zwei Token #und besteht 1.

Dies wird im Makro von LaTeX verwendet \g@addto@macro.

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

soll abcam Ende der aktuellen Definition von hinzugefügt werden \foo.

Eine einfache (und wenn ich mich recht erinnere) Definition könnte sein

\makeatletter

\gdef\foo{123}

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

\gaA\foo{abc}

\show\foo

Das funktioniert einwandfrei und zeigt die Definition als an 123abc. Versuchen Sie jedoch

\gaA\foo{#}

und du bekommst

! Illegal parameter number in definition of \foo.

Wir können jedoch die Tatsache nutzen, dass #in einem Token-Register nichts Besonderes ist und dass der Registerinhalt nur einmal erweitert wird

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

Zuerst \toks@wird das Register so definiert, dass es die Erweiterung des im ersten Argument übergebenen Makros enthält, gefolgt vom Inhalt des zweiten Arguments. #kann sicher in einer Token-Zuweisung verwendet werden. Dann wird das Makro global so definiert, dass die Erweiterung von \thetoksgenau dem Inhalt von entspricht, \toks@ohne weitere Erweiterung, selbst wenn diese #Token enthält:

\makeatletter

\gdef\foo{123}

\g@addto@macro\foo{abc}

\show\foo

\g@addto@macro\foo{#}

\show\foo

produziert

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

wobei #wie beabsichtigt hinzugefügt wurde (es #wurde nur eines hinzugefügt, die Verdoppelung ##ist ein Artefakt der Verwendung von \show).

verwandte Informationen