在 DNA 序列中用不同颜色排版不同的字符

在 DNA 序列中用不同颜色排版不同的字符

我创建了一个宏,用它来格式化 DNA 序列,因为它们应该采用等宽字体并大写:

\newcommand{\DNA}[1]{\texttt{\uppercase{#1}}}

现在我有一列,不同行上有一些不同的 DNA 序列,比如说:

1 & \DNA{GCATCCAATGCC}\\
2 & \DNA{GGGACCAATGCG}\\
3 & \DNA{TTATCCAATCTC}\

我想用不同的颜色为 DNA 序列中的每个字符(碱基)着色,因为读者可以更轻松地看到某些模式(在本例中是重复出现的 CCAAT 序列,一个假定的 Hap 复合物结合域)。(例如,这里

这意味着,所有 A -> 红色 T -> 绿色 C -> 蓝色 G -> 黑色

有没有办法做到这一点,或者有一个逐字包可以实现这一点?非常感谢您的帮助!

----------

Liu 发布的示例运行良好,但在我的 tabular/floatrow 表中却不行,Tobi 的示例在所有测试环境中都运行良好。

再次感谢大家的大力帮助!

答案1

像这样?

[编辑:我修改了示例,因此它不会影响其他列表。]

\documentclass{article}
\usepackage{listings,xcolor}
\lstdefinestyle{dna}{%
    literate={A}{\textcolor{green}{A}}{1}
        {B}{\textcolor{blue}{B}}{1}
        {C}{\textcolor{red}{C}}{1}
        {a}{\textcolor{green}{A}}{1}
        {b}{\textcolor{blue}{B}}{1}
        {c}{\textcolor{red}{C}}{1},
    basicstyle=\ttfamily,
}
\newcommand{\DNA}[1]{%
    \lstinline[style=dna]{#1}%
}
\begin{document}
\lstinline{ABCabc}\quad\DNA{bbCa}
\section{Somthing about \DNA{abcabcababc}}
\end{document}

您也可以在命令中使用它,例如\section 查看listings手册以获取更多信息。

答案2

(根据 Martin 的建议修改的版本)

\documentclass{article}
\usepackage{xcolor}
\begingroup
\catcode`A\active
\catcode`T\active
\catcode`C\active
\catcode`G\active
\gdef A{\textcolor{red}{\string A}}
\gdef T{\textcolor{green}{\string T}}
\gdef C{\textcolor{blue}{\string C}}
\gdef G{\textcolor{black}{\string G}}
\endgroup

\DeclareRobustCommand\DNA[1]{\begingroup
  \scantokens{%
    \catcode`A\active
    \catcode`C\active
    \catcode`G\active
    \catcode`T\active
    \ttfamily#1\endinput}%
  \endgroup}

\begin{document}

\section{\DNA{ACGT}}

\DNA{ACGTACGT}, \fbox{\DNA{ACGTACGT}}

\end{document}

更专业的选择是使用texshade包裹,尤其是生物学。我差点忘了。对我来说它相当复杂,而且有一些预定义的样式。你最好先阅读手册。

答案3

为了完整起见,这里有一个使用 LuaTeX 的解决方案。我使用 LPEG 解析输入,然后对其应用适当的样式。解决方案在 ConTeXt 中,但将其转换为 LaTeX 应该很容易。

\unexpanded\def\DNA#1%
    {\ctxcommand{dnaparse("#1")}}

\startluacode
  thirddata = thirddata or {}
  thirddata.dna = thirddata.dna or {}
  local dna = thirddata.dna

  dna.attributes ={ 
      A = { color = "red",   style = "mono" },
      T = { color = "green", style = "mono" },
      C = { color = "blue",  style = "mono" },
      G = { color = "black", style = "mono" },
      default = { color = "black", style = "mono"},
    }

  local function format(char)
    local hash = dna.attributes[char] or dna.attributes[default]
    context.style(hash, char)
  end

  local char = lpeg.S("ATCG") / format
  dna.parser = lpeg.Cs(char^0)


  function commands.dnaparse(str)
    dna.parser:match(str)
  end
\stopluacode

\starttext

  \DNA{GCATCCAATGCC}
  \DNA{GGGACCAATGCG}
  \DNA{TTATCCAATCTC}

\stoptext

使用 Lua 的优点是您不必摆弄 catcode。

答案4

新的解决方案,带有解析器。

使用核心 TeX:

\documentclass{article}
\usepackage{color}
\def\dnaA{\textcolor{red}{A}}
\def\dnaT{\textcolor{green}{T}}
\def\dnaC{\textcolor{blue}{C}}
\def\dnaG{\textcolor{black}{G}}
\def\DNA#1{%
  \edef\testchar{#1}%
  \if;\testchar
    \relax
  \else
    \csname dna#1\endcsname
    \expandafter\DNA
  \fi}
\begin{document}
\DNA ACGTAGCTAACCG;
\end{document}

使用 的pgf模块parser

\documentclass{article}
\usepackage{pgf}
\usepgfmodule{parser}
\pgfparserdef{dna}{initial}{\meaning A}{\textcolor{red}{A}}
\pgfparserdef{dna}{initial}{\meaning T}{\textcolor{green}{T}}
\pgfparserdef{dna}{initial}{\meaning C}{\textcolor{blue}{C}}
\pgfparserdef{dna}{initial}{\meaning G}{\textcolor{black}{G}}
\pgfparserdef{dna}{initial}{\meaning ;}{\pgfparserswitch{final}}
\newcommand\DNA{\pgfparserparse{dna}}
\begin{document}
\DNA ACGTAGCTAACCG;
\end{document}

在此处输入图片描述

相关内容