Markdown转LaTeX的Python程序大全(持续更新)

2023-05-16

文章目录

          • 1.双`$$`符号转`\begin`-`\end`型公式
          • 2.将`\matrix{}`域替换为`\begin`-`\end`域
          • 3.删除 LaTeX \LaTeX LATEX中不需要的Markdown关键词

Markdown是做笔记的利器,虽然有 Pandoc这样的工具,但直接转过去的格式通常是没法直接编译成功的。其中一个最大的问题就是公式的转换。

比如在Markdown里面,写不写\begin{equation}这样的代码其实都不会自动编号,所以经常在做笔记的时候索性就不想写了。那么此时通常是用双$$符号来进行公式居中排版,而编号就手动用\tag{1}这样的方式进行。这种方式在Markdown里一时爽,但转成 LaTeX \LaTeX LATEX的时候就非常痛苦了。转换过去的一大通代码无法编译,并且也不好改。当然还有一些非常不同于自己平时的操作,比如它会自动引用一些不太习惯的宏包。这种时候如果手动去修改工作量巨大。

在多次试验过后,发现最简单的方式还是将Markdown的正文部分直接粘到 TeX \TeX TEX的文件中,因为这样至少纯公式的部分就完全不用改动。至于作用域和环境的修改就手动弄一下就好。当然这种做法仍然是不够有效,尤其手动修改的时候十分容易出错,所以我们还是总结一些常用的方法,在从Markdown转向 LaTeX \LaTeX LATEX的时候可以极大的节约我们的时间。

这个工作可能要一边做一边来完善,我们先将一些比较直接有效的方法列出,后续内容持续更新。

1.双$$符号转\begin-\end型公式

方法:思路很简单,将文本全部读出,依次将双$$改为\begin{equation}\end{equation}

def dollar2begin(input_fname,output_fanme):
    f = open(input_fname,'r')
    a = f.read()
    b= ''
    k = 1

    for i in range(100):
        if k%2 ==1:
            b = a.replace("$$",r"\begin{equation}",1)
        else:
            b = a.replace("$$",r"\end{equation}",1)
        a = b
        k += 1
        

    f2 = open(output_fanme,'w')
    f2.write(b)
    f2.close()
    f.close()

调用方式:

input_fname = r'test_input.md'
output_fanme = r'test_output.md'
dollar2begin(input_fname,output_fanme)
2.将\matrix{}域替换为\begin-\end

方法:这个功能的实现稍嫌复杂,涉及好几个问题。首先定位\matrix所在位置,然后定位其后的第一个左括号{ ,这2步相对好实现。而最难的在于找到和左括号完全对应的右括号},这里则需要一定的技巧。所以这里先写出括号匹配的方法,再写出完整的替换代码。

 def getIndex(s, i, targets=['{','}']): 
    if s[i] != targets[0]: 
        return -1
    d = deque() 
    for k in range(i, len(s)): 
        if s[k] is targets[1]: 
            d.popleft() 

        elif s[k] is targets[0]: 
            d.append(s[i]) 
        if not d: 
            return k 
    return -1

输入值:s为原字符串,i为第一个左括号所在的位置,targets表示对应的左手括号。这里写成这样是为了方便其它的作用域修改。比如还可以对方括、圆括甚至于其它的一些作用域。这里实现时采用了双队列,逐步将左括加入,如果遇到右括则匹配成功删除这一对(有点像对对碰)。那么当消除到最后一对时,即找到了想要的右括。由于deque是系统自带,因此可以不用导入相应的库。

完整的\matrix转换方法:

 def change_brackets(org_str, targname =r'\matrix',target_str = [r'\begin{matrix}',r'\end{matrix}']):
    first_ind = 0
    while True:   
        # find the sub_ind of the first bracket after targname
        left_brack = org_str.find(targname,first_ind) + len(targname)
        
        if left_brack > len(targname):
        # find the corresponding right bracket
            right_brack = getIndex(org_str,left_brack)
            org_str = org_str[0 : left_brack : ] +' '+ org_str[left_brack + 1 : :] 
            org_str = org_str[0 : right_brack : ]+target_str[1]+org_str[right_brack + 1 : :]             
            org_str = org_str.replace(targname,target_str[0], 1)
            first_ind = right_brack + 1
        else:
            break
    return org_str

这里为了方便起见,仍然将targname写成了默认类型,同时也对目标域的值进行了指定,所以也可以用于将其它类型进行修改。不过暂时还没发现哪些需要被修改的类型。

3.删除 LaTeX \LaTeX LATEX中不需要的Markdown关键词

这里主要指的就是\tag{0},这一步操作很简单,因为我们编号的时候自己会有一个编号的习惯,所以可以自行将tag中的数值进行枚举再替换。当然最简单的就是用正则,一步到位。这里我们只写一个简单的实现方式,主要是为了写成一个统一的程序时能够方便地一步到位,而不用到处粘来粘去。

def remove_tags(org_str,targname = r'\tag'):
    i = 0 
    first_ind = 0
    while True:   
        # find the sub_ind of the first bracket after targname
        left_brack = org_str.find(targname,first_ind) + len(targname)

        if left_brack > len(targname):
        # find the corresponding right bracket
            right_brack = getIndex(org_str,left_brack)
            org_str = org_str.replace(org_str[left_brack-len(targname):right_brack+1],'')
            i += 1
            print(i)
        else:
            break
    return org_str

这里同样,虽然本意只是为了替换掉\tag{},但同样也可以用于其它同类型的关键词的替换。尤其这个方法可以将任意\label_name{XXX}这种样子的东西全部删掉,可以根据自己的需要进行调整即可。

目前基本上经过上述3步操作,所有在Markdown里能够正常显示的公式就能全部在\LaTeX中直接粘贴使用了。后续如果还有其它的发现,还会继续更新。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Markdown转LaTeX的Python程序大全(持续更新) 的相关文章

  • Yapi-从零搭建接口管理平台

    介绍 旨在为开发 产品 测试人员提供更优雅的接口管理服务 可以帮助开发者轻松创建 发布 维护 API xff1b 官网网址 xff1a YApi 教程 hellosean1025 github io 搭建 其实官网有明确的搭建方法 xff0
  • Sql 数据库细节全解(icelei讲sql)

    磊哥哥讲Sql 一 what who defined1 数据库whatever2 引言导入 二 database and tables guy1 Basic element project definition2 template data
  • 编写一个Shell函数检查Linux系统中某文件的权限是否小于一个值

    我编写了一个Shell函数 xff0c 使用这个函数需要传两个参数 xff1a 文件绝对路径和一个三位整数 通过这个函数可以检查文件权限是否小于等于你给定的值 submod export filepath 61 1 export maxmo
  • codeforces 1328 B. K-th Beautiful String

    题意 xff1a 就是找到第 k k k 个全排列的字符串 通过找规律 xff0c 第一个 b b b 在倒数第二位有
  • 使用python 解ccf-csp 2019-03-1小中大

    传送 问题描述 问题分析 这个题目最大值和最小值很好得到 xff0c 因为已经排好序了 xff0c 只需要判断一下是正序还是反序就可以了 xff0c 至于中位数我们得先清除它的概念 xff0c 如果不清楚 xff0c 也可以从给出来的例子判
  • ubuntu生成anaconda快捷方式

    https blog csdn net weixin 45653050 article details 105636020
  • 编码转换

    编码定义 在计算机硬件中 xff0c 编码 xff08 coding xff09 是在一个主题或单元上为数据存储 xff0c 管理和分析的目的而转换信息为编码值 xff08 典型地如数字 xff09 的过程 在软件中 xff0c 编码意味着
  • Visual Studio Code安装go插件报错

    VScode第一次跑go代码时提示The go outline command is not available Run 34 go get v github com ramya r有效解决安装方法 出现问题 xff1a Visual St
  • TCP实现服务器与客户端的连接(多线程)

    上一篇博客中 xff0c 我们用TCP实现了服务器与客户端的连接 但是有一个问题 xff0c 即一个客户端在和服务器交互时 xff0c 其他客户端无法连接 xff0c 为解决这一问题 xff0c 我们将服务器端改造为线程池的版本 xff08
  • 【GIT】在kali linux上安装git与码云提交|kali安装wps

    xff11 安装git kali自带 xff0c xff08 apt get install git xff09 2 添加git服务用户 xff08 这一步不知道有没有用也输入了 xff0c 只是有点问题 xff09 useradd git
  • Windows10系统重装之U盘安装

    1 准备工作 操作系统 xff1a Windows 10 安装工具 xff1a U盘安装 程序下载 xff1a MediaCreationTool 链接 xff1a https pan baidu com s 1GTnFze86sDjRnV
  • ubuntu18.04安装cuda和cudnn

    一 安装 cuda 1 首先查看自身电脑最高支持的cuda版本为多少 xff0c 在终端输入以下指令 nvidia smi 可以看到我的最高支持 cuda 11 4 2 打开英伟达官网 下载官方cuda 此处我下载的是cuda 11 0 3
  • 批处理打开指定路径下的所有文件

    需求 xff1a 批处理打开指定路径下的所有文件 前提 xff1a 默认各位同学已经熟悉常用的各种批处理命令 xff0c 本文仅对涉及到的批处理命令做简单的介绍 xff0c 有需要进一步学习 xff0c 可查阅网上其它资料 也可通过CMD命
  • 系统调用的概念及原理

    系统调用与内核函数 内核函数与普通函数形式上没有什么区别 xff0c 只不过前者在内核实现 xff0c 因此要满足一些内核编程的要求 系统调用是用户进程进入内核的接口层 xff0c 它本身并非内核函数 xff0c 但它是由内核函数实现的 x
  • CMAKE编译ORB-SLAM2时,报错找不到Eigen3,报错Eigen3 found!之类错误(已解决)

    当编译执行到 build sh文件时 xff0c 报错Eigen3 found xff01 之类错误 解决方法 xff1a 在主文件夹下直接查找FindEigen3 cmake文件 然后把它复制到报错的CMakeLists txt对应的路径
  • Python爬虫---王者荣耀(最详细)

    Python爬虫 王者荣耀 最详细 首先来到王者荣耀的首页 点击游戏壁纸进去 xff0c 就会看到这些图片 xff0c 大致看了一下 xff0c 是我们想要的东西 点开图片看看能不能找到什么规律 可以看见每张图下面都有六个分辨率的选项 xf
  • hypermesh分析流程

    对于CAE初学者来说 xff0c hypermesh是一个很适合的工具 xff0c 既可以作为其他分析软件的输入 xff0c 自带的求解器也能取得很精确的结果 xff0c 本文是作者的一些实用心得 xff0c 全是干货 学习一个软件时 xf
  • PVE7.1安装Jellyfin几个问题

    按网络资料显示 xff0c 最好是在LXC安装 一 模板问题 直接创建CT xff0c 模板里是空的 xff0c 所以需要在pve local xff08 pve xff09 模板里 xff0c 找到相关模板 xff08 如ubuntu20
  • Mybatis-Plus代码生成器(generator)

    在写代码的时候 xff0c 使用mybatis plus的代码生成器可以帮助我们减少很多工作量 xff0c 详细说明可以看官方文档https baomidou com pages 779a6e 在使用之前需要把包给导一下 xff0c gen
  • TT 的神秘礼物

    题目 TT 的神秘礼物 题意 xff1a TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM

随机推荐

  • computed和watch

    computed 1 什么是computed xff1f computed是计算属性 类似于方法 xff0c 但和methods不同 xff0c methods每次调用时会重新执行函数 xff0c 而computed在其内部变量不变或其返回
  • Anaconda3 2021.05(64bit)安装图文教程

    目录 little背景安装包下载安装 little背景 有朋友说下学期要学Python xff0c anaconda的jupyter notebook这么方便不得不安利一下 xff0c 顺手写个博客记下来 本文如有问题请多指教 xff01
  • 数据结构第三章 栈和队列题目答案

    一 选择题 1 xff0e 栈结构通常采用的两种存储结构是 xff08 A xff09 A xff0e 顺序存储结构和链表存储结构 B xff0e 散列方式和索引方式 C xff0e 链表存储结构和数组 D xff0e 线性链表结构和非线性
  • 博客模板

    题目链接 xff1a 题目描述 xff1a Input xff1a Output xff1a Sample Input xff1a Sample Output xff1a Hint xff1a 思路 xff1a 总结 xff1a 代码 xf
  • 程序设计思维与实践 Week9 作业 C-长凳问题(签到题)

    题目链接 xff1a C 长凳问题 题目描述 xff1a SDUQD 旁边的滨海公园有 x 条长凳 第 i 个长凳上坐着 a i 个人 这时候又有 y 个人将来到公园 xff0c 他们将选择坐在某些公园中的长凳上 xff0c 那么当这 y
  • 程序设计思维与实践 Week11 作业 必做题 A-蒜头君买房子

    题目链接 xff1a A 蒜头君买房子 题目描述 xff1a 蒜头君从现在开始工作 xff0c 年薪N万 他希望在蒜厂附近买一套60平米的房子 xff0c 现在价格是 200万 假设房子价格以每年百分之K增长 xff0c 并且蒜头君未来年薪
  • 程序设计思维与实践 Week11 作业 必做题 B-蒜头君列队

    题目链接 xff1a B 蒜头君列队 题目描述 xff1a 蒜头君的班级里有n 2个同学 xff0c 现在全班同学已经排列成一个n n的方阵 xff0c 但是老师却临时给出了一组新的列队方案 为了方便列队 xff0c 所以老师只关注这个方阵
  • 程序设计思维与实践 Week11 作业 必做题 C-简单密码

    题目链接 xff1a C 简单密码 题目描述 xff1a Julius Caesar 曾经使用过一种很简单的密码 对于明文中的每个字符 xff0c 将它用它字母表中后 55 位对应的字符来代替 xff0c 这样就得到了密文 比如字符 A 用
  • 【蓝桥杯单片机3】共阳数码管的静态显示

    本节要完成的实验现象 xff1a 8个数码管分别单独依次显示0 xff5e 9的值 xff0c 然后所有数码管一起同时显示0 F的值 xff0c 如此往复 训练重点 xff1a 1 弄清楚数码管的段码与显示数值之间关系 2 共阳数码管的基本
  • 程序设计思维与实践 CSP-M3 B-消消乐大师——Q老师

    题目描述 xff1a Q老师是个很老实的老师 xff0c 最近在积极准备考研 Q老师平时只喜欢用Linux系统 xff0c 所以Q老师的电 脑上没什么娱乐的游戏 xff0c 所以Q老师平时除了玩Linux上的赛车游戏SuperTuxKart
  • 程序设计思维与实践 Week12 作业 必做题 C-东东扫寝室

    题目链接 xff1a C 东东扫寝室 题目描述 xff1a 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a
  • 程序设计思维与实践 Week13 作业 必做题 A-TT 的神秘任务1

    题目链接 xff1a A TT的神秘任务1 题目描述 xff1a 这一天 xff0c TT 遇到了一个神秘人 神秘人给了两个数字 xff0c 分别表示 n 和 k xff0c 并要求 TT 给出 k 个奇偶性相同的正整数 xff0c 使得其
  • 程序设计思维与实践 Week13 作业 必做题 C-TT 的奖励

    题目链接 xff1a C TT的奖励 题目描述 xff1a 在大家不辞辛劳的帮助下 xff0c TT 顺利地完成了所有的神秘任务 神秘人很高兴 xff0c 决定给 TT 一个奖励 xff0c 即白日做梦之捡猫咪游戏 捡猫咪游戏是这样的 xf
  • 程序设计思维与实践 Week15 实验 B-ZJM的本领

    题目链接 xff1a B ZJM的本领 题目描述 xff1a 众所周知 xff0c ZJM 住在 B 站 这一天 Q 老师来找 ZJM 玩 xff0c ZJM 决定向 Q 老师展现一下自己快速看番的本领 ZJM 让 Q 老师任意挑选了一部番
  • CCF 2018-9-3 元素选择器

    题目链接 xff1a 元素选择器 题目描述 xff1a 思路 xff1a 模拟题 xff0c 简化版的元素选择器 xff0c 首先创建储存每一层的节点 xff0c 节点中包括标签 xff0c id属性和缩进 由于对于标签的大小写不敏感 xf
  • 期末验收汇总

    WEEK9作业 xff1a A 咕咕东的目录管理器 B 东东学打牌 C 长凳问题 签到题 WEEK10作业 xff1a A Game23 签到题 B LIS amp LCS C 拿数问题 II WEEK10限时大模拟 xff1a A STr
  • 【RoboMaster】我是这样搞定第一次单目相机测距的

    之前在做一个单目测距的小项目 xff0c 大概需要就是用单目相机 xff0c 对一个特定的目标进行识别并测算相机与该目标的距离 所以便去网上找了一堆教程 xff0c 这里给大家总结一下 xff0c 希望给小白们一个参考 首先是基本需求了 x
  • 最简单-P1591 阶乘数码-洛谷

    知道的越多 xff0c 不知道的越多 xff08 微信 xff1a Y17744650906 xff09 点赞再看 xff0c 养成习惯 P1591 阶乘数码 题目描述 求 n n 中某个数码出现的次数 输入格式 第一行为 t t leq
  • 虚拟机里的ubuntu突然不能上网解决方案

    最近vw里面的ubuntu突然不能上网了 我去查了下许多人的方法 xff0c 大多都是叫你改文件配置然后重启网络之类的 xff0c 我弄了半天 xff0c 结果本来是半身瘫痪的网络直接成了植物人 这是我直接向重装了 xff0c 但文件 xf
  • Markdown转LaTeX的Python程序大全(持续更新)

    文章目录 xff11 xff0e 双 96 96 符号转 96 begin 96 96 end 96 型公式2 xff0e 将 96 matrix 96 域替换为 96 begin 96 96 end 96 域3 xff0e 删除 LaTe