
Durante la compilación de un documento de látex, las páginas se "envían" una por una. Entiendo que esto está marcado por el mensaje de la consola [1], [2], [3], etc., formando cada página. Sin embargo, al inspeccionar las escrituras en el archivo DVI, he establecido que el archivo DVI en realidad no está escrito en el momento de imprimir estos [n] mensajes. Más bien, parece que los datos se almacenan en caché y solo llegan al disco en algún momento posterior. Para documentos pequeños parece que todas las páginas se escriben de una sola vez al final del proceso de compilación.
Para investigar esto, intercepté la llamada fwrite. No se solicita en todos los envíos.
Mi pregunta es: ¿hay alguna manera de forzar a Latex a escribir en el archivo DVI en cada envío, es decir, cuando termina de compilar cada página de contenido? Esto es para habilitar algunas funciones de vista previa dvi personalizadas que quiero implementar.
Respuesta1
Como habrás adivinado, la salida al archivo DVI se almacena en el búfer y se escribe la mitad dvi_buf_size
a la vez.
En el Knuth TeX original, ver§594:
Los bytes DVI se envían a un búfer en lugar de escribirse directamente en el archivo de salida. Esto hace posible reducir la sobrecarga de las llamadas a subrutinas, acelerando así considerablemente el cálculo, ya que la salida de bytes DVI es parte del bucle interno de TeX.
Véanse también los artículos 597 y 598, que detallan la implementación:
- Los bytes se escriben en el buffer con
dvi_out
- Cuando la parte no vaciada del búfer alcanza la mitad del tamaño de
dvi_buf
, se llama al procedimientowrite_dvi
, que realiza la escritura real en el archivo.
En PdfTeX se mantiene la misma implementación (§624–625). En la práctica, en web2c, el procedimiento write_dvi
escambióaserallamara fwrite
.
Si no le importa la velocidad (en la que esto probablemente tendrá sólo un pequeño efecto de todos modos: para la mayoría de los documentos LaTeX, la mayor parte del tiempo se dedica a expandir macros en lugar de escribir en el archivo de salida), puede intentar cambiar la implementación de TeX y recompilación: ya sea cambiando para dvi_buf_size
que sea realmente pequeño (un comentario dice que debe ser un múltiplo de 8, entonces, ¿quizás 8 funcione?), o redefiniendo dvi_out
(que está destinado a escribir un byte en el búfer DVI) para escriba el byte en el archivo directamente con fwrite
. ¡Tendrá curiosidad por saber si funciona!
Respuesta2
Supongo que esto puede tener que ver con la constante "dvi_buf_size", que está configurada en 16384 en algunas distribuciones (no estoy seguro de la mía). Así que me pregunto si \shipout solo activará una escritura en el archivo si la página El tamaño agota este búfer (o la mitad). Y, de hecho, en mis pruebas veo escrituras en archivos dvi de 8192, que de hecho es la mitad de 16384.
Entonces, mi teoría es que \shipout no escribe en el archivo DVI, simplemente envía los datos al búfer DVI, que se escribe en el archivo cada 8192 bytes. La estructura de páginas real del documento es irrelevante. Si \shipout no hace que el búfer alcance los 8192 bytes, no activará una escritura en el archivo, y si \shipout entrega más de 8192 bytes, especulo que esto provocará escrituras en el archivo hasta que el búfer sea menor que 8192 bytes. En cualquier caso, las escrituras en el archivo no son página por página.