2010-03-16 4 views
4

LaTeX을 사용하고 있는데 문자열 조작과 관련하여 문제가 있습니다. 문자열의 모든 문자에 작업을 적용하고 싶습니다. 특히 모든 문자 "x"를 "\ discretionary {} {} {} x"로 바꾸고 싶습니다. 나는 에서 임의의 포인트를 분리 할 수 ​​있도록 긴 문자열 (DNA)을 가지고 있기 때문에 을하고 싶습니다.라텍스 - 문자열의 모든 문자에 연산 적용

따라서 모든 문자 다음에 수동으로 \ {{{{{{{{{{{{{{{{{{{{{}}}을 수동으로 삽입하는 대신 "myDNA"라는 명령을 사용하고 싶습니다.

이것이 가능합니까? 나는 웹을 둘러 보았고,이 주제에 관한 많은 도움이되는 정보를 가지고 있지 않았다. 적어도 도움이 될만한 정보가 있으리라.

--edit 는 명확히하기 :

 

    the dna sequence is CTAAAGAAAACAGGACGATTAGATGAGCTTGAGAAAGCCATCACCACTCA 
    AATACTAAATGTGTTACCATACCAAGCACTTGCTCTGAAATTTGGGGACTGAGTACACCAAATACGATAG 
    ATCAGTGGGATACAACAGGCCTTTACAGCTTCTCTGAACAAACCAGGTCTCTTGATGGTCGTCTCCAGGT 
    ATCCCATCGAAAAGGATTGCCACATGTTATATATTGCCGATTATGGCGCTGGCCTGATCTTCACAGTCAT 
    CATGAACTCAAGGCAATTGAAAACTGCGAATATGCTTTTAATCTTAAAAAGGATGAAGTATGTGTAAACC 
    CTTACCACTATCAGAGAGTTGAGACACCAGTTTTGCCTCCAGTATTAGTGCCCCGACACACCGAGATCCT 
    AACAGAACTTCCGCCTCTGGATGACTATACTCACTCCATTCCAGAAAACACTAACTTCCCAGCAGGAATT 

그냥 일반 바꿈, 하이픈없이 : 내가 완성 된 문서에 표시 할 것은이 같은 것입니다. DNA 서열은 공백없이 하나의 긴 문자열이 될 것이지만 어느 시점에서든 깨질 수 있습니다. 이것이 나의 아이디어가 모든 문자 다음에 "\ 임의의 {} {} {}"를 가려서 어떤 하이픈도 삽입하지 않고 어느 시점에서든 깨질 수있는 이유입니다.

+0

임의 하이픈에'\ - '를 사용할 수 없습니까? Wayyyyy 짧아. 나는 여전히 자동 배치에 대해 생각하고있다. – Cascabel

+0

내 생각에 LaTeX에 하이픈을 넣을 수있는 방법이 있어야합니다 (아직 찾을 수 없음). 그것은 확실히 당신이 그것을 끌 수 있습니다! – Cascabel

+0

어쩌면, 당신이 다음과 같은 일을 할 수 있었다면 : 어디에서든지 짧은 문자열을 하이픈 넣으라고 말하고 기본 하이픈 문자를 "아무것도"로 설정하십시오; 그때 내 요구를 만족시킬 것입니다 – hroest

답변

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}과 같습니다.

\ discretionary {} {} {} 대신 \ 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도 제거해야합니다.


편집 :

또한 DNA 데이터 또는 긴 숫자를 인쇄 할 것 같다 seqsplit 패키지가있다. 그들은 또한 더 좋은 출력을위한 몇 가지 옵션을 가지고 있습니다. 그래서 아마도 당신이 찾고있는 것입니다 ...

+1

하지만 자유 재량권을 \ hspace {0pt}로 변경할 수 있습니다. 실제로 TeX를 알 수있는 길! – Cascabel

+0

은 불행하게도 나는 그것이하는 일/작동 방식을 이해하지 못한다. 고마워요. – hroest

+0

예를 들어 주제가 좀더 복잡하고 적응하기까지 다소 시간이 걸렸지 만, 주제별로 Tex에서 나 자신을 배웠습니다. 기본적으로 그것이하는 일은 목록에서 패턴 매칭입니다. 그래서 첫 번째 문자를 가져 와서 변환 한 다음 나머지 문자열을 호출합니다. – Debilski

-2
  1. 문자열이 동일하다고 가정하면 서문에서 \newcommand{}{}을 사용하십시오. 이처럼 : 그것은 당신의 요구 사항을 충족하지 않는 경우 \newcommand{\myDNA}{blah blah blah}

, 내가 제안 : 작은 부분에 이르기까지 2. 브레이크 문자열, 다음 순서로 새 명령을 호출 한 다음 \newcommand을 사용 : \myDNA1 \myDNA2을.

여전히 작동하지 않는다면 문자열 교체 요구 사항을 충족시키기 위해 perl 스크립트를 작성하는 것이 좋습니다.

+0

기본적으로 공백없이 하나의 긴 문자열이 있습니다 (위의 예를 참조하십시오). 모든 문자에 명령 (예 : "이 텍스트 삽입")을 적용하고 싶습니다. perl 스크립트에 대해 생각해 봤지만 나는 그 스크립트 없이는 할 수 있기를 바랬다. 편집하기 전에 매번 전처리하는 것이별로 재미있는 일은 아닙니다 ... – hroest

+0

환상적인 축 어적 환경을 바라 보았습니까? 나는 그것을 볼 시간이 없지만, 당신은 항상 글꼴을 바꾸고, 인라인 한 멋진 축 어적 인 환경을 열고, 환경이 그 일을하도록 시도 할 수있었습니다. 이 방법이 효과가 있는지 나는 잘 모르겠지만, 마지막 시도로서, 그것은 가치있는 일이 될지도 모릅니다. – Mica

3

\say은 필요 없지만 Debilski의 게시물은 분명히 확실한 방법입니다. 더 신축성이 없기 때문에 나는 당신의 예를 시도 할 때 나는 비정형 마진 결국 -

\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의 사용 : 여기에 몇 가지 LaTeX의 내부 바로 가기 (\@gobble\@ifnextchar)을 사용한다 짧은 방법이있다 . \hskip은 각 문자 사이에 약간의 신축성있는 접착제를 추가합니다 (그리고 나중에 \unskip은 우리가 추가 한 여분의 것을 취소합니다). 또한 "최종 사용자"매크로는 모두 소문자 인 LaTeX 스타일 규칙에 유의하십시오. 내부 매크로는 사용자가 실수로 호출하지 않도록 어딘가에 @을 가지고 있습니다. 이것이 어떻게 작동하는지는 파악하려면

\@gobble은 (해당 분기가 $ 다음 문자 때에 만 실행하기 때문에,이 케이스 $에) 그것의 앞에있는 어떤 먹는다. 가장 중요한 점은 \[email protected]은 "else"브랜치에 하나의 인수 만 주어지기 때문에 그 인수를 다음 char (즉, $이 아님)과 바꿉니다. 우리는 단지 \def\hyphenate#next#1{#1\hskip...\[email protected]}을 쓰고 "else"브랜치에 args가없는 것을 넣을 수는 있지만 (내 의견으로는) \[email protected]이 더 일반적입니다. (이미 표준 LaTeX에서는 그렇지 않습니다.) 놀랍습니다.

+0

예, '\ hskip'이 (가) 그렇게하는 것처럼 보입니다. – Debilski

0

조판 DNA 서열을 다루는 contrib package on CTAN가 있습니다. 예를 들어 줄 바꿈보다 약간 더 많은 작업을 수행합니다. 예를 들어 색상 지정도 지원합니다. 그래도 출력물을 얻는 것이 가능한지 확실하지 않으며 DNA 시퀀스 조판 영역에 대한 경험이 없지만 긴 문자열 하나를 가장 쉽게 읽을 수 있습니까?