将 escapechar 传递给列表内的新命令

将 escapechar 传递给列表内的新命令

我已经为彩色粗体文本定义了一个新命令,如下所示,以便在listing环境中使用:

\definecolor{mycolor}{rgb}{0,0.8,0}
\newcommand{\lstemph}[1]{\textcolor{mycolor}{#1}}

在我的 中\lstdefinestyle,提供了一个选项:escapechar=!,每次我想要使用我的命令时,我都必须!在命令之前和之后写入:

return !\lstemph{tmp\_val + 2}!;

我怎样才能定义命令以包含转义字符,这样我就不能!在中写入listing

更新:我的示例代码:

\documentclass{article}
\usepackage{t1enc}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{textcomp}
\usepackage{color}
\usepackage{listings}

\definecolor{mycolor}{rgb}{0,0.8,0}
\newcommand{\lstemph}[1]{\textcolor{mycolor}{#1}}
\lstloadlanguages{C++}
\lstdefinestyle{myCpp}
{
    language=C++,
    tabsize = 4,
    framesep = 3mm,
    frame=tb,   
    classoffset = 0,    
    basicstyle = \footnotesize\ttfamily,
    keywordstyle = \bfseries\color[rgb]{0,0,1},
    commentstyle = \itshape\color[rgb]{0.133,0.545,0.133},
    stringstyle = \color[rgb]{0.627,0.126,0.941},
    extendedchars = true,
    breaklines = true,
    prebreak = \textrightarrow,
    postbreak = \textleftarrow,
    escapeinside = {(*@}{@*)},
    escapechar=!,
    moredelim=**[is][\color{red}]{@}{@},
    numbers = left,
    numberstyle = \tiny,
    stepnumber = 5
}

\begin{document}

\begin{lstlisting}[style=myCpp,caption={Test}]
return !\lstemph{tmp\_val + 2}!;
\end{lstlisting}

\end{document}

答案1

如果您的命令只接受一个参数,并且您永远不需要向其传递结束花括号 ( ),那么您可以通过适当使用键}来“模拟”列表中的命令:moredelim

moredelim=[is][\lstemph]{\\lstemph\{}{\}}

如果您escapechar仅使用输入\lstemph命令,那么您可以简单地使用!作为分隔符:

moredelim=[is][\lstemph]{!}{!}

完整示例:

\documentclass{article}
\usepackage{t1enc}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\usepackage{textcomp}
\usepackage{color}
\usepackage{listings}

\definecolor{mycolor}{rgb}{0,0.8,0}
\newcommand{\lstemph}[1]{\textcolor{mycolor}{#1}}
\lstloadlanguages{C++}
\lstdefinestyle{myCpp}
{
    language=C++,
    tabsize = 4,
    framesep = 3mm,
    frame=tb,   
    classoffset = 0,    
    basicstyle = \footnotesize\ttfamily,
    keywordstyle = \bfseries\color[rgb]{0,0,1},
    commentstyle = \itshape\color[rgb]{0.133,0.545,0.133},
    stringstyle = \color[rgb]{0.627,0.126,0.941},
    extendedchars = true,
    breaklines = true,
    prebreak = \textrightarrow,
    postbreak = \textleftarrow,
    escapeinside = {(*@}{@*)},
    % escapechar=!,
    moredelim=**[is][\color{red}]{@}{@},
    numbers = left,
    numberstyle = \tiny,
    stepnumber = 5
}

\begin{document}

\begin{lstlisting}[style=myCpp,caption={Test},moredelim={[is][\lstemph]{\\lstemph\{}{\}}}]
return \lstemph{tmp_val + 2};
\end{lstlisting}

\begin{lstlisting}[style=myCpp,caption={Test},moredelim={[is][\lstemph]{!}{!}}]
return !tmp_val + 2!;
\end{lstlisting}

\end{document}

打印两个结果列表的屏幕截图

答案2

正如 Christian 在他的评论中指出的那样,你所问的问题是不可能的。这类似于问:

在 [某些 C 语言] 中,如何通过写入n而不是来打印换行符\n

不管怎样,你都需要指定需要解释为 TeX 而不是文字的内容。唯一的方法listings是通过其转义字符机制。

相关内容