我正在写论文,有一些代码片段要展示。我使用listings
嵌入在自定义float
环境中的包来显示它们。
要将它们列在我的文档开头的索引中 - 类似于\listoffigures
- 我使用:
\listof{code}{List of Code}
这(从技术上讲)可以按预期工作,但看起来与我的图表列表完全不同。请参见下面的屏幕截图(左侧为图表列表,右侧为代码列表)。
为什么?如何修复?或者如何修改\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
。
因此,要解决这个问题:
- 如何进行调整
\parskip
而不\parindent
弄乱列表? - 如何避免
hyperref
包装弄乱布局?
更新 3:关闭了这个问题:
- 如何进行调整
\parskip
而不\parindent
弄乱列表?我在这里问了一个后续问题:如何避免\parskip
被应用于\listoffigures
等等? - 如何避免
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>
。使用的值是\@lfigure
article 类中的 的默认值。但是,如果您使用的类具有不同的值(并且看起来确实如此),则显然不会拾取它们。
解决方案:提供您自己的副本,\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。