我已经为彩色粗体文本定义了一个新命令,如下所示,以便在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
是通过其转义字符机制。