引用自排版整首永不结束的歌
我运行过这段代码,在它报告生成了大约 47,000 页(在很短的时间内)后,我中止了该过程。不幸的是,我的计算机抱怨生成的 pdf 文件“已损坏”并且无法打开。一个更好的(也许不可能?)答案是生成一个文件,以便在进程被终止(或死亡)后可以实际查看输出。
这让我很好奇(而且也只是好奇而已)。TeX 能优雅地死掉吗?由于它的输出是 PDF,所以它最后可能还需要做一些不平凡的事情来确保 PDF 是有效的,所以直接杀死 TeX 未免太突然了。
一种更优雅的方法是让 TeX 在每次发货时询问“我应该继续吗?”,但是这种方法也存在另一个极端:它太具有侵扰性,因为用户需要不断发出命令才能让 TeX 继续运行。
我首先想到的是以非阻塞方式与正在运行的进程进行通信的唯一方法是通过文件。在每次发送(或其他)时,TeX 可以检查文件是否存在,如果不存在则继续,如果存在则读取文件并执行该文件包含的任何操作(从而允许更精细的通信)。
有没有更好的办法?
答案1
运行此文件
\def\resume{\let\foo\relax}
\count0=0
\def\foo{\advance\count0 1 \foo}
\foo\relax\relax\relax\relax
hello I reached \the\count0 before you stopped me
\bye
然后在终端上停止它(在大多数 shell 中按 control-c)并输入 i\resume,它就会干净地完成:
pdftex oops
This is pdfTeX, Version 3.1415926-2.4-1.40.13 (TeX Live 2012)
restricted \write18 enabled.
entering extended mode
(./oops.tex
! Interruption.
\foo ->\advance \count 0 1
\foo
l.7 \foo
\relax\relax\relax\relax
? i\resume
[18672624{/usr/local/texlive/2012/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
] )</usr/local/texlive/2012/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb
>
Output written on oops.pdf (1 page, 14709 bytes).
Transcript written on oops.log.
答案2
如果您设置了\pausing=1
,TeX 将在从文件读取每一行输入后停止。
答案3
也许可以设置一个计时器\everypar
?我\pdfelapsedtime
按照我在帖子中显示的方式使用对 TeX 的各种操作进行基准测试在说明该技术的 MWE 中,我使用了一个简单的
\ifdim\result sp <100000sp \fibo \else Finish\fi
进行时间检查。代码很粗糙,只是一个概念。
\documentclass[a4paper]{article}
\usepackage{fp}
\begin{document}
\makeatletter
\pdfresettimer
\newcount\numbertimes
\newcount\numone
\newcount\numtwo
\newcount\savenumone
\def\fibonacci#1{..
\numbertimes=2\numone=0
\numtwo=1
\loop
\advance\numone by \numtwo
\savenumone=\the\numone \numone=\numtwo \numtwo=\savenumone
\advance\numbertimes by 1 \ifnum \numbertimes<#1
\repeat
\ifnum\numbertimes=#1 \advance\numone by \numtwo\fi
}
\def\fibo{%
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
\fibonacci{30}\fibonacci{30}\fibonacci{30}\fibonacci{30}
}
\fibo\fibo\fibo\fibo\fibo\fibo\fibo\fibo\fibo\fibo
\FPset\result{\the\pdfelapsedtime}
\FPmul\result{\result}{100}
\FPround\result{\result}{16}
\result\thinspace
\ifdim\result sp <100000sp \fibo \else Finish\fi
\makeatother
\end{document}
将“完成”更改为\enddocument
终止。