Должны ли различные реализации TeX (например, MiKTeX и TeX Live) создавать идентичные файлы DVI?

Должны ли различные реализации TeX (например, MiKTeX и TeX Live) создавать идентичные файлы DVI?

Говорят, что TeX должен работать одинаково на всех системах. Например,Кнут'sTRIP-тестсуществует для того, чтобы гарантировать, что любая программа может называться «TeX», только если она делает определенные вещи при определенных входных данных. И сама программа TeX принимает определенные меры для предотвращения системно-зависимых факторов, вызывающих различия в поведении, например, для измерений, вместо чисел с плавающей точкой TeX использует числа с фиксированной точкой: целые кратные 1 sp(масштабированная точка), что составляет 1/65536 от 1/72,27 дюйма.

Q1: Но (помимо прохождения трип-теста) что значит вести себя одинаково?

Поскольку вывод TeX представляет собой файл DVI, содержащий инструкции по набору текста (взять шрифт F, сдвинуться вправо на W единиц, установить там символ 97 и т. д.), одна естественная интерпретация (как мне кажется) заключается в том, что файлы DVI должны быть идентичны, за исключением, конечно, байтов, составляющих временную метку. Эквивалентно, если мы запустимdvitype два файла, исравниватьпосле фильтрации строки временной метки они должны содержать идентичные инструкции (это одна из интерпретаций).

Но даже с довольно простыми входными файлами я вижу расхождения в файлах DVI (т.е. за пределами только строки метки времени) между MiKTeX и TeX Live. В частности, рассмотрим следующий минимальный .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, а именно:

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.

что вызвано разницей, которая происходит ниже:

< 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), включая, наконец, постамбулу. Они соответствуют разделу printer, a, и, как мы видим, есть разница в 1 единицу между клеем, который использовался в двух случаях, который вернулся к синхронизации после этого запуска текста, а также разница в a w0против right3инструкции, из-за которой все будущие инструкции начинались с разных байтов.

Q2: Является ли это расхождение между MiKTeX и TeX Live ошибкой в ​​какой-либо из них? Очевидно, что эти две программы где-то по-разному реализовали округление. Одна из них не делает это «правильным» способом (если он есть)?

Я знаю, что расхождение ничтожно мало. Разница в 1 единицу в файле DVI (единица DVI?), если я правильно помню, соответствует 1 sp, что составляет разницу примерно в 5 нанометров, меньше длины волны видимого света. Даже если единица не совсем 1 sp, я где-то видел эти единицы, называемые «RSU», что означает «нелепо малая единица». Так что если только файлы DVI не выводились с каким-то смехотворным (физически невозможным) разрешением и/или увеличением, разница не имела бы значения на практике, если бы не была возможность визуально различить вывод.

Тем не менее, разница есть, и разве TeX не должен выдавать одинаковые результаты на всех системах? (Заметьте, я не использую pdfTeX или eTeX, а просто то, что должно быть TeX Кнута.) Из-за этой разницы сложно узнать, когда две реализации TeX ведут себя одинаково. Итак, последняя пара вопросов:

В3:Допустима ли некоторая погрешность округления/расхождение с плавающей точкой между реализациями TeX? Если да, то какая именно величина приемлема?Документ теста TRIPсам по себе сбивает с толку в этом вопросе, поскольку в нем говорится следующее (выделено мной):

Настройки клея вотображаетиз TeX-боксов округляются в зависимости от системы, поэтомуНебольшие отклонения допустимы. Однако такие отклонения применяются только к значениям набора склеивания, которые появляются в конце строки \hboxили \vbox;все остальные числа должны точно совпадать, так как они вычисляются с помощью целочисленной арифметики впредписанный системно-независимый способ.

Полученный файл должен соответствовать главному TRIP.TYPфайлу шага 0, за исключением того, чтонекоторые значения могут быть немного невернымииз-за расхождений в округлении чисел с плавающей точкой. Кроме того, могут быть различия между командами «right» и «w» и «x», а также между «down» и «y» и «z»; главное, чтобы все символы и правила иххх'sдолжны быть почти в тех же положенияхкак указано в Приложении F.

4-й квартал: Наконец, учитывая, что не только позиции, но даже команды (и, следовательно, все последующие байты) могут различаться между реализациями TeX, как мы можем проверить, что новая реализация TeX ведет себя правильно / идентично «реальному» TeX, в смысле создания «по сути» идентичных файлов DVI? Очевидно, что простое выполнение diffна файлах DVI (после dvitype) неработоспособно, поскольку оно обильно производит, очевидно, незначительные различия. Есть ли какой-то инструмент (вроде «вы можете захотеть написать программу DVIcompare», о котором упоминает Кнут) или какой-то другой набор тестов?

решение1

TeX занимается набором текста на физическом носителе (например, бумаге). Для Дона идентичный вывод означает визуально одинаковый вид, и любые вычисления на уровне пользователя абсолютно идентичны (именно поэтому вы не можете получить доступ к некоторым внутренним компонентам TeX и использовать их значения, поскольку они могут отличаться от установки к установке). Это означает, что разрывы строк и страниц должны быть точно в одной и той же точке. Однако он намеренно использовал плавающую точку для вычисления частей обработки склеивания (таким образом, что она не может изменить разрывы строк или страниц), но при записи в файл dvi полученные точные позиции символов могут отличаться на малую долю.

Чтобы ответить на ваши конкретные вопросы:

В1: это действительно показывает то, что объясняется в руководстве по тестированию TRIP (часть, которую вы цитируете в В3).

В2: ошибки нет (согласно инструкции по тестированию TRIP)

Q3: не уверен, что именно сбивает с толку в этом утверждении. Обратите внимание, что "настройка склеивания" происходит при окончательном определении точных мест в файле dvi, когда клей используется внутри TeX, например, для определения переносов строк, он все равно используется с фиксированной точкой, поэтому там такие различия не будут видны.

В4 вы не можете сделать это, посмотрев на файл dvi (который тест на отключение, насколько я знаю, не делает). Я не думаю, что вы можете сделать это, даже посмотрев на данные "Completed box shipped out" без маскировки возможных ошибок округления в частях (glue set ...), показанных там. Но эта маскировка возможна, и все остальные части символического вывода будут точно такими же, и это то, что мы, например, используем в наборе тестов регрессии LaTeX для сравнения вывода после изменений, внесенных в код LaTeX.

решение2

Для web2c я задокументировал, почему все различия считаются приемлемыми в web2c/triptrap/README, то есть: http://tug.org/svn/texlive/trunk/Build/source/texk/web2c/triptrap/README?view=markup

Связанный контент