列表的背景颜色没有正确换行

列表的背景颜色没有正确换行

我正在做一个项目,想显示一个氨基酸序列。我想让 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并在输入中进行一些修改:

  1. 替换\colorbox\ccolorbox(使用接下来定义的一些宏)
  2. 用以下代码替换!非彩色段开头的\!
  3. 摆脱所有其他!

以下是代码片段:

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

输出为:

例如每行 40 个字母

答案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

结果如下:在此处输入图片描述

不幸的是,线条没有右对齐。好像颜色框增加了一点空间。

相关内容