使用everyshi

使用everyshi

我有一些使用 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"

这是一个更为严格的要求。

相关内容