在我的tufte-book
文档中,我想使用listings
包显示源代码列表,但其标题在页边距中。修改代码以排版列表标题并不简单,因此最简单的解决方案是将列表包装在浮动环境中(请参阅“结合 listings 和 tufte-book,listings 标题位于 tufte 的边缘”这个问题的第二个答案)。但是,这不起作用:
- 如果为浮动环境指定标签,则行号引用的标签(请参阅“Lstlistings 引用行号”问题的第二个答案) 将不再输出到辅助文件,并且引用将显示为“??”。
- 如果省略浮动环境的标签,行号引用将是错误的(它们总是引用第一行)。
下面是一个最小的工作示例,说明了第二种选择的不同变体:
\documentclass{tufte-book}
\makeatletter
% textwidth Tuftian float for listings
\newenvironment{listing}[1][htbp]
{\ifvmode\else\unskip\fi\begin{@tufte@float}[#1]{lstlisting}{}}
{\end{@tufte@float}}
% fullwidth Tuftian float for listings
\newenvironment{listing*}[1][htbp]%
{\ifvmode\else\unskip\fi\begin{@tufte@float}[#1]{lstlisting}{star}}
{\end{@tufte@float}}
% enable re-use of \listoflistings facility
\def\ext@lstlisting{lol}
% show listing number in caption even though \lst@@caption is empty
\def\fnum@lstlisting{\lstlistingname~\thelstlisting}
\makeatother
\usepackage{listings}
\begin{document}
% regular Tuftian figure float, wrong caption and writes to lof
\begin{figure}
\begin{lstlisting}[escapechar=|]
Dummy line
Labeled line |\label{line:test1}|
\end{lstlisting}
\caption{First test}
\end{figure}
Reference to line \ref{line:test1}
% custom Tuftian listing float, correct caption and writes to lol
\begin{listing}
\begin{lstlisting}[escapechar=|]
Dummy line
Labeled line |\label{line:test2}|
\end{lstlisting}
\caption{Second test}
\end{listing}
Reference to line \ref{line:test2}
% lstlisting float, wrong caption but writes to lol
\begin{lstlisting}[escapechar=|,float=h,caption=Third test]
Dummy line
Labeled line |\label{line:test3}|
\end{lstlisting}
Reference to line \ref{line:test3}
\end{document}
结果如下:
现在我想采用第二种方法(因为我希望我的列表出现在“列表列表”而不是“图片列表”下),因为它在边距中提供了标题,因此可以很好地与其余的浮动环境集成。但是,行号引用不起作用,我不知道为什么。辅助文件的相关内容如下:
\newpmemlabel{^_1}{1}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces First test}}{1}{lstnumber.-1.2}}
\newlabel{line:test1}{{1}{1}{}{lstnumber.-1.2}{}}
\newpmemlabel{^_2}{1}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}{\ignorespaces Second test}}{1}{lstnumber.-2.2}}
\newlabel{line:test2}{{1}{1}{}{lstnumber.-2.2}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}Third test}{1}{lstlisting.0.2}}
\newlabel{line:test3}{{2}{1}{}{lstnumber.2.2}{}}
答案1
问题似乎是程序包用于图形和表格的\label
浮动环境中命令的重新定义tufte-latex
(在问题的第二个示例中,也用于列表)。下面是相应的代码,其中已经包含解决方案的提示:
\renewcommand{\label}[1]{\@tufte@label{##1}}%
% Handle subfigure package compatibility
\ifthenelse{\boolean{@tufte@packages@subfigure}}{%
% don't move the label while inside a \subfigure or \subtable command
\global\let\label\@tufte@orig@label%
}{}% subfigure package is not loaded
文档tufte-latex
类检测subfigure
包是否已加载,并相应地设置布尔值。我在使用subcaption
取代subfig
和subfigure
包的包时遇到了这个问题 - 我无法引用子图,因为它们的标签未输出到辅助文件,就像列表中的标签丢失一样。为了保留命令\label
对列表和subcaption
浮点的原始行为,我只需在文档序言中使用以下几行将布尔值设置为 true:
\makeatletter
\setboolean{@tufte@packages@subfigure}{true}
\makeatother
这解决了我的列表和子图的问题。