列表:语言的常规设置似乎被覆盖/不被尊重

列表:语言的常规设置似乎被覆盖/不被尊重

我对以下listings样式感到困惑。我的 .tex 文件中有两种不同语言(R 和 LaTeX)的代码。由于 R 列表和 LaTeX 列表的某些设置相同,因此我定义了样式“all”。任何 都应该尊重它。因此,我在两种语言的定义中 \begin{lstlisting} .. \end{lstlisting}使用。然后,还有其他特定于语言的设置,也应该尊重这些设置。但是,正如您所见,这并不奏效。尽管我将 R 列表中的关键字设置为 、或,但 lapply 和 sapply 也获得了蓝色。为什么?如何解决这个问题?style=alllstsetifelsefunction

看起来我必须在环境的可选参数中重复所有定义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。该样式将在最后生效。

相关内容