2010-03-16 74 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序列排版領域的經驗,但是一個長串是最具可讀性的表示方式?