我正在尝试用粗体版本替换数学环境中的字符。不幸的是,这些字符也出现在文本的其余部分中。
我的文字:
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}")
希望我的格式正确......
答案 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开始并破解它以进行所需的替换。它仍然不会是微不足道的,但也不应该是不可克服的。