各节内交替编号

各节内交替编号

我正在排版一本书,这本书分为几个段落(部分),整本书的段落连续编号,并包含一些表格。表格的编号必须与它们所在的部分相同。因此,“表 23”可以立即识别为位于第 23 部分。

但是,有些部分包含多个表格。我需要对它们进行编号,在部分编号中添加一个连续的数字,然后按照每个部分重新开始。

例如:表 46.1 和表 46.2 都位于第 46 节中,而表 120.1、120.2 和 120.3 位于第 120 节中。

但是,重要的是,如果一个部分中只有一个表,则它的编号必须与部分编号保持相同,后面没有“.1”。

我可以自动实现这个吗?

答案1

下面的方法似乎可以解决问题,至少使用amsbookdocument 类。对于其他文档类,可能需要进行一些调整(这就是为什么总是给出一个最小工作示例)。

基本思想是,每当开始一个部分(或在文档末尾)时,前一节中的表格数量都会保存到带有 形式标签的辅助文件中TablesInSection<section#>。然后该\thetable命令使用\setcounterref来自引用计数包检查该部分是否包含多个表。如果是,则将表号与部分号一起打印,否则仅打印部分号。

由于每个部分的表格数量都保存在辅助文件中,因此每次任何部分的表格数量发生变化时,您都需要运行 (pdf)latex 两次。我还没有检查如果命令\section与可选参数一起使用会发生什么,因此很可能需要进行调整。如果您使用章节,那么章节内的部分也应该编号,尽管您可以对此进行修改。

输出如下:

在此处输入图片描述

代码如下:

\documentclass{amsbook}
\usepackage{etoolbox}
\usepackage{refcount}
\numberwithin{table}{section}
\makeatletter
% write a label to the aux file
\newrobustcmd{\WriteLabel}[2]{%
% use the following if hyperref is loaded
%   \immediate\write\@auxout{\string\newlabel{#1}{{#2}{}{}{#1.#2}{}}}
    \immediate\write\@auxout{\string\newlabel{#1}{{#2}{\thepage}}}%
}
\makeatother

\newcommand\savesectiontablenumber{%
  \ifnum\value{section}>0%
    \ifnum\value{table}>0%
      \WriteLabel{TablesInSection\thesection}{\arabic{table}}%
    \fi%
  \fi%
}
\preto\section\savesectiontablenumber
\AtEndDocument{\savesectiontablenumber}
\newcounter{tablechecker}
\renewcommand\thetable{%
  \setcounterref{tablechecker}{TablesInSection\thesection}
  \ifnum\thetablechecker>1
    \thesection.\arabic{table}%
  \else\thesection%
  \fi%
}

\begin{document}

\section{Section one}
  \begin{table}[h]\caption{A table}\label{single}
A table
\end{table}

\section{Section one}
  \begin{table}[h]\caption{First table}\label{one}
First table
\end{table}
\begin{table}[h]\caption{Second table}\label{two}
Second table
\end{table}

\end{document}

相关内容