相当于 -file-line-error 的警告

相当于 -file-line-error 的警告

、等-file-line-error命令行标志非常有效。当您有一个包含大量文件的大型项目时,错误消息不仅会非常清楚地指示行号,还会指示texlatex姓名该事件发生的文件。

不幸的是,此标志对警告不起作用。找到出现未满或过满警告的文件名称的最有效方法是什么?理想情况下,这可以在不借助 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.textable1.tex,我们可以看到tabular中的过满环境从table1.tex的第 12 行开始。这是警告中页面范围开头table1.tex的来源。12

table1section.tex在 的第 11 行输入到。这是警告页面范围内section.tex的来源。11

因此日志消息可能被翻译如下:

我打开了文件section.tex。然后我输入了文件。当我输入文件时,我发现在第 12 行和第 11 行之间的某处table1.tex出现了溢出。\hboxtable1.texsection.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 的回答让我找到了一个对我有用的答案。

  1. vi使用、vim或打开文件gvim
  2. 找到警告(这应该很容易)
  3. 键入“A)”在日志文件当前行末尾添加一个开括号。
  4. 编辑器的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 (对象
 基于,但不是对象
  []

剧本肯定会令人困惑。

高血压

相关内容