如果文档不遵守某些既定规则,Xe/Latex 会收到警告

如果文档不遵守某些既定规则,Xe/Latex 会收到警告

如果乳胶文档不遵守某些预定义规则,是否有办法获得“可见”警告?例如,如果一个段落包含超过 7 行,我仍然希望我的文档被编译,但我希望获得“可见”警告。

答案1

你可以在 LuaLaTeX 中使用post_linebreak_filter打回来。如果段落长度超过七行,它将在日志中显示警告。只需print在函数内部替换为,error即可使编译失败而不是警告。

\documentclass{article}
\usepackage{blindtext}
\usepackage{luacode}

\begin{luacode*}
local function check_lines (head)
  local lines = 0
  for line in node.traverse_id(node.id("hlist"), head) do
     lines = lines + 1
  end
  if (lines > 7) then
     print("\nWARNING: Paragraph with more than seven lines detected!\n")
  end
  return true
end

luatexbase.add_to_callback("post_linebreak_filter", check_lines, "check_lines", 0)
\end{luacode*}


\begin{document}

\Blindtext

\end{document}

我认为其他引擎不可能实现像 Lua 回调这样的自动化解决方案。如果你不介意将每个段落包装在一个环境中,你可以使用\eatlinesVictor Eijkhout 在他的书中介绍的方法TeX 按主题分类。这甚至可以告诉您错误段落出现在哪一行。

\documentclass{article}
\usepackage{blindtext}

\newbox\linebox
\newcount\linecount

\def\eatlines{%
  \setbox\linebox\lastbox
  \ifvoid\linebox
  \else
  \unskip\unpenalty
  {\eatlines}%
  \global\advance\linecount by 1
  \box\linebox
  \fi}

\newenvironment{countlinesinpar}{%
  \global\linecount=0
  \vbox\bgroup
}{
  \par\eatlines\egroup
  \ifnum\linecount>7
    \message{^^JWARNING: Paragraph with more than seven lines detected at line \the\inputlineno!^^J}%
  \fi
}

\begin{document}

\begin{countlinesinpar}
\blindtext
\end{countlinesinpar}

\end{document}

如果你真的不喜欢在环境中将每个段落换行,你可以尝试将魔法放在 中\everypar。不幸的是,标准 LaTeX 文档类会\everypar在随机点覆盖(例如\begin{document})。因此,你的文档可能会在随机位置意外爆炸。我已经注意到它没有正确处理缩进框,从而导致警告Overfull \hbox。无论如何,将其放在 之后\begin{document}

\everypar={%
  \global\linecount=0
  \vbox\bgroup\everypar={}%
  \def\par{%
    \endgraf\eatlines\egroup\endgraf
    \ifnum\linecount>7
      \message{^^JWARNING: Paragraph with more than seven lines detected at line \the\inputlineno!^^J}%
    \fi}
}

相关内容