lstlisting 环境:将语法排版应用于转义代码

lstlisting 环境:将语法排版应用于转义代码

lstlisting软件包提供的环境允许listings您退出环境并插入任意 LaTeX 代码,该代码使用通常的(非逐字)规则进行评估。我感兴趣的是是否可以使用lstlisting宏将文本插入环境,然后该文本仍由环境解析lstlisting

想要这样做的动机如下。我正在开发一个包含许多lstlisting环境的项目,我们想为某些经常出现的代码片段提供宏,以便 (i) 在整个文档中强制标准化,以及 (ii) 如果我们想更改代码片段,那么我们只需在一个地方进行更改。

下面的 MWE 希望能够演示我想要实现的目标。这不是我们将要使用它的那种情况的一个非常现实的例子,但希望可以成为一个清晰的例子。MWE 的目标是让环境将lstlisting宏插入的文本识别为注释,然后使用粗体字体对其进行排版。编译示例的图像显示在最底部。

还要注意,宏由于某种原因在第二个代码块中插入了一个额外的空格。

\documentclass{article}

\usepackage{listings}

\lstset{%
  language=bash,
  basicstyle=\fontfamily{pcr}\selectfont,
  commentstyle=\bfseries,
  escapeinside={(*@}{@*)}
}

\newcommand{\comment}[1]{\# here is a comment: #1}


\begin{document}

This is how the example currently looks after compilation.  Notice that the text
after the pound sign in the second code block isn't typeset using bold font.

\begin{lstlisting}
# here is a comment: hardcoded
echo example 1
\end{lstlisting}

\begin{lstlisting}
(*@\comment{using a macro}@*)
echo example 2
\end{lstlisting}


\end{document}

在此处输入图片描述

答案1

似乎您想退出,lstlisting只是为了稍后默默地重新输入它,以便突出显示注释中的关键字或其他语法部分。 那么为什么不留在lstlisting? 您可以定义一个新的分隔环境,从mordelim=**[is]输出中删除分隔符,但仍将所有其他样式应用于它们之间的文本。 这样,新的注释环境[*@ ... @*]可能如下所示:

\documentclass{article}

\usepackage{listings}
\usepackage{xcolor}

\lstset{%
  language=bash,
  basicstyle=\fontfamily{pcr}\selectfont,
  commentstyle=\bfseries,
  escapeinside={(*@}{@*)},
  moredelim=**[is][\commentstyle]{[*@}{@*]},
  keywordstyle={\color{blue}}
}

\newcommand{\commentstyle}{\frenchspacing \bfseries \# here is a comment: }
\newcommand{\comment}[1]{\# here is a comment: #1}

\begin{document}
This is how the example currently looks after compilation.  Notice that the text
after the pound sign in the second code block isn't typeset using bold font.

\begin{lstlisting}
# here is a comment: hardcoded
echo example 1
\end{lstlisting}

\begin{lstlisting}
(*@\comment{using a macro}@*)
echo example 2
\end{lstlisting}

\begin{lstlisting}
[*@with keywords like echo@*]
echo example 3
\end{lstlisting}
\end{document}

在此处输入图片描述

相关内容