将 lstinline 转义符与宏结合使用

将 lstinline 转义符与宏结合使用

我尝试使用escapechar选项lstinline。为了“激活它”,我使用了描述的方法这里。但是,在宏中使用它时,它会中断。如下所示。有办法解决这个问题吗?

错误说明

\documentclass{article}

%for lstinline
\usepackage{listings}

%for highlighting
\usepackage{xcolor}

%to allow escapechar inside lstinline
\usepackage{etoolbox}
\makeatletter
\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
\makeatother

%the example macro
\def\mymacro#1{\lstinline[escapechar=§]|§#1§|}

%for demonstration purposes
\def\perfectly{perfectly}

%highlight lstinline
\lstset{
    basicstyle=\ttfamily\color{blue}
}

\begin{document}
    \lstinline[escapechar=§]|works §\perfectly§| - listinline no more active

    \mymacro{doesn't work} - lstinline is still active here
\end{document}

答案1

如果你真的想通过列表-包裹:

我不知道您使用什么 TeX 引擎(它是基于以单字节/8 位 ASCII 为内部字符表示方案的传统 TeX,还是基于以多字节 utf8/unicode 为内部字符表示方案的 XeTeX/LuaTeX)。

因此,在下面的示例中,单字节编码latin1被明确指定为输入编码。如果您希望复制粘贴示例进行测试,请确保您的平台上生成的文本文件也是 latin1 编码的。(或者调整对输入-package 到您平台上使用的 8 位/单字节编码。)


只要\mymacro始终通过读取和标记 .tex 输入文件的部分内容来获取其参数,并且从不获取通过其他宏传递的参数(在将参数传递给 之前,为其他宏收集参数时,可能在错误的类别代码制度下对参数进行了标记\mymacro),您就可以\mymacro在逐字类别代码制度下读取和标记其参数,然后将它们(包括对 的调用\lstinline)传递给\scantokens

为了\mymacro在 verbatim-catcode-régime 下读取并标记其参数,我使用了+v解析-包裹。

该过程非常简单:

\mymacro在新打开的本地作用域内更改一些类别代码和 TeX 参数。然后它调用\innermymacro\innermymacro在 verbatim-catcode-régime 下收集三个参数并用短语(短语 1:、\lstinline[escapechar=§]|短语 2:、§短语 3:)包围它们|%,这些短语在定义时\innermymacro也在 verbatim-catcode-régime 下收集。这样,您将获得 verbatim-catcode-régime 中的标记序列
\lstinline[escapechar=§]|<Argument 1>§<Argument2>§<Argument3>|%
此序列传递给\scantokens,前缀为\endgroup,以便在重新标记和处理事物时发生的第一件事\scantokens就是关闭本地作用域。

\documentclass{article}

% You need some 8bit-encoding with the listings-package:
\usepackage[latin1]{inputenc}
% xparse's verbatim-arguments are handy:
\usepackage{xparse}%
% To allow patching commands:
\usepackage{etoolbox}
% To typeset code-listings:
\usepackage{listings}
% To allow escapechar inside lstinline:
\makeatletter
\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
\makeatother
% For highlighting:
\usepackage{xcolor}

% The example macro's syntax:
%
% \mymacro{<stuff inside \lstinline before the LaTeX-escape>}%
%         {<stuff inside \lstinline inside the LaTeX-escape>}%
%         {<stuff inside \lstinline after the LaTeX-escape>}%
%
\newcommand*\mymacro{%
  \begingroup
  \catcode`\^^I=12\relax
  \catcode`\^^M=12\relax
  \newlinechar=\endlinechar\relax
  \innermymacro
}%
\NewDocumentCommand\innermymacro{+v+v+v}{%
  \RenewDocumentCommand\innermymacro{+v+v+v}{%
     \scantokens{\endgroup#1##1#2##2#2##3#3}%
  }%
}%
\innermymacro{\lstinline[escapechar=§]|}{§}{|%}%

%for demonstration purposes
\def\perfectly{perfectly}

%highlight lstinline
\lstset{
    basicstyle=\ttfamily\color{blue}
}

\begin{document}
\lstinline[escapechar=§]|works §\perfectly§| -- listinline no more active

\mymacro{Before \LaTeX-escape. }%
        {{\frenchspacing Inside \LaTeX-escape: \perfectly.}}%
        { After \LaTeX-escape.} -- lstinline no more active

\end{document}

在此处输入图片描述

相关内容