latexmkrc

latexmkrc

我正在使用此命令在终端中编译乳胶文档,如下所示:

latexmk -pdfxe -pvc -xelatex -interaction=nonstopmode -output-directory="./build"

一切顺利。但我仍然面临编译有时可能会失败的问题,问题是我很难从终端输出中找出问题所在。我想知道是否可以使 latexmk 输出更好,例如错误消息用红色显示,警告消息用黄色显示,或者其他方式使它更容易找出问题所在。有什么改进方法可以实现吗?

答案1

是的,这是可能的,但你必须修改你的latexmkrc或使用独立的程序来传输输出。示例解释如下在这篇博文中,您有两个选择:

  1. 修改 latexmkrc
  2. 使用 Python 中的定制解决方案或类似更酷的输出

latexmkrc

{
    no warnings 'redefine';
    use Term::ANSIColor;
    my $old_warn_running = \&main::warn_running;
    sub color_warn_running {
        print STDERR color('green');
        $old_warn_running->(@_);
        print STDERR color('reset');
    }
    if (-t STDERR) {
        # Only use color if a terminal is attached
        *main::warn_running = \&color_warn_running;
    }
}

基于 Python 的解决方案

#!/usr/bin/env python3
"""Filter output of pdflatex.

Usage: filter.py <latex engine> <options> <file>
"""
import os
import subprocess
import sys

import colorama
from colorama import Fore, Style
colorama.init()


def main(cmd):
    # Disable pdflatex line wrap (where possible)
    env = dict(os.environ, max_print_line="1000000000")

    # Run pdflatex and filter/colour output
    pdflatex = subprocess.Popen(
        cmd, env=env, 
        stdout=subprocess.PIPE, stderr=subprocess.STDOUT
    )
    for line in iter(pdflatex.stdout.readline, b''):
        line = line.decode('utf8').strip()
        if line.startswith('(/') or line.startswith('(./'):
            # Start loading file
            pass
        elif line.startswith(')'):
            # Finish loading file
            pass
        elif line.startswith('!'):
            # Error
            print(Fore.RED + line + Style.RESET_ALL)
        elif line.startswith('Overfull') or \
                line.startswith('Underfull') or \
                'warning' in line.lower() or \
                'missing' in line.lower() or \
                'undefined' in line.lower():
            # Warning
            print(Fore.YELLOW + line + Style.RESET_ALL)
        else:
            print(line)


if __name__ == '__main__':
    assert len(sys.argv) > 1
    main(sys.argv[1:])

然后您可以将其添加$pdflatex = "./filter.py pdflatex %O %S";到您的latexmkrc

相关内容