、等-file-line-error
命令行标志非常有效。当您有一个包含大量文件的大型项目时,错误消息不仅会非常清楚地指示行号,还会指示tex
latex
姓名该事件发生的文件。
不幸的是,此标志对警告不起作用。找到出现未满或过满警告的文件名称的最有效方法是什么?理想情况下,这可以在不借助 IDE 的情况下完成。
对下列问题的回答简洁且相关:
澄清
当您有多层嵌套和大型日志文件时,问题就会变得困难(我的日志文件大小在 5,000 到 30,000 行之间,包含大量无用的信息。)
在日志中,文件打开用 表示(filename
,文件关闭用 表示)
。现在,假设您有一个主文件,它输入节文件,每个节文件输入几个小节文件,每个小节文件输入表格和图形。
假设您在日志文件的第 17,432 行看到一条溢出消息,表明错误发生在输入行 182。您有两个选择:
- 在所有文件中搜索第 182 行,组成你的项目
- 在日志文件中进行向后搜索,仔细平衡开括号和闭括号,直到找到在日志文件的第 17,432 行哪个输入文件处于活动状态。
以下是我文件中的实际摘录.log
。请注意,其中有许多与文件包含无关的开括号和闭括号。还请注意,此摘录中的最后一条消息缺少输入行号。
21983 LaTeX 字体信息:字体形状“T1/ptm/bx/n”大小不可用 21984 (字体) 在输入行 21 上尝试使用字体形状“T1/ptm/b/n”。 21985 21986 段落第 14-22 行的 \hbox 过满(太宽 9.91599pt) 21987 \T1/ptm/m/n/10 (\T1/ptm/b/n/10 N\T1/ptm/m/n/10 \T1/ptm/b/n/10 的数量 I\T1/ptm 21988 /m/n/10 实例 \T1/ptm/b/n/10 V\T1/ptm/m/n/10 变量),\T1/ptm/b/n/10 MTE \ 21989 T1/ptm/m/n/10 (\T1/ptm/b/n/10 M\T1/ptm/m/n/10 u\T1/ptm/b/n/10 t\T1/ptm/m/n/10 a 21990 能力(\T1/ptm/b/n/10 E\T1/ptm/m/n/10 xplicit)), 21991 [] 21992 21993 21994 当 \output 处于活动状态时,发生 \vbox 未满(不良率 10000)[]
答案1
找到出现欠满或过满警告的文件的名称最有效的方法是什么?
在文件中搜索.log
字符串erfull
(在文本编辑器或命令行工具中)。这将为您提供所有过满和未满框警告。警告将告诉您错误来自源文件中的哪些行,日志文件还将指示错误发生在哪个 PDF 页面上。
当您阅读日志文件时,您可以看到每个输入的子文件在打开时的状态。每个文件名后面出现的警告与该文件中的行号有关。
我编造了一个例子来证明这一点,希望不会太令人困惑。下面的文件结构如下:
主要文件包括
section.tex
section.tex
输入table1.tex
section.tex
输入subsection.tex
subsection.tex
输入table2.tex
这两个表格文件都会造成严重的框溢出。
erfull
主文件中的第一个警告.log
是:
(./section.tex (./table1.tex)
Overfull \hbox (3524.03448pt too wide in paragraph at lines 12-11
查看生成的子文件section.tex
和table1.tex
,我们可以看到tabular
中的过满环境从table1.tex
的第 12 行开始。这是警告中页面范围开头table1.tex
的来源。12
table1
section.tex
在 的第 11 行输入到。这是警告页面范围内section.tex
的来源。11
因此日志消息可能被翻译如下:
我打开了文件
section.tex
。然后我输入了文件。当我输入文件时,我发现在第 12 行和第 11 行之间的某处table1.tex
出现了溢出。\hbox
table1.tex
section.tex
因此,要回答您的问题,如何找到出现箱子过满或不足的情况的文件的名称,它位于警告之前日志文件中最近引用的文件中。
以下是示例:
\documentclass{article}
\usepackage[nopar]{lipsum}
\usepackage{filecontents}
%***************************************
\begin{filecontents}{table1.tex}
\begin{tabular}{llll}
a & b & c & \lipsum[1]\\
\end{tabular}
\end{filecontents}
%***************************************
\begin{filecontents}{table2.tex}
\begin{minipage}{1in}
\lipsum[1]
\end{minipage}
\end{filecontents}
%***************************************
\begin{filecontents}{subsection}
\subsection{Minipage}
\input{table2}
\end{filecontents}
%***************************************
\begin{filecontents}{section.tex}
\section{Confusion}
a
b
\input{table1}
d
e
f
\clearpage
\input{subsection}
\end{filecontents}
%***************************************
\begin{document}
\tableofcontents
\include{section}
\end{document}
答案2
@AndrewCashner 的回答让我找到了一个对我有用的答案。
vi
使用、vim
或打开文件gvim
- 找到警告(这应该很容易)
- 键入“A)”在日志文件当前行末尾添加一个开括号。
- 编辑器的
showmatch
功能将带你到日志文件中显示的那一行警告之前日志文件中最近引用的文件。
这是一个可以提供一些帮助的 AWK 脚本。
#!/usr/bin/gawk -f
{
for (i = 1; i <= NF; i++)
word($i)
print top()": " $0
}
function word(s) {
if (s ~ /^[(][^()]+$/)
push(substr(s,2))
else
letters(s)
}
function letters(s, i) {
for (i = 1; i <= length(s); i++)
letter(substr(s,i,1))
}
function letter(s) {
if (s == "(")
push("");
else if (s == ")")
pop();
}
function push(s) { stack[++sp] = s; }
function pop() { return stack[sp--];}
function top(j) {
for (j = sp; j >0; j--)
if (stack[j] != "" )
return stack[j] ;
print "Sorry; I got confused - not sure what can be done"
exit 1
}
该脚本读取一个.log
文件,并将其打印到标准输出,并在每行日志前加上生成它的输入文件的名称。grep
按照所述通过管道传输输出这里即可得到 的合理近似值
-file-line-error
。
脚本会尝试匹配输入中的括号,以便找出当前活动的文件名。但是,如果出于某种原因,TeX 会打印出括号不匹配的文本,例如,
段落第 69-70 行的 \hbox 未满(badness 2065) [][]\EU2/lmr/m/n/10 具有 \EU2/lmr/bx/n/10 原型 \EU2/lmr/m/n/10 (对象 基于,但不是对象 []
剧本肯定会令人困惑。
高血压