我一直在关注这个话题关于使用\NewDocuentCommand
和lstlisting
接受的答案都很好,只是它太大了,对我来说不太起作用。
我想出了这个例子来测试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}
输出类似。