使用变量定义列表语言

使用变量定义列表语言

我正在使用 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}

相关内容