
我想用不同的顏色來突出一些代表蛋白質氨基酸序列的字母。下面的程式碼工作正常,但突出顯示的方塊並不完全適合字母,正如您在 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};}
產生:
這很醜陋,但顯示了可能性:-)
更新
請注意,如果您對突出顯示斑點的形狀太過瘋狂,則與周圍文字的對齊可能會受到影響。可以透過將 tikz 繪圖的邊界框精確設定為突出顯示文字的形狀來解決此問題,從而允許「斑點」溢出此邊界框。
下面的例子更清楚地說明了我的意思:
\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;
}}
結果: