如何检查标题级别的嵌套是否正确

如何检查标题级别的嵌套是否正确

我们如何检查 LaTeX 文件中的标题级别是否按顺序排列,即,,,\section和。如何捕捉后面跟着或后面跟着等。\subsection\subsubsection\paragraph\subparagraph\section\subsubsection\subsection\paragraph

答案1

zeroth 解决方案的“抽象”版本:

\makeatletter
\def\set@schk#1#2{%
  \expandafter\let\csname schk@#1\expandafter\endcsname
  \csname #1\endcsname
  \@namedef{schk@#1@level}{#2}%
  \@namedef{#1}{\schk@check{#1}\csname schk@#1\endcsname}%
}
\set@schk{section}{1}
\set@schk{subsection}{2}
\set@schk{subsubsection}{3}
\set@schk{paragraph}{4}
\set@schk{subparagraph}{5}

\def\schk@check#1{%
  \ifnum\numexpr\csname schk@#1@level\endcsname-\schk@current\relax>\@ne
    \par You can't put \texttt{\expandafter\string\csname #1\endcsname} here\par
  \fi
  \xdef\schk@current{\csname schk@#1@level\endcsname}%
}
\def\schk@current{0}
\makeatother

我们在每个分段命令前面添加一个检查,以确保级别差异不大于一,然后设置当前级别。

答案2

你可以用一种 hack 的方式来做。我不知道有什么软件包可以做到这一点。而且它可能会被某些软件包破坏。尽管它应该对其他软件包有一定的抵抗力。

我所做的是检查排版规则。我添加了很多不必要的来举例说明。您可以对、... 等任何您想要的命令\if执行相同的实现模式。\part\chapter

基本上,它会跟踪允许排版的内容。\if每个部分、子部分等都应该有一个,然后重新定义部分以检查这一点。如果允许排版,它将继续并更新允许遵循的内容,这可以任意进行,而且相当简单。

\documentclass{article}
\begin{document}
\makeatletter
% Always allow to step back and go one forth
% Create If variables for each sectioning
\newif\iftest@section
\newif\iftest@ssection
\newif\iftest@sssection
% Initialize to correct values
\test@sectiontrue
\test@ssectiontrue
\test@sssectionfalse
% Save old definition of sections, that are going to be incorporated
\let\osection\section
\let\ossection\subsection
\let\osssection\subsubsection
% Redefine section
\def\section{%
    \iftest@section % We are allowed to typeset a section, proceed
    % Initialize what is allowed to be typeset after a section
    \test@sectiontrue
    \test@ssectiontrue
    \test@sssectionfalse
    % Expandafter to circumvent grabbing of \else
    \expandafter\osection
    \else
    % If not applicable for typesetting write out an error message
    % You could add a \warning here (but then it wont compile)
    ERROR you are not allowed to add a section now!
    % Eat the argument of the section, easily expanded to also gobble the
    % [] argument
    \expandafter\@gobble
    \fi
}
% Do same handling for the subsection
\def\subsection{%
    \iftest@ssection
    \test@sectiontrue
    \test@ssectiontrue
    \test@sssectiontrue
    \expandafter\ossection
    \else
    ERROR you are not allowed to add a subsection now!
    \expandafter\@gobble
    \fi
}

\def\subsubsection{%
    \iftest@sssection
    \test@sectiontrue
    \test@ssectiontrue
    \test@sssectiontrue
    \expandafter\osssection
    \else
    ERROR you are not allowed to add a subsubsection now!
    \expandafter\@gobble
    \fi
}
\makeatother

\section{A}

\subsection{A.1}
\subsection{A.2}
\subsubsection{A.2.1}


\section{B}

\subsubsection{B.1.1} % This will return an error

\section{C}

\subsection{C.1}

\subsubsection{C.1.1}

\end{document}

这将输出:

在此处输入图片描述

答案3

这是一种相当独特的方法,它的优点是,如果您确实发现问题,可以轻松修复问题。它要求您使用 emacs+reftex。

首先,理论:如果 a\section后面跟着 a \subsubsection,它将被编号n.0.1n节号。因此,您需要做的就是列出所有节号,然后搜索零!

参考TeX如果您使用 emacs,则可以轻松完成此操作。只需执行C-c =(即,Ctrl+c然后=)。这将打开列出部分的 reftex 窗口。按下l此窗口也会列出所有标签。很棒,对吧?此外,这不仅会列出当前文档的部分,还会列出\include文档中列出的其他文档中的其他部分TeX-master。太酷了。

但无论如何。这对当前的问题有什么帮助?好吧,尽管 reftex 缓冲区看起来很酷,但它只是纯文本。我们可以搜索纯文本。C-s向前搜索,C-r向后搜索。所以C-s .0应该在缓冲区中搜索.0。很有可能以这种方式发现层次结构错误的实例。

这种方法的优点在于它能让你轻松修复问题。假设你看到以下内容:

破碎切片

(抱歉配色方案不太好。我还没来得及修复它)。有两种方法可以修复这个问题。首先,你可能想在上方添加一个新的子节Broken。按回车键,reftex 会将你移动到文件所在的部分\subsubsection{Broken!}。因此,只需向上移动几行并执行C-c C-s添加新节类型命令即可。

但这很酷。假设你只想将 的级别更改Broken为 子节。在 reftex 缓冲区中,你可以使用<>分别将节类型命令向上和向下移动一个级别。因此,按下<2.0.1 Broken!会将其更改为 子节2.1 Broken!。现在,这很酷。

了解更多关于可怕的力量的 emacs。

相关内容