是否可以让 LaTeX 检查文档的每个部分是否存在某些环境?

是否可以让 LaTeX 检查文档的每个部分是否存在某些环境?

我有一份文档,其中 (大多数) 证明都需要有一个例子。有没有一种简单的方法可以让 LaTeX 检查我没有忘记例子?我想象的是这样的:

\documentclass{article}
\begin{document}
\section{Problems 2.4}
\begin{examples}
  Examples here
\end{examples}
\begin{proof}
  Prove things
\end{proof}
\end{document}

如果我忽略examples环境,我就会收到某种警告。

\item(我实际上是在中写问题enumerate,但我愿意改用章节或小节,因为这可能更有意义)

对评论问题的回答:

例子和证明是否必须按照特定的顺序排列,或者例子有时在证明之前,证明有时在例子之前?

这并不重要;最好先放示例再放证明,但无论哪种顺序都可以。我通常将示例放在证明之前 — 不需要有变化的选项。

给定部分是否可以有多个证明或例子?

没有

接下来,您更喜欢使用\subsection\item

不是特别;我不确定在教科书中做问题集的通常方法是什么,但它似乎\item通常与教科书编号相匹配。

最后,警告应该出现在日志文件中还是应该打印在文本中?

最好将其放在日志文件中;如果将其打印在终端的输出中就更好了。

答案1

这是实现此目的的一种快捷方法。您尚未说明您希望exampleproof环境是什么样子,因此我仅创建了虚拟环境。

诀窍是在这些环境开始时设置一些标志:我使用了两个计数器\myexample\myproof。然后我劫持了命令并简单地检查和\section是否相等:如果它们不相等,那么要么有一个没有证明的例子,要么有一个没有例子的证明。\myexample\myproof

MWE 在日志中写入以下消息:

LaTeX Warning: Section 2 is missing an example or proof on input line 37.
LaTeX Warning: Section 3 is missing an example or proof on input line 41.
LaTeX Warning: Section 5 contains too many examples and proofs on input line 57.

(因此也可以在命令行上使用。)就我个人而言,我也会将这些消息打印在 PDF/dvi 文件中,在类似这样的文件中,\ifdraft ... \fi这样当不处于草稿模式时,您就可以自动禁用输出中的消息。(根据您使用的类文件,要执行此操作,您可能需要将其添加\newif\ifdraft到您的 tex 文件中,然后使用 和 打开或关闭“草稿模式” \drafttrue\draftfalse

你说永远不会有超过一个例子和一个证明,但是如果某个部分包含 2 个或更多的证明/例子,发出警告可能是有意义的,所以我让代码这样做了。

以下是代码:

\documentclass{article}
\usepackage{etoolbox}
\let\realSection=\section% saving for use later
\newcount\myexample      % number of examples in a section
\newcount\myproof        % number of proofs in a section
% dummy proof/example environments
\newenvironment{example}{\noindent\textbf{Example}\global\advance\myexample by 1}{\par}
\newenvironment{proof}{\noindent\textbf{Proof}\global\advance\myproof by 1}{\par}
\makeatletter
% check if \myproof and \myexample are both 0 or both 1 or WARN
\newcommand\CheckExamplesProofs{%
   \ifnum\myexample=\myproof%
      \ifnum\myexample>1% too many examples/proofs is bad!
        \@latex@warning{Section \arabic{section}\space contains too many examples and proofs}%
      \fi%
   \else% different number of examples/proofs is bad!
      \@latex@warning{Section \arabic{section}\space is missing an example or proof}%
   \fi
   \myproof=0\myexample=0% new section so reset the counters
}
\makeatother
\def\section{\CheckExamplesProofs\realSection}
\AtEndDocument{\CheckExamplesProofs}% to check that the last section behaves

\begin{document}
\section{Problems 2.4}
\begin{example}
  Examples here
\end{example}
\begin{proof}
  Prove things
\end{proof}

\section{Problems 2.3}
  \begin{proof}A proof
  \end{proof}

\section{Problems 2.2}
  \begin{example}A example
  \end{example}

\section{Problem 2.1}

\section{Problem 2.1}
\begin{example}
  Examples here
\end{example}
\begin{proof}
  Prove things
\end{proof}
\begin{example}
  Examples here
\end{example}
\begin{proof}
  Prove things
\end{proof}

\end{document}

该命令\AtEndDocument{\CheckExamplesProofs}检查最后一节的证明和示例数量。根据文档的结构,您可能需要在每一章的开头进行类似的检查,以确保上一章的最后一节具有正确数量的证明和示例。为此,您可以使用:

\let\realChapter=\chapter
\def\chapter{\CheckExamplesProofs\realChapter}

相关内容