listings
我的文档中多次需要该包的一些选项。因此,我想知道是否可以在序言中的某个地方通过命令/宏定义(并稍后更改)这些选项,然后在需要时使用该命令/宏?我尝试了该keyval
包,但没有成功。
\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[american]{babel}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{keyval}
\usepackage{filecontents}
% write dummy R file
\begin{filecontents*}{foo.R}
f <- function(x){
t <- exp(-x) # just some dummy example
sqrt(t) # return value
}
\end{filecontents*}
% general listings settings
\lstset{
language=R,
basicstyle=\ttfamily\small,
keywords={if, else, repeat, while, function, for, in, next, break},
otherkeywords={}
}
% define my own listings settings which frequently appear
\newcommand{\mylstset}{\setkeys{keywordstyle=\color{blue}, commentstyle=\itshape\color{red}}}
% specific listing environment
\xdefinecolor{blue}{RGB}{58, 95, 205}%
\xdefinecolor{red}{RGB}{178, 34, 34}%
\lstnewenvironment{Rinput}[1][]{%
\lstset{\mylstset}% my listings settings
#1% content
}{}
\begin{document}
Show \texttt{foo.R}:
\lstinputlisting[\mylstset]{foo.R}% my listings settings
\end{document}
答案1
在答案中总结我的评论:
首先要定义自定义设置,而不是\setkeys
简单的键/值对列表:
\newcommand*\mylstset{keywordstyle=\color{blue}, commentstyle=\itshape\color{red}}
现在,主要的问题是,这个宏在输入之前需要扩展一次\lstinputlisting
:
\expandafter\lstinputlisting\expandafter[\mylstset]{foo.R}
因为这很繁琐(并且在文档主体中不是一种很好的风格),当需要更频繁地执行此操作时,定义一个包装器可能会很方便:
\newcommand\myinputlisting[1][]{\expandafter\lstinputlisting\expandafter[#1]}
现在可以按如下方式使用它:
\myinputlisting[\mylstset,otherkey=...]{foo.R}
需要注意的是,这\mylstset
必须是键/值列表中的第一个条目,否则它不会首先被扩展。
由于要求是不是要使用自定义命令,但原始语法需要重新定义\lstinputlisting
。为此,需要先保存其定义,然后才能在重新定义中使用:
% save original definition of \lstinputlisting:
\let\origlstinputlisting\lstinputlisting
% renew definition of \lstinputlisting:
\renewcommand\lstinputlisting[1][]{\expandafter\origlstinputlisting\expandafter[#1]}
这有效,但应该注意,这种重新定义可能会因具有可选参数的命令而失败。更安全的方法是使用\LetLtxMacro
(来自letltxmacro
包)而不是\let
。
总而言之,在我看来,有一个更好的方法:定义自定义样式并通过以下style
选项使用它:
% preamble:
\lstdefinestyle{mystyle}{keywordstyle=\color{blue}, commentstyle=\itshape\color{red}}
% document
\lstinputlisting[style=mystyle]{foo.R}