我正在从 php 脚本执行 pdflatex,它给了我很长的日志条目列表,其中混杂着错误,例如
system('/usr/texbin/pdflatex -output-directory=./temp/tex '.$tex_output . " 1> /dev/null ",$firstRun);
是否可能仅获取错误或警告(可能使用它生成的日志文件)?
答案1
错误总是以 开头<exclamationmark><space>
,这在日志中应该很容易查找。
另外,您可以将类似的东西管道化x\nx\n
到程序中latex
,这应该会使它在第一次错误后停止。然后您可以更轻松地搜索它,我相信日志中的最后一行空行应该就在这个错误之后。(这是因为在发生x
错误后,只有一些最终的字体信息和内存使用情况会写入日志。)
答案2
这是我最终为 Node.js 编写的内容。命令如下:
pdflatex -interaction=nonstopmode -halt-on-error my-doc.tex
解析错误的代码stdout
:
function parseError(text: string) {
let lines = text.trim().split('\n')
let firstErrorFound = false
let lastErrorFound = false
let message: Array<string> = []
let newLineCount = 0
lines.forEach(line => {
if (line.match(/^\!/)) {
if (firstErrorFound) {
lastErrorFound = true
}
firstErrorFound = true
}
if (lastErrorFound) {
return
}
if (firstErrorFound) {
// don't have more than 2 new lines in a row.
if (line.match(/^\s*$/)) {
newLineCount++
if (newLineCount > 1) {
return
}
} else {
newLineCount = 0
}
if (line.match(/See the LaTeX manual/i)) {
return
}
if (line.match(/Type\s+H <return>\s+for immediate help/i)) {
return
}
if (line.match(/^\s+\.\.\.\s*/)) {
return
}
message.push(line.replace(/^\!\s+/, '').replace(/\s*$/, ''))
}
})
return message.join('\n').replace(/\n\n+/gm, '\n\n')
}
示例输出:
LaTeX Error: Can be used only in preamble.
l.3 \usepackage
{geometry}