Joerg Fischer schrieb:
> Ulrich D i e z <
ud.usenetco...@web.de> wrote:
>
>> \NewDocumentCommand\hksqrt{om}{%
>
> Cool. Das funktioniert prima.
Es ist auch nur ein Workaround, der nicht genau nachvollzieht, was
(La)TeX beim Setzen von Wurzelzeichen genau tut.
> Danke! Wieviel LaTeX-Erfahrung braucht
> man bis man auf sowas kommt?
Ich weiß nicht, wie man LaTeX-Erfahrung quantifizieren soll. ;-)
> Also ich kenne durchaus einige Programmiersprachen
> und benutze LaTeX auch nicht erst seit vorgestern,
Zum Glück hast du nicht gesagt, dass (La)TeX eine Programmiersprache
sei. ;-)
Solche Statements haben nämlich schon lustigste Debatten nach sich
gezogen.
TeX ist zwar angeblich "Turing complete", aber es gibt Leute, die
sagen, TeX/LaTeX sei keine Programmiersprache, sondern eine
Textsatzsprache.
Auch Knuth bezeichnet TeX im TeXbook nie explizit als Programmiersprache,
sondern allgemein als "Sprache", und im Preface des TeXbook ist in
Zusammenhang mit dem Vorgänger des derzeitigen TeX, TeX78, von "attempt
at a document formatting language" die Rede.
In einem Double-Dangerous-Bend-Absatz in Chapter 20: Definitions (also
called Macros) wird aber darauf aufmerksam gemacht, dass man TeX als
primitive Programmiersprache verwenden kann:
| Appendices B, D, and E contain numerous examples of how to make macros
| do useful things. Let’s close this chapter by presenting a few examples that
| show how TeX can actually be used as a primitive programming language, if you want
| to achieve special effects, and if you don’t care very much about computer costs.
Außerdem wird in Chapter 24: Summary of Vertical Mode ein Zusammenhang zu
"Computersprachen" hergestellt:
| We shall define TeX’s parts of speech by using a modified form of the gram-
| matical notation that was introduced about 1960 by John Backus and Peter Naur for
| the definition of computer languages.
Es wird aber nirgendwo explizit gesagt, dass TeX eine Programmiersprache sei.
Da man beim Lesen des TeXbook extrem griffelspitzig sein muss, weil
viel Information sehr komprimiert dargestellt wird, nehme ich an, dass
absichtlich vermieden wurde, TeX als Programmiersprache zu bezeichnen.
> aber das ist schon... heftiger Code...
Als ich in TeX/LaTeX einstieg, kam mir vieles auch "heftig" vor, was aber
hauptsächlich daran lag, dass ich anfangs darin verhaftet war, mein Wissen
über prozedur-, funktions- und objektorientierte Programmiersprachen wie
Pascal, C, C++, Java etc auf (La)TeX übertragen zu wolllen - in der Annahme,
mir dadurch ersparen zu können, mir die Grundlagen darüber, wie TeX
funktioniert, unter Verwendung der von Donald E. Knuth in seinem TeXbook
erklärten Konzepte und in Zusammenhang mit diesen Konzepten eingeführten
Begriffe anzueignen.
Da TeX
- keine solche Programmiersprache sondern eine Textsatzsprache ist,
- das geschriebene TeX-Programm zur Laufzeit des Compilers ausführt
und die dabei entstehenden Resultate verwendet, um eine Ausgabedatei
(dvi oder pdf) mit gesetztem Text und/oder Hilfsdateien und/oder
Meldungen an der Konsole zu erzeugen, anstatt das geschriebene
Programm in Maschinencode zu übersetzen, der durch Aufruf der
ausführbaren Datei auf der Maschine ausgeführt wird,
- verschiedene Ebenen/"Verdauungsstadien" des Verarbeitens von TeX-
Eingabedateien hat, die man beim Programmieren in TeX berücksichtigen
muss -- zB ist das Stadium, in dem Makros definiert werden und andere
Assignments stattfinden - diese Dinge finden im "Magen" von TeX statt,
ein anderes als das Stadium, in dem Expansion stattfindet
(Expansion, d.h., Ersetzen von Makros und anderen expandierbaren
Token und deren Argumenten durch Token, die den Ersetzungstext
bilden, findet in der "Speiseröhre" von TeX statt),
- ein "Verdauungsstadium" hat, im TeXbook in der Analogie zu einem
lebenden Organismus mit Verdauungstrakt "gullet"="Speiseröhre" genannt,
in welchem alle Expansion erledigt wird, wobei Konzepte wie Token,
Primitive, Makro und Makroargument und Expansion eine Rolle spielen,
sodass man sich beim Programmieren überlegen kann,
- ob man für dieses Stadium/die Speiseröhre programmiert, also so
programmiert, das der programmierte "Mechanismus" schon in der
"Speiseröhre" von TeX vollständig abläuft, und dafür zB Makros
definiert, die sich zB rekursiv gegenseitig aufrufen und dabei
ihre Argumente als "Variablen" benutzen, wobei die als Argumente
übergebenen Zusammenstellungen an Token die Werte der Variablen im
betreffenden Expansionssschritt darstellen,
- oder auch den "Magen" miteinbezieht, also zB einen "Mechanismus"
programmiert, der auch Assignments ausführt, zB Hilfsmakros
umdefiniert, Boxen für Box-Register setzt, deren Maßangaben man
dann mittels \dp/\ht/\wd erhalten kann, Token-Registern einen
Inhalt zuweist, etc
, man sich bei TeX also weit mehr mit der Frage befassen muss, in
welches (Verdauungs-)Stadium des Verarbeitens der .tex-Eigabedatei man
mit seiner Programmiererei eingreifen will, als man das bei herkömmlichen
Programmiersprachen muss; auch bei LuaTeX mit seinen Möglichkeiten,
mittels in der Programmiersprache Lua gschriebenen Routinen in die
Abläufe von TeX einzugreifen, spielt die Frage, in welches
(Verdauungs-)Stadium des Verarbeitens der .tex-Eigabedatei durch TeX
man eingreifen möchte, eine große Rolle
, kann man die Übertragung von aus anderen Programmiersprachen geläufigen
Konzepten meiner Meinung nach nur dann erfolgreich bewerkstelligen, wenn
man die Unterschiede zwischen diesen Programmiersprachen und TeX kennt, was
wiederum heißt, dass man mit den Grundkonzepten der Funktionsweise von
TeX und damit auch mit den von Knuth in diesem Zusammenhang eingeführten
Begriffen vertraut sein muss.
Als ich dazu überging, beim Programmieren in TeX nicht mehr ausgehend
von dem denken zu wollen, was ich über das Programmieren in anderen
Sprachen wusste, sondern ausgehend von den im TeXbook für TeX erklärten
Konzepten und Begriffen, fing es an, mir viel leichter zu fallen.
Die Profis in den Newsgroups comp.text.tex und de.comp.text.tex
und auf der Plattform TeX-LaTeX-StackExchange haben mir sehr geholfen
und helfen mir sehr, zu verstehen, wie in TeX die Dinge
ineinandergreifen.
Mit freundlichem Gruß
Ulrich