¿Las diferentes implementaciones de TeX (por ejemplo, MiKTeX y TeX Live) deberían producir archivos DVI idénticos?

¿Las diferentes implementaciones de TeX (por ejemplo, MiKTeX y TeX Live) deberían producir archivos DVI idénticos?

Se dice que TeX debería funcionar de manera idéntica en todos los sistemas. Por ejemplo,Knuth'sprueba de viajeexiste para garantizar que cualquier programa pueda llamarse "TeX" solo si hace ciertas cosas dadas ciertas entradas. Y el propio programa TeX toma ciertas medidas para evitar que factores dependientes del sistema causen diferencias en el comportamiento, por ejemplo, para las dimensiones, en lugar de números de punto flotante, TeX usa números de punto fijo: múltiplos enteros de 1 sp(punto escalado), que es 1/65536 de 1/72,27 de pulgada.

Q1: Pero (aparte de pasar la prueba del viaje) ¿qué significa comportarse de manera idéntica?

Como la salida de TeX es un archivo DVI que contiene instrucciones de composición tipográfica (elegir la fuente F, moverse a la derecha en unidades W, establecer el carácter 97 allí, etc.), una interpretación natural (me parece) es que los archivos DVI deben ser idénticos. , excepto, por supuesto, los bytes que constituyen la marca de tiempo. De manera equivalente, si ejecutamosdvitype en los dos archivos, ycompararDespués de filtrar la línea de marca de tiempo, deben contener instrucciones idénticas (es una interpretación).

Pero incluso con archivos de entrada bastante simples, veo discrepancias en los archivos DVI (es decir, más allá de la línea de marca de tiempo), entre MiKTeX y TeX Live. Específicamente, considere el siguiente mínimo.tex archivo de entrada mínimo (parte de un párrafo deUna suave introducción a 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

Cuando ejecuto el archivo anterior a través de dos programas llamados TeX, a saber:

MiKTeX-TeX 2.9.6300 (3.14159265) (MiKTeX 2.9.6600)

y

TeX 3.14159265 (TeX Live 2017)

ambos en la misma computadora (macOS 10.13.3 High Sierra), la salida de TeX (los archivos DVI)mirarvisualmente idénticos, pero son de diferentes tamaños (diferente número de bytes). Cuando se comparan las instrucciones reales (códigos de operación) contenidas en los archivos DVI (ejecutándolas dvitypeen cada archivo), hay cientos de diferencias menores. En este caso, el primero es

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

que es causado por una diferencia que ocurre más adelante a continuación:

< 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 

o si desea verlo verticalmente uno al lado del otro:

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 

y después de eso, todo ocurre tres bytes más tarde en el último archivo (el generado por TeX Live tex), incluido finalmente el postámbulo. Estos corresponden a la sección printer, a, y como podemos ver, hay una diferencia de 1 unidad entre el pegamento que se usó en los dos casos, que volvió a sincronizarse después de esta ejecución de texto, y también una diferencia de una instrucción w0versus una , right3lo que provocó que todas las instrucciones futuras comenzaran en bytes diferentes.

Q2: ¿Esta discrepancia entre MiKTeX y TeX Live es un error en alguno de ellos? Evidentemente, los dos programas deben haber implementado el redondeo de manera diferente en alguna parte. ¿Alguno de ellos no lo hace de la manera “correcta” (si es que la hay)?

Sé que la discrepancia es pequeña. Una diferencia de 1 unidad en el archivo DVI (¿unidad DVI?), corresponde, si no recuerdo mal, a 1 sp, que es una diferencia de unos 5 nanómetros, menor que la longitud de onda de la luz visible. Incluso si la unidad no es exactamente 1 sp, he visto en alguna parte estas unidades llamadas "RSU", por "Unidad ridículamente pequeña". Entonces, a menos que los archivos DVI se emitieran con una resolución y/o aumento ridículo (físicamente imposible), la diferencia no importaría en la práctica, en lo que respecta a poder distinguir visualmente la salida.

Sin embargo, hay una diferencia: ¿no se supone que TeX produce resultados idénticos en todos los sistemas? (Tenga en cuenta que no estoy usando pdfTeX o eTeX, sino lo que se supone que es el TeX de Knuth). Esta diferencia hace que sea difícil saber cuándo dos implementaciones de TeX se comportan de manera idéntica. Entonces, las últimas dos preguntas:

P3:¿Es aceptable cierta cantidad de error de redondeo/discrepancia de punto flotante entre implementaciones de TeX? Si es así, ¿cuánto es exactamente aceptable? ElDocumento de prueba de viajees en sí mismo confuso sobre este asunto, ya que dice cosas como (el énfasis es mío):

Ajustes de pegamento en elmuestrade cajas TeX están sujetas a redondeo dependiente del sistema, por lo quese permiten ligeras desviaciones. Sin embargo, tales desviaciones se aplican sólo a los valores establecidos de pegamento que aparecen al final de una línea \hboxo ;\vboxtodos los demás números deben coincidir exactamente, ya que se calculan con aritmética de números enteros en unmanera prescrita independiente del sistema.

El archivo resultante debe coincidir con el TRIP.TYParchivo maestro del paso 0, excepto quealgunos de los valores pueden estar un poco fuera de lugardebido a discrepancias de redondeo de punto flotante. Además, puede haber diferencias entre los comandos 'derecha', 'w' y 'x', y entre 'abajo', 'y' y 'z'; La clave es que todos los personajes y reglas yxxx'sdeberían estar casi en las mismas posicionescomo se especifica en el Apéndice F.

Q4: Finalmente, dado que no solo las posiciones sino incluso los comandos (y, en consecuencia, todos los bytes posteriores) pueden diferir entre las implementaciones de TeX, ¿cómo podemos probar que una nueva implementación de TeX se comporta de manera adecuada/idéntica a TeX "real", en el sentido de ¿Producir archivos DVI “esencialmente” idénticos? Claramente, simplemente ejecutar difflos archivos DVI (después de dvitype) no es viable ya que produce profusamente diferencias evidentemente insignificantes. ¿Existe alguna herramienta (como “es posible que desee escribir un DVIcompareprograma” que menciona Knuth) o algún otro conjunto de pruebas?

Respuesta1

TeX se ocupa de la composición tipográfica en un soporte físico (por ejemplo, papel). Para Don, una salida idéntica significa una apariencia visualmente igual y cualquier cálculo a nivel de usuario es exactamente idéntico (razón por la cual no se puede acceder a algunas partes internas de TeX y usar sus valores, ya que pueden diferir de una instalación a otra). Esto significa que se supone que los saltos de línea y de página deben estar exactamente en el mismo punto. Sin embargo, utilizó deliberadamente el punto flotante para calcular partes del manejo del pegamento (de manera que no pueda cambiar los saltos de línea o de página), pero al escribir en el archivo dvi las posiciones exactas resultantes de los caracteres pueden estar desviadas en una pequeña fracción.

Para responder a sus preguntas explícitas:

P1: eso realmente muestra lo que se explica en el manual de prueba de TRIP (la parte que citas en la P3).

P2: no hay errores (debido a lo que está escrito en el manual de prueba de TRIP)

P3: No estoy seguro de qué es confuso en esa afirmación. Tenga en cuenta que la "configuración del pegamento" es cuando finalmente se determinan los puntos exactos en el archivo dvi, cuando se usa pegamento dentro de TeX, por ejemplo, para determinar saltos de línea, todavía se usa con punto fijo, por lo que tales diferencias no aparecerán.

P4, no puede hacerlo mirando el archivo dvi (que la prueba de viaje no hace, que yo sepa). No creo que puedas ni siquiera mirar los datos de "Caja completa enviada" sin enmascarar posibles errores de redondeo en las piezas (juego de pegamento...) que se muestran allí. Pero ese enmascaramiento es posible y todas las demás partes de la visualización de salida simbólica serán exactamente iguales y eso es lo que nosotros, por ejemplo, usamos en el conjunto de pruebas de regresión LaTeX para comparar la salida después de los cambios realizados en el código LaTeX.

Respuesta2

Para web2c, documenté por qué todas las diferencias se consideran aceptables en web2c/triptrap/README, es decir, http://tug.org/svn/texlive/trunk/Build/source/texk/web2c/triptrap/README?view=markup

información relacionada