有没有什么办法可以将这些包endfloat
和结合起来chngcntr
?
我希望所有表格都位于文档末尾(带有endfloat
),并包含章节编号(例如,1.1.)。
下面的例子产生了“3.1”(尽管它应该是“1.1”),因为我猜是endfloat
在文档末尾建立了一个新的部分?
非常感谢您提出的任何想法!
梅威瑟:
\documentclass[11pt, a4paper]{article}
\usepackage[nolists, fighead, tabhead]{endfloat}
\usepackage{chngcntr}
\counterwithin{table}{section}
\begin{document}
\section{test1}
\begin{table}[!htp]
\caption{This should be table 1.1}
\end{table}
xx
\section{test2}
\section{test3}
\end{document}
答案1
这是一个棘手的问题,因为浮动环境会被保存,并且会从代码的一个部分移植到另一个部分。因此,当您最终让表格出现时,如果您插入了另一个部分,那么表格将只出现在最后一个部分中。
为了解决这个问题,我们可以使用一个新的计数器,它会与endfloat
特定浮点类型的计数器一起递增(在这种情况下,我已经使用 完成了这项工作table
,但你应该能够找到/替换所有内容table
以便figure
为浮点数启用相同的行为figure
)。
\newcounter{myposttable}
然后,etoolbox
用于在每次table
启动新环境时运行代码。请注意,这在首次遇到表时都会发生和当表格最终打印在该部分/文档的末尾时。
\AtBeginEnvironment{table}{...
第一次,我们检查自定义控制序列名称是否尚未创建,然后定义一个宏来打印我们希望显示的浮点数。1
\ifcsdef{eftable\themyposttable}{}{ % Only runs first time through, not second time
\stepcounter{table} % Get actual next table number
\csxdef{eftable\themyposttable}{\thetable} % Create global variable \eftable<#>
\addtocounter{table}{-1}% % reset table number so as not to disrupt operation
}
然后\thetable
更新,控制表格的实际标签。这两次都会运行,但仅在第二次将表格实际输出到页面时使用。
\renewcommand{\thetable}{\csuse{eftable\themyposttable}}
最后,我们必须myposttable
在第二次时将计数器重置为 0,因为我们需要再次计算自定义宏。
\AtBeginTables{\setcounter{myposttable}{0}}
还有一些其他项目负责完成解决方案,包括更新\tableplace
哪些控件可以放置在表格出现的位置的文本。
\renewcommand\tableplace{\begin{center}[\tablename~\csuse{eftable\themyposttable}\ referenced here.]\end{center}}
我还允许在一页上有多个浮动,以方便呈现结果。
\renewcommand{\efloatseparator}{\mbox{}}
结果
表格原始位置的部分显示如下:
表格本身移动到文档末尾:
最终 MWE
\documentclass[11pt, a4paper]{article}
\usepackage{chngcntr}
\counterwithin{table}{section}
\usepackage[nolists, fighead, tabhead]{endfloat}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{etoolbox}
% For Tables:
% Make a new counter to step through the number of tables we have
% We use this to keep track of the "real" labels of the floats
\newcounter{myposttable}
% The following code will be run both when the table is initially encountered
% AND when the table is finally printed at the end of the section/document
\AtBeginEnvironment{table}{
\stepcounter{myposttable} % Work with incremented myposttable count
% If not defined, define a label for the table to be stored and displayed later.
\ifcsdef{eftable\themyposttable}{}{\stepcounter{table}\csxdef{eftable\themyposttable}{\thetable}\addtocounter{table}{-1}}
% Renew the definition of \thetable to use the updated number
\renewcommand{\thetable}{\csuse{eftable\themyposttable}}
}
% Reset the myposttable counter when we start displaying the tables
% to cycle through the actual labels we want while we print them
\AtBeginTables{\setcounter{myposttable}{0}}
% Change definition of \tableplace to reflect actual table numbers with section
\renewcommand\tableplace{\begin{center}[\tablename~\csuse{eftable\themyposttable}\ referenced here.]\end{center}}
% --- End For Tables
% Allow multiple floats on one page
\renewcommand{\efloatseparator}{\mbox{}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\section{test1}
\begin{table}[!htp]
\caption{This should be table 1.1}
\end{table}
\section{test2}
\begin{table}[!htp]
\caption{This should be table 2.1}
\end{table}
\section{test3}
\begin{table}[!htp]
\caption{This should be table 3.1}
\end{table}
\end{document}
1这意味着代码无法像写的那样工作,因为每章末尾都有 endfloats,每个章节都有浮点数。可以通过弄清楚如何清除相关csname
变量或(更简单)将当前章节包含在 中,使用类似 的csname
内容来解决这个问题\csxdef{eftable\thechapter chap\themyposttable}{\thetable}
。myposttable
在这种情况下,计数器也应该在章节之间重置。