Markdown转LaTeX的Python程序大全(持续更新)
文章目錄
- 1.雙`$$`符號(hào)轉(zhuǎn)`\begin`-`\end`型公式
- 2.將`\matrix{}`域替換為`\begin`-`\end`域
- 3.刪除LaTeX\LaTeXLATE?X中不需要的Markdown關(guān)鍵詞
Markdown是做筆記的利器,雖然有 Pandoc這樣的工具,但直接轉(zhuǎn)過(guò)去的格式通常是沒(méi)法直接編譯成功的。其中一個(gè)最大的問(wèn)題就是公式的轉(zhuǎn)換。
比如在Markdown里面,寫不寫\begin{equation}這樣的代碼其實(shí)都不會(huì)自動(dòng)編號(hào),所以經(jīng)常在做筆記的時(shí)候索性就不想寫了。那么此時(shí)通常是用雙$$符號(hào)來(lái)進(jìn)行公式居中排版,而編號(hào)就手動(dòng)用\tag{1}這樣的方式進(jìn)行。這種方式在Markdown里一時(shí)爽,但轉(zhuǎn)成LaTeX\LaTeXLATE?X的時(shí)候就非常痛苦了。轉(zhuǎn)換過(guò)去的一大通代碼無(wú)法編譯,并且也不好改。當(dāng)然還有一些非常不同于自己平時(shí)的操作,比如它會(huì)自動(dòng)引用一些不太習(xí)慣的宏包。這種時(shí)候如果手動(dòng)去修改工作量巨大。
在多次試驗(yàn)過(guò)后,發(fā)現(xiàn)最簡(jiǎn)單的方式還是將Markdown的正文部分直接粘到TeX\TeXTE?X的文件中,因?yàn)檫@樣至少純公式的部分就完全不用改動(dòng)。至于作用域和環(huán)境的修改就手動(dòng)弄一下就好。當(dāng)然這種做法仍然是不夠有效,尤其手動(dòng)修改的時(shí)候十分容易出錯(cuò),所以我們還是總結(jié)一些常用的方法,在從Markdown轉(zhuǎn)向LaTeX\LaTeXLATE?X的時(shí)候可以極大的節(jié)約我們的時(shí)間。
這個(gè)工作可能要一邊做一邊來(lái)完善,我們先將一些比較直接有效的方法列出,后續(xù)內(nèi)容持續(xù)更新。
1.雙$$符號(hào)轉(zhuǎn)\begin-\end型公式
方法:思路很簡(jiǎn)單,將文本全部讀出,依次將雙$$改為\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()調(diào)用方式:
input_fname = r'test_input.md' output_fanme = r'test_output.md' dollar2begin(input_fname,output_fanme)2.將\matrix{}域替換為\begin-\end域
方法:這個(gè)功能的實(shí)現(xiàn)稍嫌復(fù)雜,涉及好幾個(gè)問(wèn)題。首先定位\matrix所在位置,然后定位其后的第一個(gè)左括號(hào){ ,這2步相對(duì)好實(shí)現(xiàn)。而最難的在于找到和左括號(hào)完全對(duì)應(yīng)的右括號(hào)},這里則需要一定的技巧。所以這里先寫出括號(hào)匹配的方法,再寫出完整的替換代碼。
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為第一個(gè)左括號(hào)所在的位置,targets表示對(duì)應(yīng)的左手括號(hào)。這里寫成這樣是為了方便其它的作用域修改。比如還可以對(duì)方括、圓括甚至于其它的一些作用域。這里實(shí)現(xiàn)時(shí)采用了雙隊(duì)列,逐步將左括加入,如果遇到右括則匹配成功刪除這一對(duì)(有點(diǎn)像對(duì)對(duì)碰)。那么當(dāng)消除到最后一對(duì)時(shí),即找到了想要的右括。由于deque是系統(tǒng)自帶,因此可以不用導(dǎo)入相應(yīng)的庫(kù)。
完整的\matrix轉(zhuǎn)換方法:
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這里為了方便起見(jiàn),仍然將targname寫成了默認(rèn)類型,同時(shí)也對(duì)目標(biāo)域的值進(jìn)行了指定,所以也可以用于將其它類型進(jìn)行修改。不過(guò)暫時(shí)還沒(méi)發(fā)現(xiàn)哪些需要被修改的類型。
3.刪除LaTeX\LaTeXLATE?X中不需要的Markdown關(guān)鍵詞
這里主要指的就是\tag{0},這一步操作很簡(jiǎn)單,因?yàn)槲覀兙幪?hào)的時(shí)候自己會(huì)有一個(gè)編號(hào)的習(xí)慣,所以可以自行將tag中的數(shù)值進(jìn)行枚舉再替換。當(dāng)然最簡(jiǎn)單的就是用正則,一步到位。這里我們只寫一個(gè)簡(jiǎn)單的實(shí)現(xiàn)方式,主要是為了寫成一個(gè)統(tǒng)一的程序時(shí)能夠方便地一步到位,而不用到處粘來(lái)粘去。
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{},但同樣也可以用于其它同類型的關(guān)鍵詞的替換。尤其這個(gè)方法可以將任意\label_name{XXX}這種樣子的東西全部刪掉,可以根據(jù)自己的需要進(jìn)行調(diào)整即可。
目前基本上經(jīng)過(guò)上述3步操作,所有在Markdown里能夠正常顯示的公式就能全部在\LaTeX中直接粘貼使用了。后續(xù)如果還有其它的發(fā)現(xiàn),還會(huì)繼續(xù)更新。
總結(jié)
以上是生活随笔為你收集整理的Markdown转LaTeX的Python程序大全(持续更新)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 模糊数学笔记:七、模糊综合评判决策
- 下一篇: Python之并行--基于joblib