アップデート

アップデート

タンパク質のアミノ酸配列を表す文字を、異なる色で強調表示したいです。以下のコードは問題なく動作しますが、強調表示されたボックスが文字にぴったりと収まりません。MWE 出力を見るとわかるように、ボックスは文字の下部に少しずれていて、中央に配置されていません。これを文字の中央に配置するには、どうすればよいでしょうか。

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}

MWE出力

ここに画像の説明を入力してください

アップデート
Stephan Lehmke の回答を使用すると、フォントを使用した場合でもInconsolata配置が保持され、問題が解決されました。すばらしいです!

ここに画像の説明を入力してください

答え1

不思議なことに、soul「ハイライト ブロブ」の位置を調整する機能はあまりありません。

これをプリアンブルに追加することで、垂直位置を調整できます。

\usepackage{etoolbox}

\newdimen\hladdbelow
\newdimen\hladdabove

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

\hladdbelow-2pt
%\hladdabove1pt

説明:、および の3 つのsoulコマンドは基本的に同じコードを使用しますが、寸法(「強調表示ブロック」の深さ) と(「強調表示ブロック」の高さ) に異なる値を選択するだけです。\ul\st\hl\SOUL@uldp\SOUL@ulht

\SOUL@hlpreamble( によって使用される) は、フォント サイズに基づいてこれらの値を「インテリジェントに」決定しますが、調整用のインターフェイスは提供しません。そのため、元の決定後に追加される新しい寸法(上部に追加する長さ) と(下部に追加する長さ)\hlを導入しています。\hladdabove\hladdbelow

現状では、下部を少し削減するだけで十分なようです\hladdbelow-2ptが (したがって、)、別の調整が必要な場合は値を試してみることができます。


ここで示す設定では、次のようになります (cmttフォントを使用)。

ここに画像の説明を入力してください

答え2

ハイライトされたシーケンスが行末で折り返されないことを前提として、\colorboxの代わりにjust を使用できます。\hl

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

ここに画像の説明を入力してください

フォントがないInconsolataので変更しました。

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

答え3

どうやら、マクロにはボックスの深さを調整するための\hl{}が含まれている\strutようで、ディセンダのある文字 ( などQ) が含まれている場合と含まれていない場合で深さが同じになります。これにより、ボックスの高さが一定になることが保証されます。

ただし、選択したフォントによっては、深さが少し大きすぎるようです。

tikz を使用すると、結果をより細かく制御できます (この問題にはやりすぎですが)。解決策は次のとおりです。

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

結果

以前はを使用して\vphantom{Q}同じ目的を達成していました\strutが、このソリューションではボックスの深さが短くなります。 を削除して\vphantom{Q}、ボックスの深さがその内容物とぴったり一致するようにすることもできますが、これにより Q と K で異なるボックスの深さが生成され、見栄えがよくありません。

TikZ を使用する利点は、丸い角、不規則なエッジなどの他の効果を簡単に実現できることです。例:

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

生成:

結果2

そして

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

生成:

結果3

醜いですが、可能性を示しています :-)

アップデート

強調表示されたブロブの形状をあまりに乱暴にすると、周囲のテキストとの配置が影響を受ける可能性があることに注意してください。これは、強調表示されたテキストの形状に正確に tikz 描画の境界ボックスを設定し、「ブロブ」がこの境界ボックスからはみ出すようにすることで修正できます。

次の例は、私が言いたいことをより明確に示しています。

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

結果:

結果4

関連情報