使用Regexp替换Latex文件中的数学表达式

时间:2009-08-27 17:46:04

标签: regex latex replace

我正在尝试用粗体版本替换数学环境中的字符。不幸的是,这些字符也出现在文本的其余部分中。

我的文字:

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

text textG text $G$ text.

每个G里面     \ begin {align} \ end {align} 和美元符号之间     $ G $ 应改为

\ mathbf {G}。

其他人将保持不变。

我很欣赏每一个想法:)

谢谢

大编辑: 到目前为止,我有一个工作程序(Python),感谢stackoverflow中的建议和其他一些发现。

但该程序将f.e \ quad 替换为 \ q“替换”广告 。如果我想用 “替换” 替换所有 “u”

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 个答案:

答案 0 :(得分:2)

单独使用正则表达式很难做到这一点。你用的是什么语言?它是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

答案 1 :(得分:0)

这将在对齐块中找到G

s/(?<=\\begin\{align\})(((?!\\end\{align\}).)*?)G/{$1}\mathbf{G}/g

答案 2 :(得分:0)

要真正解决这个问题,您需要编写一个解析器。解析一般TeX是一项可能委婉地称为非平凡的任务(尝试通过TeX运行this file),但对于典型的LaTeX数学表达式,您可以从matplotlib's parser开始并破解它以进行所需的替换。它仍然不会是微不足道的,但也不应该是不可克服的。