我正在为大学准备一篇“小论文”,需要展示大量代码(C、C++、gnuplot、LaTeX 等)——因此我花了今晚的时间阅读和listings
。fancyvrb
后者我已经与newfloat
- 和caption
- 包一起使用了。前者在我的第一次实验中看起来非常有吸引力和方便(换行、索引、没有浮动主体的标题……)。
所有四个软件包都相互兼容,但我感到困惑,例如,caption
和 listings
,提供标题功能,或两者兼有,newfloat
并且listings
,可用于创建“列表表”等......
恐怕我没有具体的问题……我更想寻求有关如何一起使用这四个包的提示或建议。例如:我应该将浮动/标题管理分配给newfloat
并且caption
只分配给吗?哪个代码包应该“完成主要工作”?是否可以使用各自的“列表列表”定义独立的代码环境?是否有一种方便的方法来生成不同风格的内联列表?等等。
如果您能为我提供一个良好的开端并给我指明一个有希望的方向,我将非常高兴,这样我就可以——如果有必要——在设置一切的过程中提出更精确的问题。
答案1
从您的问题来看,您似乎需要能够用多种语言编写代码、为列表提供标题以及创建“列表列表”。在这种情况下,listings
该套餐为您提供您所需的一切。
\lstlistoflistings
允许您创建所有带标题列表的列表。您甚至可以毫不费力地为每种语言创建独立的列表;请参阅下面的示例代码,其中为 LaTeX、C++ 和 Gnuplot 列表定义了环境,每个列表都有自己的计数器和列表列表。它提供了许多预定义语言(其中包括您提到的 C、C++、Gnuplot、LaTeX),您可以进一步自定义它们。
它提供了自己的字幕机制,但如果你使用
caption
包来定制您的标题,如果需要,您可以轻松覆盖列表设置。默认情况下,长列表不会浮动,并且可以进行分页。使用
float
键,您的列表将被视为浮动对象(在某些情况下可能很方便);但请注意,浮动对象不允许进行分页。
该caption
软件包将允许您自定义字幕的外观和感觉。该软件包与 配合使用listings
。
newfloat
只有在需要使用新类型的浮动对象时才会使用,这对于您的代码片段来说似乎没有必要;正如我之前提到的,您可以轻松地将lstlisting
环境变成浮动对象(如果需要),而无需任何新的包
简而言之,我想说(根据您的问题判断),这listings
是可行的方法,caption
如果您想改变字幕的感觉和外观,最终可以使用它。
一个简单的示例,展示了您可以多么快速地使用该包为您的列表设置自定义环境listings
;我定义了两个环境,一个用于 C++ 代码,另一个用于 LaTeX。
我使用该caption
包来更改标题标签和分隔符使用的默认字体:
\documentclass{article}
\usepackage{caption}
\usepackage{xcolor}
\usepackage{listings}
\usepackage[T1]{fontenc}
\usepackage{beramono}
% some colors for the listings
\colorlet{cppkeyword}{teal}
\colorlet{latexkeyword}{green!50!black}
\colorlet{gnuplotkeyword}{magenta!60!black}
\colorlet{gnuplotcomment}{teal}
\colorlet{symb}{red!50!black}
\colorlet{comm}{brown}
% for captions: boldfaced labels, separator=period
\captionsetup[lstlisting]{labelfont=bf,labelsep=period}
% style for c++ listings
\lstdefinestyle{cpp}{%
language=C++,
keywordstyle=\bfseries\color{cppkeyword},
literate=%
{\{}{\textcolor{symb}{\{}}1
{\}}{\textcolor{symb}{\}}}1
{(}{\textcolor{symb}{(}}1
{)}{\textcolor{symb}{)}}1
{;}{\textcolor{symb}{;}}1
}
% style for LaTeX listings
\lstdefinestyle{latex}{%
language=[LaTeX]{TeX},
texcsstyle=*\bfseries\color{latexkeyword},
literate=%
{\{}{\textcolor{symb}{\{}}1
{\}}{\textcolor{symb}{\}}}1
{(}{\textcolor{symb}{(}}1
{)}{\textcolor{symb}{)}}1
{\%}{\textcolor{comm}{\%}}1
}
% style for Gnuplot listings
\lstdefinestyle{gnuplot}{%
language=Gnuplot,
keywordstyle=\bfseries\color{gnuplotkeyword},
commentstyle={\itshape\color{gnuplotcomment}},
literate=%
{"}{\textcolor{symb}{"}}1
}
% Common style for all listings
\lstset{
basicstyle=\small\ttfamily,
columns=fullflexible,
tabsize=3
}
% We tweak the default settings for C++ listings
\renewcommand\lstlistlistingname{\texttt{C++} listings}
\lstnewenvironment{cpp}[1][]{%
\renewcommand\lstlistingname{\texttt{C++} listing}
\lstset{style=cpp,#1}}{}
% Counters for LaTeX and Gnuplot listings and an auxiliary counter
\newcounter{latexlst}
\newcounter{gnuplotlst}
\newcounter{tmp}
\makeatletter
% Environment for LaTeX listings; extension for auxiliar file: lll
\lstnewenvironment{latex}[1][]{%
\renewcommand\lstlistingname{\LaTeX\ listing}
\setcounter{tmp}{\value{lstlisting}}
\setcounter{lstlisting}{\value{latexlst}}
\lstset{style=latex,nolol,#1}
}{%
\refstepcounter{latexlst}
\addcontentsline{lll}{lstlisting}{\protect\numberline{\thelstlisting}\lst@@caption}%
\setcounter{lstlisting}{\value{tmp}}
}
% Settings for the List of LaTeX listings
\newcommand\lstlistoflatexlistings{%
\bgroup
\renewcommand\lstlistlistingname{\LaTeX\ listings}
\let\contentsname\lstlistlistingname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lll}}%
\tableofcontents
\egroup%
}
% Environment for Gnuplot listings; extension for auxiliar file: lgl
\lstnewenvironment{gnuplot}[1][]{%
\renewcommand\lstlistingname{\texttt{Gnuplot} listing}
\setcounter{tmp}{\value{lstlisting}}
\setcounter{lstlisting}{\value{gnuplotlst}}
\lstset{style=gnuplot,nolol,#1}
}{%
\refstepcounter{gnuplotlst}
\addcontentsline{lgl}{lstlisting}{\protect\numberline{\thelstlisting}\lst@@caption}%
\setcounter{lstlisting}{\value{tmp}}
}
% Settings for the List of Gnuplot listings
\newcommand\lstlistofgnuplotlistings{%
\bgroup
\renewcommand\lstlistlistingname{\texttt{Gnuplot} listings}
\let\contentsname\lstlistlistingname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lgl}}%
\tableofcontents
\egroup%
}
\makeatother
\begin{document}
\lstlistoflistings
\lstlistoflatexlistings
\lstlistofgnuplotlistings
\begin{cpp}[caption={test code for \texttt{C++}},label={lst:c++}]
long some_function();
int other_function();
int calling_function()
{
long test1;
int test2;
}
\end{cpp}
\begin{latex}[caption={test code for \LaTeX},label={lst:latex}]
\newcommand\mycom[1]{%
\fbox{#1}%
}
\end{latex}
\begin{gnuplot}[caption={test code for \texttt{Gnuplot}},label={lst:gnuplot}]
# 1st step
set term "table"
set output "temp.dat"
splot ....
\end{gnuplot}
\LaTeX code: \lstinline[style=latex]{\documentclass}\par
\texttt{Gnuplot} code: \lstinline[style=gnuplot]{set output "temp.dat"}\par
\texttt{C++} code: \lstinline[style=cpp]{int calling_function()}
\end{document}