Actualizar

Actualizar

Quiero resaltar algunas letras que representan una secuencia de aminoácidos de una proteína usando diferentes colores. El siguiente código funciona bien, pero el cuadro resaltado no se ajusta exactamente a las letras, como puede ver en la salida de MWE, está ligeramente desplazado hacia la parte inferior de las letras y no está centrado, entonces, ¿cómo justificar esto para que quede en el centro de ¿letras?

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}

Salida MWE

ingrese la descripción de la imagen aquí

Actualizar
Usando la respuesta de Stephan Lehmke, el problema se resolvió incluso cuando se usa Inconsolatala fuente y se conserva la alineación, ¡simplemente increíble!

ingrese la descripción de la imagen aquí

Respuesta1

Curiosamente, soulno ofrece mucho con respecto al ajuste de la posición del "blob resaltado".

Al agregar esto a su preámbulo, puede ajustar la posición vertical:

\usepackage{etoolbox}

\newdimen\hladdbelow
\newdimen\hladdabove

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

\hladdbelow-2pt
%\hladdabove1pt

Explicación:Los tres soulcomandos \ulbásicamente \stusan \hlel mismo código, solo que eligen valores diferentes para las dimensiones \SOUL@uldp(profundidad del "bloque de resaltado") y \SOUL@ulht(altura del "bloque de resaltado").

\SOUL@hlpreamble(utilizado por \hl) determina estos valores "inteligentemente" basándose en el tamaño de fuente, pero no ofrece ninguna interfaz para su ajuste. Así que estoy introduciendo nuevas dimensiones \hladdabove(longitud para agregar en la parte superior) y \hladdbelow(longitud para agregar en la parte inferior) que se agregan después de la determinación original.

Tal como están las cosas, parece suficiente quitar un poco en la parte inferior (por lo tanto \hladdbelow-2pt), pero puedes experimentar con los valores si quieres un ajuste diferente.


La configuración que se muestra aquí produce (usando cmttfuente):

ingrese la descripción de la imagen aquí

Respuesta2

Puedes usar just \colorboxen lugar de \hl, asumiendo que la secuencia resaltada no se ajusta al final de las líneas:

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

ingrese la descripción de la imagen aquí

No tengo Inconsolatafuente, por eso la cambié.

\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}

Respuesta3

Al parecer la macro \hl{}incluye un \strutpara ajustar la profundidad del cuadro, para que tenga la misma profundidad cuando contiene caracteres con descendentes (como Q) y cuando no. Esto garantiza que la altura de la caja sea consistente.

Sin embargo, quizás para la fuente elegida, la profundidad parezca demasiado grande.

Puedes tener un control más preciso del resultado si usas tikz (lo cual ciertamente es excesivo para este problema). Aquí hay una solución:

\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

Solía \vphantom{Q}​​lograr el mismo objetivo que con \strut, pero esta solución produce una profundidad de cuadro más corta. También puede eliminar el \vphantom{Q}, para que la profundidad de la caja se ajuste exactamente a su contenido, pero esto produciría diferentes profundidades de caja para Q y K, lo que en mi humilde opinión no se ve bien.

La ventaja de usar TikZ es que puedes lograr fácilmente otros efectos, como esquinas redondeadas, bordes irregulares, etc. Por ejemplo:

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

produce:

Resultado2

y

\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};}

produce:

Resultado3

Lo cual es feo, pero muestra las posibilidades :-)

Actualizar

Tenga en cuenta que si se vuelve demasiado loco con la forma de la mancha resaltada, la alineación con el texto circundante puede verse afectada. Esto se puede solucionar configurando el cuadro delimitador del dibujo tikz exactamente con la forma del texto resaltado, permitiendo que la "mancha" se extienda por este cuadro delimitador.

El siguiente ejemplo muestra más claramente lo que quiero decir:

\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

información relacionada