Преобразование научной нотации в формат математического режима TeX - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть несколько уравнений, смешанных по всему документу, которые отображаются в следующих формах:

5^4 %A
3^-1 %B
5.01 x 10^2.05 %C
5.01 x 10^2 %D
-5 x 10^3 %E

Другими словами, они соответствуют формату x^y или z * x^y, где z, x и y могут быть любым целым или рациональным числом (выраженным десятичной точкой), положительным или отрицательным.

Я хочу преобразовать их в математический режим для TeX. E.g.:

$5.01 \cdot 10^2$

При большой помощи других мне удалось создать сценарий BASH с sed для решения пунктов A и B:

sed "s/\-\{0,1\}[0-9]\{1,\}^\-\{0,1\}[0-9]\{1,\}/$&$/" input > output

Это позволяет конвертировать элементы A и B в математический режим, но я обнаружил, что он конвертирует только первое обнаруженное в строке вхождение. Например, если строка говорит 5^10 is greater than 1^2, она преобразует это в $5^10$ is greater than 1^2. Второй проход со сценарием приводит к $$5^10$$ is greater than 1^2.

Мне удалось изменить приведенный выше скрипт для обработки элементов C, D и E, но я не могу понять, как обрабатывать заднюю вторую часть (я пометил его как «???»):

sed "s/\-\{0,1\}[0-9]\{1,\}\ x\ \-\{0,1\}[0-9]\{1,\}^\-\{0,1\}[0-9]\{1,\}/???/" input > output

Это создает проблему:

  • Даже если вышеперечисленное может сработать, если я сначала запускаю первый сценарий sed, а затем запускаю второй, первый смешивает второй, т. Е. Я получаю 5.01 x $10^2.05$. Если бы я сначала запустил второй скрипт, то после запуска второго скрипта я бы получил $5.01 x $10^2.05$$.

Короче говоря, как я могу выполнить этот вид преобразования для всех элементов в документе?

5^4 --> $5^4$
3^-1 --> $3^-1$
5.01 x 10^2.05 --> $5.01 \cdot 10^2.05$
5.01 x 10^2 --> $5.01 \cdot 10^2$
-5 x 10^3 --> $-5 \cdot 10^3$

Ответы [ 3 ]

0 голосов
/ 27 ноября 2011

но я обнаружил, что он преобразует только первое вхождение, найденное в строке

Используйте флаг глобальной замены /g.

Преобразование вашего текста лучше всего сделать за несколько проходов

Проход 1

 sed 's/\(-\?[0-9].\?[0-9]*\) x \(-\?[0-9]\{1,\}\)^\([0-9]\{1,\}\.\?[0-9]*\)/$\1 cdot \2^^\3$/g' input > tmp

То, что мы сделали здесь, это захват \(...\) x \(...\) ^ \(...\) в запоминаемые шаблоны sed\1 \2 и \3, которые мы затем используем для преобразования текста.

Это относится к вашим% C,% D,% E и, например, преобразует 5.01 x 10^2.05 в $5.01 cdot 10^^2.05$.Обратите внимание, что мы временно преобразовали вхождения ^ в ^^.

Pass 2

sed -i 's/-\?[0-9]\+\^-\?[0-9]\+/$&$/g' tmp

Это относится к вашим примерам% A и% B.Поскольку ранее мы конвертировали ^ в 10^2.05 в ^^, на проходе 2 это решение было проигнорировано при решении отмеченных вами проблем.

Проход 3

sed -i 's/\^^/^/g' tmp

, который просто преобразует ^^ обратно в ^

0 голосов
/ 27 ноября 2011

Это может работать для вас:

 sed -i 's/\(-\?[0-9]\+\(\.[0-9]\+\)\? \)x\( -\?[0-9]\+\^-\?[0-9]\+\(\.[0-9]\+\)\?\)\|\(-\?[0-9]\+\^-\?[0-9]\+\)/$\1\\cdot\3\5$/g;s/\$\\cdot/$/g' file

хотя переключатель GNU sed -r делает его намного менее загроможденным:

 sed -ri 's/(-?[0-9]+(\.[0-9]+)? )x( -?[0-9]+\^-?[0-9]+(\.[0-9]+)?)|(-?[0-9]+\^-?[0-9]+)/$\1\\cdot\3\5$/g;s/\$\\cdot/$/g' file
0 голосов
/ 27 ноября 2011

Исходя из того, что вам нужно, сработает ли следующий метод для вас?

[jaypal~/Temp]$ cat file0
5^4
3^-1
5.01 x 10^2.05
5.01 x 10^2
-5 x 10^3

[jaypal~/Temp]$ sed -e 's/^/\$/' -e 's/$/\$/' -e 's/x/\\cdot/' file0
$5^4$
$3^-1$
$5.01 \cdot 10^2.05$
$5.01 \cdot 10^2$
$-5 \cdot 10^3$
...