如何将图表列表与清单列表合并

如何将图表列表与清单列表合并

这是我在这个论坛上的第一篇帖子,我向您寻求帮助解决高级问题。我正在写论文,我正在使用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}

在此处输入图片描述

相关内容