![如何检查标题级别的嵌套是否正确](https://linux22.com/image/247672/%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E6%A0%87%E9%A2%98%E7%BA%A7%E5%88%AB%E7%9A%84%E5%B5%8C%E5%A5%97%E6%98%AF%E5%90%A6%E6%AD%A3%E7%A1%AE.png)
我们如何检查 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.1
为n
节号。因此,您需要做的就是列出所有节号,然后搜索零!
参考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!
。现在,这很酷。