uwe_lueck > texmap > baytex10neu laden

[ START <<< zuerst klicken, dann auf Bildunterrand klickenwuerg | abstract | core | mod | mod-plus | audience | inhalt
teil-1 | ltx-goal | engs-fmts | rels-engs-fmts | engines | fmts | ltx-plus
teil-2 | ltx-doc | code-toks | anatomy | words | toks | toks-sample | fix-var | alphs | txt-code | program-aj | intest | tbt | large-alphs | cplx-lttr
teil-3 | casc | trans | impat-seq | one-proc | concat | mess | line-mess | sleep-awake | bits | buffer | streaming | bp | qualif | homo
teil-4 | css | css-input | onto-id | csts | back-disambig | csbox | disambig-? | meaning | not-tokvals | usepackage | justif | plain-change
teil-5 | var-toks | let | fun-groups | toks-over | xcp-great | xcp-poor | xpp | turing | turing-limit |
teil-6 | loop | ltx-xpa | aj-if | 25
teil-z | thanks | cause | cause-3 | colophon
teil-zzz | blogexec | back-in-name | onto-nt | mat ]



Von TeXs Magen aufwärts
und
25 Jahre Alois Kabelschachts
\expandafter

Uwe Lück
v0.1: 10. BayTeX, 21. Juli 2012
v0.2: 2014/08/06


… ein rechtes Gewürge …

… eine Einladung,
die Bestandteile TeXs digitalen Speisebreis
mit gemeinsamer Neugier
näher in Augenschein zu nehmen
und sie genüsslich zu beschnuppern …



Inhalt nüchtern*

Es geht um die
  1. Verarbeitung von TeXs Tokens durch die Engine mittels Expansion im Gegensatz zu Wertzuweisungen
  2. am Beispiel der Implementierung von Programmschleifen durch Makros
  3. in möglichst durch reine LaTeX-Nutzer verständlicher Weise, jedenfalls bei mathematischem/informatischem Hintergrund.

– Der Vortrag ist als Abwandlung der Dokumentation des dowith-Pakets gedacht, die schon „25 Jahre Kabelschachts \expandafter“ feierte.



Kernaussagen***

  1. Das TeXbook unterscheidet nicht zwischen „Kontrollfolgen“ und „Kontrollfolgentokens“.
  2. Dieser Fehler ist bisher in allen Darstellungen von TeX und seinen Spezialanwendungen übernommen worden.
  3. Der Vortrag versucht eine bessere Darstellung von TeX.



Modifikationen*

Einige „Folien“ bzw. ihre Titel sind mit einem oder zwei Sternen markiert:
* Ein Stern bedeutet, dass es die Folie im Vortrag nicht gab und der Inhalt nicht vorgetragen wurde.
So sind jedoch weder nachträglich erstellte Folien zu Vorgetragenem noch nachträglich inhaltlich erweiterte markiert.
** Zwei Sterne bedeuten, dass das für das Vortragsthema weniger relevant ist und bei knapper Zeit besser weggelassen werden sollte.
Ähnliche Bemerkungen:


Weiter zu Fassungen*

  • Witzigerweise habe ich die Fassung vom 21. Juli 2012 nicht archiviert, sondern die zugrunde liegenden Dateien für den (vorliegenden) „Nachtrag“ direkt weiterbearbeitet.
  • Im Vortrag habe ich einiges an der Tafel visualisiert. Vorliegend versuche ich, manches davon in „Folienform“ zu bringen. Die „horizontale Kaskade“ (vgl. Finite state transducer – Computerlinguistik) passte allerdings schon kaum auf die breite(!) Tafel (vgl. nun alphs).



Wen möchte ich ansprechen? Womit?

Neuigkeiten für jeden bei ganz unterschiedlichen TeX-Kenntnissen?
  1. „Blick hinter die Kulissen von LaTeX
    – für „reine“ LaTeX-Nutzer – unter denen manche laut Wikipedia LaTeX von TeX nicht unterscheiden können!?
  2. an TeX-Makroprogrammierung interessierte:
    – Vergleich von Tricks bei Konditionalen und Schleifen (die „alte Kunst, Tokens zu sparen“; „Robustheit“/Expandierbarkeit)
  3. vielleicht alle: geschicktere Beschreibung der Grundfunktionen von TeX als im TeXbook (dieses „schwer verdaulich“, Peter Wilson, didaktische Lügen …)
  4. an theoretischer Informatik Interessierte – wo ich eher Amateur bin (Korrekturen erbeten) Teilprozessoren, Aspekte von Turing-Vollständigkeit



Vortragsteile*

  1. Engines und Formate
  2. Teilprozessoren und „Privatsprachen“
  3. Kommunikation der Teilprozessoren
  4. Kontrollfolgen, Kontrollfolgentokens und deren Bedeutung
  5. Verarbeitung von Tokens
  6. Konditionale, Schleifen



Teil 1:
Engines und Formate



Zwecke von LaTeX

… als Benutzeroberfläche für Autoren:
hochwertiger Schriftsatz ohne
  • Typografiekenntnisse
  • Kenntnisse der Funktionsweise der TeX-Engine



Kombinationen von Engines und Formaten

Terminal-
kommando
entspricht Engine Format
latex etex &latex pdfTeX im DVI-Modus LaTeX
pdflatex pdftex &latex pdfTeX im PDF-Modus LaTeX
pdftex pdftex &plain pdfTeX im PDF-Modus Plain TeX
xelatex xetex &latex XeTeX LaTeX
– weiterführend:



Beziehungen zwischen Engines und Formaten*

  • Formate bilden durch Makroprogrammierung AbstraktionsschichtenBenutzeroberflächen, Auszeichnungssprache, Programmierschnittstellen – oberhalb der primitiven Engine-Befehle, die die Nutzung lezterer erst praktikabel machen.
  • Engines und Formate werden weitgehend unabhängig voneinander entwickelt – die bekannten Formate sind (ursprünglich) älter als die aktuellen Engines, sollen aber – als einmal erlernte Benutzeroberflächen und wie auch ältere Manuskripte (Dokumentdateien) – mit neueren Engines nutzbar bleiben. (Bei ConTeXt und LaTeX3 ist es etwas anders …)



(Ein paar) Engines*

„Westlich orientiert“, „TeX-Schriften“ „Nativ“ Unicode, Systemschriften, OpenType
 • Knuths TeX (80er Jahre)
 • ε-TeX (Peter Breitenlohner)
 • pdfTeX
 • XeTeX
 • LuaTeX

… vgl. TUG resources

Die neueren Engines erweitern Knuths zur Anpassung an allgemeine Neuerungen im Computersatz (und Dokumentenaustausch). Knuths TeX bleibt dabei wesentlicher Bestandteil. Der Vortrag betrifft alle gleichermaßen (bis auf quadrierte Codezeichenzahl bei Unicode).txt-code



Formate

  • Plain TeX (Knuth)  fast  LaTeX (XeLaTeX, LuaLaTeX?)
  • ? ConTeXt
  • eplain



Latex durchdringen → TeX-Infektion!**

  • LaTeXs Benutzeroberfläche ist kaum geeignet, die Gestaltungsmöglichkeiten von TeX voll auszuschöpfen
    – dazu muss man die Funktionalität der Engine kennen (das TeXbook oder so).
  • LaTeXs „Infrastruktur“ („private“/„interne“ Makros) ist für den Umgang mit der Engine aber sehr hilfreich
    (wird alternativ von eplain oder miniltx angeboten).
  • „Zusatzpakete“ von eifrigen „Drittparteien“ (macros/latex/contrib/) schöpfen diese Möglichkeiten immer weiter aus
    und bieten dafür neue „Befehle“ mit „LaTeX-artiger“ Syntax an.



Teil 2:
TeX’s Teilprozessoren und „Privatsprachen

(Vgl. Zusammenfassung in Wikipedia TeX#Typesetting_system:
„divided into four levels“)


Dokumentation von LaTeX(-Paketen) für Autoren

LaTeX und solche Erweiterungspakete sind in folgendem Stil dokumentiert:
Tippt man
\foo∗[⟨opt-arg⟩]{⟨mand-arg⟩},
so erhält man …“
Dabei soll man etwa wirklich die Codezeichen\foo∗[“ tippen, im direkten Anschluss einige situationsabhängige Codezeichen „⟨opt-arg⟩“ (optionale Argumente situationsabhängigen Umfangs); weiter exakt ]{ …


Von Code zu …*

  • Eine Zeile LaTeX-Code ist (fast) eine Liste (Informatik) oder endliche Folge (Mathematik) von Codezeichen – „String“, „Zeichenkette“.
  • Codezeichen betrachte ich als Zahlen von 0 bis 255 (hexadezimal "FF) bei Knuths TeX und pdfTeX bzw. bis "FFFF mit XeTeXkew117 (und LuaTeX, rate ich). Wenn in LaTeX-Dokumentation „abc“ „als Code“ gesetzt wird (z. B. mit „\texttt{abc}“), bedeutet das mathematisch die Zahlenfolge ("61 ,"62 ,"63).
  • Intern arbeitet TeX (die Engine) diese Listen in eine andere Sorte Listen um und bildet noch weitere „Sorten von Listen“ …


kew117J. Kew: „The Multilingual Lion“, TUGboat Bd. 26 (2005) S. 117; zu UTF-8 S. 118.


Anatomy of TeX*

It is important to understand the idea of token lists, […] The individual lines of input in your files are seen only by TeX’s „eyes“ and „mouth“; but after that text has been gobbled up, it is sent to TeX’s “stomach” in the form of a token list, and the digestive processes that do the actual typesetting are based entirely on tokens.
The TeXbook S. 38



„String“ verallgemeinert

Für eine Menge Α – „Alphabet“ – (bei Strings und lehrüblichen Automaten erst mal endlichhier?) ist Α die Menge der Wörter (einer formalen „Sprache“) über Α, oder der „Listen“ bzw. endlichen Folgen mit Gliedern („Buchstaben“) in Α (Kleene Star).

(Notation hier, falls jemand fragt:) Etwas genauer enthält Α zunächst die leere Folge () (Länge 0). Andere Folgen α haben ein erstes Glied b = first(α) und einen „Rest“ β = rest(α) (die Länge von α ist um 1 größer als die von β). Α ist minimal (zu wählen) mit der Bedingung, dass es zu b in Α und β in Α ein α mit first(α) = b und rest(α) = β enthältcarα = bβ.

Beispiel: Χ = {0,…,"FF} bzw. {0,…,"FFFF} Menge der Codezeichen  ⇒  Χ Menge der Strings/Codezeichenketten


carVgl. a. CAR and CDR und aj-litm. „Minimal“ ⇒ Eindeutigkeit wie beim geordneten Paar.


Tokens

Es gibt zwei Sorten von Tokens (Τ = Τchar ∪ Τname):
Zeichentokens („character tokens“)
  • werden zu Glyphen oder haben bestimmte „feste“(?) Steuerungsfunktionen …
  • brauchen wir im Vortrag nicht

Benannte Tokens“ („control sequences“, „control sequence tokens“)
  • werden aus „Backslash-Folgen“ (wie „\input“) gebildet
  • haben „variable“ Bedeutung …
  • jeder Codezeichenkette α aus Χ entspricht ein benanntes Token ntok(α) mit dem Namen α (soweit TeX Platz hat).



Tokens – Beispiel*

Eine Zeile
\input MS
einer Eingabedatei ist eine Folge von 9 Codezeichen (eine Codezeichenkette der Länge 9). Sie wird in eine Liste
(ntok(input), M11, S11)
von 3 Tokens (ein benanntes, zwei Zeichentokens) umgewandelt – so hofft man im allgemeinen …

Es handelt sich eigentlich um ein Plain-TeX-Beispiel, TeXbook S. 7, nicht LaTeX-Konventionen genügende Syntax, würde aber auch mit LaTeX funktionieren.



Bedeutung von Tokens: „fest“/„variabel“?

TeX’s digestive processes always know exactly what a character token signifies, because the category code appears in the token itself; but when the digestive processes encounter a control sequence token, they must look up the current definition of that control sequence in order to figure out what it means.
The TeXbook S. 39

Dies ist auch mal wieder falsch; von „aktiven Zeichen“ („~“, mit babel"“) her rührende Zeichentokens verhalten sich in dieser Hinsicht wie benannte Tokens. In der Beschreibung der TeX-Syntax in Kapitel 24 steht ⟨control sequence⟩ sogar für „either a control sequence or an active character“ – bei ⟨definition⟩ und ⟨let assignment⟩ (S. 275/277).

Das Zitat bebeispielt auch die unterschiedslose Verwendung von „control sequence“ und „control sequence token“ im TeXbook.



Streit um TeXs Mund**

TeX’s programming facilities come in two forms—there are TeX’s macros which are expanded in its mouth, and some additional assignment operations like \def which take place in the stomach.
Alan Jeffrey: “Lists in TeX’s Mouth,” TUGboat Vol. 11 (1990)

… im Gegensatz zu TeX for the Impatient und

Chapter 7 has described the process by which input files are converted to lists of tokens in TeX’s “mouth,” and Chapter 20 explained how expandable tokens are converted to unexpandable ones in TeX’s “gullet” by a process similar to regurgitation.
The TeXbook S. 267



Teilprozessor TeXbook Aufgabe Alphabet
Dateiprozessor eyes Abstraktion von Text-txt-code und Zeilenendkodierungl-end Bytes
Codezeichen-/Zeilen-
prozessor alias Tokenizer
mouth Umwandlung in Tokens Codezeichen (Χ)txt-code
Expansions-
prozessor
gullet (Speiseröhre) Reduktion auf nicht expandierbare Tokens Tokens (Τ)
Ausführungs-
prozessor
stomach (Magen) Wertzuweisungen, Beiträge zum Seitenaufbau dito
visueller Prozessortbt ? Ausrichtung von Kästchen etc. „Nodes“?



txt-codeTeXbook S. 43: EBCDIC; UTF-8-Bytes bleiben vor XeTeX unverändert, mit XeTeX wird alles in UTF-16 umkodiert.kew117 Im ersten Fall bezieht sich mein Ausdruck „Codezeichen“ (weil mir noch kein anderes Wort eingefallen ist) und die Menge Χ (griechisch Chi) auf die einzelnen Bytes, nicht auf die Zeichen, die man mit einem auf UTF-8 eingestellten Editor sieht.
l-endTeXbook S. 46.


Impatient – „intestines“*

Auch die Darstellung in TeX for the Impatient (Paul W. Abrahams, Kathryn A. Hargreaves, Karl Berry) ist sehr empfehlenswert (und wesentliche Vorlage des Vortrags), suche „How TeX works“ und „anatomy“.

Dort werden Knuths „Magen“ noch die „Intestines“ (Darm) angefügt, die aus den Seitenkästen das Ausgabeformat erzeugen sollen.tfti16

Dagegen bezieht sich im TeXbookstomach“ nach meinem Eindruck auf „den ganzen Rest“ unterhalb der Speiseröhre.


tfti16S. 16


TeX by Topic*

Dem gegenüber „unterteile“ ich den „Magen“ in Ausführungsprozessor und visuellen Prozessor – Eijkhouts TeX by Topictbt-n folgend (execution processor“).

TeX by Topic legt andererseits „eyes“ und „mouth“ als input processor“ zusammen (aber two-level), dessen Darstellung auch inhaltlich nicht fehlerfrei ist.

Überhaupt ist meine Darstellung mit „Prozessoren“ und „Automaten“ wohl durch Eijkhout geprägt.tbt-fn


tbtViktor Eijkhout: TeX by Topic (eijkhout.net/tbt/
tbt-fnHinsichtlich der Fehler?


„Buchstaben“?

Nachtrag zu Wörtern über Alphabeten und „intestines“:

Die Menge Τ der Tokens bildet schon wegen des „benannten“ Anteils (ebenso mächtig wie Χ) eine „weniger endliche“ Menge als das „Alphabet“ Χ der Codezeichen. (Hier setzt die buffer size oder jedenfalls das einen festen Gesamtumfang fordernde Design? TeXs eine Grenze.)

Ohnehin enthalten Alphabete etwa der Aussagenlogik, Modallogik und Prädikatenlogik (mathematische Logik, formale Logik) abzählbar unendlich viele Variablen (sind also unendlich, und ich habe unendliche Alphabete nicht hier erfunden).

Merkwürdiger noch: …



Komplexe „Buchstaben“**

Richtig komplex werden dann die „Kästchen“ als Glieder der horizontalen und vertikalen Listen im „visuellen“ Prozessor, sie entsprechen nicht sehr der Vorstellung eines Alphabets eines Automaten der theoretischen Informatik. Glieder von Listen bzw. endlicher Folgen sind sie aber sicher doch. Sogar die Seiten, die der „Darm“ am Ende ausspuckt, könnte man als Buchstaben eines Alphabets sehen 
Obeying […], TeX’s stomach assembles larger and larger units, starting with characters and ending with pages, and passes the pages to TeX’s intestines.



Teil 3:
Kommunikation der Teilprozessoren



Kaskade*

TeXs zuvor aufgelistete Teilprozessoren verhalten sich wie eine Kaskade von Transduktoren der theoretischen Informatik, endliche „Automaten“, die einen in der „Eingangssprache“ gehaltenen Datenstrom in einen der „Ausgangssprache“ nach sehr einfachen Regeln umwandeln – auch eine Art Formatkonversion (Transkodierung) oder auch ähnlich der Signalumwandlung in der (analogen) Nachrichtentechnik.


Kaskadierende Transformationen*

You can imagine TeX as a kind of organism with “eyes”, “mouth”, “gullet”, “stomach”, and “intestines”. Each part of the organism transforms its input in some way and passes the transformed input to the next stage.

Die „Ausgangssprache“ ist gleichzeitig die „Eingangssprache“ des nächsten Prozessors weiter innen. In der Tabelle steht in der Zeile zu jedem Teilprozessor nur das Eingangsalphabet, der „empfangende“ Prozessor steht jeweils in der folgenden Zeile.


… sequence of pages***

Zur Illustration, Bestätigung, Stoffwiederholung und Vorbereitung des Folgenden:
The eyes transform an input file into a sequence of characters.  The mouth transforms the sequence of characters into a sequence of tokens, where each token is either a single character or a control sequence.  The gullet expands the tokens into a sequence of primitive commands, which are also tokens.  The stomach carries out the operations specified by the primitive commands, producing a sequence of pages.  Finally, the intestines transform each page into the form required for the .dvi file and send it there.



Ausstattung eines „Transduktors“*

Es geht nicht so sehr um genaue Entsprechung zum Begriff der theoretischen Informatik (laut Wikipedia), eher um gemeinsame Eigenschaften von TeXs Teilprozessoren. Die Ausstattung ist:
  • Eingangsalphabet
  • Eingangspuffer – enthält stets ein Wort über dem Eingangsalphabet
  • Ausgangsalphabet
  • „Zustände“ (wie „innerhalb Zeile“, TeXbook S. 46)
  • Umwandlungs-/Übergangsregeln (Zustand, Eingangswort) → (Zustand′, Ausgangswort)
  • Speicher für „Zwischenergebnisse“ und „Unterbrechungen“ („Keller“-/Stapel-/LIFO- oder aber Ringspeicher-/FIFO-artig)



Konkatenation

Sind α (Länge m) und β (Länge n) Wörter über dem Alphabet Α, so schreibe ich einfach αβ für ihre Zusammenfügung (Länge m + n; Konkatenation, Juxtapositions-Notation).

Ist γ = αβ, so heißt α Anfang (und β Ende) von γ.

Im Fall von Codezeichenketten (A = Χ) ist beispielsweise „allAnfang von „aller“.allanf

Und zwar γ = aller, α = all, β = er

Die Konkatenation kann folgendermaßen auf die „konstruktive“ Darstellung (siehe words) zurückgeführt werden (Rekursion nach der Länge des linken Bestandteils): () β = β und (aα′) β = a (α′β) (vgl. Definition von Addition und Multiplikation mit den Peano-Axiomen).


allanf„Aller Anfang ist …“


Eine einzelne „Nachricht*

Der Puffer irgendeines Teilprozessors P an einem bestimmten „Punkt“ z habe den Inhalt πz, der Pufferinhalt des nächst-inneren Teilprozessors R sei ρz.

P macht nun einen Anfang α von πz aus –

πz = αβ
– so dass eine Transformationssregel fordert, α in ein Wort γ über Rs Eingangsalphabet umzuwandeln. z′ sei die Situation nach Ausführung der Transformation. Die Pufferinhalte sind dann
πz′ = β und  ρz′ = ρzγ


Nachricht vom Zeilenprozessor*

Beispiel: Der Pufferinhalt des Zeilenprozessors sei
πz = αβ
und der Pufferinhalt des Expansionsprozessors ρz. Zu z′ sind die Pufferinhalte
πz = β und  ρz = ρzγ
– in folgender Situation:  k: Χ → {0,…,15} stelle die Zeichenkategorien (catcode) dar. Es seien α = aα′ und β = bβ′ mit k(a) = 0, k(a′) = 11 für alle Glieder a′ von α′ und schließlich k(b) ≠ 11 – wie bei „\input MSzuvor, α = input usw.

Dann ist γ das Singleton (ntok(α′)), und dem Expansionspuffer wird das Token ntok(α′) angehängt.



Schlafen und Wachen***

You can understand how the processes interact by imagining that each process eagerly gobbles up the output of its predecessor as soon as it becomes available.

1.) Von Teilprozessoren immer nur einer aktiv, die andern „schlummern“.

2.) Ist der Puffer des aktiven leer, oder fehlen darin Funktionsargumente, so weckt er den nächstäußeren …

3.) Kann ein Prozessor dem nächstinneren ein nicht-leeres „Häppchen“ liefern, so weckt er den und setzt sich selbst wieder zur Ruhe.

4.) Der Dateiprozessor liefert eine ganze Zeile, weiter innen genügt Produktion eines einzelnes Tokens (Nodes?), um sich aus dem Produktionsprozess wieder zu verabschieden.



Datenströme (in „Häppchen“)***

As far as the stomach is concerned, the input flows in as a stream of tokens, somewhat as if your TeX manuscript had been typed all on one extremely long line.
The TeXbook S. 38

Wie beschrieben liefert jeder Teilprozessor P aus seinem Pufferzustand πz seinem Nachfolgerprozessor R ein „Häppchen“ γz. Die Häppchen können nicht beliebig lang, aber beliebig viele sein. Wir können alle in einem TeX-Lauf von P versandten Häppchen γy zu
σ = γ0γ0′ … γY
zusammenfügenγ0 ist das erste, γY das letzte.


Pufferinhalt***

R hat von σ immer nur einen Ausschnitt ρz im Puffer
σ = αzρzβz
– der sich immer weiter nach „rechts“ verschiebt.bp Das bearbeitete Material αz wird einfach „aufgegeben“ (aber contextlines…).  

bp
α0 = () = βZ,   β0 = σ  [ αZ: end, endinput ];
z früher als z′  ⇒  αz Anfang von αz′  und  βz′ Ende von αz
Genauer ist ein TeX-Lauf eine Folge von Quadrupeln (Qz, αz, βz, γz) (Q+, Q)


Datenstromverarbeitung***

  TeX kann im Prinzip ganze Enzyklopädien in einem Lauf setzen, etwas im Gegensatz zu Textverarbeitungssystemen, die ein Abbild eines Dokuments im Speicher zu halten versuchen (Word, XML-DOM vs. Streaming … Erfahrungen von Instabilität ab 1 MB). (Dann muss aber LaTeXs \label/\ref anders implementiert werden.)


Komplikationen***

Unterbrechungen“ (Vorgriffe) …
DP 
  • inputTftI S. 46f.: „shifts its gaze“ … „Nachfolgerinhalt“ vs. „nächster Inhalt“

ZP
  • catcodeTftI S. 47
  • futurelet, aftergroup

EP
  • rekursive (TbT) „Selbstaufrufe“



Homomorphismen?***

A mit Konkatenation freies Monoid
(Abstrakte Algebra, Kategorientheorie)…
hA → B bestimmt hA → B
k, ink, catcode, Leerzeichen; „gaze“]


Teil 4:
Kontrollfolgen, Kontrollfolgentokens
und deren Bedeutung



„Kontrollfolgen“

For example, […] the string of characters \input is a control sequence.
The TeXbook S. 7

⇒  der Ausdruck „\input“ referiert auf eine Codezeichenfolge (Element von Χ ), hier „Kontrollfolge“ genannt …
(1) A control sequence is considered to be a single object that is no longer composed of a sequence of symbols.
The TeXbook S. 39

⇒  eine Kontrollfolge ist keine Folge mehrfregekein Element von Χ mehr, sondern von Τ …

fregeVgl. Gottlob Frege: „Der Begriff Pferd ist kein Begriff.“


Was ist „\input“?

… gemäß line-mess wird der Anfang „\input“ des Zeilenpuffers in das benannte Token ntok(input) umgewandelt. Im TeXbook wird es ebenfalls durch „\input“ bezeichnet.

\input“ ist also zunächst eine Folge von 6 Codezeichen, aber dann, aber dann … ist es ein „einzelnes“, nicht mehr „zusammengesetztes“ Objekt (aus Τ).

– oder:

  1. \input ist aus 6 Zeichen zusammengesetzt und
  2. \input ist nicht aus 6 Zeichen zusammengesetzt.
Widerspruch. „Gut“, das eine „zuerst“, das andere „später“ – letztlich schwer verständlich.


Ontologie: zeitübergreifende Identität***

  1. Das Rätsel der Sphinx
  2. Entwicklungsstadien eines (individuellen?) Insekts (Falter, Käfer):
    Ei, Larve (Raupe), Puppe, Imago
  3. Klein-Uwe, U. L. blond, vor 5 bzw. 4 Sekunden, grauhaarig, plastiniert
  4. Teilchenbahn (Nebelkammer), Planetenbahn
  5. Film, Zeichentrickfilm, Buchstaben in Laufschrift (Illusion?)
  6. Entwicklungsstadien von „\input“: String, Token, … (… pdfsync etc.)
  7. Entwicklungsstadien der Zahl 4: durch die Quadratwurzelfunktion nimmt sie die Gestalt der Zahl 2 an, so dass gilt
    4 < 3



Kontrollfolgentokens

  1. Die aus „Kontrollfolgen“ als Elementen von Χ gebildeten benannten Tokens werden im TeXbook auch „control sequence tokens“ genannt.
  2. Es würde mir gut gefallen, wenn das Ergebnis der Konvertierung einer „Kontrollfolge“ „Kontrollfolgentoken“ genannt würde.
  3. Im TeXbook werden jedoch (ab S. 39) „control sequence“ und „control sequence token“ gleichbedeutend verwendet (vgl. css-input).



Ambiguität von ‚\‘“ beheben***

  1. Wäre der Backslash wenigstens nicht in „Schreibmaschinenzeichensatz“ („als Code“, „\“) gesetzt, sondern irgendwie als „\“, so hätte man „\input“ gegenüber „\input“ …
  2. Deutlicher wäre es, den Backslash bei der Bezeichnung von ntok(input) gar nicht erst ins Spiel zu bringen. Um eine Folge von benannten Tokens darzustellen, wäre „ntok“ allerdings tatsächlich zu umständlich, z. B.
    ntok(let) ntok(next) ntok(iterate)
    aus dem Code
    \let\next\iterate
    ?-Notation 



Der Token-Kasten**

Tatsächlich wird im TeXbook ein Token wie ntok(input) ausnahmsweise auch mittels einer Box bezeichnet:
input
Das Makro (!?) \cstok in manmac.tex dafür ähnelt LaTeXs \fbox, ist typografisch aber raffinierter/besser.


„Variable“ → Fragezeichen-Notation

  1. zur Erinnerung: um ein benanntes Token zu verarbeiten, muss TeX dessen „aktuelle Definition nachschlagen“ …
  2. … präziser fände ich: „dessen aktuelle Bedeutung“ … (allgemeiner)
  3. → z. B. ?input kürzer für ntok(input)
  4. → allgemein ?χ kürzer für ntok(χ) (χ aus Χ)
  5. … verhält sich wie eine Variable
  6. die unterschiedliche Werte annehmen kann –
  7. → „Tokenfunktionen“ …



TeXs Anzeige von Tokenbedeutungen***

\show\χ im Code führt (hoffentlich) zur Anzeige der Bedeutung von ntok(χ) am Bildschirm und im .log-File. \meaning\χ fügt sie in den Tokenstrom ein. – Geht auch mit Zeichentokenschar).

Code Anzeige
\show a the letter a.
\show 0 the character 0.
\show\empty \empty=macro:
->.
\show\let \let=\let.
\show\undefined \undefined=undefined.

… nach \escapechar=`? stattdessen „?let=?let.“ und „?undefined=undefined.“.



Notation für Bedeutungen benannter Tokens

χ ist die Bedeutung von ntok(χ) im TeXbook, wenn im Register *\χ steht – „Primitiv“, „eingebaute“ Funktion. (pdfTeX-Primitive?)

Schema Bedeutung von ntok(χ) = ?χ …
χ zu Beginn eines INITEX-Laufs – vgl. TeXbook S. 268 u.
Lχ zu Beginn eines LaTeX-Laufs
Pχ zu Beginn eines Plain-TeX-Laufs
!χ ab „intendierter“ Bedeutungszuweisung (z. B. Paket)

Beispiele:

  1. input = Pinput = L@@input ≠ Linput  [ analog end! ]
  2. Das Rätsel der LaTeX-Sphinx: vor/nach \documentclass/\begin{document}



LaTeXs \usepackage im Wandel der Zeiten …***

  1. Lusepackage – damit \usepackage vor \documentclass – liefert eine Fehlermeldung. Statt \usepackage kann aber der „Paketschreiberbefehl“ \RequirePackage verwendet werden.
  2. Ldocumentclass ändert die Bedeutung von ?usepackage in LRequirePackage – das könnte man !usepackage nennen.
  3. \begin{document} ruft Ldocument auf, was die Bedeutungen von ?usepackage und ?RequirePackage in L@notprerr (eine Fehlermeldung) ändert.



Rechtfertigung des TeXbooks***

  1. [ Plastination „schweißt Bestandteile zusammen“  ]
  2. [ „Leerzeichen-Normalisierung“ → Textausgabe = Eingabe (aber \endlinechar=...) ]
  3. Vielfach wäre es wohl nur lästig, zwischen Code- und Tokenebene zu unterscheiden.
  4. Gegenüber der Funktionsweise der Engine und Plain TeX ist die Code-Token-Wandlung simpel, um Code geht es nur auf wenigen der fast 500 Seiten.
  5. Fast alle im TeXbook behandelten Tokens ändern ihre Bedeutung nicht.



Bedeutungswandel mit Plain TeX***

  1. ?next und ?iterate sind dafür da, durch Änderung ihrer Bedeutungen Konditionale und Schleifen zu steuern. LaTeX übernimmt ?iterate dafür aus Plain TeX.
    [ ähnlich ?do ]
  2. Nach Pnewif?ifχ können Konditionale
    ?ifχτelseφfi
    (τ, φ aus Τ) verwendet werden. ?ifχ bedeutet dabei entweder iftrue – nach ?χtrue – oder iffalse – per Voreinstellung oder ?χfalse. Das Konditional wird also durch Änderung der Bedeutung von ?ifχ gesteuert. – Wird in LaTeX zumindest intern verwendet.



Teil 5:
Verarbeitung von Tokens



Variable Tokens*

Wie erwähnt haben „aktive-Zeichen-Tokens“ – sie bilden die Menge
Τact = { h13 | h aus Χ }
variable Bedeutungen, ebenso wie benannte Tokens (aus Τname). Wir fassen sie mit den benannten Tokens zur Menge der variablen Tokens
Τvar = ΤnameΤact
zusammen.


Bedeutungsverschiebung durch let

Die Funktion let erwartet zwei Tokens (v, t) als Argumente. Das erste (v) muss variabel (aus Τvar) sein. let weist ihm dann die Bedeutung des weiteren Tokens (t) zu.

Beispiel aus Ergebnis zu oben
let ?@@input ?input LaTeX behält Zugriff auf input,
während ?input „Makro wird“
not-tokvals
let ?usepackage
      ?RequirePackage
Ldocument ?usepackage bedeutet
!usepackage
usepackage
let ?ifχ ?iftrue ?χtrue in ?ifχ τ ?fi
wird τ (aus Τ) „berücksichtigt“
plain-change

alternativ: „?letv=t



Funktionsgruppen/Anweisungen***

Using its “stomach”, TeX processes the tokens in groups. Each group contains a primitive command followed by its arguments, if any. Most of the commands are of the “typeset this character” variety, so their groups consist of just one token.

1.) Der Eingangstokenstrom σ des AP wurde oben als aus den vom EP gelieferten „Häppchen“ γy zusammengesetzt beschrieben.

2.) Der AP nimmt eine andere Aufteilung von σ in „Funktionsgruppen“ φy vor. Gleichung; „Befehl“


AP, EP; ZP: Zeichenkategorien, Escapezeichen


Übersicht Tokenverarbeitung*

… vgl. alphs

Art z. B. Teilprozessor
visuell“: Glyphen, Schriftwechsel,
Abstände, … – „Nodes“ anfügen
Zeichentokens der
Kategorien 11 und 12,
hskip, …
Ausführungspr. (→ VP)
Parameteränderungen,
Makrodefinitionen, …
count, def, let Ausführungspr.
Expansion Makros,
if...else...fi,
expandafter
Expansionspr.

Ausführungsfunktionen vs. Expansionsfunktionen



Die Macht des Ausführungsprozessors*

Funktion steuert
input Dateiprozessor 
catcode Zeilenprozessor
def Expansionsprozessor (erzeugt Makro)
let Expansions-/Ausführungsprozessor
Zählerarithmetik automatischen Text (Nummern, Expansion …)
Dimensionsarithmetik visuellen Prozessor
visuelle Beiträge dito …


Die Armseligkeit des Ausführungsprozessors

TODO


Lob des Expansionsprozessors*

  • implementiert Benutzeroberfläche/Auszeichnungssprache (Ausführungsfunktionen Menschen nicht zumutbar) – Format!
  • Expandierbarkeit, Robustheit, Nebenwirkungsfreiheit …



Turing-Vollständigkeit**

  • … der Makroexpansion (Jeffey!?)
  • d. h.:
    • … TeXs Zählerarithmetik („berechnen“) wird dafür nicht benötigt
      (Eijkhout 2004 erweitert Jeffreys Lambda-Kalkül-Simulation um „Rechnen“)
    • … nach Definition eines „universellen“ Makrosatzes können beliebige Berechnungen oder Computerprogramme ohne weitere Wertzuweisungen (funktionale Programmierung) simuliert werden (via Simulation einer universellen Turingmaschine – benötigt weniger als 10 Symbole/Zustände)



Grenzen der Unendlichkeitsidealisierung/ -illusion**

  • Einschränkung: an den Expansionspuffer kann nicht??? „angebaut“ werden [TeXbook S. 300!?] (Idealisierung schlechter als mit anderen Programmen)
  • Ausweg:
    • Band durch zwei Dateien (wie Keller, plus temporäre Datei) simulieren – TeX kann zwar nicht beliebig lange Zeilen, aber Textdateien mit beliebig vielen Zeilen verarbeiten und schreiben – Verlagerung der Idealisierung ins Dateisystem
    • Simulation von Tag-Systemen noch direkter (während \input schreiben)
    • vgl. Markov-Algorithmus
    • Hintergrund: Makroexpansion ist Zeichenkettenersetzung



Teil 6:
Konditionale, Schleifen



Versionen von \loop

plain.tex (Zeilenumbrüche und Abstände verändert):
\def\loop#1\repeat{\def\body{#1}\iterate}
\def\iterate{\body \let\next\iterate
             \else \let\next\relax \fi \next}
Kabelschacht zunächst (ohne \let\next!):
\def\iterate{\body \expandafter\iterate\else\fi}
Kabelschacht weiter (ohne \relax), latex.ltx 1994/05/16:
\def\loop#1\repeat{%
    \def\iterate{#1\relax\expandafter\iterate\fi}%
    \iterate \let\iterate\relax}
– d. h. \body entfällt.


LaTeX-Konditionale

… Verallgemeinerung von \@ifundefined, inspiriert von Jeffrey (nächste Folie):
\def\LaTeXif#1{%
    #1\expandafter\@firstoftwo \else
      \expandafter\@secondoftwo\fi  }
\long\def\@firstoftwo#1#2{#1}
\long\def\@secondoftwo#1#2{#2}
… ermöglicht
\LaTeXif{test}{ja}{nein}


Ohne \expandafter

\TeXif{test}{ja}{nein}
mit Jeffrey S. 240:
\def\gobblefalse\else\gobbletrue\fi#1#2%
    {\fi#1}
\def\gobbletrue\fi#1#2%
    {\fi#2}
\def\TeXif#1%
    {#1\gobblefalse\else\gobbletrue\fi}


25 Jahre später …

2012 dokumentiert Uwe Lück sein
\def\DoWith#1#2{%
    \ifx\StopDoing#2\empty\else
        #1{#2}%
        \expandafter\DoWith\expandafter#1%
    \fi}
\let\StopDoing\DoWith
… erinnert sich der Erwähnung von „Kabelschacht“ in source2e.pdf (Dokumentation von latex.ltx), sieht sich den TUGboat-Artikel an, schaut im TeXbook nach – und versteht, warum das \expandafter funktioniert! Wer ist dieser Kabelschacht?

[ Hier übernimmt Peter Breitenlohner. ]



Teil z:
Nachträge



Danke*

… für die hochprofessionelle Organisation!


Anlässe und Motivation*

für den Vortrag:
  • Meine, Mathematiker, Informatiker u. ä. müssten die Funktionsweise von TeX doch eigentlich interessant finden – nicht nur ein „Textverarbeitungssystem“!
    Vielmehr sollte es mit TeX möglich sein, Fachartikel automatisch aus der Messdatenbank zu erzeugen, vgl. TeXbook S. 218 (\primes), Sokal-Affäre, Turing-Test und ELIZA.
  • Hoffe zu demonstrieren, dass ein bisschen abstrakte Mathematik (was die meisten von uns im ersten Semester erlebt haben und vielleicht einige immer wieder ihren eigenen Studenten erzählen) auch nützlich ist, um sich irgendwo („unerwartet“) zurechtzufinden.
  • Bei Entwicklung von fnlineno.sty und edfnotes.sty



Anlässe und Motivation*

  • Bei Entwicklung von fnlineno.sty und edfnotes.sty wollte ich das Ergebnis rekursiver Makros von Stephan Böttcher (lineno.sty) allgemein beschreiben – erste Vermutungen waren falsch, die nächsten hätte ich mit vollständiger Induktion beweisen wollen … dazu müsste ich TeXs Verarbeitung von Tokens mal formal beschreiben können …



Kolophon*

Diese „Folien“ im HTML-Format wurden mit folgenden Paketen aus dem morehype-Bündel erzeugt:
  •     blog.sty – erzeugt HTML (siehe blog.pdf)
  •  blogdot.sty – für Beamer-„Folien“, siehe blog.pdf
  • blogexec.sty – „nicht-funktionale“ Erweiterungen von blog.sty für lokales „minimales Markup“ (vgl. fifinddo-info), siehe blogexec.pdf

Zusammen mit blogexec.sty wurde blog.sty um die „BlogLigs“-Funktionalität erweitert, die wie blogexec.sty die Lesbarkeit des Codes und den Schreibkomfort verbessert und Wiki-artige Auszeichnung implementiert.



Teil zzz:
Verwandte Themen; ein andermal



blogexec.sty

Eigentlich wollte ich die vereinfachte Auszeichnungssprache (Wikipedia- u. ä. artig, Begriff in Wikipedia umstritten) demonstrieren, die mit meiner HTML-Erzeugung neuerdings möglich ist …


\“ im Tokennamen***

\“ ausschließlich erstes Zeichen einer „Kontrollfolge“nicht ambig?

Token herkömmliche
Schreibweise
LaTeX
ntok(\) \\ Nutzerbefehl für „neue Zeile“
ntok(\χ) … \\χ erstes Argument des mit \newcommand
definierten \χ optional  ⇒
ntok(\χ) speichert intern Ersetzungsregel,
ntok(χ) sucht nur optionales Argument

Beispiel: „\newcommand{\mine}[1][meins]{#1}
weist ntok(\mine) Ersetzung „[12#1]12“ → #1 zu
– herkömmlich „\\mine“ sieht aus wie „‚mine‘ in neuer Zeile“ …

[ … Fortsetzung; csname, damit auch innerhalb; \catcode...=0 … ]



Ontologie: Was ist ein benanntes Token?

„Was ist ntok(χ)?“
  1. χ selbst?
  2. \χ vermittels TeXbook-Vermischung?
  3. Position in der Hashtabelle oder im Pool

ähnliche Situation: Zahlen können (im Rahmen der Zermelo-Fraenkel-Mengenlehre) unterschiedlich definiert werden (etwa um Existenz „konstruktiv“ zu begründen – oder als Beweis relativer Konsistenz); praktisch sind nur axiomatische Charakterisierungen (Eigenschaften) relevant.


Materialsammlung zu Turing-Vollständigkeit