업데이트

업데이트

다양한 색상을 사용하여 단백질의 아미노산 서열을 나타내는 일부 문자를 강조하고 싶습니다. 아래 코드는 잘 작동하지만 강조 표시된 상자는 문자에 정확하게 맞지 않습니다. 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 출력

여기에 이미지 설명을 입력하세요

업데이트
InconsolataStephan Lehmke의 답변을 사용하면 글꼴과 정렬을 사용하는 경우에도 문제가 해결되었습니다 . 정말 놀랍습니다!

여기에 이미지 설명을 입력하세요

답변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

강조 표시된 시퀀스가 ​​줄 끝에서 줄 바꿈되지 않는다고 가정하면 just \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에 대해 다른 상자 깊이가 생성되므로 IMHO가 보기에 좋지 않습니다.

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

관련 정보