
Я хочу выделить некоторые буквы, которые представляют собой аминокислотную последовательность белка, используя разные цвета. Код ниже работает нормально, но выделенный блок не соответствует буквам в точности, как вы можете видеть в выводе 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};}
производит:
и
\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};}
производит:
Это некрасиво, но показывает возможности :-)
Обновлять
Обратите внимание, что если вы слишком сильно запутаетесь с формой подсвечивающей капли, это может повлиять на выравнивание с окружающим текстом. Это можно исправить, установив ограничивающую рамку рисунка 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;
}}
Результат: