我创建了一个宏,用它来格式化 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}