我们知道对于识别 LaTeX 公式而言,$
是**内联模式(行内公式)分隔符,$$
是外显模式(独立公式)**分隔符
但笔者要想将 LaTeX 文章放在网页上,不同插件支持识别 LaTeX 的公式分隔符不一样,如 WordPress 网站短代码
$latex
、$
[latex]
、[/latex]
[katex]
、[/katex]
这就需要批量替换文本,在这里笔者用 Python 写了一个简单脚本进行替换
全局替换分隔符
如果是想全局替换分隔符,可以参考如下代码,含义为:
- 将内联模式(行内公式)分隔符
$
替换成[latex display=true]
和[/latex]
- 将外显模式(独立公式)分隔符
$$
替换成[latex]
和[/latex]
content = open('input.txt', 'r', encoding='utf-8')
with open('output.txt', "w", encoding='utf-8') as f:
is_display_head = True # 是否为独立公式首标记
is_inline_head = True # 是否为行内公式首标记
for line in content:
# 执行下面两个循环,将所有 $$ 和 $ 符号替换成对应的 LaTeX 公式标记
for i in range(0, line.count('$$')):
if is_display_head:
line = line.replace('$$', '[math display=true]', 1)
else:
line = line.replace('$$', '[/math]', 1)
is_display_head = not is_display_head
for i in range(0, line.count('$')):
if is_inline_head:
line = line.replace('$', '[math]', 1)
else:
line = line.replace('$', '[/math]', 1)
is_inline_head = not is_inline_head
f.write(line)
f.flush() # 写入硬盘
f.close() # 关闭文件,并刷新
根据特定内容替换分隔符
如果是想根据搜索到特定内容才替换分隔符,可以参考如下代码,含义为:
- 将含有
srch_list_1
中字符串的公式块分隔符替换成[latex display=true]
和[/latex]
- 将含有
srch_list_2
中字符串的公式块分隔符替换成[latex]
和[/latex]
- 未出现上述字符串的公式块分隔符保持不变
import sys
# 搜索列表1:独立公式的特殊标识符
srch_list_1 = ['\\begin']
# 搜索列表2:行内公式的特殊标识符
srch_list_2 = ['\\lim', "\\frac", "\\displaystyle", '|_', "f'_", 'f_']
with open('input.txt', 'r', encoding='utf-8') as content, \
open('output.txt', "w", encoding='utf-8') as f:
# 逐行读取文件内容
for line in content:
# 以 $ 符号为分隔符,将每行字符串拆分成多个单词
words = line.split('$')
# 对于每个 $ 包裹的字符串
for i in range(1, len(words), 2):
# res 表示搜索结果,0 代表没有出现对应字符串,1 表示行内公式,2 表示独立公式
res = 0
# 在搜索列表1中查找字符串
for j in range(len(srch_list_1)):
if srch_list_1[j] in words[i]:
res = 2
break
# 如果搜索列表1中没有出现对应字符串,就在搜索列表2中查找字符串
if res == 0:
for j in range(len(srch_list_2)):
if srch_list_2[j] in words[i]:
res = 1
break
# 根据搜索结果确定分隔符
sep = '$' if res == 0 else '[latex]' if res == 1 else '[latex display=true]'
# 将字符串包裹在分隔符中
words[i] = sep + words[i] + sep
# 将单词列表中的单词重新组合成字符串
line = ''.join(words)
# 将字符串写入输出文件
f.write(line)
# 将缓存中的输出写入硬盘
f.flush()