内含 lstlisting 的宏

内含 lstlisting 的宏

我一直在关注这个话题关于使用\NewDocuentCommandlstlisting接受的答案都很好,只是它太大了,对我来说不太起作用。

我想出了这个例子来测试xparse

\documentclass{article}
\usepackage{xparse}
\usepackage{listings}

\ExplSyntaxOn
\NewDocumentCommand{\code}{m +v}{
    \begin{lstlisting}[style=#1,numbers=none,xleftmargin=0.35cm,framesep=0mm]
        #2
    \end{lstlisting}
}
\ExplSyntaxOff
   
\begin{document}

\code{C}{
int x = 200;
unsigned int y = 0;
}

\end{document}

就像在CTAN xparse 文档我首先将其用作m普通参数,然后+v将其用作多行逐字参数,但失败了。看来我还是遗漏了一些东西……

答案1

您可以使用链接问题中 Bruno 的解决方案(我认为非常聪明)。

\documentclass{article}
\usepackage{listings}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\code}{m +v}{
  \newlinechar=\endlinechar
  \exp_args:Nx \scantokens
  {
    \string\begin{lstlisting}[\unexpanded{language=#1,numbers=none,xleftmargin=0.35cm,framesep=0mm}]
      #2
    \string\end{lstlisting}
  }
}
\ExplSyntaxOff

\begin{document}

\code{C}{
int x = 200;
unsigned int y = 0;
}

\end{document}

在此处输入图片描述


但是请使用新的环境。

\documentclass{article}
\pagestyle{empty}
\usepackage{listings}

\lstnewenvironment{code}[1]{\lstset{language=#1,numbers=none,xleftmargin=0.35cm,framesep=0mm}}{}

\begin{document}

\begin{code}{C}
int x = 200;
unsigned int y = 0;
\end{code}

\end{document}

输出类似。

相关内容