
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
Aktualisieren
Mithilfe der Antwort von Stephan Lehmke wurde das Problem gelöst, auch wenn Inconsolata
die Schriftart verwendet wird, und die Ausrichtung bleibt erhalten, einfach großartig!
Antwort1
Seltsamerweise soul
bietet 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 soul
Befehle \ul
und \st
verwenden \hl
grundsä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-2pt
aber Sie können mit den Werten experimentieren, wenn Sie eine andere Anpassung wünschen.
Die hier gezeigte Einstellung erzeugt (unter Verwendung cmtt
der Schriftart):
Antwort2
Sie können einfach \colorbox
anstelle von verwenden \hl
, vorausgesetzt, dass die hervorgehobene Sequenz am Zeilenende nicht umbrochen wird:
\newcommand{\hlc}[2][yellow]{{\fboxsep1pt\colorbox{#1}{#2}}}
Ich habe keine Inconsolata
Schriftart, 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 \strut
zum 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}
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:
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:
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: