Латекс - применить операцию к каждому символу в строке - PullRequest
4 голосов
/ 16 марта 2010

Я использую LaTeX и у меня проблема с обработкой строк. Я хочу, чтобы операция применялась к каждому символу строки, особенно Я хочу заменить каждый символ "x" на "\ discretionary {} {} {} x". я хочу делать это потому, что у меня есть длинная строка (ДНК), которую я хочу иметь возможность отделить в любая точка без переносов.

Таким образом, я хотел бы иметь команду myDNA, которая будет делать это вместо меня вставка вручную \ discretionary {} {} {} после каждого символа.

Возможно ли это? Я посмотрел в Интернете, и там не было много полезного информация по этой теме (по крайней мере, не все, что я мог понять), и я надеялся что вы могли бы помочь.

- редактировать Чтобы уточнить: То, что я хочу видеть в готовом документе, выглядит примерно так:


    the dna sequence is CTAAAGAAAACAGGACGATTAGATGAGCTTGAGAAAGCCATCACCACTCA
    AATACTAAATGTGTTACCATACCAAGCACTTGCTCTGAAATTTGGGGACTGAGTACACCAAATACGATAG
    ATCAGTGGGATACAACAGGCCTTTACAGCTTCTCTGAACAAACCAGGTCTCTTGATGGTCGTCTCCAGGT
    ATCCCATCGAAAAGGATTGCCACATGTTATATATTGCCGATTATGGCGCTGGCCTGATCTTCACAGTCAT
    CATGAACTCAAGGCAATTGAAAACTGCGAATATGCTTTTAATCTTAAAAAGGATGAAGTATGTGTAAACC
    CTTACCACTATCAGAGAGTTGAGACACCAGTTTTGCCTCCAGTATTAGTGCCCCGACACACCGAGATCCT
    AACAGAACTTCCGCCTCTGGATGACTATACTCACTCCATTCCAGAAAACACTAACTTCCCAGCAGGAATT

просто разрывы строк без дефисов. Последовательность ДНК будет одна длинная строка без пробелов или чего-либо, но она может оборваться в любой точке. Вот почему моя идея заключалась в том, чтобы вставлять "\ discretionary {} {} {}" после каждого символ, так что он может сломаться в любой точке без вставки дефисов.

Ответы [ 4 ]

6 голосов
/ 17 марта 2010

Принимает строку в качестве аргумента и вызывает \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}, если вам это нравится больше (и вы находитесь в среде латекса).Чтобы выровнять правое поле, я думаю, вам нужно выполнить более тонкую настройку (но см. Ниже).Эффект, конечно, минимизируется использованием шрифта фиксированной ширины.

Редакция:

\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}

Предложение Стива об использовании \hskip звучит как очень хорошая идеядля меня, поэтому я сделал несколько исправлений.Обратите внимание, что я переименовал макрос \say и сделал его более полезным, поскольку теперь он фактически выполняет преобразование.(Однако, если вы удалите \hskip из \transform, вам также необходимо удалить \unskip в определении основного макроса.


Редактировать:

Существует также пакет seqsplit , который, похоже, предназначен для печати данных ДНК или длинных чисел. Они также предоставляют несколько вариантов более качественного вывода, так что, возможно, это то, что вы ищете...

3 голосов
/ 17 марта 2010

Пост Дебильски, безусловно, является надежным способом сделать это, хотя \say не является необходимым. Вот более короткий путь, который использует некоторые внутренние ярлыки LaTeX (\@gobble и \@ifnextchar):

\makeatletter
\def\hyphenatestring#1{\xHyphen@te#1$\unskip}
\def\xHyphen@te{\@ifnextchar${\@gobble}{\sw@p{\hskip 0pt plus 1pt\xHyphen@te}}}
\def\sw@p#1#2{#2#1}
\makeatother

Обратите внимание на использование \hskip 0pt plus 1pt вместо \discretionary - когда я попробовал ваш пример, у меня получилось неровное поле, потому что растяжение отсутствует. \hskip добавляет растяжимый клей между каждым символом (а \unskip впоследствии отменяет добавленный нами дополнительный). Также обратите внимание на соглашение по стилю LaTeX, согласно которому все макросы «конечного пользователя» строчные, в то время как во внутренних макросах где-то есть @, чтобы пользователи случайно не вызывали их.

Если вы хотите выяснить, как это работает, \@gobble просто съедает все, что находится перед ним (в данном случае $, поскольку эта ветвь запускается только тогда, когда $ является следующим символом). Суть в том, что \sw@p дается только один аргумент в ветви "else", поэтому он заменяет этот аргумент следующим символом (это не $). С таким же успехом мы могли бы написать \def\hyphenate#next#1{#1\hskip...\xHyphen@te} и поместить это без аргументов в ветку "else", но (на мой взгляд) \sw@p является более общим (и я удивлен, что он уже не в стандартном LaTeX).

0 голосов
/ 16 марта 2010
  1. Предполагая, что ваша строка такая же, в преамбуле используйте \newcommand{}{}.Например: \newcommand{\myDNA}{blah blah blah}

, если это не удовлетворяет вашим требованиям, я предлагаю: 2. Разбить строки до наименьшей части, затем использовать \newcommand, а затем вызвать новые командыв последовательности: \myDNA1 \myDNA2.

Если это все еще не работает, вы можете захотеть написать скрипт на perl для удовлетворения ваших потребностей в замене строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...