我定义了几个新的代码环境(使用listings
' lstnewenvironment
);除了一个属性(使用的语言)外,它们都具有相同的属性。例如:
\documentclass[a4paper,12pt]{book}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{xcolor}
\lstnewenvironment{xml}
{
\lstset
{
literate=
{é}{{\'e}}1
{É}{{\'E}}1
{à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1 {î}{{\^i}}1
{À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1 {Î}{{\^I}}1,
language=XML,
breaklines=true,
xleftmargin=\parindent,
showstringspaces=false,
showspaces=false,
showtabs=false,
keepspaces=true,
tabsize=2,
captionpos=t,
numbers=left,
numbersep=5pt,
numberstyle=\tiny\color{graycode},
escapeinside={(*}{*)},
basicstyle=\footnotesize\ttfamily,
keywordstyle=\bfseries\color{green!40!black},
commentstyle=\itshape\color{purple!40!black},
identifierstyle=\color{blue},
stringstyle=\color{orange}
}
}
{}
\begin{document}
\begin{xml}
<something> ... </something>
\end{xml}
\end{document}
我想重构我的代码,将通用内容保存在某种宏中,该宏会按原样(逐字)转储调用时存储的任何内容。例如:
\newcommand{\stringlstset}
{
literate = ...
breaklines = ...
...
}
\lstnewenvironment{xml}
{
\lstset
{
\stringlstset
language = xml
...
}
}
\lstnewenvironment{prolog}
{
\lstset
{
\stringlstset
language = prolog
...
}
}
我猜你必须使用一些低级技巧才能完成此操作。我在 Google 上搜索了一些内容,但找不到可行的解决方案。ConTeXt 的缓冲区例如,看起来很有希望,但它们不能在这里使用。
可能有一些方法可以listings
解决这个问题,但我对这里的通用解决方案感兴趣。
答案1
的第二个参数\lstnewenvironment
只是在环境之前执行的任意代码。因此,它可以由多个\lstset
命令组成,您可以将常见的自定义设置放入一个命令中,例如\stringlstset
,它\lstset
本身就是一个。这是一个小例子:
\documentclass[a4paper,12pt]{book}
\usepackage{listings}
\usepackage[usenames,dvipsnames]{xcolor}
\newcommand{\stringlstset}{\lstset{
breaklines=true,
showspaces=false}}
\lstnewenvironment{xml}
{\lstset{language=XML}\stringlstset}
{}
\begin{document}
\begin{xml}
<something> Somethig long enough to see a breaking of the line </something>
\end{xml}
\begin{lstlisting}
<something> Somethig long enough to see a breaking of the line </something>
\end{lstlisting}
\end{document}
生产
在环境中有换行符xml
,但在环境中没有lstlistng
。
答案2
代替
\lstnewenvironment{whatever}
{
\lstset
{
\stringlstset,
language = whatever,
...
}
}
你可以
\lstnewenvironment{whatever}
{
\expandafter\lstset
\expandafter{
\stringlstset,
language = whatever,
...
}
}