为什么 \listof{}{} 和 \listoffigures 的样式不同?

为什么 \listof{}{} 和 \listoffigures 的样式不同?

我正在写论文,有一些代码片段要展示。我使用listings嵌入在自定义float环境中的包来显示它们。

要将它们列在我的文档开头的索引中 - 类似于\listoffigures- 我使用:

\listof{code}{List of Code}

这(从技术上讲)可以按预期工作,但看起来与我的图表列表完全不同。请参见下面的屏幕截图(左侧为图表列表,右侧为代码列表)。

lof 与 loc

为什么?如何修复?或者如何修改\listof{}{}布局以使其看起来类似于\listoffigures

我试过解决方法是重新定义布局,但它不能按预期工作(仍然看起来不同)并且引发​​的错误比我在这里发布的还要多。

更新 1:经过几个小时的尝试,我终于弄清楚了我的文档出了什么问题(它已经非常臃肿了)。我将尝试用一个最简单的工作示例来解释这个问题。请注意下面的屏幕截图。

\documentclass[12pt,a4paper,twoside,openright]{report}
 \usepackage[english]{babel}
 \usepackage{float}
  \newfloat{algo}{tbp}{loa}[chapter]
  \setlength{\parskip}{3mm}     % !
  \setlength{\parindent}{3mm}   % !
  \frenchspacing
  \sloppy

 \begin{document}
  \listoffigures
  \listof{algo}{List of Algorithms}

  \chapter{foo}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{A figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{An algorithm}
   \end{algo}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{Another figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{Another algorithm}
   \end{algo}

  \chapter{bar}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{Yet another figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{Yet another algorithm}
   \end{algo}

 \end{document}

帕斯基普

Parskip 和 parent 似乎发挥了重要作用,但我仍然没有得到步调一致的回答(带章节间距)……

更新 2:好的,现在我找到了它无法正常工作的原因。是软件包hyperref。更新的 MWE:

\documentclass[12pt,a4paper,twoside,openright]{report}
 \usepackage[english]{babel}
 \usepackage{float}
  \newfloat{algo}{tbp}{loa}[chapter]
%  \setlength{\parskip}{3mm}
%  \setlength{\parindent}{3mm}
  \frenchspacing
  \sloppy
% \usepackage{hyperref}                    % !!!
%  \hypersetup{pdftitle={Bachelorthesis}}  % !!!
%  \hypersetup{colorlinks=false}           % !!!
%  \hypersetup{plainpages=false}           % !!!
%  \hypersetup{pdfborder={0 0 0}}          % !!!
 \usepackage{etoolbox}
 \makeatletter
  \patchcmd{\@chapter}%
  {\addtocontents{lof}}%
  {\addtocontents{loa}{\protect\addvspace{10pt}}%
   \addtocontents{lof}}%
  {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
 \makeatother


 \begin{document}
  \listoffigures
  \listof{algo}{List of Algorithms}

  \chapter{foo}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{A figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{An algorithm}
   \end{algo}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{Another figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{Another algorithm}
   \end{algo}

  \chapter{bar}
   \begin{figure}
    \centering
    \rule{1cm}{1cm}
    \caption{Yet another figure}
   \end{figure}
   \begin{algo}
    (algo)
    \caption{Yet another algorithm}
   \end{algo}

 \end{document}

取消注释 hyperref 包和设置会弄乱自定义的布局\listof

因此,要解决这个问题:

  1. 如何进行调整\parskip而不\parindent弄乱列表?
  2. 如何避免hyperref包装弄乱布局?

更新 3:关闭了这个问题:

  1. 如何进行调整\parskip而不\parindent弄乱列表?我在这里问了一个后续问题:如何避免\parskip被应用于\listoffigures等等?
  2. 如何避免hyperref包装弄乱布局?已解决:只需在所有包的末尾加载 hyperref 即可 \makeatother

谢谢弗兰克·米特尔巴赫的解决方法帮助我解决了到目前为止的布局问题。

答案1

你可能会说这是软件包的错误float。它定义\listof命令如下:

\newcommand*{\listof}[2]{%
  \@ifundefined{ext@#1}{\float@error{#1}}{%
    \@namedef{l@#1}{\@dottedtocline{1}{1.5em}{2.3em}}%
    \float@listhead{#2}%
    \begingroup\setlength{\parskip}{\z@}%
      \@starttoc{\@nameuse{ext@#1}}%
    \endgroup}}

这意味着它 a) 将 固定\parskip为零(这通常是可以的,但仍有些问题)和 b) 通过定义 赋予每个“listof”行一个硬编码的含义\l@<type>。使用的值是\@lfigurearticle 类中的 的默认值。但是,如果您使用的类具有不同的值(并且看起来确实如此),则显然不会拾取它们。

解决方案:提供您自己的副本,\listof如下所示:

\makeatletter
\renewcommand*{\listof}[2]{%
  \@ifundefined{ext@#1}{\float@error{#1}}{%
    \expandafter\let\csname l@#1\endcsname \l@figure  % <- use layout of figure
    \float@listhead{#2}%
    \begingroup
      \setlength\parskip{0pt plus 1pt}%               % <- or drop this line completely
      \@starttoc{\@nameuse{ext@#1}}%
    \endgroup}}
\makeatother

这将使“列表”行的格式与“图片列表”列表中图片的格式相同,并将段落之间的间距(这里的每一行都是一个段落)重置为文章/报告类使用的默认值。另一种方法是完全取消该设置。

report但是,在使用 case或class时这还不够book。正如 @lockstep 的回答中提到的,该\chapter命令还会向此类列表中添加垂直空间材料。因此,还\@chapter需要修补该命令以包含这个额外的空间。所以你需要类似

   \usepackage{etoolbox}
   \makeatletter
   \patchcmd{\@chapter}%
     {\addtocontents{lof}}%
     {\addtocontents{alg}{\protect\addvspace{10pt}}%  % <-- "alg" is the extension you use
      \addtocontents{lof}}%
     {\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
   \makeatother

您必须将“alg”替换为您使用的文件扩展名

答案2

您尝试的解决方法是针对book具有不同定义的类\chapter。对于report,以下内容对我有用(即,为图表列表和新定义的算法列表产生相同的格式):

\documentclass[a4paper]{report}

\usepackage{float}
\newfloat{algo}{tbp}{loa}[chapter]

\usepackage{xpatch}
\makeatletter
\xapptocmd{\@chapter}{%
  \addtocontents{loa}{\protect\addvspace{10\p@}}%
}{}{}
\makeatother

\begin{document}

\listoffigures

\listof{algo}{List of Algorithms}

\chapter{foo}

\begin{figure}
\centering
\rule{1cm}{1cm}
\caption{A figure}
\end{figure}

\begin{algo}
(algo)
\caption{An algorithm}
\end{algo}

\begin{figure}
\centering
\rule{1cm}{1cm}
\caption{Another figure}
\end{figure}

\begin{algo}
(algo)
\caption{Another algorithm}
\end{algo}

\chapter{bar}

\begin{figure}
\centering
\rule{1cm}{1cm}
\caption{Yet another figure}
\end{figure}

\begin{algo}
(algo)
\caption{Yet another algorithm}
\end{algo}

\end{document}

在此处输入图片描述

在此处输入图片描述

注意:您提供的屏幕截图不是看起来像是该类的默认 LoF 间距report(同一章中的条目之间有额外的间距)。您应该提供显示相关包和/或单个自定义项的 MWE。

相关内容