我使用该listings
包在 LaTeX 文档中渲染代码。我尝试定义一个新命令或一个新环境,其中使用 \lstinline。我在 StackExchange 上阅读了许多关于此问题的问题,但尚未找到解决问题的方法。
我想要一个\code
这样的宏:
\code{a $\leq$ b}
扩展为:
\begin{definition}
\lstinline[mathescape=true]{a $\leq$ b}
\end{definition}
该NewDocumentCommand
包xparse
看起来很有希望但是却无法编译。
\NewDocumentCommand\code{v}{\lstinline[mathescape=true]{#1}}
\code{a $\leq$ b}
错误:
ERROR: Undefined control sequence.
--- TeX said ---
\lst@arg ->a $\
leq$ b
l.6 \code{a $\leq$ b}
所以,我的问题是:是否可以警告 LaTeX,\code
在传递给之前,不应扩展的参数\lstinline
?
谢谢你,
皮埃尔
答案1
我通过要求双倍使它变得更简单,{{
可能可以通过更多的努力来避免这种情况,或者使用环境形式或明确的结束标记,例如,\code ... \stopcode
这会更容易。
\documentclass{article}
\usepackage{listings}
\begin{document}
%\code{a $\leq$ b}
\hrule
\begin{quote}
\lstinline[mathescape=true]{a $\leq$ b \zzz}
\end{quote}
\hrule
\bigskip
% gobble a {
\def\code{\afterassignment\xcode\let\tmp}
% run lstinline and save inside box0, call \setcode when done
\def\xcode{\setbox0\hbox\bgroup\aftergroup\setcode
\lstinline[mathescape=true]}
% does the environment required, using \usebox0 to use the saved text
\def\setcode{\hrule\begin{quote}\usebox0\end{quote}\hrule}
\code{{a $\leq$ b \zzz}}
\end{document}
或按照评论中的要求添加参数
\documentclass{article}
\usepackage{listings}
\begin{document}
%\code{a $\leq$ b}
\hrule
\begin{quote}
\lstinline[mathescape=true]{a $\leq$ b \zzz}
\end{quote}
\hrule
\bigskip
% gobble a {
\def\code#1{\def\savedlabel{#1}\afterassignment\xcode\let\tmp}
% run lstinline and save inside box0, call \setcode when done
\def\xcode{\setbox0\hbox\bgroup\aftergroup\setcode
\lstinline[mathescape=true]}
% does the environment required, using \usebox0 to use the saved text
\def\setcode{\hrule\begin{quote}\label{\savedlabel}\fbox{\savedlabel}\\%
\usebox0\end{quote}\hrule}
\code{hmm}{{a $\leq$ b \zzz}}
\end{document}