我需要写下序列比对(分子生物学)。在我看来,使用 LaTeX 几乎不可能实现这一点。由于我是 LaTeX 新手,有人能给我一些提示吗?我尝试尽可能好地复制我想要的内容。这就是我想在 pdf 文档中得到的内容。
AGCATT--ATATTCTAAATTT (Reference sequence)
|||||||||||||x|||
CATTAGATA--CTTAA (Query sequence)
谢谢您的任何评论。
答案1
答案2
这是一个具有方便语法的实现,使用expl3
。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{xparse}
\providecommand{\textbar}{$|$}
\ExplSyntaxOn
\NewDocumentCommand{\sequence}{O{}m}
{
\group_begin:
\keys_set:nn { egreg/sequence } { #1 }
\egreg_sequence:n { #2 }
\group_end:
}
\NewDocumentCommand{\sequencesetup}{m}
{
\keys_set:nn { egreg/sequence } { #1 }
}
\keys_define:nn { egreg/sequence }
{
top .tl_set:N = \l_egreg_sequence_top_tl,
bottom .tl_set:N = \l_egreg_sequence_bot_tl,
width .tl_set:N = \l_egreg_sequence_wd_tl,
sfont .tl_set:N = \l_egreg_sequence_sfont_tl,
lfont .tl_set:N = \l_egreg_sequence_lfont_tl,
top .initial:n = {Reference~sequence},
bottom .initial:n = {Query~sequence},
width .initial:n = 0.75em,
}
\seq_new:N \l__egreg_sequence_rows_seq
\cs_new_protected:Nn \egreg_sequence:n
{
\seq_set_split:Nnn \l__egreg_sequence_rows_seq { \\ } { #1 }
\begin{tabular}{@{}ll@{}}
\tl_use:N \l_egreg_sequence_sfont_tl
\tl_map_function:fN
{ \seq_item:Nn \l__egreg_sequence_rows_seq { 1 } }
\egreg_sequence_item:n &
\tl_use:N \l_egreg_sequence_lfont_tl
(\l_egreg_sequence_top_tl) \\
\tl_use:N \l_egreg_sequence_sfont_tl
\tl_map_function:fN
{ \seq_item:Nn \l__egreg_sequence_rows_seq { 2 } }
\egreg_sequence_item:n &
\\
\tl_use:N \l_egreg_sequence_sfont_tl
\tl_map_function:fN
{ \seq_item:Nn \l__egreg_sequence_rows_seq { 3 } }
\egreg_sequence_item:n &
\tl_use:N \l_egreg_sequence_lfont_tl
(\l_egreg_sequence_bot_tl) \\
\end{tabular}
}
\cs_generate_variant:Nn \tl_map_function:nN { f }
\cs_new_protected:Nn \egreg_sequence_item:n
{
\makebox[\l_egreg_sequence_wd_tl]
{
\token_if_eq_charcode:NNTF #1 |
{ \textbar }
{ \token_if_eq_charcode:NNF #1 . { #1 } }
}
}
\ExplSyntaxOff
\begin{document}
\section*{Standard}
\sequence{
AGCATT--ATATTCTAAATTT \\
..|||||||||||||x||| \\
..CATTAGATA--CTTAA
}
\section*{With options}
\sequence[
top=Séquence de référence,
bottom=Séquence de requête,
sfont=\ttfamily,
width=0.5em,
]{
AGCATT--ATATTCTAAATTT \\
..|||||||||||||x||| \\
..CATTAGATA--CTTAA
}
\section*{With setup}
\sequencesetup{
top=Séquence de référence,
bottom=Séquence de requête,
sfont=\ttfamily,
width=0.5em,
}
\sequence[lfont=\bfseries]{
AGCATT--ATATTCTAAATTT \\
..|||||||||||||x||| \\
..CATTAGATA--CTTAA
}
\end{document}
输入在\\
标记处被拆分,然后三行排版,每个字符位于一个框中(可自定义宽度)。末尾的标签添加到顶部和底部行(也可自定义)。序列(key sfont
)的字体和标签(key lfont
)是独立的。