在 \lstinline 中转义

在 \lstinline 中转义

在 -environment 中有几种转义 LaTeX 代码的选项lstlisting。但这似乎在 中不起作用\lstinline。我想做这样的事情:

\lstinline[escapechar=§]{§\textlangle§foo§\textrangle§}

有什么解决方法吗?

答案1

通过mathescapefrom退出listings其工作方式\lstinline与在环境中一样lstlisting。下面是一个展示如何使用它的简单示例:

在 \lstinline 中转义

\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\begin{document}
\section{foo} \label{foo}
\lstinline[mathescape]!abc$ijk$xyz$\ref{foo}$23!
\end{document}

在上面的例子中,ijk在数学模式下设置,因为mathescape是真的,而\ref{foo}也是,但打印为对第一节的引用。请注意分隔符的选择,!而不是{...},尽管 MWE 也适用于此。

答案2

从阅读包的代码来看listings,显然是故意的,但未记录的行为,即不能在中使用转义lstinline,但例外情况除外mathescape。据推测,转义在上下文中被视为“不安全的功能” TextStyle(其中lstinline之一),但不清楚为什么或何时它可能不安全。

可以重新启用该功能,如下所示,但请小心,以防它导致任何问题:

\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings

% http://tex.stackexchange.com/q/43526
% fix the apparently deliberate but undocumented behaviour of disabling escapes other than mathescape in TextStyle (used by \lstinline)
% there may be a good reason why this is disabled by default, so beware in case it causes any problems
\usepackage{etoolbox}
\makeatletter
\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}}
\makeatother

% for the example:
\usepackage{textcomp}% for \textlangle, \textrangle


\begin{document}
Experimental brace syntax: \lstinline[escapechar=§]{§\textlangle§foo§\textrangle§}

Standard delimiter syntax: \lstinline[escapechar=§]!§\textlangle§foo§\textrangle§!

\end{document}

代码输出说明

相关内容