如何从 pdflatex 工具获取错误消息(特别是从 php 运行)

如何从 pdflatex 工具获取错误消息(特别是从 php 运行)

我正在从 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}

相关内容