2010-03-16 44 views
4

我正在使用LaTeX,并且我有关于字符串操作的问题。 我想要对字符串的每个字符进行操作,具体来说是 我想用“\ discretionary {} {} {} x”替换每个字符“x”。我想这样做 这是因为我有一个长字符串(DNA),我希望能够在任何时间点在 处分开而没有连字符。乳胶 - 对字符串中的每个字符应用操作

因此,我希望有一个名为“myDNA”的命令,可以替代 手动插入每个字符之后的\ discretionary {} {} {}。

这可能吗?我浏览过网页,并没有多少帮助 关于这个主题的信息(至少没有任何我能理解),我希望 ,你可以帮助。

--edit 澄清: 我想完成的文档中看到的是这样的:

 

    the dna sequence is CTAAAGAAAACAGGACGATTAGATGAGCTTGAGAAAGCCATCACCACTCA 
    AATACTAAATGTGTTACCATACCAAGCACTTGCTCTGAAATTTGGGGACTGAGTACACCAAATACGATAG 
    ATCAGTGGGATACAACAGGCCTTTACAGCTTCTCTGAACAAACCAGGTCTCTTGATGGTCGTCTCCAGGT 
    ATCCCATCGAAAAGGATTGCCACATGTTATATATTGCCGATTATGGCGCTGGCCTGATCTTCACAGTCAT 
    CATGAACTCAAGGCAATTGAAAACTGCGAATATGCTTTTAATCTTAAAAAGGATGAAGTATGTGTAAACC 
    CTTACCACTATCAGAGAGTTGAGACACCAGTTTTGCCTCCAGTATTAGTGCCCCGACACACCGAGATCCT 
    AACAGAACTTCCGCCTCTGGATGACTATACTCACTCCATTCCAGAAAACACTAACTTCCCAGCAGGAATT 

只是普通的换行,没有任何连字符。 DNA序列将是一个长的字符串,没有任何空格或任何东西,但它可以随时中断。 这就是为什么我的想法是在每个 字符后面加上一个“\ discretionary {} {} {}”,这样它就可以在任何时候中断而不插入任何连字符。

+0

你不能使用'\ -'作为自由连字吗? Wayyyyy更短。我仍在考虑自动放置。 – Cascabel 2010-03-16 20:34:17

+0

我的想法是,必须有一种方法(无法找到它)告诉LaTeX它可以在任何地方连字符。它当然可以让你关掉它! – Cascabel 2010-03-16 20:41:34

+0

也许,如果你能够做到以下几点:告诉它在任何地方连字符连字符短文本,并将默认连字符设置为“无”;那么它会满足我的需求 – hroest 2010-03-16 20:43:57

回答

6

这需要一个字符串作为参数,每个字符后调用\discretionary{}{}{}。输入字符串停在第一个美元符号,所以你不应该使用它。

\def\hyphenateWholeString #1{\xHyphenate#1$\wholeString} 

\def\xHyphenate#1#2\wholeString {\if#1$% 
\else\say{#1}\discretionary{}{}{}% 
\takeTheRest#2\ofTheString 
\fi} 

\def\takeTheRest#1\ofTheString\fi 
{\fi \xHyphenate#1\wholeString} 

\def\say#1{#1} 

你会称之为\ hyphenateWholeString {CTAAAGAAAACAGGACG}。

代替\ {裁量} {} {}你也可以尝试\ {HSPACE} 0pt,如果你喜欢,更多的(并且是在乳胶环境)。为了调整正确的边距,我认为你需要做一些更好的调整(但请参见下文)。通过使用固定宽度的字体,效果当然是最小化的。

修订:用\hskip

\def\hyphenateWholeString #1{\xHyphenate#1$\wholeString\unskip} 

\def\xHyphenate#1#2\wholeString {\if#1$% 
\else\transform{#1}% 
\takeTheRest#2\ofTheString\fi} 

\def\takeTheRest#1\ofTheString\fi 
{\fi \xHyphenate#1\wholeString} 

\def\transform#1{#1\hskip 0pt plus 1pt} 

史蒂夫的建议听起来是一个非常好的主意给我,所以我做了一些修改。请注意,我已将\say宏重命名并使其更有用,因为它现在实际进行了转换。 (但是,如果您从\transform删除\hskip,则还需要删除主宏定义中的\unskip


编辑:

也有seqsplit包这似乎用于打印DNA数据或长编号,以制成。他们也带来了一些更好的输出选择,所以也许这就是你要找的...

+1

但是,您可以将自由裁量更改为\ hspace {0pt},并且它一定可行!真正了解TeX的方法! – Cascabel 2010-03-16 21:11:46

+0

作品像一个魅力,但不幸的是我不明白它是什么/它是如何工作的。非常感谢 – hroest 2010-03-16 21:18:35

+0

我刚刚从Tex的专题书中了解到我自己,虽然在那里的例子更加复杂,我花了一段时间去适应它... 基本上它是在列表中进行模式匹配。所以它需要第一个字符,转换它,然后用字符串的其余部分调用它自己。 – Debilski 2010-03-16 21:23:38

-2
  1. 假设您的字符串相同,请在序言中使用\newcommand{}{}。就像这样: \newcommand{\myDNA}{blah blah blah}

如果不满足你的要求,我建议: 2.打破串到最小的部分,然后用\newcommand,然后调用新的命令序列:\myDNA1 \myDNA2

如果仍然不工作,你可能想看看在写一个perl脚本,以满足您的字符串替换的需求。

+0

我基本上有一个没有空格的长字符串(参见上面的例子)。我想对每个角色应用一个命令(如“插入此文本”)。我曾想过一个Perl脚本,但我希望没有它可以做。每次在编译之前进行预处理并没有太大的乐趣... – hroest 2010-03-16 20:46:22

+0

您是否考虑过在某种花哨的逐字环境中寻找答案?我没有时间看它,但你总是可以改变字体,打开一个内联花哨的逐字环境,并尝试让环境做好工作。我不知道这是否可行,但作为最后的努力,这可能是值得的工作。 – Mica 2010-03-16 21:10:54

3

Debilski的帖子绝对是一个可靠的方法来做到这一点,虽然\say是没有必要的。下面是利用一些LaTeX的内部快捷方式(\@gobble\@ifnextchar)较短方式:

\makeatletter 
\def\hyphenatestring#1{\[email protected]#1$\unskip} 
\def\[email protected]{\@ifnextchar${\@gobble}{\[email protected]{\hskip 0pt plus 1pt\[email protected]}}} 
\def\[email protected]#1#2{#2#1} 
\makeatother

注意使用的\hskip 0pt plus 1pt代替\discretionary - 当我想你的例子,我结束了一个衣衫褴褛的利润率,因为没有伸展。 \hskip在每个字符之间添加了一些可拉伸的胶水(并且之后取消了我们添加的额外一个)。还要注意LaTeX风格的惯例,即“最终用户”宏全部为小写,而内部宏在某处有一个@,以便用户不会意外地调用它们。

如果你想弄清楚是如何工作的,\@gobble刚吃在它前面的是什么(在这种情况下,$,因为该分支只有当$是下一个字符运行)。重点是\[email protected]只在“else”分支中有一个参数,所以它将该参数与下一个字符交换(不是$)。我们可以写\def\hyphenate#next#1{#1\hskip...\[email protected]},并在“else”分支中没有参数,但是(在我看来)\[email protected]更普遍(我很惊讶它已经不是标准的LaTeX)。

+0

是的,'\ hskip'好像是这样做的。 – Debilski 2010-03-17 00:09:57

0

有一个处理排版DNA序列的contrib package on CTAN。它不仅仅是断线,例如它也支持着色。我不确定是否有可能获得你之后的输出结果,而且我也没有DNA序列排版领域的经验,但是一个长串是最具可读性的表示方式?