如何在 listings(或 fancyvrb)环境中预处理代码?

如何在 listings(或 fancyvrb)环境中预处理代码?

假设我想创建一个shell环境来排版 shell 命令的示例。我想自动化一些细节以保持一致性。例如,我需要自动在第一行的开头放置一个“$”,因此一段代码如下:

\begin{shell}
cat nothing > /dev/null
cat: nothing: No such file or directory
\end{shell}

将被排版为如下代码:

$ cat nothing > /dev/null
cat: nothing: No such file or directory

这个想法可以扩展。例如,命令行的排版可以与命令输出不同,或者我可能想截取最后一个\以缩进后续行,等等......

换句话说,我想预处理在将环境的逐字内容传递给实际lstlisting环境之前。

这有可能吗?该怎么做?

答案1

这可能很快就会变得太复杂而无法使用,但我编写它是为了提到环境verbatimbox允许使用可选参数对其内容进行有限的预处理。

但是,在这种情况下,我只是使用\active字符来拦截和测试输入。

\documentclass{article}
\usepackage{verbatimbox,ifthen,xcolor}
\let\CatCode\catcode
\let\aCtive\active
\let\LCC c
\CatCode`c=\aCtive %
\def c{\Ctest}
\CatCode`c=11 %
\def\Ctest#1#2#3{%
  \ifthenelse{\equal{#1#2}{at}}%
    {\ifthenelse{\equal{#3}{:}}{\rmfamily\LCC#1#2#3}{\$ \textcolor{red}{\LCC#1#2#3}}}%
    {\LCC#1#2#3}%
}
\begin{document}
\begin{verbbox}
cat nothing > /dev/null
cat: nothing: No such file or directory
other stuff with a c in it
\end{verbbox}
verbatimbox without active c: \fbox{\theverbbox}

\CatCode`c=\active
\begin{verbbox}
cat nothing > /dev/null
cat: nothing: No such file or directory
other stuff with a c in it
\end{verbbox}
\CatCode`c=11 
verbatimbox with active c: \fbox{\theverbbox}
\end{document}

在此处输入图片描述

相关内容