Q&A:科学写作中的基本工具和用法

让科学流行起来。

博客写什么,除了大段优美的文字,长篇炫酷的代码,极富美感的科学公式必不可少。随着开源软件的流行,这个任务不再困难。本文记录了在自己相关尝试中遇到的问题,希望对大家有帮助。

分类 问题 备注
转换 Q:Ipython notebook文章如何直接发布博客? 把.ipynb文件直接转换为md文件
配置 Q:如何插入数学公式?
Q:为什么有一些公式无法生成?
Q:直接用LaTeX的语法写内容就可以了?
语法 Q:LaTeX的语法有哪些

转换

Q:Ipython notebook文章如何直接发布博客?

Ipython Notebook是数据科学领域常用的交互式编程工具之一。利用Ipython Notebook可以写出非常好的程序和笔记的混合体。如果能够直接转换成博客输出,自然会大大减少博客整理的工作量。这样的转换非常方便

1
ipython nbconvert --to markdown M_step1.ipynb

其中 M_step1.ipynb 是需要转换的文件名,在同一个文件夹下会生成同名的.md文件。如果需要转换成其他格式,可以参考上面列出的文档调整参数,下面列出的几篇英文文档也会有帮助:

执行过程如下图:

想了解细节可以在How IPython and Jupyter Notebook work查看。

配置

Q:如何插入数学公式?

基础知识:MathJax 和 Latex

成功经验

到目前为止,亲测唯一有效且兼容性高的方法是安装hexo-math插件。

1
npm install hexo-math --save

不需要其他任何配置,直接在md文件中按照latex的语法要求撰写公式。

失败经验

参见我的另一篇博客Hexo实现Math公式撰写的实验报告,总结一下:

Q:为什么有一些公式无法生成?

Hexo先用marked.js渲染再交给MathJax渲染,在marked.js渲染的时候下划线_是被escape掉并且换成了标签,即斜体字,另外LaTeX中的\也会被转义成一个\,这样会导致MathJax渲染时不认为它是一个换行符了。

有三种办法解决这个问题

处理办法 优势 劣势 备注 参考资料
办法一:修改渲染文件,规避这个问题 正常使用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,首先找到下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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|$)/
};

其中的两行

1
2
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

修改为

1
2
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)}$ 对应的代码如下:

1
$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 发布