異なる TeX 実装 (例: MiKTeX と TeX Live) は同一の DVI ファイルを生成する必要がありますか?

異なる TeX 実装 (例: MiKTeX と TeX Live) は同一の DVI ファイルを生成する必要がありますか?

TeXはすべてのシステムで同じように動作すると言われています。例えば、クヌースTRIPテスト特定の入力に対して特定の処理を実行する場合にのみ、どのプログラムも「TeX」と呼べるようにするために存在します。また、TeX プログラム自体は、システム依存の要因によって動作に違いが生じないように、特定の対策を講じています。たとえば、寸法については、浮動小数点数ではなく、固定小数点数を使用します。つまり、1 の整数倍sp(スケールされたポイント) であり、これは 1/72.27 インチの 1/65536 に相当します。

Q1しかし、(トリップテストに合格すること以外に)同じように動作するというのはどういう意味でしょうか?

TeXの出力はタイプセッティングの指示(フォントFを選択、W単位右に移動、そこに文字97を設定など)を含むDVIファイルなので、1つの自然な解釈(私にはそう思える)は、タイムスタンプを構成するバイトを除いて、DVIファイルは同一でなければならないということだ。同様に、dvitype2つのファイルを実行すると、比較するタイムスタンプ行をフィルタリングした後、それらには同一の命令が含まれるはずです (1 つの解釈です)。

しかし、かなり単純な入力ファイルであっても、MiKTeXとTeX LiveのDVIファイル(つまり、タイムスタンプ行以外)に矛盾が見られます。具体的には、次の最小限の.tex入力ファイル(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

上記のファイルを TeX という 2 つのプログラムで実行すると、次のようになります。

MiKTeX-TeX 2.9.6300 (3.14159265) (MiKTeX 2.9.6600)

そして

TeX 3.14159265 (TeX Live 2017)

両方とも同じコンピュータ(macOS 10.13.3 High Sierra)上で、TeXの出力(DVIファイル)見て見た目は同じですが、サイズが異なります(バイト数が異なる)。DVIファイルに含まれる実際の命令(オペコード)を比較すると(dvitype各ファイルで実行して)、数百の小さな違いがあります。この場合、最初の違いは

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

これは、後で発生する diff によって発生します。

< 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 

または、縦に並べて表示したい場合は、次のようにします。

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 

その後、すべては後者のファイル (TeX Live によって生成されたファイルtex) の 3 バイト後に発生し、最後にポストアンブルも含まれます。これらはセクション に対応しておりprinter, a、ご覧のとおり、2 つのケースで使用されたグルーには 1 単位の差があり、このテキスト実行後に同期が回復しました。また、 命令w0right3命令の差があり、これにより、今後のすべての命令が異なるバイトで開始されます。

Q2: MiKTeX と TeX Live の間のこの矛盾は、どちらかのバグでしょうか? 明らかに、2 つのプログラムはどこかで丸め処理を異なる方法で実装しているに違いありません。どちらかが「正しい」方法で実行できていないのでしょうか (もしあるとすれば)?

この差異はごくわずかであることはわかっています。私の記憶が正しければ、DVI ファイル (DVI 単位?) の 1 単位の差は 1 に相当しsp、これは約 5 ナノメートルの差で、可視光の波長よりも小さいです。単位が とまったく同じでなくても1 sp、これらの単位は「RSU」(「Ridiculously Small Unit」の略) と呼ばれているのをどこかで見たことがあります。したがって、DVI ファイルがとんでもない (物理的に不可能な) 解像度や拡大率で出力されない限り、視覚的に出力を区別できる限り、この差は実際には問題になりません。

それでも、違いはあります。TeX はすべてのシステムで同じ結果を生成するはずではないでしょうか? (注: 私は pdfTeX や eTeX ではなく、Knuth の TeX を使用しているはずです。) この違いにより、2 つの TeX 実装が同じように動作しているかどうかを知ることが難しくなります。それでは、最後の 2 つの質問です。

質問3:TeXの実装間で、ある程度の丸め誤差や浮動小数点の差異は許容されるのでしょうか?もしそうなら、正確にはどの程度許容されるのでしょうか?TRIPテスト文書この問題に関しては、次のようなことを述べているため、混乱を招きます(強調は筆者による)。

接着設定ディスプレイTeXボックスはシステム依存の丸めの影響を受けるため、若干の逸脱は許容される\hboxただし、このような偏差は、または行の末尾に表示される接着セット値にのみ適用されます\vbox他のすべての数字は正確に一致するはずです、これらは整数演算で計算されるため、システムに依存しない方法で規定される

TRIP.TYP結果のファイルは、ステップ0のマスターファイルと一致するはずですが、いくつかの値は少しずれている可能性があります浮動小数点の丸め誤差によるものです。さらに、「右」と「w」と「x」コマンド、「下」と「y」と「z」コマンドの間にも違いがあるかもしれません。重要なことは、すべての文字とルールとxxxほぼ同じ位置にあるはずです付録Fに規定されているとおり。

Q4最後に、位置だけでなくコマンド(および結果的に後続のすべてのバイト)も TeX 実装間で異なる可能性があることを考えると、新しい TeX 実装が「本質的に」同一の DVI ファイルを生成するという意味で、「実際の」 TeX と適切に / 同一に動作していることをどのようにテストできるでしょうか。明らかに、diffDVI ファイル( の後dvitype)を単純に実行することは、明らかに重要でない差異を大量に生成するため、実行不可能です。何らかのツール(Knuth が言及している「プログラムを記述することをお勧めしますDVIcompare」のような)または他の一連のテストはありますか。

答え1

TeX は、物理的な媒体 (紙など) へのタイプセッティングに関係しています。Don にとって、出力が同一であるということは、見た目が等しく、ユーザー レベルの計算がまったく同一であることを意味します (そのため、TeX の内部にアクセスしてその値を使用することはできません。インストールごとに値が異なる可能性があるためです)。つまり、改行とページ区切りは、まったく同じ位置にあるはずです。ただし、Don は、グルー処理の一部を計算するのに意図的に浮動小数点を使用しました (改行やページ区切りを変更できないようにするため)。しかし、dvi ファイルに書き込むと、文字の正確な位置がわずかにずれる場合があります。

あなたの明確な質問に答えるために:

Q1: これは実際に TRIP テスト マニュアル (Q3 で引用した部分) で説明されている内容を示しています。

Q2: バグはありません(TRIP テストマニュアルに記載されているため)

Q3: この記述の何が混乱を招くのか分かりません。「グルー設定」は、最終的に dvi ファイル内の正確な位置を決定するときに使用されることに注意してください。グルーが TeX 内で使用される場合、たとえば改行を決定するために固定小数点が使用されるため、このような違いは現れません。

Q4 dvi ファイルを見るだけではわかりません (私の知る限り、トリップ テストではこれは行われません)。「Completed box shiped out」データを見ても、そこに表示されている (glue set ...) 部分の丸め誤差をマスクせずにはできないと思います。ただし、そのマスクは可能であり、シンボリック出力表示の他の部分はすべてまったく同じになります。これは、たとえば LaTeX 回帰テスト スイートで LaTeX コードの変更後の出力を比較するために使用するものです。

答え2

web2cについては、web2c/triptrap/READMEにすべての違いが許容される理由を記載しました。 http://tug.org/svn/texlive/trunk/Build/source/texk/web2c/triptrap/README?view=markup

関連情報