我正在尝试突出显示listings
环境中的代码片段。为此,我使用没有填充的颜色框,如下所示这个答案:
\newcommand{\reducedstrut}{\vrule width 0pt height .9\ht\strutbox depth .9\dp\strutbox\relax}
\newcommand{\hlight}[1]{\begingroup\setlength{\fboxsep}{0pt}\colorbox{yellow}{\reducedstrut#1\/}\endgroup}
清单设置为语法高亮显示 C 代码并用作ttfamily
字体:
\lstset{
language=C,
basicstyle=\small\ttfamily,
breakatwhitespace=true,
columns=fullflexible,
tabsize=2,
escapeinside={(*@}{@*)}
}
现在,如果我创建一个lstlisting
,则其中包含的特殊字符将显示在ttfamily
:
\begin{lstlisting}
int main() {
printf("\n");
}
\end{lstlisting}
但是,如果我突出显示代码,则特殊字符({
在}
下面\
的示例中)将使用默认的乳胶字体显示:
\begin{lstlisting}
(*@\hlight{\textbf{int main() \{}}@*)
(*@\hlight{printf("\textbackslash n");}@*)
}
\end{lstlisting}
我如何定义\hlight
以使字体在内部保持不变colorbox
?
以下是 MWE:
\documentclass[11pt]{article}
\usepackage{color}
\usepackage{listings}
\usepackage[T1]{fontenc}
\lstset{
language=C,
basicstyle=\small\ttfamily,
breakatwhitespace=true,
columns=fullflexible,
tabsize=2,
escapeinside={(*@}{@*)}
}
\newcommand{\reducedstrut}{\vrule width 0pt height .9\ht\strutbox depth .9\dp\strutbox\relax}
\newcommand{\hlight}[1]{\begingroup\setlength{\fboxsep}{0pt}\colorbox{yellow}{\reducedstrut#1\/}\endgroup}
\begin{document}
\begin{lstlisting}
int main() {
printf("\n");
}
\end{lstlisting}
\begin{lstlisting}
(*@\hlight{\textbf{int main() \{}}@*)
(*@\hlight{printf("\textbackslash n");}@*)
}
\end{lstlisting}
\end{document}
答案1
使用默认的 OT1 编码,即使上下文是打字机类型,命令\{
和\}
也会从数学字体中获取相应的字符。有人可能会尝试修复此问题,但使用编码更简单。\textbackslash
T1
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{listings}
\lstset{
language=C,
basicstyle=\small\ttfamily,
breakatwhitespace=true,
columns=fullflexible,
tabsize=2,
escapeinside={(*@}{@*)}
}
\newcommand{\reducedstrut}{\vrule width 0pt height .9\ht\strutbox depth .9\dp\strutbox\relax}
\newcommand{\hlight}[1]{\begingroup\setlength{\fboxsep}{0pt}\colorbox{yellow}{\reducedstrut#1\/}\endgroup}
\begin{document}
\begin{lstlisting}
int main() {
printf("\n");
}
\end{lstlisting}
\begin{lstlisting}
(*@\hlight{\textbf{int main() \{}}@*)
(*@\hlight{printf("\textbackslash n");}@*)
}
\end{lstlisting}
\end{document}