首先,请允许我介绍一下背景:根据 Gonzalo Medina 的回答是否在带有 titletoc 的图表列表中包含章节?,我向表格列表添加了相同的功能。虽然我的图表列表一切正常,但表格列表将章节行(针对出现表格的每个新章节)保存到文件\jobname.lot
中后与第一个表对应的行。
导致这种奇怪结果的原因与我文档中章节的内容有关,因为我尝试使用完全相同的类和包,但使用类似 MWE 的章节,表格也一切正常。这就是我没有在这里询问这个奇怪特征的原因——它可能是我自己的章节文件中潜伏着的东西,尽管我无法透露它可能是什么,而且我检查的结果确实很奇怪。尽管如此,如果有人看到同样的特征发生,任何关于其起源的建议都会受到欢迎。
我正在尝试一种不同的方法:我的课程基于memoir
,我正在使用新的文件扩展名(lotb
)来存储文件中有关章节和表格的数据,\jobname.lotb
使用的方法与 Gonzalo Medina 提出的方法相同(除了基于 的一些小改动memoir
)。使用这种方法一切都很顺利,但我不知道如何检索表格的页码以将它们带到文件中\jobname.lotb
。
接下来是 MWE,我的真实设置比这复杂得多。
此外,我非常欢迎任何关于如何全面改善我的方法的建议。
\documentclass{memoir}
\usepackage{etoolbox}
\makeatletter
\def\thischaptertitle{}
\def\thischapternumber{}
\def\thistabtitle{}
\newtoggle{noFigs}
\newtoggle{noTabs}
%<- My new "list of"
\def\listoftabsname{Tables}
\newlistof{listoftabs}{lotb}{\listoftabsname}
\def\tabsmark{\listoftabsname}
\AtBeginDocument{%
% I part ways slightly from Gonzalo Medina's answer by resorting
% to a memoir-based hook
\apptocmd{\memendofchapterhook}{%
\gdef\thischaptertitle{\f@rtoc}%
\gdef\thischapternumber{\thechapter}%
\global\toggletrue{noTabs}%
\global\toggletrue{noFigs}%
}{}{}
% This is going to be used to get the content of the caption of a table.
% But, how do I get the page number?
% Plus, I guess it can be done much better than this
\apptocmd{\@caption}{%
\gdef\thistabtitle{\@currentlabelname}%
\gdef\thistabpage{}%<- How to?
}{}{}
% In my true setting I have to do this AtEnd, instead of AtBeginning
\AtEndEnvironment{table}{%
\iftoggle{noTabs}{
\global\togglefalse{noTabs}
\addtocontents{lotb}{%
\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}{\protect\ignorespaces\thischaptertitle}}{}{}
\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}}
}{}
}
% This goes AtEndEnvironment{table} in order to have the right counter value;
% otherwise, it is lagging one unit behind; e.g., the first is \thechapter.0
\AtEndEnvironment{table}{%
\addtocontents{lotb}{%
\protect\contentsline {table}%
{\protect\numberline {\thetable}{\protect\ignorespaces\thistabtitle}}{\thistabpage}{}
\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}}
}%
% Everything runs smoothly for the figures
\AtBeginEnvironment{figure}{%
\iftoggle{noFigs}{
\addtocontents{lof}{\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}{\protect\ignorespaces \thischaptertitle}}{}{}
\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}
\global\togglefalse{noFigs}
}{}
}%
}
\makeatother
% I'm using all of the packages below (and more) in my original setting.
% They appear here just because I think they can be relevant in order to provide a context
% for any possible answers to work in my real-life scenario
\usepackage[figurewithin=chapter,tablewithin=chapter]{caption}
\usepackage{titletoc}
\usepackage[toctitles,explicit]{titlesec}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\tableofcontents
\listoffigures*
\listoftabs
\chapter{One}
\begin{figure}
One
\caption{One.}
\end{figure}
\begin{table}
\caption{One.}
One
\end{table}
\begin{table}
\caption{Oneb.}
Oneb
\end{table}
\chapter{Two}
\begin{figure}
Two
\caption{Two.}
\end{figure}
\begin{table}
Two
\caption{Two.}
\end{table}
\chapter{Three}
\begin{figure}
Three
\caption{Three.}
\end{figure}
\begin{table}
Threeb
\caption{Threeb.}
\end{table}
\end{document}
编辑:我最初的问题,将上述所有内容都放在舞台上,已经通过我在下面的非答案帖子中解释的方法得到了解决。
答案1
\addcontentsline
在第二个中使用法线\AtEndEnvironment{table}
更简洁、更容易,并且它还提供正确的超锚点。额外的垂直间距用 表示\addtocontents
。
事实上,\addcontentsline
是一个包装器\addtocontents{...}{\protect\contentsline{...}{...}{...}}
,让它使用默认样式执行任何设计要做的事情将保证使用正确的页码和超锚点。
原则上,可以对中的额外章节行执行相同的操作.lotb
。
\documentclass{memoir}
\usepackage{etoolbox}
\makeatletter
\def\thischaptertitle{}
\def\thischapternumber{}
\def\thistabtitle{}
\newtoggle{noFigs}
\newtoggle{noTabs}
% <- My new "list of"
\def\listoftabsname{Tables}
\newlistof{listoftabs}{lotb}{\listoftabsname}
\def\tabsmark{\listoftabsname}
\AtBeginDocument{%
% I part ways slightly from Gonzalo Medina's answer by resorting
% to a memoir-based hook
\apptocmd{\memendofchapterhook}{%
\gdef\thischaptertitle{\f@rtoc}%
\gdef\thischapternumber{\thechapter}%
\global\toggletrue{noTabs}%
\global\toggletrue{noFigs}%
}{}{}
% This is going to be used to get the content of the caption of a table.
% But, how do I get the page number?
% Plus, I guess it can be done much better than this
\apptocmd{\@caption}{%
\gdef\thistabtitle{\@currentlabelname}%
\gdef\thistabpage{\thepage}%<- This is the how-to
}{}{}
% In my true setting I have to do this AtEnd, instead of AtBeginning
\AtEndEnvironment{table}{%
\iftoggle{noTabs}{
\global\togglefalse{noTabs}
\addtocontents{lotb}{%
\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}{\protect\ignorespaces \thischaptertitle}}{\thepage}{}
\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}}
}{}
}
% This goes AtEndEnvironment{table} in order to have the right counter value;
% otherwise, it is lagging one unit behind; e.g., the first is \thechapter.0
\AtEndEnvironment{table}{%
\addcontentsline{lotb}{table}{\protect\numberline {\thetable}{\protect\ignorespaces \thistabtitle}}
% \addtocontents{lotb}{%
% \protect\contentsline {table}%
% {\protect\numberline {\thetable}{\protect\ignorespaces \thistabtitle}}{\thistabpage}{\thetable.\theHtable}
\addtocontents{lotb}{\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}}
}%
% Everything runs smoothly for the figures
\AtBeginEnvironment{figure}{%
\iftoggle{noFigs}{
\addtocontents{lof}{\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}{\protect\ignorespaces \thischaptertitle}}{}{}
\protect\vskip0.125\protect\baselineskip}%\addvspace{5\p@}}
\global\togglefalse{noFigs}
}{}
}%
}
\makeatother
% I'm using all of the packages below (and more) in my original setting.
% They appear here just because I think they can be relevant in order to provide a context
% for any possible answers to work in my real-life scenario
\usepackage[figurewithin=chapter,tablewithin=chapter]{caption}
\usepackage{titletoc}
\usepackage[toctitles,explicit]{titlesec}
\usepackage{hyperref}
\usepackage{cleveref}
\begin{document}
\tableofcontents
\listoffigures*
\listoftabs
\chapter{One}
\begin{figure}
One
\caption{One.}
\end{figure}
\begin{table}
\caption{One.}
One
\end{table}
\begin{table}
\caption{Oneb.}
Oneb
\end{table}
\chapter{Two}
\begin{figure}
Two
\caption{Two.}
\end{figure}
\begin{table}
Two
\caption{Two.}
\end{table}
\chapter{Three}
\begin{figure}
Three
\caption{Three.}
\end{figure}
\begin{table}
Threeb
\caption{Threeb.}
\end{table}
\end{document}
答案2
这更像是一种修正或替代方法,而不是对我帖子的正确回答,但我认为它可能对某些人有用,而且我比我原来的方法更喜欢它。它仍然借鉴了 Gonzalo Medina 的贡献,当然,也借鉴了 Christian Hupfer 的贡献——我将其视为对我帖子的回答。
我当前方法的基础是破解字幕命令,而不是使用环境钩子。通过这种方式,我增强了原始方法,因为通过命令添加字幕的非浮动\captionof
也会写入相应的内容列表,而破解基于浮动的环境则不会出现这种情况。在我的设置中,它完全是关于表格和非浮动表格类环境的,这就是为什么我对基于表格的字幕进行破解测试(\ifthenelse
来自包的命令xifthen
)。对于图形也可以这样做。当然,要删除针对所考虑的浮动类型的环境的钩子。
下面我将介绍这个 hack。为了简洁起见,我不会重复整个 MWE,但如果有人认为我应该重新输入一遍,请随时告诉我。
\apptocmd{\@caption}{%
\gdef\thistabtitle{\@currentlabelname}%
\gdef\thistabpage{\thepage}%
%
\ifthenelse{\equal{\@captype}{table}}{%
\iftoggle{noTabs}{%
\global\togglefalse{noTabs}
\addtocontents{lotb}{%
\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}%
{\protect\ignorespaces \thischaptertitle}}{}{}}%
}{}%
\addcontentsline{lotb}{table}%
{\protect\numberline {\thetable}%
{\protect\ignorespaces \thistabtitle}}}{}
}{}{}
编辑:好吧,在测试了图片的字幕破解之后,我发现我最初关于表格列表的问题(导致我来到这里)已经通过使用\pretocmd
并忘记环境上的钩子解决了。我甚至不再需要新的内容列表了!写入默认表格列表 ( \jobname.lot
) 效果很好。因此,对我来说,“解决所有问题”的破解如下,包括表格和图片(欢迎进一步增强代码):
\newcommand{\addchapterto}[1]{%
\addtocontents{#1}{%
\protect\contentsline {chapter}%
{\protect\numberline {\thischapternumber}{\protect\ignorespaces \thischaptertitle}}{}{}}%
\addtocontents{#1}{\protect\vskip0.125\protect\baselineskip}%
}
\pretocmd{\@caption}{%
\ifthenelse{\equal{\@captype}{table}}{%
\iftoggle{noTabs}{
\global\togglefalse{noTabs}
\addchapterto{lot}
}{}
}{%
\ifthenelse{\equal{\@captype}{figure}}{%
\iftoggle{noFigs}{
\global\togglefalse{noFigs}
\addchapterto{lof}
}{}%
}{}%
}%
}{}{}