Sollten verschiedene TeX-Implementierungen (z. B. MiKTeX und TeX Live) identische DVI-Dateien erzeugen?

Sollten verschiedene TeX-Implementierungen (z. B. MiKTeX und TeX Live) identische DVI-Dateien erzeugen?

Es wird gesagt, dass TeX auf allen Systemen identisch funktionieren soll. BeispielsweiseKnuth'STRIP-Testexistiert, um sicherzustellen, dass jedes Programm nur dann „TeX“ genannt werden kann, wenn es bei bestimmten Eingaben bestimmte Dinge tut. Und das TeX-Programm selbst ergreift bestimmte Maßnahmen, um zu verhindern, dass systemabhängige Faktoren zu Verhaltensunterschieden führen, z. B. verwendet TeX für Dimensionen anstelle von Gleitkommazahlen Festkommazahlen: ganzzahlige Vielfache von 1 sp(skalierter Punkt), was 1/65536 von 1/72,27 Zoll entspricht.

Frage 1: Aber was bedeutet es (abgesehen vom Bestehen des Trip-Tests), sich identisch zu verhalten?

Da die Ausgabe von TeX eine DVI-Datei mit Satzanweisungen ist (Schriftart F aufnehmen, W-Einheiten nach rechts bewegen, dort Zeichen 97 setzen usw.), ist eine natürliche Interpretation (so scheint es mir), dass die DVI-Dateien identisch sein müssen, mit Ausnahme natürlich der Bytes, die den Zeitstempel bilden. Entsprechend gilt: Wenn wir dvitypedie beiden Dateien ausführen undvergleichenNach dem Herausfiltern der Zeitstempelzeile sollten sie identische Anweisungen enthalten (ist eine Interpretation).

Aber selbst bei recht einfachen Eingabedateien sehe ich in den DVI-Dateien (also über die Zeitstempelzeile hinaus) Diskrepanzen zwischen MiKTeX und TeX Live. Beachten Sie insbesondere die folgenden minimalen.tex Eingabedatei (Teil eines Absatzes ausEine sanfte Einführung in TeX):

The DVI file is then read by another program (called a
device driver) that produces the output that is readable by
humans. Why the extra file? The same DVI file can be
read by different device drivers to produce output on a dot
matrix printer, a laser printer, a screen viewer, or a
phototypesetter. Once you have

\end

Wenn ich die obige Datei durch zwei Programme namens TeX ausführe, nämlich:

MiKTeX-TeX 2.9.6300 (3.14159265) (MiKTeX 2.9.6600)

Und

TeX 3.14159265 (TeX Live 2017)

beide auf dem gleichen Computer (macOS 10.13.3 High Sierra), die Ausgabe von TeX (die DVI-Dateien)sehenoptisch identisch, aber unterschiedlich groß (unterschiedliche Anzahl von Bytes). Wenn man die tatsächlichen Anweisungen (Opcodes) in den DVI-Dateien vergleicht (indem man sie dvitypeauf jeder Datei ausführt), gibt es Hunderte kleiner Unterschiede. In diesem Fall ist der erste

10c10
< Postamble starts at byte 561.
---
> Postamble starts at byte 564.

Dies wird durch einen Diff verursacht, der weiter unten auftritt:

< 436: w0 261236 h:=9392617+261236=9653853, hh:=611 
< 437: setchar112 h:=9653853+364090=10017943, hh:=634 
< 438: setchar114 h:=10017943+256683=10274626, hh:=650 
< 439: setchar105 h:=10274626+182045=10456671, hh:=662 
< 440: setchar110 h:=10456671+364090=10820761, hh:=685 
< 441: x2 -18205 h:=10820761-18205=10802556, hh:=684 
< 444: setchar116 h:=10802556+254863=11057419, hh:=700 
< 445: setchar101 h:=11057419+291271=11348690, hh:=718 
< 446: setchar114 h:=11348690+256683=11605373, hh:=734 
< 447: setchar44 h:=11605373+182045=11787418, hh:=746 
< 448: right3 271931 h:=11787418+271931=12059349, hh:=764 
< 452: setchar97 h:=12059349+327681=12387030, hh:=785 
---
> 436: right3 261235 h:=9392617+261235=9653852, hh:=611 
> 440: setchar112 h:=9653852+364090=10017942, hh:=634 
> 441: setchar114 h:=10017942+256683=10274625, hh:=650 
> 442: setchar105 h:=10274625+182045=10456670, hh:=662 
> 443: setchar110 h:=10456670+364090=10820760, hh:=685 
> 444: x2 -18205 h:=10820760-18205=10802555, hh:=684 
> 447: setchar116 h:=10802555+254863=11057418, hh:=700 
> 448: setchar101 h:=11057418+291271=11348689, hh:=718 
> 449: setchar114 h:=11348689+256683=11605372, hh:=734 
> 450: setchar44 h:=11605372+182045=11787417, hh:=746 
> 451: right3 271932 h:=11787417+271932=12059349, hh:=764 
> 455: setchar97 h:=12059349+327681=12387030, hh:=785 

oder wenn Sie es lieber vertikal nebeneinander sehen möchten:

436: w0 261236 h:=9392617+261236=9653853, hh:=611             | 436: right3 261235 h:=9392617+261235=9653852, hh:=611 
437: setchar112 h:=9653853+364090=10017943, hh:=634           | 440: setchar112 h:=9653852+364090=10017942, hh:=634 
438: setchar114 h:=10017943+256683=10274626, hh:=650          | 441: setchar114 h:=10017942+256683=10274625, hh:=650 
439: setchar105 h:=10274626+182045=10456671, hh:=662          | 442: setchar105 h:=10274625+182045=10456670, hh:=662 
440: setchar110 h:=10456671+364090=10820761, hh:=685          | 443: setchar110 h:=10456670+364090=10820760, hh:=685 
441: x2 -18205 h:=10820761-18205=10802556, hh:=684            | 444: x2 -18205 h:=10820760-18205=10802555, hh:=684 
444: setchar116 h:=10802556+254863=11057419, hh:=700          | 447: setchar116 h:=10802555+254863=11057418, hh:=700 
445: setchar101 h:=11057419+291271=11348690, hh:=718          | 448: setchar101 h:=11057418+291271=11348689, hh:=718 
446: setchar114 h:=11348690+256683=11605373, hh:=734          | 449: setchar114 h:=11348689+256683=11605372, hh:=734 
447: setchar44 h:=11605373+182045=11787418, hh:=746           | 450: setchar44 h:=11605372+182045=11787417, hh:=746 
448: right3 271931 h:=11787418+271931=12059349, hh:=764       | 451: right3 271932 h:=11787417+271932=12059349, hh:=764 
452: setchar97 h:=12059349+327681=12387030, hh:=785           | 455: setchar97 h:=12059349+327681=12387030, hh:=785 

und danach kommt alles drei Bytes später in der letzteren Datei vor (die von TeX Live generiert wurde tex), einschließlich des Postambels. Diese entsprechen dem Abschnitt printer, a, und wie wir sehen können, besteht ein Unterschied von 1 Einheit zwischen dem in den beiden Fällen verwendeten Klebstoff, der nach diesem Textdurchlauf wieder synchron war, und auch ein Unterschied zwischen einer Anweisung w0und einer right3Anweisung, was dazu führte, dass alle zukünftigen Anweisungen bei unterschiedlichen Bytes begannen.

Fragebogen: Ist diese Diskrepanz zwischen MiKTeX und TeX Live ein Fehler in einem der beiden Programme? Offensichtlich müssen die beiden Programme die Rundung irgendwo unterschiedlich implementiert haben. Macht es eines der beiden Programme nicht auf die „richtige“ Weise (falls es eine gibt)?

Ich weiß, dass die Diskrepanz minimal ist. Ein Unterschied von 1 Einheit in der DVI-Datei (DVI-Einheit?) entspricht, wenn ich mich richtig erinnere, 1 sp, was einem Unterschied von etwa 5 Nanometern entspricht, kleiner als die Wellenlänge des sichtbaren Lichts. Auch wenn die Einheit nicht genau ist 1 sp, habe ich diese Einheiten irgendwo als „RSUs“ gesehen, für „Ridiculously Small Unit“. Sofern die DVI-Dateien also nicht mit einer lächerlichen (physikalisch unmöglichen) Auflösung und/oder Vergrößerung ausgegeben würden, wäre der Unterschied in der Praxis nicht von Bedeutung, soweit man die Ausgabe visuell unterscheiden könnte.

Dennoch gibt es einen Unterschied, und soll TeX nicht auf allen Systemen identische Ergebnisse liefern? (Beachten Sie, dass ich nicht pdfTeX oder eTeX verwende, sondern nur das, was angeblich Knuths TeX ist.) Dieser Unterschied macht es schwierig zu erkennen, wann sich zwei TeX-Implementierungen identisch verhalten. Also die letzten paar Fragen:

Frage 3:Ist ein gewisses Maß an Rundungsfehlern/Gleitkommaabweichungen zwischen TeX-Implementierungen akzeptabel? Wenn ja, wie viel ist genau akzeptabel? DieTRIP-Testdokumentist in dieser Angelegenheit selbst verwirrend, da dort Dinge stehen wie (Hervorhebung durch mich):

Klebeeinstellungen imzeigtvon TeX-Boxen unterliegen einer systemabhängigen Rundung,Geringe Abweichungen sind zulässig. Solche Abweichungen gelten jedoch nur für die Leimwerte, die am Ende einer \hboxoder\vbox Zeile stehen;alle anderen Zahlen sollten genau übereinstimmen, da sie mit ganzzahliger Arithmetik in einemvorgeschriebene systemunabhängige Weise.

Die resultierende Datei sollte mit der Masterdatei übereinstimmen.TRIP.TYP aus Schritt 0 übereinstimmen, mit der Ausnahme, dassEinige der Werte können etwas abweichenaufgrund von Rundungsdiskrepanzen bei Gleitkommazahlen. Außerdem kann es Unterschiede zwischen den Befehlen 'right' und 'w' und 'x' sowie zwischen 'down' und 'y' und 'z' geben. Entscheidend ist, dass alle Zeichen und Regeln undxxx'Ssollten sich in nahezu den gleichen Positionen befindenwie in Anhang F angegeben.

Viertes Quartal: Und schließlich, da sich nicht nur die Positionen, sondern sogar die Befehle (und folglich alle nachfolgenden Bytes) zwischen TeX-Implementierungen unterscheiden können, wie können wir dann testen, ob sich eine neue TeX-Implementierung richtig bzw. identisch zu „echtem“ TeX verhält, also im Sinne der Erzeugung „im Wesentlichen“ identischer DVI-Dateien? Offensichtlich ist die einfache Ausführung diffauf den DVI-Dateien (nach dvitype) nicht praktikabel, da dies in großem Umfang offensichtlich unbedeutende Unterschiede erzeugt. Gibt es ein Tool (wie das von Knuth erwähnte „Sie möchten vielleicht ein DVIcompareProgramm schreiben“) oder eine andere Reihe von Tests?

Antwort1

TeX befasst sich mit dem Schriftsatz auf einem physischen Medium (z. B. Papier). Für Don bedeutet identische Ausgabe ein optisch gleiches Erscheinungsbild und alle Berechnungen auf Benutzerebene sind exakt identisch (weshalb Sie auf einige interne Komponenten von TeX nicht zugreifen und deren Werte verwenden können, da diese von Installation zu Installation unterschiedlich sein können). Dies bedeutet, dass Zeilen- und Seitenumbrüche exakt an der gleichen Stelle sein sollten. Er hat jedoch absichtlich Gleitkommazahlen verwendet, um Teile der Verbindungsbehandlung zu berechnen (auf eine Weise, die Zeilen- oder Seitenumbrüche nicht ändern kann), aber beim Schreiben in die DVI-Datei können die resultierenden genauen Positionen der Zeichen um einen winzigen Bruchteil abweichen.

Um Ihre expliziten Fragen zu beantworten:

F1: Das zeigt tatsächlich, was im TRIP-Testhandbuch erklärt wird (der Teil, den Sie in F3 zitieren).

F2: kein Fehler (aufgrund der Angaben im TRIP-Testhandbuch)

F3: Ich bin mir nicht sicher, was an dieser Aussage verwirrend ist. Beachten Sie, dass „Klebeeinstellung“ dazu dient, die genauen Stellen in der DVI-Datei endgültig zu bestimmen. Wenn Kleber in TeX verwendet wird, z. B. um Zeilenumbrüche zu bestimmen, wird er immer noch mit Fixkomma verwendet, sodass solche Unterschiede nicht auftreten.

Q4: Das geht nicht, indem Sie sich die DVI-Datei ansehen (was der Trip-Test meines Wissens nicht tut). Ich glaube nicht, dass Sie das können, selbst wenn Sie sich die Daten „Versandte fertige Kartons“ ansehen, ohne mögliche Rundungsfehler in den dort angezeigten Teilen (Klebersatz ...) zu maskieren. Aber diese Maskierung ist möglich und alle anderen Teile der symbolischen Ausgabeanzeige werden genau gleich sein, und das ist es, was wir beispielsweise in der LaTeX-Regressionstestsuite verwenden, um die Ausgabe nach Änderungen am LaTeX-Code zu vergleichen.

Antwort2

Für web2c habe ich in web2c/triptrap/README dokumentiert, warum alle Unterschiede als akzeptabel angesehen werden, und zwar: http://tug.org/svn/texlive/trunk/Build/source/texk/web2c/triptrap/README?view=markup

verwandte Informationen