在介绍 LATEX 之前,我们得知道什么是 TEX 。
TEX (希腊语:/tɛx/,音译“泰赫”,文本模式下写作TeX),是一个由美国计算机教授高德纳(Donald Ervin Knuth)编写的功能强大的排版软件。它在学术界十分流行,特别是数学、物理学和计算机科学界。 TEX 被普遍认为是一个优秀的排版工具,特别是在处理复杂的数学公式时。利用诸如是 LATEX 等终端软件, TEX 就能够排版出精美的文本以帮助人们辨认和查找。
高德纳(Donald Knuth,1938/01/10 -)最早开始自行编写 TEX 的原因,是因为当时的排版技术十分粗糙,已经影响到他的巨著《计算机程序设计艺术》的印刷质量。他以典型的黑客思维模式,决定自行编写一个排版软件: TEX 。他原本以为他只需要半年时间,在1978年下半年就能完成,但最终他用了超过十年时间,直到1989年 TEX 才最终停止修改。
LATEX (/ˈlɑːtɛx/,常被读作/ˈlɑːtɛk/或/ˈleɪtɛk/),文字形式写作LaTeX,是一种基于 TEX 的排版系统,由美国计算机科学家莱斯利·兰伯特在20世纪80年代初期开发,利用这种格式系统的处理,即使用户没有排版和程序设计的知识也可以充分发挥由 TEX 所提供的强大功能,不必一一亲自去设计或校对,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学、化学类文档。这个系统同样适用于生成从简单的信件到完整书籍的所有其他种类的文档。
LATEX 使用 TEX 作为它的格式化引擎,当前的版本是 LATEX2ε 。
LATEX 本质上是用编程语言写成的一个“ TEX 宏包”,它扩展了 TEX 的功能,使我们很方便的逻辑的进行创作而不是专心于字体,缩进这些烦人的东西。
LATEX 能较为友好的在网页或者文档中显示出规范整洁的各类公式和符号,例如
log3G , Ω(N2)
这些公式都是通过 LATEX 实现的,对应的 LATEX 语句如下:
$$\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}$$
$\log_3 G$
$\Omega (N^2)$
$$ x = \dfrac{-b \pm \sqrt{b^2 - 4ac}}{2a} $$
可以发现,有些公式和正常文字一样,有些却是在页面正中间。这是行内公式和行间公式的区别,对应到语法上就是行内公式使用$formula$
,而行间公式使用$$formula$$
, formula
代表公式的内容。
LATEX 的功能远不止这么简单,很多高级数学公式例如求和,求积以及一些复杂的物理公式都可以用其表示。
先说 LATEX 的简单用法:
1. 在数学公式中,经常用到 上标和下标,在LaTeX语法中对应^
和-
。例如x_i^2
: x2i , \log_2 N
: log2N 。
2. 分组,简单来说就是当遇到下标或者上标不是单字符时会用到,例如 x2a1 , 用式子x_a1^2
会得出错误的公式 xa12 。由于这时a
和1
属于同一组,所以需要声明它们是一起的。 LATEX 中使用大括号{}
将同一组的符号括到一起。刚才的式子正确表示是x_{a1}^2
。
3. 括号,如果式子中本来就有括号()[]{}
,那么使用时()[]
正常使用即可,而{}
在括号之前需要加转义符\
。例如 (2+3)[4+4]{5+6} : (2 + 3)[4 + 4]\{5 + 6\}
。
4. 分数,分数通过\frac{}{}
实现。例如 35 : \frac{3}{5}
。稍微复杂的分数也能表示
\frac{\log_2 N + N^3}{\ln N - 2N^2}
。
在Markdown中可以使用$formula$
或$$formula$$
插入公式,也可以使用\\(formula\\)
插入,但是由于Hexo使用的markdown解析引擎的问题,后一种时有出错,推荐使用第一种方式。
常见函数表达方法:
函数名称 | 函数符号 | 表达方法 |
---|---|---|
根号 | 3√ | \sqrt3 |
求和 | ∑Ni=0i | \sum_{i=0}^N i |
求积 | ∏50a | \prod_{0}^5 a |
积分 | ∫∞0x3 | \int_{0}^\infty x^3 |
多次开方 | xy−−√3 | \sqrt[3]{\frac xy} |
三角函数 | sin , cos , tan | \sin , \cos , \tan |
极限 | limx→0 | \lim_{x\to0} |
对数函数 | log5x , lny | \log_5 x , \ln y |
常见符号表示方法:
符号名称 | 符号 | 表达方法 |
---|---|---|
希腊字母 | α , β , …, ω | \alpha, \beta, …, \omega |
希腊字母大写 | Γ , Δ , …, Ω | \Gamma, \Delta, …, \Omega |
比较符 | < > ≤ ≥ ≠ | \lt \gt \le \ge \neq |
运算符 | × ÷ ± ∓ | \times \div \pm \mp |
常见数学符号1 | ∪ ∩ ∖ ⊂ ⊆ ⊊ ⊃ ∈ ∉ ∅ ∅ | \cup \cap \setminus \subset \subseteq \subsetneq \supset \in \notin \emptyset \varnothing |
常见数学符号2 | ∧ ∨ ¬ ∀ ∃ ⊤ ⊥ ⊢ ⊨ | \land \lor \lnot \forall \exists \top \bot \vdash \vDash |
箭头 | → → ← ⇒ ⇐ ↦ | \to \rightarrow \leftarrow \Rightarrow \Leftarrow \mapsto |
在 list of currently supported LATEXLATEX commands中有更多 LATEX 支持的语法。
刚开始使用的时候,经常发现页面中的公式解析出错,例如_
在Hexo中会生成斜体的字符,在 LATEX 中生成的 是下标 。这就导致了矛盾。
可行的解决方法有两个:
hexo-renderer-marked
,可以换成功能更强大的Pandoc。 npm uninstall hexo-renderer-marked --save // 卸载旧的引擎
npm install hexo-renderer-pandoc --save // 安装pandoc
修改hexo的渲染源码: 打开nodes_modules/marked/lib/marked.js
:
第一步: 去掉\的额外转义。 先备份一下,然后修改第449行
escape: /^\\([\\`*{}\[\]()# +\-.!_>])/,
改为:
escape: /^\\([`*{}\[\]()# +\-.!_>])/,
这样就会去掉\的转义了。
第二步:将em
标签对应的符号中,去掉_
。第459行
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
修改为:
em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
因为markdown中有*
可以表示斜体,_
就去掉了,这样问题就解决了。
这部分参考天空的城的Hexo下mathjax的转义问题。
[1] mathjax官网
[2] TeX维基百科
[3] LaTeX维基百科
[3] Github上的issue
[4] MathJax basic tutorial and quick reference
[5] 知乎上的公式是怎么打出来的?
[6] hexo 如何解决markdown下划线要加反斜杠,以及如何使用其他markdown的渲染引擎?
[7] Hexo下mathjax的转义问题
[8] 如何处理Hexo和MathJax的兼容问题