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}