Aktualisieren

Aktualisieren

Ich möchte einige Buchstaben, die eine Aminosäuresequenz eines Proteins darstellen, in verschiedenen Farben hervorheben. Der folgende Code funktioniert einwandfrei, aber das hervorgehobene Kästchen passt nicht genau zu den Buchstaben. Wie Sie in der MWE-Ausgabe sehen können, ist es leicht nach unten verschoben und nicht zentriert. Wie kann man dies also so begründen, dass es in die Mitte der Buchstaben gelangt?

MWE-Code

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

Bildbeschreibung hier eingeben

Aktualisieren
Mithilfe der Antwort von Stephan Lehmke wurde das Problem gelöst, auch wenn Inconsolatadie Schriftart verwendet wird, und die Ausrichtung bleibt erhalten, einfach großartig!

Bildbeschreibung hier eingeben

Antwort1

Seltsamerweise soulbietet es nicht viel hinsichtlich der Anpassung der Position des „Hervorhebungs-Blobs“.

Indem Sie dies zu Ihrer Präambel hinzufügen, können Sie die vertikale Position anpassen:

\usepackage{etoolbox}

\newdimen\hladdbelow
\newdimen\hladdabove

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

\hladdbelow-2pt
%\hladdabove1pt

Erläuterung:Die drei soulBefehle \ulund \stverwenden \hlgrundsätzlich den gleichen Code, wählen nur unterschiedliche Werte für die Abmessungen \SOUL@uldp(Tiefe des „Hervorhebungsblocks“) und \SOUL@ulht(Höhe des „Hervorhebungsblocks“).

\SOUL@hlpreamble(verwendet von \hl) ermittelt diese Werte „intelligent“ anhand der Schriftgröße, bietet aber keine Schnittstelle zur Anpassung. Daher führe ich neue Dimensionen ein \hladdabove(Länge, die oben hinzugefügt werden soll) und \hladdbelow(Länge, die unten hinzugefügt werden soll), die nach der ursprünglichen Ermittlung hinzugefügt werden.

So wie es ist, scheint es auszureichen, unten etwas wegzunehmen (daher ), \hladdbelow-2ptaber Sie können mit den Werten experimentieren, wenn Sie eine andere Anpassung wünschen.


Die hier gezeigte Einstellung erzeugt (unter Verwendung cmttder Schriftart):

Bildbeschreibung hier eingeben

Antwort2

Sie können einfach \colorboxanstelle von verwenden \hl, vorausgesetzt, dass die hervorgehobene Sequenz am Zeilenende nicht umbrochen wird:

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

Bildbeschreibung hier eingeben

Ich habe keine InconsolataSchriftart, deshalb habe ich sie geändert.

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

Antwort3

Anscheinend \hl{}enthält das Makro eine Funktion \strutzum Anpassen der Tiefe des Felds, sodass es dieselbe Tiefe hat, wenn es Zeichen mit Unterlängen (wie Q) enthält und wenn nicht. Dadurch wird sichergestellt, dass die Höhe des Felds konsistent ist.

Allerdings erscheint uns die Tiefe vielleicht für die gewählte Schriftart etwas zu groß.

Sie können das Ergebnis genauer steuern, wenn Sie Tikz verwenden (was für dieses Problem zugegebenermaßen übertrieben ist). Hier ist eine Lösung:

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

Ergebnis

Früher habe ich \vphantom{Q}dasselbe Ziel erreicht wie mit \strut, aber diese Lösung erzeugt eine geringere Kastentiefe. Sie können auch die entfernen \vphantom{Q}, sodass die Tiefe des Kastens genau zu seinem Inhalt passt, aber dies würde unterschiedliche Kastentiefen für Q und K erzeugen, was meiner Meinung nach nicht gut aussieht.

Der Vorteil der Verwendung von TikZ besteht darin, dass Sie problemlos andere Effekte wie abgerundete Ecken, unregelmäßige Kanten usw. erzielen können. Beispiel:

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

erzeugt:

Ergebnis2

Und

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

erzeugt:

Ergebnis3

Das ist hässlich, zeigt aber die Möglichkeiten :-)

Aktualisieren

Beachten Sie, dass die Ausrichtung mit dem umgebenden Text beeinträchtigt werden kann, wenn Sie die Form des hervorgehobenen Blobs zu sehr variieren. Dies kann behoben werden, indem Sie den Begrenzungsrahmen der Tikz-Zeichnung genau auf die Form des hervorgehobenen Textes einstellen, sodass der „Blob“ über diesen Begrenzungsrahmen hinausragt.

Das folgende Beispiel verdeutlicht, was ich meine:

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

Ergebnis:

Ergebnis4

verwandte Informationen