在 LaTeX 中重复使用命令部分

在 LaTeX 中重复使用命令部分

我定义了几个新的代码环境(使用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,
  ...
 }
}

相关内容