pdflatex 输出非常烦人

pdflatex 输出非常烦人

我试图理解 pdflatex 输出并发现了一个大问题:

我在一个地方有一个警告,例如该行是

\end{foo} test)test

pdflatex 打印警告消息,然后打印行信息:

l.73 \end{foo}
                   test)test[1] [2] [3]) ("C:\Users\Nils\Documents\chapter2.tex"

我以为“l.73”后面的行是保留来自 tex 文件的引用。但你可以看到下一个文件的名称也被打印出来了。

如果其中有一个圆括号,就像在这个例子中一样,输出将无法被解析器理解,因为应该检查该行中的文件名,但第一个括号将关闭最后一个文件......

我能做些什么?

答案1

你的问题有点模糊。这里只test)test打印了那一行:

\documentclass{article}
\usepackage{lipsum}
\def\foo{}
\def\endfoo{\baz}
\begin{document}
\lipsum[1]
\begin{foo}
abc
\end{foo} test)test
\lipsum
\end{document}

所以这实际上取决于导致打印警告/错误的原因。

TeX 的日志输出无法被明确解析,但它遵循一些规则。当它打开一个文件时,(file.tex会在控制台中打印;当关闭该文件时,会打印匹配。写出的页面由... ...等)表示。您编写的任何遵循这些规则的启发式方法都必须接受这样一个事实:不匹配的括号和方括号可能会出现在输出中。[1][2]

我想到了一个替代方案。您可以使用currfileandfilehook包打印出文件打开/关闭的明确标记,然后使用此信息。例如:

\RequirePackage{filehook,currfile}
\makeatletter
\def\fileindent{}
\def\pushindent{%
  \expandafter\def
  \expandafter\fileindent
  \expandafter{\fileindent\space\space}%
}
\def\popindent{%
  \edef\@tempa{%
    \noexpand\expandafter\def
    \noexpand\expandafter\noexpand\fileindent
    \noexpand\expandafter{%
      \noexpand\@gobbletwo\unexpanded\expandafter{\fileindent}%
    }%
  }%
  \@tempa
}
\makeatother
\AtBeginOfEveryFile{\typeout{\fileindent Begin file \currfilename}\pushindent}
\AtEndOfEveryFile{\popindent\typeout{\fileindent End file \currfilename}}
\documentclass{article}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

这里,每个嵌套文件包含都在控制台输出中缩进(这就是顶部代码混乱的原因)。对于您的目的而言,这不是必需的,但我发现它更易于目视检查。

相关内容