2009-08-27 3 views
1

数学環境内の文字を太字で置き換えようとしています。残念ながら、これらの文字はテキストの残りの部分でも発生します。Regexpを使用してラテックスファイル内の数式を置き換える

マイテキスト: 内部

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

text textG text $G$ text. 

すべてのG \ {揃える}始める\エンド{揃える} と $ G $ が

に置き換えされなければならないドル記号の間\ mathbf {G}。

その他は変更しないでください。

私はすべてのアイデアに感謝:)

はあなたに

BIG EDITありがとう:これまでのところ を、私は、stackoverflowので助言や他のいくつかの発見のおかげで、作業プログラム(パイソン)を持っています。

しかし、プログラムがf.e \クワッド \ に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}") 

...

+0

なぜfind&replaceを使用しないのですか?その仕事は少しですが、結果はあなたが望む通りに正確になります。 – Mica

+1

厳密に「通常の」表現は、ラテックスのような文脈自由言語を解析するほど強力ではないので、確実に行うことはできません。あなたがたぶん数学モードを頻繁に入れ子にしないように、あなたはほとんどのケースを得るヒューリスティックを見つけることができないと言っているわけではありません。 – dmckee

+0

RE:検索と置換を使うのはなぜですか? これは愚かなモンキーなので、 –

答えて

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 
+0

ご返信ありがとうございます。 私はPerlを使ったことが一度もありませんでした。私はもっと簡単な方法があると考えました。 より多くの文字を別のコマンドに置き換える必要があります。上記は単なる例です。 Perlを "試してみる"とすべての変更をdiffingするのは非常に面倒です。 –

0

これは整列ブロック内Gのを見つける:

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

これを本当に解決するには、パーサーを作成する必要があります。一般的なTeXの構文解析は、些細なこととはまったく別のものです(this fileをTeXで実行してみてください)。しかし、典型的なLaTeX数式では、matplotlib's parserから始めて、必要な置き換えを行うことができます。まだまだ些細なことではありませんが、克服不可能ではありません。

関連する問題