我正在排版一本书,这本书分为几个段落(部分),整本书的段落连续编号,并包含一些表格。表格的编号必须与它们所在的部分相同。因此,“表 23”可以立即识别为位于第 23 部分。
但是,有些部分包含多个表格。我需要对它们进行编号,在部分编号中添加一个连续的数字,然后按照每个部分重新开始。
例如:表 46.1 和表 46.2 都位于第 46 节中,而表 120.1、120.2 和 120.3 位于第 120 节中。
但是,重要的是,如果一个部分中只有一个表,则它的编号必须与部分编号保持相同,后面没有“.1”。
我可以自动实现这个吗?
答案1
下面的方法似乎可以解决问题,至少使用amsbook
document 类。对于其他文档类,可能需要进行一些调整(这就是为什么总是给出一个最小工作示例)。
基本思想是,每当开始一个部分(或在文档末尾)时,前一节中的表格数量都会保存到带有 形式标签的辅助文件中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}