这是“是否在带有 titletoc 的图表列表中包含章节?“。当浮动元素放置在页面顶部的新部分/章节之后时,原始解决方案似乎存在问题。在 LoF 中,图形标题位于插入的部分/章节标题上方(见屏幕截图)。如果我们将浮动元素的位置更改为b
或其他任何位置,它都可以正常工作。
下面的代码适用于报告类,但我已经检查过并且存在于书籍/报告/文章及其 KOMA 等效物中。
\documentclass{scrreprt}
\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\def\thisparttitle{}\def\thispartnumber{}
\newtoggle{noFigs}
\apptocmd{\@part}%
{\gdef\thisparttitle{#1}\gdef\thispartnumber{\thepart}%
\global\toggletrue{noFigs}}{}{}
\AtBeginDocument{%
\AtBeginEnvironment{figure}{%
\iftoggle{noFigs}{
\addtocontents{lof}{\protect\contentsline {part}%
{\protect\numberline {\thispartnumber} {\thisparttitle}}{}{} }
\global\togglefalse{noFigs}
}{}
}%
}
\makeatother
\begin{document}
\listoffigures
\part{Part 1}
\chapter{Hallo}
\lipsum
\section{Hallo}
\begin{figure}[t] % change placement to cbt and it works
\caption{Part 1 Fig}
Test
\end{figure}
\end{document}
编辑
当多个图形/表格位于不同部分时,Heiko 建议的解决方案会出现问题。例如:
\begin{document}
\listoftables\listoffigures
\part{Part 1}
\begin{table}\caption{Part 1 Tab}\end{table}
\part{Part 2}
\begin{table}\caption{Part 1 Tab}\end{table}
\begin{figure}\caption{Part 1 Fig}\end{figure}
\end{document}
答案1
附加零件内容行(在图形列表中)被添加到宏的开头\figure
(\begin{figure}
)。此时浮动尚未开始,零件行的写入指令位于figure
源中的 位置。
稍后将在 中创建浮动对象\@xfloat
。\caption
然后将其内容行写入浮动对象内。但浮动对象可以浮动到某个位置前源代码位置,在您的情况下使用选项t
。然后两行内容就会乱序。
可以通过移动浮动框内的部分内容行来解决此问题。
以下示例不是从浮动环境的最开始处开始,仍然在浮动框之外,而是挂接到\@floatboxreset
,它会在浮动框的开头自动调用。LaTeX 会记住 中的浮动对象的类型,\@captype
并且宏\ext@<captype>
( <captype>
∈ { figure
, table
, ...}) 包含列表类型 ( \ext@figure
-> lof
)。这样,如果其他浮动类型遵循 LaTeX 约定,也会自动支持它们。例如,由包定义的新浮动类型float
将起作用。
新的浮点类型只需要一个新的切换开关,并在开始新的部分时重置该切换开关。这是通过\AddFloatToggle
示例中的宏完成的。
\documentclass{scrreprt}
\usepackage{etoolbox}
\makeatletter
% Initialize variables
\newcommand*{\ResetFloatToggles}{}% toggle reset list for \part
\newcommand*{\thisparttitle}{}
\newcommand*{\thispartnumber}{}
\newcommand*{\AddFloatToggle}[1]{%
\newtoggle{no#1s}%
\apptocmd{\ResetFloatToggles}{%
\global\toggletrue{no#1s}%
}{}{}%
}
% Set variables and reset float toggles at the start of \part
\apptocmd{\@part}{%
% Remember part title and part number
\gdef\thisparttitle{#1}%
\gdef\thispartnumber{\thepart}%
\ResetFloatToggles
}{}{}
% Emit \addcontentsline at the begin of the float box
\apptocmd{\@floatboxreset}{%
% Test, if toggle exists for this float type.
% Since there isn't an official command for testing
% toggle existence, the internal code for testing
% is used, see the definition of \newtoggle.
\ifcsdef{etb@tgl@no\@captype s}{%
\iftoggle{no\@captype s}{%
% \@captype is the type of float, e.g. "figure", "table", "program"
% \ext@... (\ext@figure, \ext@table, \ext@program)
% contains the type/extension for the list of the float type, e.g.
% "lof", "lot", "lop".
\addcontentsline{\csname ext@\@captype\endcsname}{part}{%
\protect\numberline{\thispartnumber} {\thisparttitle}%
}%
\global\togglefalse{no\@captype s}%
}{}%
}{%
% unsupported float type
\typeout{Warning: there is no toggle for float type \@captype!}%
}%
}{}{}
\makeatother
\usepackage{float}
\newfloat{program}{tbp}{lop}[chapter]
\AddFloatToggle{figure}
\AddFloatToggle{table}
\AddFloatToggle{program}
\begin{document}
\listoftables
\listoffigures
\listof{program}{List of Programs}
\part{Part 1}
\begin{table}\caption{Part 1 Tab}\end{table}
\begin{program}\caption{Part 1 Program}\end{program}
\part{Part 2}
\begin{table}\caption{Part 2 Tab}\end{table}
\begin{figure}\caption{Part 2 Fig}\end{figure}
\end{document}
答案2
显然,LaTeX 没有意识到它进入了part
,直到它遇到了里面的其他东西part
。
编辑
这是一个自动化过程。它用于修改命令\@caption
。现在它正确存储了标题,然后环境figure
将其应用于List Of Figures
环境末尾:
\long\def\@caption#1[#2]#3{%
\par
\gdef\my@caption{#2}
\begingroup
\@parboxrestore
\if@minipage
\@setminipage
\fi
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
\renewenvironment{figure}%
{\@float{figure}}%
{\end@float
\addcontentsline{lof}{figure}%
{\protect\numberline{\thefigure}{\my@caption}}%
}%
\renewenvironment{figure*}%
{\@dblfloat{figure}}%
{\end@dblfloat
\addcontentsline{lof}{figure}%
{\protect\numberline{\thefigure}{\my@caption}}%
}%
那么你的文档将变成:
\documentclass{scrreprt}
\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\def\thisparttitle{}\def\thispartnumber{}
\newtoggle{noFigs}
\apptocmd{\@part}%
{\gdef\thisparttitle{#1}\gdef\thispartnumber{\thepart}%
\global\toggletrue{noFigs}}{}{}
\AtBeginDocument{%
\AtBeginEnvironment{figure}{%
\iftoggle{noFigs}{
\addtocontents{lof}{\protect\contentsline {part}%
{\protect\numberline {\thispartnumber} {\thisparttitle}}{}{} }
\global\togglefalse{noFigs}
}{}
}%
}
\long\def\@caption#1[#2]#3{%
\par
\gdef\my@caption{#2}
\begingroup
\@parboxrestore
\if@minipage
\@setminipage
\fi
\normalsize
\@makecaption{\csname fnum@#1\endcsname}{\ignorespaces #3}\par
\endgroup}
\renewenvironment{figure}%
{\@float{figure}}%
{\end@float
\addcontentsline{lof}{figure}%
{\protect\numberline{\thefigure}{\my@caption}}%
}%
\renewenvironment{figure*}%
{\@dblfloat{figure}}%
{\end@dblfloat
\addcontentsline{lof}{figure}%
{\protect\numberline{\thefigure}{\my@caption}}%
}%
\makeatother
\begin{document}
\listoffigures
\part{Part 1}
\chapter{Hallo}
\lipsum
\section{Hallo}
\begin{figure}[t]
\caption{First figure}
Test
\end{figure}
\begin{figure}[b]
\caption{Second figure}
Test
\end{figure}
\end{document}
现在您可以将任何定位参数分配给您的figure
环境。
这是解决问题的另一种方法:
\documentclass{scrreprt}
\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\def\thisparttitle{}\def\thispartnumber{}
\newtoggle{noFigs}
\apptocmd{\@part}%
{\gdef\thisparttitle{#1}\gdef\thispartnumber{\thepart}%
\global\toggletrue{noFigs}}{}{}
\AtBeginDocument{%
\AtBeginEnvironment{figure}{%
\iftoggle{noFigs}{
\addtocontents{lof}{\protect\contentsline {part}%
{\protect\numberline {\thispartnumber} {\thisparttitle}}{}{} }
\global\togglefalse{noFigs}
}{}
}%
}
\makeatother
\begin{document}
\listoffigures
\part{Part 1}
\chapter{Hallo}
\lipsum
\section{Hallo}
\let\aclt\addcontentsline
\renewcommand*{\addcontentsline}[3]{}
\begin{figure}[t] % change placement to cbt and it works
\caption{Part 1 Fig}
Test
\end{figure}
\let\addcontentsline\aclt
\addcontentsline{lof}{figure}%
{\protect\numberline{\thefigure}{Part 1 Fig}}%
\end{document}
我只是稍微延迟了执行\addcontentsline
,该命令是其中的一部分\caption
,并将输入行添加到图形列表中。
另一项编辑
这是通过将被抑制命令的副本存储到 中后抑制\addcontentsline
使用来实现的。在环境恢复以提供先前的输出后,然后使用与所需输出匹配的参数执行它。请注意,第三个参数恰好包含的参数。\renewcommand*
\aclt
figure
\addcontentsline
\caption