我正在使用此命令在终端中编译乳胶文档,如下所示:
latexmk -pdfxe -pvc -xelatex -interaction=nonstopmode -output-directory="./build"
一切顺利。但我仍然面临编译有时可能会失败的问题,问题是我很难从终端输出中找出问题所在。我想知道是否可以使 latexmk 输出更好,例如错误消息用红色显示,警告消息用黄色显示,或者其他方式使它更容易找出问题所在。有什么改进方法可以实现吗?
答案1
是的,这是可能的,但你必须修改你的latexmkrc
或使用独立的程序来传输输出。示例解释如下在这篇博文中,您有两个选择:
- 修改 latexmkrc
- 使用 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
。