我怎样才能把 endfloat 和 chngcntr 结合起来?

我怎样才能把 endfloat 和 chngcntr 结合起来?

有没有什么办法可以将这些包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在这种情况下,计数器也应该在章节之间重置。

相关内容