我有一些使用 XeLaTeX 自动生成和编译的大型报告。只是想知道是否有人知道如何跟踪渲染进度,因为这些报告可能需要一分钟以上的时间才能渲染(许多 TikZ 图形和 2-300 页)。我在 Ubuntu 上使用 XeLaTeX。
答案1
通常,编译日志会跟踪当前已发送到 pdf/dvi 等的页面。
因此,通过跟踪当前发送了哪一页,如果知道文档的大致页数,就可以确定自己在汇编中的位置。
日志文件中的一般输出如下:
[<page number>]
但是 LaTeX 还会在日志文件中打印出许多警告和其他信息,因此它更有可能是这样的:
[7pdfTeX warning (ext4): destination with the sa...
因此在这种情况下,您需要搜索日志文件并获取页码。当然,任何以该格式写入日志的信息[<int>
也将被获取。
第一个想法是这样做(如果我们在 Linux 下处理 bash):
function mytex {
local args=""
while [ $# -gt 1 ]; do
args="$args $1" ; shift
done
# You have to have the extension ".tex"
local fn="${1%.tex}"
# You can either directly pipe, or read from log
pdflatex $args $fn.tex | grep -e "\[[0-9]\+" | \
sed -e "s/\[/\n/gi" | sed -e "/^[0-9]\+/{s/\([0-9]\+\).*/\1/gi ; p } ; d"
# Or, however this poses some other problems when re-reading
# a constantly updating file.
# pdflatex $args $fn.tex > /dev/null &
# grep -e "\[[0-9]\+" $fn.log ...
}
mytex $@
查找并仅发送需要进一步处理的grep
行。 第一个确保后面的整数将是新行上的第一个字符。 最后一个仅打印出以新行开头的整数并删除任何字符。[<int>
sed
[
sed
上述三个序列最好放在脚本语言中,因为它不会不断更新到标准输出。这是因为所有管道都是嵌套的。因此,最好只有一个管道。
此外,在脚本中,您可以确保页面打印是连续的,从而删除来自包等的潜在消息。这可能足以获得不错的输出。
您应该能够使用它。
使用everyshi
如果使用,everyshi
您可以在每次发货时自动打印信息。
因此:
\EveryShipout{\message{^^JHELLO \thepage^^J}}
将会更容易跟踪,那么您只需要:
pdflatex $args $fn.tex | sed -e "/^HELLO [0-9]\+/{s/HELLO \([0-9]\+\).*/\1/gi ; p } ; d"
这是一个更为严格的要求。