Использование Regexp для замены математического выражения внутри Latex File - PullRequest
1 голос
/ 27 августа 2009

Я пытаюсь заменить символы в математической среде их полужирными версиями. К сожалению, эти символы встречаются и в остальной части текста.

Мой текст:

text text text text Gtext G G text ....
\begin{align}
f&=gG \\
G &= tG
\end{align}

text textG text $G$ text.

Каждый Г внутри \ begin {align} \ end {align} и между знаками доллара $ G $ должны быть заменены на

\ mathbf {G}.

Остальные должны остаться нетронутыми.

Я ценю каждую идею:)

Спасибо

БОЛЬШОЕ РЕДАКТИРОВАНИЕ: Пока у меня есть рабочая программа (Python), благодаря совету и некоторым другим выводам в stackoverflow.

Но программа заменяет f.e \ quad на \ q "заменить" на . если я хочу заменить все "u" s на "replace" .

from tempfile import mkstemp
from shutil import move
from os import remove, close
import shutil

def replace(file, outputfile, pattern, subst, boundary1, boundary2):
    #Create temp file
    fh, abs_path = mkstemp()
    newfile="tempfile.tmp"
    new_file = open(newfile,'w')
    old_file = open(file)
    inAlign=False
    for line in old_file:
        if boundary1 in line:
              inAlign = True

        if inAlign:
            print line
            print line.replace(pattern, subst)

            new_file.write(line.replace(pattern, subst))
        else:
            new_file.write(line)

        if boundary2 in line:
            inAlign = False;



    #close temp file

    new_file.close()
    close(fh)
    old_file.close()

    shutil.move(newfile,outputfile)

replace("texfile.tex","texfile_copy.tex","G", "\\mathbf{G}", "\\begin{align}", "\\end{align}")

Надеюсь, я правильно отформатировал ...

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

Это будет трудно невозможным только с помощью регулярных выражений. Какой язык вы используете? Это Perl, есть модуль LaTeX :: TOM, который вам очень поможет.

Однако, если вы знаете, что ваши теги \begin и \end всегда находятся на отдельной строке, будет работать следующий псевдокод:

foreach (line in file)
    if line.matches( /\\begin{align}/ )
        inAlign = true
    end

    if inAlign
        line.replace( /(G)/\\mathbf{$1}/ )
    else
        line.replace( /\$(G)\$/\$\\mathbf{$1}\$/ )
    end

    if line.matches( /\\end{align}/ )
        inAlign = false;
    end
end
0 голосов
/ 14 сентября 2009

Чтобы действительно решить эту проблему, вам нужно написать парсер. Разбор общего TeX - это задача, которая может быть эвфемистически названа нетривиальной (попробуйте запустить этот файл через TeX), но для типичных математических выражений LaTeX вы можете начать с синтаксического анализатора matplotlib и взломать его для выполнения замены вы хотите. Это все еще не будет тривиальным, но и не должно быть непреодолимым.

0 голосов
/ 27 августа 2009

Это найдет G s внутри блоков выравнивания:

s/(?<=\\begin\{align\})(((?!\\end\{align\}).)*?)G/{$1}\mathbf{G}/g
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...