从 Markdown 到 WordPress,Latex 数学公式完美输入
原创博客,转载请注明出处,谢谢!
demo
下载地址:demo
需求
作为一个从事于科研论文的工科男,Latex 是必备的技能。因为 Latex 优秀的排版能力,论文投稿,我基本上都是用 Latex 提交的。平时论文和博文的初稿,也都是在 Markdown 完成的。要分享学术相关的博文,公式必不可少。花了几小时在 Markdown 上写好了博文。因为Wordpress 上显示支持 Markdown,我屁颠屁颠将内容复制到 WordPress,结果悲剧了!公式不显示呀,不显示。。。公式都是一堆字母,惨不忍睹,如下图所示:
摸索
然后去网上查怎么解决。有说修改 header.php 的,有说下 MathJax-LaTeX 和 Simple Mathjax 插件的,也有说 KaTeX 插件的。然后我就去搜了一下,发现这些插件的安装数目,才几千,几千。。。相比较那些常用的插件,少则几十万多则上百万的安装数目,几千的数目真的是很小很小的用户量。难道 WordPress 用户发学术博文的不多?突然有种不靠谱的预感,之后的不断折腾证实我的这个预感。
插件
截止到我写这篇博文,网上的各种方法我都尝试过,实在是没找个如意的工具或者方法。网上的资料有两个问题:一是太老,停留在好几年,很多工具都已经更新,不再可行。当初他们的方法现在早就行不通了。比如有个步骤很详细的 MathJax-LaTeX 插件离线安装讲解,最后发现我下载的安装包里面的文件和他完全不同。我才知道,那会是版本 1.2,现在是1.3 版本,很多东西都升级了。其二是很多高手各种修改文件,各种高大上的代码嵌入文件,我嫌麻烦,因为这么复杂跟着做,最后还是不行怎么还原回来?
只能勉强实现的最基本的公式展示的功能。后面会吐槽。
首先,我搜到的几个 Latex 插件:MathJax-LaTeX,Simple Mathjax 和 KaTeX。
这几个插件我都下载用了一下,功能大同小异。都解决不了我的博文中那种 markdown 的公式转化需求,即无法顺利将 $...$
和$$...$$
中的公式识别并转换。
我的学术博文中,公式真的不少呀!所以,只能照着网上的某些方法修改 header.php
文件,比如在 </head>
前插入:
然后再加入转换的语句:
不知道是我主题的原因还是什么原因,我加入后是真不行,依旧无法成功转化公式。
有博客说是因为 CDN 服务被墙了,要手动下载包,然后自己添加。我也尝试了,后来发现并不是这个原因。CDN 并没有被墙。所以,这条也忽略。
直到我去看了插件的说明:
原来我的 markdown 文件只有 $
为界的公式,它没法调用,需要强制加入识别符,告诉这个库我们需要调用它了。然后,我将第一个符号表示 $u$
改成 [la tex]u[/la tex]
(注意此处中括号中应该没有空格,为了显示故意空格设置!),终于出现公式符号了。但是,只能识别并显示部分公式,那些特别短的,或者那些没有两个 $
干扰的。再加入替换两个 $
的,还是不行。加了上面的脚本替换语句,依旧不行。不知道什么原因。我将标识符手动修改成 []
和 \[\]
都不行。
自己动手
既然不行,那就按着这个思路,自己替换完成后再粘帖到 wordpess 不就好了?按照这个思路,我决定自己写代码来完成这个简单的任务。毕竟,写完代码后,以后只需要一句命令就可以轻松就搞定,不香?
Python 代码转化函数定义如下:
def def convert(input_name, output_name):
try:
with open(input_name, 'r', encoding='utf8') as fr, open(output_name, 'w', encoding='utf8') as fw:
data = fr.read()
pattern1 = '\$[\s\S]+?\$'
pattern2 = '\$\$[\s\S]+?\$\$'
data = re.sub(pattern2, lambda x:'\(' + re.split('\$\$',x.group(0))[1] + '\)', data)
data = re.sub(pattern1, lambda x:'\(' + re.split('\$',x.group(0))[1] + '\)', data)
fw.write(data)
time.sleep(0.5)
print('Sucess!')
except FileNotFoundError as e:
print(e)
然后在写一下解析命令,就完成了!
步骤
1.将写好的 markdown 文件,此例为 input.md
,与我写好的 python 代码放在一个文件夹里;
2.打开计算机终端或命令行,Windows 可以为 CMD , Linux 为 bash,如果安装了 Anaconda 还可以是 Prompt;
3.输入命令 python convert.py -i input.md -o output.md
;
4.将 output.md
中的内容直接复制到 WordPress,然后就可以预览发布了!
就这么简单!
效果对比
我的原始 Markdown:
最终呈现的网页效果:DeepRank,一个基于列表排序的推荐算法
两者效果基本一致!
谢谢 很受启发。特别是最后借助python自动转换一块儿