我有一些代码想要逐字排版(lstlisting 也可以) - 但我想通过不同的背景颜色突出显示其中的某些部分,即如下所示:
\begin{verbatim}
hello \colorbox{red}{world} blah
hello world blub
\end{verbatim}
不应colorbox
逐字解释并且不应引入额外的水平空格,即 blah 和 blub 应正确对齐(例如没有任何突出显示)。
我尝试了如下环境Verbatim
:lstlisting
\begin{lstlisting}[escapechar=\%]
或者
\begin{Verbatim}[commandchars=\\\{\}]
与当时的转义命令结合colorbox
- 突出显示有效 - 但引入了额外的空格并搞乱了字符对齐。
我怎样才能正确地做这件事?
答案1
我认为alltt
同名包中的环境更适合这里。它使除 和 之外的所有内容都\
逐字逐句{
地}
类似于
\begin{Verbatim}[commandchars=\\\{\}]
。
提到的增加的空间是由于使用\fboxsep
了使盒子变大。您可以通过将此值设置为零来避免这种情况,无论是全局还是局部使用自己的宏。然而,这会使盒子在所有四个位置都非常紧凑。增加的空间\strut
确保它始终具有相同的高度和深度。
\documentclass{article}
\usepackage{xcolor}
\usepackage{alltt}
% Global:
\setlength{\fboxsep}{0pt}
% Better:
\newcommand\hi[2][red]{{%
\setlength{\fboxsep}{0pt}%
\colorbox{#1}{#2\strut}%
}}
\begin{document}
\begin{alltt}
hello \colorbox{red}{world\strut} blah
hello world blub
hello \hi{world} blub
\end{alltt}
\end{document}
另一种选择,也是 IHMO 中最好的选择,是对fboxsep
框的前后进行补偿:
\documentclass{standalone}
\usepackage{xcolor}
\usepackage{alltt}
% Compensate for fbox sep:
\newcommand\Hi[2][red]{%
\hspace*{-\fboxsep}%
\colorbox{#1}{#2}%
\hspace*{-\fboxsep}%
}
\begin{document}
\begin{alltt}
hello world blah
hello \Hi{world} blah
\end{alltt}
\end{document}
结果:
答案2
只需设置\fboxsep=0pt
以减少周围的多余空间\colorbox
。
这是另一个解决方案:
\documentclass{article}
\usepackage{xcolor}
\usepackage{soul}
\colorlet{mycolor}{red!50}
\sethlcolor{mycolor}
\usepackage{listings}
\lstset{basicstyle=\ttfamily,columns=flexible,
escapechar=`}
\begin{document}
\begin{lstlisting}
foo`\hl{bar}`foo
\end{lstlisting}
\end{document}