Markdown转LaTeX的Python程序大全(持续更新)
文章目錄
- 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程序大全(持续更新)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模糊数学笔记:七、模糊综合评判决策
- 下一篇: 模糊数学笔记大全(模糊集、截集、模糊矩阵