为多种语言定义 `lstset` 参数

为多种语言定义 `lstset` 参数

我正在使用listings包裹,并为多种编程语言定义了lstset参数集。我想在开始lstlistinglstinputlisting通过选择与参数集定义相对应的语言来选择一个参数集。然而,我知道,在这个阶段语言选择只会影响语言特定语法的格式,与前言参数集定义无关。相反,列举多个这样的定义是徒劳的,因为最后一组定义会覆盖所有前一组定义(或看起来如此)。因此,我想知道如何定义并随后调用多个lstset参数集。

举一个非常简单的例子,

\documentclass{article}
\usepackage{listings}% http://www.ctan.org/pkg/listings
\lstset{language=C,frame=lines}
\lstset{language=C++,frame=none}
\begin{document}
\begin{lstlisting}[language=C]
#include<stdio.h>
main() {
 printf("Hello World");
}
\end{lstlisting}
\begin{lstlisting}[language=C++]
#include <iostream.h>
main() {
 cout << "Hello World!";
 return 0;
}
\end{lstlisting}
\end{document}

可以看到,两种语言都使用第二个定义的参数集 ( frame=none) 显示。我想在宏中使用键值\begin{lstlisting}对来调用序言中定义的适当的特定于语言的参数集(正如我使用键值对所建议的那样language=)。这可能吗?

答案1

您可以使用多个\lstdefinestyle来定义自己的样式,然后根据需要组合它们。通过这种方法,您可以合并以前的样式并对其进行调整。

下面我定义了样式numbers,指定要用于行号的设置,以及为框架MyFrame定义样式shadowbox。这两个样式用于定义MyCStyleMyC++Style样式。请注意,在中MyCStyle我覆盖了框架设置,而在中MyC++Style,我覆盖了背景颜色设置。

在此处输入图片描述

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}

% Copied from the listings documentation
\lstdefinestyle{numbers} {numbers=left, stepnumber=1, numberstyle=\tiny, numbersep=10pt}
\lstdefinestyle{MyFrame}{backgroundcolor=\color{yellow},frame=shadowbox}

\lstdefinestyle{MyCStyle} {language=C,style=numbers,style=MyFrame,frame=lines}
\lstdefinestyle{MyC++Style} {language=C++,style=numbers,style=MyFrame,frame=none,backgroundcolor={}}

\lstset{language=C,frame=lines}
\lstset{language=C++,frame=none}

\begin{document}
\begin{lstlisting}[style=MyCStyle]
#include<stdio.h>
main() {
 printf("Hello World");
}
\end{lstlisting}
\begin{lstlisting}[style=MyC++Style]
#include <iostream.h>
main() {
 cout << "Hello World!";
 return 0;
}
\end{lstlisting}
\end{document}

答案2

您还可以定义自己的语言相关环境:

\documentclass{article}
\usepackage{listings}
\lstnewenvironment{C}
  {\lstset{language=C,frame=lines}}
  {}
\lstnewenvironment{CPP}
  {\lstset{language=C++,basicstyle=\ttfamily\small,frame=none}}
  {}
\begin{document}

\begin{C}
#include<stdio.h>
main() {
 printf("Hello World");
}
\end{C}

\begin{CPP}
#include <iostream.h>
main() {
 cout << "Hello World!";
 return 0;
}
\end{CPP}
\end{document}

相关内容