让科学流行起来。
博客写什么,除了大段优美的文字,长篇炫酷的代码,极富美感的科学公式必不可少。随着开源软件的流行,这个任务不再困难。本文记录了在自己相关尝试中遇到的问题,希望对大家有帮助。
分类 | 问题 | 备注 |
---|---|---|
转换 | Q:Ipython notebook文章如何直接发布博客? | 把.ipynb文件直接转换为md文件 |
配置 | Q:如何插入数学公式? | |
Q:为什么有一些公式无法生成? | ||
Q:直接用LaTeX的语法写内容就可以了? | ||
语法 | Q:LaTeX的语法有哪些 |
Q:Ipython notebook文章如何直接发布博客?
Ipython Notebook是数据科学领域常用的交互式编程工具之一。利用Ipython Notebook可以写出非常好的程序和笔记的混合体。如果能够直接转换成博客输出,自然会大大减少博客整理的工作量。这样的转换非常方便。
ipython nbconvert --to markdown M_step1.ipynb
其中 M_step1.ipynb 是需要转换的文件名,在同一个文件夹下会生成同名的.md文件。如果需要转换成其他格式,可以参考上面列出的文档调整参数,下面列出的几篇英文文档也会有帮助:
- How to quickly turn an IPython notebook into a blog post
- Using IPython Notebook to Write Jekyll Blog Posts
- Python Concepts: Part None
执行过程如下图:
想了解细节可以在How IPython and Jupyter Notebook work查看。
Q:如何插入数学公式?
基础知识:MathJax 和 Latex
- MathJax是一款运行在浏览器中的开源的数学符号渲染引擎,使用MathJax可以方便的在浏览器中显示数学公式,不需要使用图片。目前,MathJax可以解析Latex、MathML和ASCIIMathML的标记语言。
- Latex是一种标记语言。
- 快速入门参考:Mathjax与LaTex公式简介
- MathJax让你爱上数学公式
成功经验
到目前为止,亲测唯一有效且兼容性高的方法是安装hexo-math
插件。
npm install hexo-math --save
不需要其他任何配置,直接在md文件中按照latex的语法要求撰写公式。
失败经验
参见我的另一篇博客Hexo实现Math公式撰写的实验报告,总结一下:
- NexT提供的MathJax的第三方接口未实现转换
- 安装Pandoc渲染插件未实现转换
有三种办法解决这个问题
|处理办法|优势|劣势|备注|参考资料
|—|—|—|—|
|办法一:修改渲染文件,规避这个问题|正常使用Latex语法|需要修改renderer代码
部分markdown语句无法使用|我的选择|Hexo下mathjax的转义问题|
|办法二:采用其他的渲染器|正常使用Latex语法||我的环境Pandoc渲染器不生效|Hexo下mathjax的转义问题|
|办法三:使用转义字符|不需要调整程序|文章中的字符不通用,如果未来环境变化可能需要调整文章|不建议使用|Hexo下mathjax的转义问题
让Hexo在使用Mathjax时支持多行公式|
最终我的选择是办法一:修改对应的渲染文件your_blog_dir/node_modules/hexo-renderer-marked/node_modules/marked/lib/marked.js
,首先找到下面的代码:
var inline = {
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
url: noop,
tag: /^<!--[\s\S]*?-->|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,
link: /^!?\[(inside)\]\(href\)/,
reflink: /^!?\[(inside)\]\s*\[([^\]]*)\]/,
nolink: /^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,
strong: /^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
code: /^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,
br: /^ {2,}\n(?!\s*$)/,
del: noop,
text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
};
其中的两行
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
修改为
escape: /^\\([`*\[\]()# +\-.!_>])/,
em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
上面的调整中删掉了\\
和{}
,另一行删掉了b_((?:[^_]|__)+?)_\b|^\
。
用法说明 这个方法产生的影响是不能用_和_表示加粗了,利用**可以做到,自己从来不用这个方法加粗。不让marked.js去转义\,{,},这个用法也非常的少见,对我的应用没有什么影响。有一种情况需要注意:*在公式经常表示乘号,字母间可以忽略,但是数字之间,需要增加转义符号
解决该问题查了很多文档,对作者一并表示感谢,具体链接在reference中列出。
### Q:直接用LaTeX的语法写内容就可以了? 在公式的前后需要用标识符包围,如果是一个`$`公式嵌入行内,如果是`$$`,公式单独成行并且居中显示。 ## 语法Q:LaTeX的语法有哪些
本文列出自己在Hexo的博文撰写中应用到的Latex语法,所有内容在自己的环境下亲测可行,不定期更新。
统计相关
$P(A_i\mid B)=\dfrac{P(A_i)P(B\mid A)}{\sum_{i=1}^n=P(A_i)P(B\mid A)}$ 对应的代码如下:
$P(A_i\mid B)=\dfrac{P(A_i)P(B\mid A)}{\sum_{i=1}^n=P(A_i)P(B\mid A)}$
Reference
文档1 文档2 文档3 文档4 文档5 文档6 文档7 文档8 文档9
ChangeLog
161122 新建 161129 发布