更新

更新

我想用不同的颜色突出显示一些代表蛋白质氨基酸序列的字母。下面的代码运行良好,但突出显示的框并不完全适合字母,正如您在 MWE 输出中看到的那样,它略微向字母底部移动并且不居中,那么如何调整它以使其位于字母的中心?

MWE 代码

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{fontspec}

\setmonofont[Scale=MatchLowercase]{Inconsolata}
\usepackage{xcolor,graphicx}
\definecolor{set1}{RGB}{200,200,200}
\definecolor{set2}{RGB}{102,255,102}
\usepackage{soul} % for highlighting  
\newcommand{\hlc}[2][yellow]{{\sethlcolor{#1}\hl{#2}}}
\newfontfamily\myfont[Scale=MatchUppercase]{Inconsolata} % monospace font 
\newenvironment{protseq}{\myfont}{\par} 

\begin{document}
\begin{protseq}
\begin{tabular}{lr}
\hlc[set2]{MLGSRAVMLL LLLPWTAQG}R AVPGGSSPAW TQCQQLSQ\hlc[set1]{K}L CTLAWSAHPL & 50\\
VGHMDLREEG DEETTNDVPH IQCGDGCDPQ GLRDNSQFCL QRIHQGLIFY & 100\\
E\hlc[set1]{K}LLGSDIFT GEPSLLPDSP VGQLHASLLG LSQLLQPEGH HWETQQIPSL &    150\\
SPSQPWQRLL LRF\hlc[set1]{K}ILRSLQ AFVAVAARVF AHGAATLSP & 189\\
\end{tabular}
\end{protseq}
\end{document}

MWE 输出

在此处输入图片描述

更新
使用 Stephan Lehmke 的答案,即使使用Inconsolata字体加对齐方式也能解决问题,真是太神奇了!

在此处输入图片描述

答案1

奇怪的是,soul在调整“突出显示的斑点”的位置方面并没有提供太多帮助。

通过将其添加到您的序言中,您可以调整垂直位置:

\usepackage{etoolbox}

\newdimen\hladdbelow
\newdimen\hladdabove

\makeatletter
\apptocmd\SOUL@hlpreamble
{%
  \advance\SOUL@uldp\hladdbelow
  \advance\SOUL@ulht\hladdabove
}{}{}
\makeatother

\hladdbelow-2pt
%\hladdabove1pt

解释:这三个soul命令\ul\st\hl基本上使用相同的代码,仅在尺寸\SOUL@uldp(“高亮块”的深度)和\SOUL@ulht(“高亮块”的高度)选择不同的值。

\SOUL@hlpreamble(由 所用\hl) 根据字体大小“智能地”确定这些值,但没有提供调整界面。因此,我引入了新的尺寸\hladdabove(添加到顶部的长度)和\hladdbelow(添加到底​​部的长度),它们是在原始确定之后添加的。

事实上,似乎足以在底部带走一点(因此,\hladdbelow-2pt),但如果您想要不同的调整,您可以尝试使用这些值。


此处显示的设置产生(使用cmtt字体):

在此处输入图片描述

答案2

您可以使用 just\colorbox代替\hl,假设突出显示的序列不会在行尾换行:

\newcommand{\hlc}[2][yellow]{{\fboxsep1pt\colorbox{#1}{#2}}}

在此处输入图片描述

我没有Inconsolata字体,因此我改变了。

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
%\usepackage{fontspec}
%
%\setmonofont[Scale=MatchLowercase]{Inconsolata}
\usepackage{xcolor,graphicx}
\definecolor{set1}{RGB}{200,200,200}
\definecolor{set2}{RGB}{102,255,102}
\usepackage{soul} % for highlighting
\newcommand{\hlc}[2][yellow]{{\fboxsep1pt\colorbox{#1}{#2}}}
%\newfontfamily\myfont[Scale=MatchUppercase]{Inconsolata} % monospace font
\newenvironment{protseq}{\ttfamily}{\par}

\begin{document}
\begin{protseq}
\begin{tabular}{lr}
\hlc[set2]{MLGSRAVMLL LLLPWTAQG}R AVPGGSSPAW TQCQQLSQ\hlc[set1]{K}L CTLAWSAHPL & 50\\
VGHMDLREEG DEETTNDVPH IQCGDGCDPQ GLRDNSQFCL QRIHQGLIFY & 100\\
E\hlc[set1]{K}LLGSDIFT GEPSLLPDSP VGQLHASLLG \hlc[set2]{LSQLLQPEGH HWETQQIPSL &    150\\
SPSQPWQRLL LRF\hlc[set1]{K}ILRSLQ AFVAVAARVF AHGAATLSP & 189\\
\end{tabular}
\end{protseq}
\end{document}

答案3

显然,该宏\hl{}包含一个\strut用于调整框深度的宏,以便当框包含带有下降部分的字符(例如Q)时和不包含下降部分的字符时,框的深度相同。这保证了框的高度一致。

然而,对于所选的字体来说,深度可能显得有点太大了。

如果你使用 tikz(对于这个问题来说,这无疑是有点过头了),你可以更好地控制结果。这是一个解决方案:

\documentclass{scrartcl}
\usepackage[T1]{fontenc}
\usepackage{fontspec}
\usepackage{tikz}

\setmonofont[Scale=MatchLowercase]{Inconsolata}
\usepackage{xcolor,graphicx}
\definecolor{set1}{RGB}{200,200,200}
\definecolor{set2}{RGB}{102,255,102}
\newfontfamily\myfont[Scale=MatchUppercase]{Inconsolata} % monospace font
\newenvironment{protseq}{\myfont}{\par}

\newcommand{\hlc}[2][yellow]{\tikz[baseline=(T.base)]
   \node[inner ysep=1pt, inner xsep=0pt, fill=#1](T){\vphantom{Q}#2};}

\begin{document}
\begin{protseq}
\begin{tabular}{lr}
\hlc[set2]{MLGSRAVMLL LLLPWTAQG}R AVPGGSSPAW TQCQQLSQ\hlc[set1]{K}L CTLAWSAHPL & 50\\
VGHMDLREEG DEETTNDVPH IQCGDGCDPQ GLRDNSQFCL QRIHQGLIFY & 100\\
E\hlc[set1]{K}LLGSDIFT GEPSLLPDSP VGQLHASLLG LSQLLQPEGH HWETQQIPSL &    150\\
SPSQPWQRLL LRF\hlc[set1]{K}ILRSLQ AFVAVAARVF AHGAATLSP & 189\\
\end{tabular}
\end{protseq}
\end{document}

结果

我曾经使用\vphantom{Q}来实现与 相同的目标\strut,但此解决方案产生的框深度较短。您也可以删除\vphantom{Q},以便框的深度恰好适合其内容,但这会为 Q 和 K 产生不同的框深度,在我看来,这看起来不太好。

使用TikZ的好处是可以很方便的实现其他效果,比如圆角,不规则边缘等等。例如:

\newcommand{\hlc}[2][yellow]{\tikz[baseline=(T.base)]
   \node[inner ysep=1pt, inner xsep=0pt, fill=#1, rounded corners=2pt](T){\vphantom{Q}#2};}

生成:

结果2

\usetikzlibrary{decorations.pathmorphing}

\newcommand{\hlc}[2][yellow]{\tikz[baseline=(T.base)]
\node[inner ysep=1pt, inner xsep=0pt, fill=#1, decorate,
   decoration={random steps, amplitude=1pt, segment length=0.5ex}](T){\vphantom{Q}#2};}

生成:

结果3

虽然很丑陋,但却展现了可能性:-)

更新

请注意,如果您对突出显示的 blob 形状进行过度调整,则可能会影响与周围文本的对齐。可以通过将 tikz 绘图的边界框精确设置为突出显示的文本的形状来解决此问题,从而使“blob”溢出此边界框。

下面的例子更清楚地说明了我的意思:

\newcommand{\hlc}[2][yellow]{\tikz[baseline=(TT.base)]{
   \node[inner sep=0pt](TT){\vphantom{Q}#2};  % rectangle with the text to highlight
   \useasboundingbox (TT.south west) rectangle (TT.north east);
   \node[inner xsep=2pt, inner ysep=1pt, fit=(TT)] (T){}; % rectangle with the highlighting blob
   % now draw arbitrary shapes based on the last rectangle
   \fill[#1, opacity=0.5] (T.north west) to[out=5, in=185] (T.north east)
          -- (T.south east) to[out=190, in=10] (T.south west) -- cycle;
}}

结果:

结果4

相关内容