Обновлять

Обновлять

Я хочу выделить некоторые буквы, которые представляют собой аминокислотную последовательность белка, используя разные цвета. Код ниже работает нормально, но выделенный блок не соответствует буквам в точности, как вы можете видеть в выводе 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}

Выход МВЭ

введите описание изображения здесь

Обновлять
Используя ответ Стефана Лемке, проблема была решена даже при использовании 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

Объяснение:Три soulкоманды \ul, \stпо \hlсути, используют один и тот же код, выбирая только разные значения для размеров \SOUL@uldp(глубина «подсвечиваемого блока») и \SOUL@ulht(высота «подсвечиваемого блока»).

\SOUL@hlpreamble(используется \hl) определяет эти значения "интеллектуально" на основе размера шрифта, но не предлагает интерфейса для настройки. Поэтому я ввожу новые размеры \hladdabove(длина для добавления сверху) и \hladdbelow(длина для добавления снизу), которые добавляются после исходного определения.

На данный момент, кажется, достаточно убрать немного снизу (следовательно, \hladdbelow-2pt), но вы можете поэкспериментировать со значениями, если хотите получить другую корректировку.


Показанная здесь настройка дает (с использованием cmttшрифта):

введите описание изображения здесь

решение2

Вы можете использовать просто \colorboxвместо \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

Связанный контент