如何在命令中定义包选项(以供重复使用)?

如何在命令中定义包选项(以供重复使用)?

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}

相关内容