
라텍스 문서를 편집하는 동안 페이지는 한 번에 하나씩 "배송"됩니다. 각 페이지를 구성하는 콘솔 메시지 [1], [2], [3] 등으로 표시되는 것으로 알고 있습니다. 그러나 DVI 파일에 대한 쓰기를 검사하여 이러한 [n]개 메시지가 인쇄되는 시점에 DVI 파일이 실제로 기록되지 않는다는 것을 확인했습니다. 오히려 데이터가 캐시되어 나중에 특정 시점에만 디스크에 도달하는 것처럼 보입니다. 작은 문서의 경우 컴파일 프로세스가 끝나면 모든 페이지가 한 번에 작성되는 것 같습니다.
이를 조사하기 위해 fwrite 호출을 가로채었습니다. 모든 배송에서 호출되지는 않습니다.
제 질문은: 배송할 때마다, 즉 콘텐츠의 각 페이지 컴파일이 완료될 때 라텍스가 DVI 파일에 강제로 쓰도록 하는 방법이 있습니까? 이는 구현하려는 일부 사용자 정의 dvi 미리보기 기능을 활성화하기 위한 것입니다.
답변1
dvi_buf_size
짐작한 대로 DVI 파일로의 출력은 버퍼링되어 한 번에 절반씩 기록됩니다 .
원본 Knuth TeX에서는 다음을 참조하세요.§594:
DVI 바이트는 출력 파일에 직접 기록되는 대신 버퍼로 출력됩니다. 이는 서브루틴 호출의 오버헤드를 줄이는 것을 가능하게 하며, DVI 바이트의 출력이 TeX 내부 루프의 일부이기 때문에 계산 속도를 상당히 높일 수 있습니다.
구현에 대한 세부 사항을 설명하는 §597–598도 참조하세요.
- 바이트는 다음을 사용하여 버퍼에 기록됩니다.
dvi_out
- 플러시되지 않은 버퍼 부분이 크기의 절반에 도달하면
dvi_buf
프로시저가write_dvi
호출되어 파일에 실제로 쓰기를 수행합니다.
PdfTeX에서는 동일한 구현이 유지됩니다(§624–625). 실제로 web2c에서 절차 는 다음 write_dvi
과 같습니다.변경됨에게BEㅏ부르다에게 fwrite
.
속도에 관심이 없다면(이것은 어쨌든 작은 효과만 가질 것입니다. 대부분의 LaTeX 문서의 경우 대부분의 시간은 출력 파일에 쓰는 대신 매크로를 확장하는 데 소비됩니다) 구현을 변경해 볼 수 있습니다. TeX 및 재컴파일: 를 dvi_buf_size
매우 작게 변경하거나(댓글에서는 8의 배수가 필요하므로 8이 작동할까요?) 다시 정의하거나 dvi_out
(DVI 버퍼에 1바이트를 쓰려는 의도) 를 사용하여 파일에 직접 바이트를 씁니다 fwrite
. 그것이 효과가 있는지 궁금할 것입니다!
답변2
나는 이것이 일부 배포판에서 16384로 설정된 상수 "dvi_buf_size"와 관련이 있을 수 있다고 추측합니다(내 배포판에 대해서는 잘 모르겠습니다.) 그래서 페이지가 다음과 같은 경우에만 \shipout이 파일에 쓰기를 트리거하는지 궁금합니다. 크기는 이 버퍼(또는 그 절반)를 소모합니다. 실제로 테스트에서 dvi 파일 쓰기가 8192인 것으로 나타났습니다. 이는 실제로 16384의 절반입니다.
그래서 내 이론은 \shipout이 DVI 파일에 쓰지 않고 단지 8192바이트마다 파일에 기록되는 DVI 버퍼로 데이터를 보내는 것입니다. 문서의 실제 페이지 구조는 관련이 없습니다. \shipout으로 인해 버퍼가 8192바이트에 도달하지 않으면 파일에 쓰기가 트리거되지 않으며, \shipout이 8192바이트를 초과하면 버퍼가 8192바이트보다 작아질 때까지 파일에 쓰기가 발생할 것으로 추측됩니다. 8192바이트. 어떤 경우에도 파일 쓰기는 페이지 단위가 아닙니다.