我正在做一个项目,想显示一个氨基酸序列。我想让 tex 决定在哪里放置换行符,但它似乎无法与使用 colorbox 突出显示序列的某些部分一起使用。
目前的情况如下
下面的源代码产生了上面的图像。
\begin{lstlisting}[escapechar=!]
>unknown protein sequence
!\colorbox{red}{MELFMKNSSLWGLKFYLFCLFIILSNINRAFASHNIFLDLQSS}!SAISVKNVHRTRFHFQPPKHWINDPNAP!\colorbox{red}{MYYNG}!!\colorbox{red}{VY}!HLFYQYNPKGSVWGNIIWAHSVSKDLINWIHLEPAIY!\colorbox{red}{PSKKFDKYGTWSGSSTILPNNKPVIIYTGVVDSYNNQVQNYAIPANLSDPFLRKWIKPNNNPL}!IVPDNSINRTEFRDPTTA!\colorbox{red}{WMGQDGLWRILIASMRKHRGMALLYRSRDFMKWIKAQ}!!\colorbox{red}{HPLHSSTN}!!\colorbox{red}{TGNWECPDFFPVLFNSTNGLDVSYR}!GKNVKYVLKNSLDVARFD!\colorbox{red}{YYTIGMYHTKIDRYIPNNNSIDGWKGL}!RIDYGNFYASKTFYDPSRNRRVIWGWSNESDVLPDDEIKKGWAGIQGIPRQVWLNLSGKQLLQWPIEELE!\colorbox{red}{TLRKQKVQLNNKKLSKGEM}!FEVKGISASQADVEVLFSFSSLNEAEQFDPRWADLYAQDVCAIKG!\colorbox{red}{STIQGGLGPFGLVTLASKNLEEYTPVFFRVFKAQKSYKILM}!!\colorbox{red}{CSDARR}!SSMR!\colorbox{red}{QNEAMYKPSFAGYVDVDLEDMKKLSLRSLIDNSVVESFGAGGKTCITSRVYPTLAIYDNAHLFVFNNGSETITIETLNAWSMDACKMN}!
\end{lstlisting}
使用以下选项
\lstset{breaklines=true,breakatwhitespace=false}
手动添加换行符是不可能的。任何帮助都将不胜感激
答案1
请参阅此答案底部的不使用任何包的方法。
更新:请参阅底部以获得更加灵活的环境。
(本帖已更新)
使用
alltt
而不是listings
并在输入中进行一些修改:
- 替换
\colorbox
为\ccolorbox
(使用接下来定义的一些宏) - 用以下代码替换
!
非彩色段开头的\!
- 摆脱所有其他
!
以下是代码片段:
\documentclass{article}
\def\cccolorbox#1#2{\ifx#2\relax\let\next\allowbreak\else
\def\next{\colorbox{#1}{#2}\allowbreak\cccolorbox{#1}}\fi\next}
\def\ccolorbox#1#2{\fboxsep0pt\cccolorbox{#1}#2\relax}
\def\!#1{\ifx#1\ccolorbox\allowbreak\expandafter\ccolorbox\else
\ifx#1\end\expandafter\expandafter\expandafter\end\else
#1\allowbreak\expandafter\expandafter\expandafter\!\fi\fi}
\usepackage{alltt}
\usepackage{color}
\begin{document}\pagestyle{empty}
\begin{alltt}
>unknown protein sequence
\ccolorbox{red}{MELFMKNSSLWGLKFYLFCLFIILSNINRAFASHNIFLDLQSS}\!SAISVKNVHRTRFHFQPPKHWINDPNAP\ccolorbox{red}{MYYNG}\ccolorbox{red}{VY}\!HLFYQYNPKGSVWGNIIWAHSVSKDLINWIHLEPAIY\ccolorbox{red}{PSKKFDKYGTWSGSSTILPNNKPVIIYTGVVDSYNNQVQNYAIPANLSDPFLRKWIKPNNNPL}\!IVPDNSINRTEFRDPTTA\ccolorbox{red}{WMGQDGLWRILIASMRKHRGMALLYRSRDFMKWIKAQ}\ccolorbox{red}{HPLHSSTN}\ccolorbox{red}{TGNWECPDFFPVLFNSTNGLDVSYR}\!GKNVKYVLKNSLDVARFD\ccolorbox{red}{YYTIGMYHTKIDRYIPNNNSIDGWKGL}\!RIDYGNFYASKTFYDPSRNRRVIWGWSNESDVLPDDEIKKGWAGIQGIPRQVWLNLSGKQLLQWPIEELE\ccolorbox{red}{TLRKQKVQLNNKKLSKGEM}\!FEVKGISASQADVEVLFSFSSLNEAEQFDPRWADLYAQDVCAIKG\ccolorbox{red}{STIQGGLGPFGLVTLASKNLEEYTPVFFRVFKAQKSYKILM}\ccolorbox{red}{CSDARR}\!SSMR\ccolorbox{red}{QNEAMYKPSFAGYVDVDLEDMKKLSLRSLIDNSVVESFGAGGKTCITSRVYPTLAIYDNAHLFVFNNGSETITIETLNAWSMDACKMN}
\end{alltt}
\end{document}
为了避免出现不规则的盒子,请使用附加功能\strut
:
\def\cccolorbox#1#2{\ifx#2\relax\let\next\allowbreak\else
\def\next{\colorbox{#1}{\strut #2}\allowbreak\cccolorbox{#1}}\fi\next}
(ABC
末尾的 是因为\!ABC
出于测试目的我在蛋白质序列末尾添加了 )
有人可能还会质疑环境的必要性alltt
。只需使用\ttfamily
(在\\
“未知蛋白质序列”后加上)就足够了(\!
对当前版本中检查的代码进行一些修改\end
)。
现在有一个解决方案。它不使用任何包(除了
color
)。将其放在序言中
\catcode`\?=\active\catcode`\!=\active
\newenvironment{proteinlisting}
{\fboxsep0pt\catcode`\?=\active\catcode`\!=\active
\def!##1{\ifx##1!\let\next!\else
\ifx##1?\let\next?\else
\ifx##1\end\let\next\end\else
##1\allowbreak\let\next!\fi\fi\fi\next}%
\def?##1{\ifx##1!\let\next!\else
\ifx##1?\let\next?\else
\ifx##1\end\let\next\end\else
\colorbox{red}{\strut ##1}\allowbreak\let\next?\fi\fi\fi\next}%
\ttfamily}{\par}
\catcode`\?=12 \catcode`\!=12
然后?
在序列中使用彩色段作为前缀,并在环境!
内使用无色段 作为前缀proteinlisting
:
\begin{proteinlisting}
\noindent>unknown protein sequence\\
\noindent?MELFMKNSSLWGLKFYLFCLFIILSNINRAFASHNIFLDLQSS!SAISVKNVHRTRFHFQPPKHWINDPNAP?MYYNG?VY!HLFYQYNPKGSVWGNIIWAHSVSKDLINWIHLEPAIY?PSKKFDKYGTWSGSSTILPNNKPVIIYTGVVDSYNNQVQNYAIPANLSDPFLRKWIKPNNNPL!IVPDNSINRTEFRDPTTA?WMGQDGLWRILIASMRKHRGMALLYRSRDFMKWIKAQ?HPLHSSTN?TGNWECPDFFPVLFNSTNGLDVSYR!GKNVKYVLKNSLDVARFD?YYTIGMYHTKIDRYIPNNNSIDGWKGL!RIDYGNFYASKTFYDPSRNRRVIWGWSNESDVLPDDEIKKGWAGIQGIPRQVWLNLSGKQLLQWPIEELE?TLRKQKVQLNNKKLSKGEM!FEVKGISASQADVEVLFSFSSLNEAEQFDPRWADLYAQDVCAIKG?STIQGGLGPFGLVTLASKNLEEYTPVFFRVFKAQKSYKILM?CSDARR!SSMR?QNEAMYKPSFAGYVDVDLEDMKKLSLRSLIDNSVVESFGAGGKTCITSRVYPTLAIYDNAHLFVFNNGSETITIETLNAWSMDACKMN
\end{proteinlisting}
输出与上一个提案相同。环境可以定制为使用其他颜色和更多标记,对于不同的颜色,只需模仿代码即可。
好的,下面是最终版本之一。在文档的序言中:
\catcode`\?=\active \catcode`\!=\active
\newenvironment{proteinseqlst}[1][60]
{\fboxsep0pt \catcode`\?=\active \catcode`\!=\active
\ttfamily
\setbox0=\hbox{A}\hsize=\wd0 \multiply\hsize by #1\relax
\def!##1{\ifx##1!\let\next!\else
\ifx##1?\let\next?\else
\ifx##1\end\let\next\end\else
##1\allowbreak\let\next!\fi\fi\fi\next}%
\def?##1##2{\ifx##2!\let\next!\else
\ifx##2?\let\next?\else
\ifx##2\end\let\next\end\else
\colorbox{##1}{\strut ##2}\allowbreak\def\next{?{##1}}\fi\fi\fi\next}%
}{\par}
\catcode`\?=12 \catcode`\!=12
此环境排版氨基酸序列,每行字母数作为可选参数指示(因此在方括号内)。默认值为 60。源中的换行符是允许的,并且不会影响输出(但不能有空行,否则 tex 运行时会出现错误)。
此环境允许使用任意颜色。将所需颜色放在 后的括号内?
。将 放在无色段的前缀中!
。请注意, xcolor
语法为 是?{yellow!20}
允许的,!
括号内的 将被处理为xcolor
,而不是环境定义。
并且 tex 运行不会在日志文件中产生过满框警告。
输入如下(每行输入任意 53 个字符,对输出没有影响):
\begin{proteinseqlst}[40]
\noindent>unknown protein sequence\\
\noindent
?{yellow}MELFMKNSSLWGLKFYLFCLFIILSNINRAFASHNIFLDLQSS!
SAISVKNVHRTRFHFQPPKHWINDPNAP?{blue}MYYNG?{green}VY!HL
FYQYNPKGSVWGNIIWAHSVSKDLINWIHLEPAIY?{red}PSKKFDKYGTWS
GSSTILPNNKPVIIYTGVVDSYNNQVQNYAIPANLSDPFLRKWIKPNNNPL!I
VPDNSINRTEFRDPTTA?{green}WMGQDGLWRILIASMRKHRGMALLYRSR
DFMKWIKAQ?{yellow}HPLHSSTN?{blue}TGNWECPDFFPVLFNSTNGL
DVSYR!GKNVKYVLKNSLDVARFD?{yellow}YYTIGMYHTKIDRYIPNNNS
IDGWKGL!RIDYGNFYASKTFYDPSRNRRVIWGWSNESDVLPDDEIKKGWAGI
QGIPRQVWLNLSGKQLLQWPIEELE?{blue}TLRKQKVQLNNKKLSKGEM!F
EVKGISASQADVEVLFSFSSLNEAEQFDPRWADLYAQDVCAIKG?{red}STI
QGGLGPFGLVTLASKNLEEYTPVFFRVFKAQKSYKILM?{blue}CSDARR!S
SMR?{red}QNEAMYKPSFAGYVDVDLEDMKKLSLRSLIDNSVVESFGAGGKT
CITSRVYPTLAIYDNAHLFVFNNGSETITIETLNAWSMDACKMN
\end{proteinseqlst}
输出为:
答案2
这是我在 Python 中快速而肮脏的解决方案
def protein_to_listing(protein_sequence, contaminated_indexes, max_line_length=50):
lines = collections.defaultdict(str)
ref_lines = collections.defaultdict(str)
index = 0
for aa_index, aa in enumerate(protein_sequence):
contaminated = aa_index in contaminated_indexes
if len(ref_lines[index]) == max_line_length:
index += 1
if contaminated:
lines[index] += aa
else:
lines[index] += "!\colorbox{green}{%s}!" % aa
ref_lines[index] += aa
return lines
结果如下:
不幸的是,线条没有右对齐。好像颜色框增加了一点空间。