使用 tufte-book 中的列表,并在页边空白处添加标题

使用 tufte-book 中的列表,并在页边空白处添加标题

在我的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取代subfigsubfigure包的包时遇到了这个问题 - 我无法引用子图,因为它们的标签未输出到辅助文件,就像列表中的标签丢失一样。为了保留命令\label对列表和subcaption浮点的原始行为,我只需在文档序言中使用以下几行将布尔值设置为 true:

\makeatletter
\setboolean{@tufte@packages@subfigure}{true}
\makeatother

这解决了我的列表和子图的问题。

相关内容