我试图理解 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]
我想到了一个替代方案。您可以使用currfile
andfilehook
包打印出文件打开/关闭的明确标记,然后使用此信息。例如:
\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}
这里,每个嵌套文件包含都在控制台输出中缩进(这就是顶部代码混乱的原因)。对于您的目的而言,这不是必需的,但我发现它更易于目视检查。