多种列表样式

多种列表样式

在使用该listings包时,如何\lstlistingname为每种类型的列表获取不同的值。

假设我的文档有C++、R 语言列表,我希望的\lstlistingname值为:C++ CodeR 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.locC++ 代码、.lorR 代码和.lop伪代码。

可以更新此设置,以便为每个列表使用单独的计数器。但是,这需要做更多的工作。

也许,作为排版 C++ 的参考,请参阅排版“C++”(cplusplus)最漂亮的方法?

相关内容