图表列表和表格列表中的自动章节/部分问题

图表列表和表格列表中的自动章节/部分问题

这是“是否在带有 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*\acltfigure\addcontentsline\caption

相关内容