文章目录

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

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

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

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

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

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

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

def dollar2begin(input_fname,output_fanme):f = open(input_fname,'r')a = f.read()b= ''k = 1for i in range(100):if k%2 ==1:b = a.replace("$$",r"\begin{equation}",1)else:b = a.replace("$$",r"\end{equation}",1)a = bk += 1f2 = 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 -1d = 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 = 0while True:   # find the sub_ind of the first bracket after targnameleft_brack = org_str.find(targname,first_ind) + len(targname)if left_brack > len(targname):# find the corresponding right bracketright_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 + 1else:breakreturn org_str

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

3.删除LaTeX\LaTeXLATE​X中不需要的Markdown关键词

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

def remove_tags(org_str,targname = r'\tag'):i = 0 first_ind = 0while True:   # find the sub_ind of the first bracket after targnameleft_brack = org_str.find(targname,first_ind) + len(targname)if left_brack > len(targname):# find the corresponding right bracketright_brack = getIndex(org_str,left_brack)org_str = org_str.replace(org_str[left_brack-len(targname):right_brack+1],'')i += 1print(i)else:breakreturn org_str

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

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

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

  1. adb 输入回车命令_Android超级终端(Adb Shell)常用命令、命令大全-持续更新 | 何连超的博客小站...

    Android超级终端(Adb Shell)常用命令.命令大全-持续更新 超级终端(手机端操作)与AdbShell(电脑端操作)使用的Shell命令(即Linux shell命令,类似Dos命令)是相 ...

  2. FC金手指代码大全·持续更新-亲测可用-FC 经典游戏完整可用的金手指大全---持续更新,偶尔玩玩经典回味无穷,小时候不能通关的现在通通通关一遍

    FC 经典游戏完整可用的金手指大全-持续更新,偶尔玩玩经典回味无穷,小时候不能通关的现在通通通关一遍 2021年5月11日更新: 每次翻金手指一些垃圾小网站标题党吸引进去吓一大堆木马什么也没有,什么x ...

  3. JAVA面试大全(持续更新中...)

    本文旨在收集Java面试过程中出现的问题,力求全面,仅作学习交流,欢迎补充,持续更新中-,部分段落选取自网上,部分引用文章已标注,部分已记不清了,如侵权,联系本人 Java基础 1.面向对象的概述 面 ...

  4. 商业数据分析模型及其核心Python代码_持续更新

    商业数据分析模型_持续更新 一.AARRR模型 二.PEST模型 理论 医美行业应用案例 三.RFM模型 理论 Python实战_核心指标计算 四.SWOT模型 五.5W1H模型 六.流程拆解法 七. ...

  5. python中text函数的语法_Python语法大全(持续更新中ing)

    1.type()函数可以返回任何Python定义的数据类型. Python提供了一些数字类型转换函数:int().long().float().complex().整数.长整数和浮点数可以通过comp ...

  6. python程序大全(7)——一元一次、一元二次方程解及函数解析

  7. 如果写文档发博客,你还在用Word文档你就out了,写文档神器Markdown的前世今生来了。(持续更新,欢迎关注点赞)

    大家好,我是ITCJF ~~ 最近家里的事情太多了,很久没更新技术文了.期间,也收到了很多小伙伴的鼓励,谢谢大家的帮助和支持,我想感谢大家最好的方式就是持续分享好的技术文章了吧,让自己和他人持续有所收 ...

  8. 搭建基于 Vim 的 C++和 Python 开发环境[持续更新]

    最近 vscode 在技术圈火了一阵子,每天都可以在掘金上看到安利文章和奇葩的插件,什么"杨超越鼓励师",还有上班摸鱼系列,"看小说插件","看股票插 ...

  9. Unity游戏优化指南大全(持续更新中!)

    Unity游戏优化指南大全 三个官方优化提示: 性能和优化 (Performance and Optimization) - 关于性能分析器以及性能和优化技巧的 Unity 学习教程. Best pr ...

最新文章

  1. 超大磁盘分区工具parted使用介绍(一)
  2. [C# Control] 仿RAR式进度条 (RarProgressBar)
  3. 亿级系统的Redis缓存如何设计???
  4. file_get_contents 在本地测试可以, 但在服务器上报错403
  5. linux oracle 运维_Oracle查询当前的crs/has自启动状态实例教程
  6. fastclick库的介绍和使用
  7. java设计模式 订阅模式_Java中的外观设计模式
  8. C++离航篇——函数默认参数、函数重载、内敛函数
  9. 微信小程序UI------实现携程首页顶部的界面(弹性布局)
  10. springmvc整合dubbo
  11. .NET开发中你可能会用到的常用方法总结(添加ing...)
  12. ShadowGun: Optimizing for Mobile Sample Level
  13. C++ MFC 打印PDF文件 以及打印指定页数
  14. 运营周期爆发期是什么?
  15. 变上限积分无穷小比阶与导数的关系问题
  16. linux安装mysql总结
  17. 测试环境的搭建和维护_软硬件测试环境
  18. 语雀可以导出html吗,工具 - Confluence 迁移到语雀 - 《语雀使用文档》 - 书栈网 · BookStack...
  19. xp外观主题下载_增强Windows XP外观的简便方法
  20. 相濡以沫与相忘于江湖

热门文章

  1. jsp中 input placeholder_前端工作中的方法总结
  2. 小程序中,iOS设备获取蓝牙设备的Mac地址
  3. SpringBoot注册Servlet、Filter、Listener
  4. Ubuntu用户设置文件说明
  5. leaflet的入门开发(一)
  6. Java NIO:IO与NIO的区别
  7. 圣杯布局简单结构代码!
  8. 根据鼠标点击位置获取DataGridView的选择行号。
  9. XML在JAVA项目中的作用
  10. Java Map hashCode深究