我正在使用该listings
包来格式化 LaTeX 中的程序代码,最后的列表列表按以下方式编号:
3.1 Code A
3.2 Code B
3.3 Code C
4.1 Code D
4.2 Code E
它会在每一章重新开始编号。但是,我需要的编号方案如下所示:
Listing 1 Code A
Listing 2 Code B
Listing 3 Code C
Listing 4 Code D
Listing 5 Code E
我已经尝试了其他问题推荐的解决方案:
\renewcommand*{\thelisting}{\sffamily\small\arabic{listing}}
% or
\renewcommand*{\thelstlisting}{\sffamily\small\arabic{lstlisting}}
但是,两个命令都会返回LaTeX Error: \thelstlisting undefined. [\renewcommand*{\thelstlisting}]
(或者thelisting
是第一个命令)。
还有其他方法可以实现这一目标吗?
请注意,我正在使用来自我所在大学的自定义文档类,如果您需要任何信息,请直接询问。
编辑:
我的文档包含以下软件包:
inputenc, ulem, listings, textcomp, color, courier, url, tabto, multirow, tabularx, xcolor, amssymb, pifont, rotating, enumitem, chngcntr
文档类包含以下包:
remreset, scrhack, color, xcolor, xifthen, ifpdf, wallpaper, palatino, scrpage2, acronym, amsmath, amssymb, amsfonts, amstext, babel, array, iftex, hyperref, graphicx
答案1
这应该可以工作,但可能需要根据您所使用的类的设置进行一些调整。
\documentclass{report}
\usepackage{chngcntr}
\usepackage{listings}
\AtBeginDocument{% the counter is defined later
\counterwithout{lstlisting}{chapter}%
}
\makeatletter
\renewcommand{\l@lstlisting}[2]{%
\@dottedtocline{1}{0em}{1.5em}{\lstlistingname\ #1}{#2}%
}
\makeatother
\begin{document}
\lstlistoflistings
\chapter{A}
\begin{lstlisting}[caption=Code A]
xyz
\end{lstlisting}
\begin{lstlisting}[caption=Code A]
xyz
\end{lstlisting}
\chapter{B}
\begin{lstlisting}[caption=Code A]
xyz
\end{lstlisting}
\begin{lstlisting}[caption=Code A]
xyz
\end{lstlisting}
\end{document}
答案2
对于您的章节编号问题,有一个更简单的解决方案。该listings
软件包提供了\lstset
配置输出的命令。该numberbychapter=false
选项的作用与宣传的完全一致。
代码:
\documentclass{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{xcolor}
\usepackage[final]{listings}
\lstset{numberbychapter=false, captionpos=b, caption=\lstname,frame=single,%
numbers=left, stepnumber=1, numbersep=2pt, xleftmargin=15pt, framexleftmargin=15pt,%
numberstyle=\tiny, tabsize=4, columns=fixed,%
basicstyle={\fontfamily{pcr}\selectfont\footnotesize},%
keywordstyle=\bfseries, commentstyle={\color[gray]{0.33}\itshape},%
stringstyle=\color[gray]{0.25}, breaklines, breakatwhitespace, breakautoindent}
\lstset{literate=
{á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
{Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
{à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
{À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
{ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
{Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
{â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
{Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
{œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
{ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
{€}{{\EUR}}1 {£}{{\pounds}}1
}
\lstloadlanguages{[ANSI]C, C++, [gnu]make, gnuplot, Matlab}
\begin{document}
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 1},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 2},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 3},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\clearpage
\lstlistoflistings
\end{document}
输出:
您肯定不需要我提供的完整 lst-setup。但它应该可以让您大致了解什么是可能的。
更新——还添加了列表的条目前缀
要获得所需的输出,您必须拥有scrhack
包和scr
-class。使用选项加载类listof=entryprefix
并使用指定条目前缀\listoflolentryname
。然而,egreg 的解决方案对您现有的文档的改动要小得多,因为它只重新定义了如何将一行打印到您的列表列表中,并因此将其合并为您的 LoL。
\documentclass[listof=entryprefix]{scrbook}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel}
\usepackage{scrhack}
\usepackage{xcolor}
\usepackage[final]{listings}
\lstset{numberbychapter=false}
\lstloadlanguages{C++}
%Rename How the Code should be named
\renewcommand\lstlistingname{Code}
%rename how the List should be named
\renewcommand\lstlistlistingname{List of Code}
%Add entry-prefix for listings
\newcommand\listoflolentryname\lstlistingname
\begin{document}
\tableofcontents
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 1}, caption={Example 1},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 2}, caption={Example 2},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\chapter{TEST}
\begin{lstlisting}[language=C++,name={Example 3}, caption={Example 3},label={sc:bsp}]
#include <iostream>
void SayHello(void)
{
// Kommentar
cout << "Hello World!" << endl;
}
int main(int argc, char **argv)
{
SayHello();
return 0;
}
\end{lstlisting}
\clearpage
\lstlistoflistings
\end{document}
产生以下输出: