用Python批量替换LaTeX公式首尾标记

我们知道对于识别 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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值