我正在使用 listings 包来记录我程序的摘录。我一直在为各种编程语言创建新的环境,想知道是否有办法破解该包,以便它接受 中的语言定义变量\lstset
。
例如,
\documentclass[11pt]{article}
\usepackage{listings}
\newcommand{\thelanguage}{Python}
\lstnewenvironment{\thelanguage}[1][]{
\lstset{
language = \thelanguage,
#1
}
}
{}
\begin{document}
\begin{Python}
This is a test.
\end{Python}
\end{document}
使用上述方法,LaTeX 会抛出“!不正确的字母常数”错误,我推测这是因为 listings 包需要的是字符串而不是变量。有办法解决这个问题吗?我应该将其定义为宏并以某种方式扩展它吗?我对 LaTeX 还不熟悉,所以任何帮助都会对我的理解有所帮助。谢谢。
答案1
language
快速测试表明,对键值设置函数进行以下修改可以正确扩展用作语言的宏:
\makeatletter
\lst@Key{language}\relax{\expandafter\lstKV@OptArg\expandafter[\expandafter]\expandafter{#1}%
{\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
\lsthk@SetLanguage
{\lst@FindAlias[##1]{##2}%
\let\lst@language\lst@malias
\let\lst@dialect\lst@oalias}}}
\makeatother
但是,您还需要扩展传递给的宏\lstnewenvironment
。以下 MWE 显示了这是如何实现的:
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\makeatletter
\lst@Key{language}\relax{\expandafter\lstKV@OptArg\expandafter[\expandafter]\expandafter{#1}%
{\lst@LAS{language}{lang}{[##1]{##2}}\lst@FindAlias\lstlanguagefiles
\lsthk@SetLanguage
{\lst@FindAlias[##1]{##2}%
\let\lst@language\lst@malias
\let\lst@dialect\lst@oalias}}}
\makeatother
\newcommand{\thelanguage}{Python}
\expandafter\lstnewenvironment\expandafter{\thelanguage}[1][]{
\lstset{
language = \thelanguage,
#1
}
}
{}
\begin{document}
\begin{Python}
This is a test.
\end{Python}
\end{document}
尽管它可能被认为是操纵语言和环境使用您的方法(即使用\lstnewenvironment
和设置language
相同的宏),在使用不同的语言方言时管理这一点似乎很麻烦。例如,使用
\newcommand{\thelanguage}{[XSC]Pascal}
需要你使用
\begin{[XSC]Pascal}
%...
\end{[XSC]Pascal}