我对以下listings
样式感到困惑。我的 .tex 文件中有两种不同语言(R 和 LaTeX)的代码。由于 R 列表和 LaTeX 列表的某些设置相同,因此我定义了样式“all”。任何 都应该尊重它。因此,我在两种语言的定义中
\begin{lstlisting} .. \end{lstlisting}
使用。然后,还有其他特定于语言的设置,也应该尊重这些设置。但是,正如您所见,这并不奏效。尽管我将 R 列表中的关键字设置为 、或,但 lapply 和 sapply 也获得了蓝色。为什么?如何解决这个问题?style=all
lstset
if
else
function
看起来我必须在环境的可选参数中重复所有定义lstlisting
。但每次都这样做很乏味,这就是为什么我首先想定义样式。此外,我不清楚为什么像这样的设置会被keywords
覆盖,因为的可选参数lstlisting
不包含keywords=...
。
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{xcolor}
\usepackage{fancyvrb}
\usepackage{listings}
\xdefinecolor{blue}{RGB}{0, 0, 255}
\xdefinecolor{red}{RGB}{255, 0, 0}
% this style should be active for all lstlistings environments
\lstdefinestyle{all}{
basicstyle=\ttfamily\small,
frame=lrtb, framerule=1pt, framexleftmargin=1pt,
showstringspaces=false
}
% this style should be active (additionally to "all") for "input" lstlistings environments
\lstdefinestyle{input}{
commentstyle=\itshape\color{red},
keywordstyle=\color{blue}
}
% listings settings for LaTeX in general [this is not respected!]
\lstset{
language=[LaTeX]TeX,
style=all,
keywords={},
otherkeywords={}
}
% listings settings for R (should hold for all R listings in general)
\lstset{
language=R,
style=all,
literate={<-}{{$\leftarrow$}}2,% this is respected
keywords={if, else, function},% this is not respected
otherkeywords={}
}
\begin{document}
\begin{lstlisting}[{language=[LaTeX]TeX}, style=input]
\begin{enumerate}
\item foo % bar
\end{enumerate}
\end{lstlisting}
\begin{lstlisting}[language=R, style=input]
x <- 4
s <- lapply(1:10, function(z) z+x)
k <- sapply(1:10, function(z) z+2*x) # other case
\end{lstlisting}
\end{document}
答案1
您似乎认为\lstset
为一种指定语言设置参数,即 中给出的语言\lstset
。但事实并非如此。您的代码首先将文档所有列表的默认语言设置为TeX
,然后将其设置为R
,依此类推。同样,它为文档的所有列表(if、else、function)设置了三个默认关键字,但当您排版 R 列表时,属于 R 的关键字列表会覆盖默认关键字列表。
您真正想要的可能最好通过样式来实现,或者您可以基于 R 定义一种新语言,或者 R 的新方言。让我们尝试使用样式:
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{xcolor}
\usepackage{fancyvrb}
\usepackage{listings}
% this style should be active for all lstlistings environments
\lstdefinestyle{all}{
basicstyle=\ttfamily\small,
frame=lrtb, framerule=1pt, framexleftmargin=1pt,
showstringspaces=false
}
% this style should be active (additionally to "all") for "input" lstlistings environments
\lstdefinestyle{input}{
commentstyle=\itshape\color{red},
keywordstyle=\color{blue}
}
\lstdefinestyle{newLaTeXsettings}{
style=all,
keywords={},
otherkeywords={}
}
% listings settings for R (should hold for all R listings in general)
\lstdefinestyle{newRsettings}{
style=all,
literate={<-}{{$\leftarrow$}}2,% this is respected
keywords={if, else, function},% this is not respected
otherkeywords={}
}
\begin{document}
\begin{lstlisting}[language={[LaTeX]TeX}, style=input, style=newLaTeXsettings]
\begin{enumerate}
\item foo % bar
\end{enumerate}
\end{lstlisting}
\begin{lstlisting}[language=R, style=input, style=newRsettings]
x <- 4
s <- lapply(1:10, function(z) z+x)
k <- sapply(1:10, function(z) z+2*x) # other case
\end{lstlisting}
\end{document}
答案2
如果您的样式设置具有某些优先级,则必须按正确的顺序加载它们。Causestyle=...
将只输出给出的列表,\lstdefinestyle
因此后一种样式将占主导地位。
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{xcolor}
\usepackage{listings}
% priority: low
\lstset{
basicstyle=\ttfamily\small,
frame=lrtb, framerule=1pt, framexleftmargin=1pt,
showstringspaces=false
}
% priority: mid
\lstdefinestyle{input}{
commentstyle=\itshape\color{red},
keywordstyle=\color{blue}
}
% priority major
\lstdefinestyle{mylatex}{%
language=[LaTeX]TeX,
keywordstyle={\color{black}},% just redoing what input would do to us.
otherkeywords={}%
}
\lstdefinestyle{myr}{
language=R,
literate={<-}{{$\leftarrow$}}2,% this is respected
keywords={if, else, function},% this is not respected
otherkeywords={}
}
\begin{document}
%low priority must be loaded befor higher priorities.
%so that i can be overwritten.
\begin{lstlisting}[ style=input, style=mylatex, ]
\begin{enumerate}
\item foo % bar
\end{enumerate}
\end{lstlisting}
\begin{lstlisting}[style=input,style=myr, ]
x <- 4
s <- lapply(1:10, function(z) z+x)
k <- sapply(1:10, function(z) z+2*x if) # other case
\end{lstlisting}
\end{document}
所有通用规则都使用 和 来设置,lstset
直到本地命令(作为style
环境提供或实际可选参数)将其覆盖为止。所以这里我创建了三个级别。首先是全局(低优先级)选项。您不会觉得需要太关心它们。第二级是样式input
,它将被样式覆盖lang
。该样式将在最后生效。