
Quero destacar algumas letras que representam uma sequência de aminoácidos de uma proteína em cores diferentes. O código abaixo funciona bem, mas a caixa destacada não se ajusta exatamente às letras, como você pode ver na saída do MWE ela está ligeiramente deslocada para a parte inferior das letras e não centralizada, então como justificar isso para torná-la no centro de cartas?
Código 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}
Saída MWE
Atualizar
Usando a resposta de Stephan Lehmke, o problema foi resolvido mesmo quando o uso Inconsolata
da fonte e o alinhamento são preservados, simplesmente incrível!
Responder1
Estranhamente, soul
não oferece muito no que diz respeito ao ajuste da posição do "blob de destaque".
Ao adicionar isto ao seu preâmbulo, você pode ajustar a posição vertical:
\usepackage{etoolbox}
\newdimen\hladdbelow
\newdimen\hladdabove
\makeatletter
\apptocmd\SOUL@hlpreamble
{%
\advance\SOUL@uldp\hladdbelow
\advance\SOUL@ulht\hladdabove
}{}{}
\makeatother
\hladdbelow-2pt
%\hladdabove1pt
Explicação:Os três soul
comandos \ul
, \st
e \hl
basicamente utilizam o mesmo código, apenas escolhendo valores diferentes para as dimensões \SOUL@uldp
(profundidade do "bloco de destaque") e \SOUL@ulht
(altura do "bloco de destaque").
\SOUL@hlpreamble
(usado por \hl
) determina esses valores de forma "inteligente" com base no tamanho da fonte, mas não oferece interface para ajuste. Portanto, estou introduzindo novas dimensões \hladdabove
(comprimento para adicionar na parte superior) e \hladdbelow
(comprimento para adicionar na parte inferior) que são adicionadas após a determinação original.
Do jeito que está, parece ser suficiente diminuir um pouco a parte inferior (portanto, \hladdbelow-2pt
), mas você pode experimentar os valores se quiser um ajuste diferente.
A configuração mostrada aqui produz (usando cmtt
fonte):
Responder2
Você pode usar apenas \colorbox
em vez de \hl
, assumindo que a sequência destacada não termina no final das linhas:
\newcommand{\hlc}[2][yellow]{{\fboxsep1pt\colorbox{#1}{#2}}}
Não tenho Inconsolata
fonte, por isso mudei.
\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}
Responder3
Aparentemente a macro \hl{}
inclui um \strut
para ajustar a profundidade da caixa, para que ela tenha a mesma profundidade quando contém caracteres com descendentes (como Q
) e quando não contém. Isso garante que a altura da caixa seja consistente.
Porém, talvez para a fonte escolhida, a profundidade pareça um pouco grande.
Você pode ter um controle mais preciso do resultado se usar o tikz (o que é um exagero para esse problema). Aqui está uma solução:
\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}
Eu costumava \vphantom{Q}
atingir o mesmo objetivo que com \strut
, mas esta solução produz uma profundidade de caixa menor. Você também pode remover o \vphantom{Q}
, para que a profundidade da caixa se ajuste exatamente ao seu conteúdo, mas isso produziria profundidades de caixa diferentes para Q e K, o que IMHO não parece bom.
A vantagem de usar o TikZ é que você pode facilmente conseguir outros efeitos, como cantos arredondados, bordas irregulares, etc.. Por exemplo:
\newcommand{\hlc}[2][yellow]{\tikz[baseline=(T.base)]
\node[inner ysep=1pt, inner xsep=0pt, fill=#1, rounded corners=2pt](T){\vphantom{Q}#2};}
produz:
e
\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};}
produz:
O que é feio, mas mostra as possibilidades :-)
Atualizar
Observe que se você exagerar no formato do blob de destaque, o alinhamento com o texto ao redor poderá ser afetado. Isso pode ser corrigido definindo a caixa delimitadora do desenho tikz exatamente no formato do texto destacado, permitindo que a "bolha" espalhe essa caixa delimitadora.
O exemplo a seguir mostra mais claramente o que quero dizer:
\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;
}}
Resultado: