Atualizar

Atualizar

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

insira a descrição da imagem aqui

Atualizar
Usando a resposta de Stephan Lehmke, o problema foi resolvido mesmo quando o uso Inconsolatada fonte e o alinhamento são preservados, simplesmente incrível!

insira a descrição da imagem aqui

Responder1

Estranhamente, soulnã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 soulcomandos \ul, \ste \hlbasicamente 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 cmttfonte):

insira a descrição da imagem aqui

Responder2

Você pode usar apenas \colorboxem vez de \hl, assumindo que a sequência destacada não termina no final das linhas:

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

insira a descrição da imagem aqui

Não tenho Inconsolatafonte, 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 \strutpara 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}

Resultado

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:

Resultado2

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:

Resultado3

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:

Resultado4

informação relacionada