在使用该listings
包时,如何\lstlistingname
为每种类型的列表获取不同的值。
假设我的文档有C++、R 语言和伪列表,我希望的\lstlistingname
值为:C++ Code
,R Code
分别Pseudo Code
是否可以将这些值定义为\lstdefinestyle{...}
定义的一部分,而不是\renewcommand{\lstlistingname}{...}
每次需要更改时都调用?
此外,我是否可以list of listings
在文档的前言部分为每种列表样式设置单独的表格,而不是将所有样式混合到同一张表格中?
答案1
我将lstlisting
使用 为每个条目定义单独的环境\lstnewenvironment
。在那里,您可以重置标题并按您想要的方式设置样式。此外,与\lstlistoflistings
来自listings.dtx
已更新以生成单独的“列表”:
\documentclass{article}
\usepackage{regexpatch}% http://ctan.org/pkg/regexpatch
\usepackage{listings}% http://ctan.org/pkg/listings
\makeatletter
% --------------------------------------- C++
\newcommand{\lstlistcplusplusname}{List of C++}
\lst@UserCommand\lstlistofcplusplus{\bgroup
\let\contentsname\lstlistcplusplusname
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{loc}}%
\tableofcontents \egroup}
\lstnewenvironment{cplusplus}[1][]{%
\renewcommand{\lstlistingname}{C++ Code}%
\xpatchcmd*{\lst@MakeCaption}{lol}{loc}{}{}%
\lstset{language=C++,#1}}
{}
% --------------------------------------- R
\newcommand{\lstlistrcodename}{List of R}
\lst@UserCommand\lstlistofrcode{\bgroup
\let\contentsname\lstlistrcodename
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lor}}%
\tableofcontents \egroup}
\lstnewenvironment{rcode}[1][]{%
\renewcommand{\lstlistingname}{R Code}%
\xpatchcmd*{\lst@MakeCaption}{lol}{lor}{}{}%
\lstset{language=R,#1}}
{}
% --------------------------------------- Pseudocode
\newcommand{\lstlistpseudocodename}{List of Pseudocode}
\lst@UserCommand\lstlistofpseudocode{\bgroup
\let\contentsname\lstlistpseudocodename
\let\lst@temp\@starttoc \def\@starttoc##1{\lst@temp{lop}}%
\tableofcontents \egroup}
\lstnewenvironment{pseudocode}[1][]{%
\renewcommand{\lstlistingname}{Pseudocode}%
\xpatchcmd*{\lst@MakeCaption}{lol}{lop}{}{}%
\lstset{basicstyle=\ttfamily,#1}}
{}
\makeatother
\begin{document}
\lstlistofcplusplus
\lstlistofrcode
\lstlistofpseudocode
\begin{cplusplus}[caption={Hello world}]
// 'Hello World!' program
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
\end{cplusplus}
\begin{rcode}[caption={Hello world}]
cat('Hello, world!\n')
\end{rcode}
\begin{pseudocode}[caption={Hello world}]
print "Hello world"
\end{pseudocode}
\end{document}
每个列表都会修补\lst@MakeCaption
命令以插入适当的文件扩展名来编写与内容相关的宏。从传统的.lol
到.loc
C++ 代码、.lor
R 代码和.lop
伪代码。
可以更新此设置,以便为每个列表使用单独的计数器。但是,这需要做更多的工作。
也许,作为排版 C++ 的参考,请参阅排版“C++”(cplusplus)最漂亮的方法?