这是我在这个论坛上的第一篇帖子,我向您寻求帮助解决高级问题。我正在写论文,我正在使用listings
包来包含代码片段。但是,我不会对每个代码片段都使用浮动环境,因为其中一些代码片段需要超过 1 页。所以我无法将它们包含在图形环境中。但我希望代码片段充当图形,所以我将它们设置为与图形共享计数器和名称:
\renewcommand\lstlistingname{Slika}
\let\c@lstlisting\c@figure
\let\thelstlisting\thefigure
\let\ftype@lstlisting\ftype@figure
现在我无法将它们添加到图表列表中,就像它们是图表一样。编号、标题、引用和一切都按我想要的方式工作,但我无法将列表添加到图表列表中。我尝试在谷歌上搜索答案,但似乎之前没有人遇到过这个特定的问题。我没有足够的知识来LaTeX
编写任何脚本或类似的东西,所以我向你们寻求帮助。提前谢谢大家。
答案1
更新请参阅答案末尾未使用补丁的较短版本。
之前的一些注释:列表就是列表,而不是图形,因此合并列表和图形LoF
可能不是应用这些不同概念的最佳方式 - 这就是为什么有一个\lstlistoflistings
命令;-)
listings
使用\addcontentsline{lol}{lstlistings}{...}
,这是硬编码的\lst@MakeCaption
。要么从中复制代码listings.sty
并更改设置,要么使用补丁来更改相关部分。在正常设置中,第二个\addcontentsline{lol}{lstlistings}{...}
命令处于活动状态。
现在,为了防止正常lof
线和线之间出现奇怪的差异,我建议也lol
使用!\let\l@lstlisting\l@figure
\documentclass{article}
\usepackage{xpatch}
\usepackage{listings}
\makeatletter
\AtBeginDocument{%
\xpatchcmd{\lst@MakeCaption}{%
\lst@ifnolol\else
\ifx\lst@@caption\@empty
\ifx\lst@caption\@empty
\ifx\lst@intname\@empty \else \def\lst@temp{ }%
\ifx\lst@intname\lst@temp \else
\addcontentsline{lol}{lstlisting}\lst@name
\fi\fi
\fi
\else
\addcontentsline{lol}{lstlisting}%
{\protect\numberline{\thelstlisting}\lst@@caption}%
\fi
\fi
}{%
\lst@ifnolol\else
\ifx\lst@@caption\@empty
\ifx\lst@caption\@empty
\ifx\lst@intname\@empty \else \def\lst@temp{ }%
\ifx\lst@intname\lst@temp \else
\addcontentsline{lof}{lstlisting}\lst@name
\fi\fi
\fi
\else
\addcontentsline{lof}{lstlisting}%
{\protect\numberline{\thelstlisting}\lst@@caption}%
\fi
\fi
}{\typeout{Patch success!}}{\typeout{Patch failure}}
\renewcommand\lstlistingname{Slika}
\let\l@lstlisting\l@figure
\let\c@lstlisting\c@figure
\let\thelstlisting\thefigure
\let\ftype@lstlisting\ftype@figure
}
\makeatother
\begin{document}
\listoffigures
\begin{figure}
\caption{Foo figure}
\end{figure}
\begin{lstlisting}[language={C},caption={Hello World},label={foo}]
#include<stdio.h>
int main(int argc,char **argv)
{
printf("Hello World!\n");
return(0);
}
\end{lstlisting}
\end{document}
无补丁的精简版本
\documentclass{article}
\usepackage{listings}
\usepackage{hyperref}
\makeatletter
% Grab the old \addcontentsline, which has been already being redefined by hyperref (eventually)
\let\latex@@addcontentsline\addcontentsline
\AtBeginDocument{%
\renewcommand{\addcontentsline}[3]{%
\def\@@zzz{#1}\def\@@zxx{lol}
\latex@@addcontentsline{%
\ifx\@@zzz\@@zxx lof\else #1\fi
}{#2}{#3}%
}
\renewcommand\lstlistingname{Slika}
\let\l@lstlisting\l@figure
\let\c@lstlisting\c@figure
\let\thelstlisting\thefigure
\let\ftype@lstlisting\ftype@figure
}
\makeatother
\begin{document}
\listoffigures
\clearpage
\begin{figure}
\caption{Foo figure}
\end{figure}
\clearpage
\begin{lstlisting}[language={C},caption={Hello World},label={foo}]
#include<stdio.h>
int main(int argc,char **argv)
{
printf("Hello World!\n");
return(0);
}
\end{lstlisting}
\end{document}