列表中特殊字符使用的字体

列表中特殊字符使用的字体

我正在尝试突出显示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}

示例清单 2

我如何定义\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 编码,即使上下文是打字机类型,命令\{\}也会从数学字体中获取相应的字符。有人可能会尝试修复此问题,但使用编码更简单。\textbackslashT1

\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}

在此处输入图片描述

相关内容