![更新](https://linux22.com/image/290094/%E6%9B%B4%E6%96%B0.png)
我想用不同的颜色突出显示一些代表蛋白质氨基酸序列的字母。下面的代码运行良好,但突出显示的框并不完全适合字母,正如您在 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};}
生成:
和
\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};}
生成:
虽然很丑陋,但却展现了可能性:-)
更新
请注意,如果您对突出显示的 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;
}}
结果: