Hallo, Am Mit, 09 Aug 2006, Hannes Vogelmann schrieb:
Am Tag 06-08-09 zur Zeit 00:33:54 schrieb Martin Schröder:
Kennst Du den Unterschied zwischen LaTeX, TeX und pdfTeX?
Naja, nur soweit, das LaTeX eben dvi-files erzeugt und mit graphicx eps-Dateien verarbeitet und pdflatex eben pdf-Dateien erzeugt und warum auch immer keine eps-Dateien schluckt wobei beide sonst ähnliche (gleiche?) macrosprachen für TeX sind. Da ich pdflatex bisher nicht verwendet habe (außer jetzt eben unwillentlich) kenne ich mich aber auch nur mit LaTeX aus.
Da gibt es keinen Unterschied. Nur das Ausgabeformat ist ein anderes und welche Grafikformate eingebunden werden können. Ok, es gibt noch ein paar Details, z.B. PDF-Specials usw. die hyperref setzt um die Hyperlinks usw. zu erzeugen. Aber solche Specials gibt's ja auch bei der DVI-Ausgabe, dann werden die aber i.d.R. für PS via dvips generiert. Aber um diese ganzen Details kümmern sich eben graphicx und hyperref selbst (bis auf ein paar Sonderfälle, die aber in der Praxis sehr selten sind). Etwas anders sieht die Sache mit eTeX vs. TeX aus, da gibt es tatsächlich ein paar Primitive mehr. Aber auch das muß den Anwender nicht interessieren, denn eTeX ist komplett abwärtskompatibel zu TeX. Es gibt praktisch 4 Backends: - TeX (ohne alles) - eTeX (mit ein paar Erweiterungen) - PDFTeX (TeX mit DVI- und PDF-Ausgabe und weiteren Verbesserungen, wobei die PDF-Ausgabe der default ist). - PDFeTeX (eTeX + PDFTeX vereint) Inzwischen verwenden eigentlich alle Distributionen PDFeTeX als Backend. LaTeX wiederum ist "nur" ein Makropaket, das mit allen(!) 4 Backends verwendet werden kann. ConTeXt hingegen kann IIRC nicht mit TeX als Backend, es verwendet Features aus eTeX und/oder PDFTeX ;) Daß du 'latex' aufrufen kannst ist nur ein Entgegenkommen, insofern, als daß das Backend gleich ein passendes Format (das "gedumpte" Makropaket, hier LaTeX) lädt. Ebenso wird das Ausgabeformat entsprechend dem Namen unter dem man das Backend aufruft angepasst. Es gibt noch weitere Makropakete, z.B. jadetex, xmltex usw. die auch über entsprechende Namen aufgerufen werden können. Du kannst statt latex auch: tex -fmt latex verwenden oder das Format per '%&latex' in der ersten Zeile dazuladen. Oder auch mit den anderen Backends (wobei die bei dir alle gleich sind): etex -efmt elatex => eLaTeX, das Format ist ein mit eTeX gedumptes LaTeX-Makropaket pdftex -fmt pdflatex => PDFLaTeX (analog) pdfetex -efmt pdfelatex => PDFeLaTeX (analog) Ggfs. wird sogar noch das Format erst generiert. So, jetzt kannst du aber eben statt 4 Backends auch weniger nehmen, und diese dann eben in den passenden "Modus" schalten. Denn, wie gesagt gilt: eTeX \supset TeX PDFTeX \supset TeX PDFeTeX = eTeX \cup PDFTeX PDFeTeX kann sich also wie alle anderen Backends verhalten. Und genau deswegen verwenden die Distributionen inzwischen PDFeTeX als Backend, das eben über die passende Konfiguration bzw. die passenden Aufrufnamen (symlinks) automatisch in die jeweiligen Modi geschaltet wird. Rufst du also 'latex' auf verwendest du das PDFeTeX Backend im DVI-Mode mit LaTeX-Format... (und s.u.)
9.2 hat wahrscheinlich noch ein teTeX 2, d.h. latex benutzt tex(1). Bei 9.3 haben sie endlich auf teTeX 3 umgestellt, und latex benutzt pdftex(1). egu.cls erkennt pdftex, weiß aber nicht, daß pdftex auch dvi erzeugen kann, und schaltet pdf an, und fällt dann auf die Nase.
So in etwa! egu.cls erkennt nicht, dass der Schalter \pdfoutput=0 gesetzt ist, weil es den bei früheren teTeX-Versionen noch nicht gab und entscheidet dann falscherweise sich so zu verhalten als wäre er auf 1 gesetzt, mit den bekannten Folgen.
Doch, \pdfoutput gibt es seit es pdftex gibt, allerdings wurde der von tex (und damit latex, etex, elatex) nicht definiert(!). Mit PDF(e)TeX als Backend wird aber \pdfoutput immer definiert (aber nicht immer auf etwas zu "true" expandierendes) gesetzt. Und nun fliegen eben alle die Pakete und Klassen auf die Nase, die den schon immer(!) falschen Test verwendet haben. Und ifpdf.sty ist so neu nicht und macht alles richtig, falls man denn man wirklich selber den Modus unterscheiden muß. Der entscheidende Code (der Rest ist eigentlich nur Beiwerk wg. Versionierung, Ausgabe im Log etc.) ist recht kurz und einfach: ==== % File: ifpdf.sty % Version: 2001/07/14 v1.1 % Author: Heiko Oberdiek [..] % Implementing the switch: \newif\ifpdf \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi ==== In der Klasse für die FAQ verwende ich: ==== %% ein 'if' fuer den Test, ob gerade pdf ausgegeben werden soll. Wenn %% vorhanden per ifpdf.sty \IfFileExists{ifpdf.sty}{% \RequirePackage{ifpdf} }{% \ClassWarning{sl-faq}{Package `ifpdf' not found, defining \string\ifpdf} \newif\ifpdf \ifx\pdfoutput\undefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi } ==== Ich verwende also, sofern vorhanden ifpdf.sty, ansonsten verwende ich den aus ifpdf kopierten Code. Wie gesagt: ein Test ob \pdfoutput undefiniert ist war schon immer fslach, funktioniert aber eben solange man nicht pdf(e)tex als Backend verwendet. Oder anders gesagt: \ifx\pdfoutput\undefined ist und war ein Test ob PDF(e)TeX das Backend ist. Aber _kein_ Test, welches Ausgabeformat gewünscht ist.
Frage am Rande: Warum lässt pdflatex keine eps-Grafiken zu? Oder liege ich da ganz falsch?
pdflatex läßt natürlich eps-Grafiken zu. Aber eben nicht wenn es PDF ausgeben soll. Das liegt schlicht daran, daß man eps nicht direkt in PDF einbetten kann. Ebenso kann man ja auch kein jpeg direkt in PS einbetten. Wenn man das eps für's PDF passend umpackt (epstopdf) oder um das jpeg einen EPS-Header schreibt (jpeg2ps), dann kann man es einbetten. In egu.cls wird aber graphicx der faslche Modus vorgegeben. Versuch doch mal folgendes: ==== \documentclass{minimal} \usepackage{graphicx} \begin{document} \includegraphics{foo} \end{document} ==== und lege ein passendes 'foo.eps' dazu. Und dann lass dein latex (das dann ein PDFeTeX im latex-Modus ist) drüberlaufen. Es sollte alles klappen. Und dann sabotiere graphicx wie es egu.cls macht: \usepackage[pdftex]{graphicx} und rufe wieder 'latex' auf. Und du solltest die bekannte Fehlermeldung bekommen. HTH, -dnh -- Get back there in front of the computer NOW. Christmas can wait. -- Linus "the Grinch" Torvalds, 24 Dec 2000 on linux-kernel