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