京山游侠

专注技术 拒绝扯淡
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束。如果某条评论中出现了两个$,MathJax 会将两个$之间的内容按照数学公式进行排版,从而导致评论区格式混乱。如果大家的评论中用到了$,但是又不是为了使用数学公式,就请使用\$转义一下,谢谢。

想从头阅读该系列吗?下面是传送门:

前言##

这样一个标题可能不太准确,因为确实无法准确地解释什么叫“文本化编辑思想”。其实我这篇随笔主要是想探讨 Markdown、LaTeX、MathJax,有兴趣的朋友可以继续往下看,同时别忘记了顺手点个赞。

先回忆一下我们平时用什么工具记笔记,最简单的可能直接上记事本,但是稍微需要点格式支持的,记事本的功能就不够用了,这时应该至少会用一个类似 Word 的“所见即所得”的可视化编辑器。很多时候我们要记录和分享的不仅仅只是文字,它还包含有各种各样的格式,比如字体、字号、颜色、标题、列表等等。这个格式可以让我们很容易地分辨笔记中的大纲和细节,也很容易突出显示需要强调的内容,便于我们阅读和理解,必要的时候,还可以在笔记中插入图片。“所见即所得”编辑器提供的编辑方法确实是最朴素的编辑思想:当你想要改变某些文字的样式时,你只需要选中它,然后在各种菜单、对话框里设置它的格式即可。这种排版很美观、样式很丰富的文章,可以称之为“富文本”。

如果进行更深层次的思考,就会发现“富文本”存在很多缺点,特别是对于我们这些程序员、理工男来说更是这样。下面略举几例:

  • “富文本”编辑起来太慢了,写文章时,即要考虑文章内容,又要考虑文章格式,写几段字就要点半天鼠标;
  • “富文本”需要专业的编辑器来编辑和阅读,如果没有编辑器,或者编辑器不兼容,那只有欲哭无泪了;
  • “富文本”往往让形式取代逻辑,文章可能从外观上看各级标题的文字大小、缩进都很正确,但是逻辑上无法指定层级关系;
  • “富文本”中的格式信息太冗余了,淹没了文章的内容;
  • “富文本”对计算机不友好,存储格式不透明不说,也让基于文本行比较的工具(如 diff 之类)无用武之地。

所以,优秀的思想应该是这样的:

  • 文章就应该存储为纯文本的格式,用任何工具都可以阅读和编辑;
  • 该纯文本的内容即要适合人类阅读,也要计算机容易理解;
  • 能正确指定文章各部分的逻辑结构;
  • 内容和显示分离,作者只用考虑文章的内容和逻辑结构,而文章怎么显示得好看是专业的人和工具的事。

这就是我标题中说的“文本化编辑思想”。这种思想在计算机领域由来已久,并逐渐形成一种哲学。比如互联网上广泛使用的 HTML、XML 等,就是把信息储存为纯文本,用任何工具都可以阅读和编辑,并且能正确地指定内容的逻辑结构,而浏览器和 CSS 则控制文章如何显示。但是,HTML 标签还是太多了,如果没有浏览器,完全靠人工脑补阅读起来还是太困难了。于是,就诞生了 Markdown。

在文本编辑领域还有另外一个难题,那就是数学公式(或者其它类似数学公式的东西,比如乐谱),它们显示起来是二维的,而且其中使用的很多符号标准键盘根本无法输入,使用的字体和正文也不一样。好在 Unix/Linux 世界中,它们有一个比较好的解决方法,那就是 LaTeX。当然,也有很多可视化的编辑器提供数学公式编辑的功能,比如 Word 的公式编辑器,比如 TexMacs。但是正如前文所述,从优秀的“文本化编辑思想”来思考,最好的依然是 LaTeX,因为使用 LaTeX 就是使用纯文本的方式输入数学公式,输入速度快,人和计算机都容易理解。LaTeX 的思想影响广泛,很多编辑器都支持以 LaTeX 语法输入数学公式。要在网页上显示数学公式,则非 MathJax 莫属了,它是一个 JavaScript 库,可以识别网页中的 LaTeX 格式的数学公式并将其完美显示出来。博客园的数学公式支持用的就是这个。

Markdown 的特点和工具##

Markdown 的宗旨就是“易读易写”,所以用 Markdown 语法写的文档,以纯文本的格式直接阅读也是非常方便的。如果对外观的要求非常高,就可以通过相应的工具将 Markdown 文档转化成 HTML 或者 PDF。Markdown 的语法非常简单,一般情况下一个多小时就学会了。目前,我在博客园中发博客基本上就是使用博客园的 Markdown 编辑器了。博客园使用和 Github 完全一样的 Markdown 语法,在这里可以阅读它的完整介绍:GitHub Flavored Markdown Spec。Markdown 用起来很舒服,除了上传图片,基本上不用动鼠标,而且近期已经有好几个人表扬我的博客排版比较舒服了。

在 Linux 桌面系统中,我使用 ReText 编辑 Markdown 文档。在 Ubuntu 中只需要sudo apt-get install retext即可以安装该软件。另外还有一些比较出名的 Markdown 编辑器,比如 reMarkable 或者 Typora,但是这两款编辑器 Ubuntu 的官方软件仓库中没有,需要自己去下载安装,所以我就不用了。另外就是 Atom 编辑器也支持 Markdown,但是我试用以后觉得它的界面不好看,所以也不用。我觉得 ReText 就不错了,其界面如下:

很显然,这个预览的结果并不漂亮,也和我博客园中的样式完全不一样。这是因为我并没有为我的预览功能指定 CSS 样式表。前面说过,文本化编辑思想就是内容和显示分离,写作的时候,只需要考虑内容就可以了,而显示效果,可以由 CSS 样式表控制。如果我想让预览的效果和我的博客中一样,只需要把我博客中的 CSS 扒下来就可以了。同理,如果看到有哪个网站的文章显示效果比较好看,把它的 CSS 样式扒下来即可。另外,从上图的预览功能可以看到,现在最新版的 ReText 可以显示一定的数学公式,但是对行内的数学公式没有显示,那是因为我们没有为 ReText 指定 MathJax 数学公式扩展。点击 ReText 的 "编辑"->"个人偏好" 菜单,在弹出的对话框里面可以设置我们使用的 CSS 样式表和 MathJax 扩展,如下图:

再重新启动 ReText,其预览效果就是这样的了:

MathJax 支持 LaTeX 语法,至于 LaTeX 编辑数学公式的语法,我这里再为大家送上一份资料:《一份不太短的LaTeX 2e介绍》。

数学公式和 LaTex##

在我上一节中,我提到了 MathJax,我的博客中和 ReText 中的数学公式支持就靠它了。MathJax 支持 LaTex 的语法,所以平时写笔记,使用 Markdown 和 Mathjax 就够了。但是真正需要写科技论文的时候,就不得不上 LaTex 了。在这一节里,我再来谈谈 LaTeX。

在很多人心中,LaTeX 是一个很专业的排版系统,同时也是一个很复杂的系统。说到专业,确实很多科技论文都是用 LaTeX 写作,而且很多知名的杂志社只接受 LaTeX 格式的投稿。使用 LaTeX 排版得到的效果那是超级赞,特别是对科技论文中充斥的数学公式而言。说到复杂,不仅是因为 LaTeX 排版语言命令繁多,更因为它数之不尽的宏包,学习成本真的是相当相当相当的高。

对于一套 LaTeX 排版系统,它究竟包含哪些东西呢?我认为它主要可以分成这样几个部分:

  • 一个排版引擎,TeX 或 pdfTeX 或 XeTeX;
  • 一系列的字体;
  • 一系列的宏包;
  • 一些工具,比如用来查看各种排版引擎输出的排版结果,或者在 dvi、ps、pdf 等格式之间的转换。

而对于 LaTeX 排版系统的复杂性,我认为主要是由于历史原因引起的,理由如下:

  • 最早的由 Knuth 教授写的 TeX 引擎不支持 UTF-8 编码的输入文件,所以要让它支持中文实在是太难了;
  • 最早的 TeX 系统自带一套字体,要扩展它就得扩展相应领域的字体,比如 LaTeX 自带丰富的数学字体,要把字体安装到 TeX 系统中是一件非常复杂的事情;
  • 大量的第三方宏包,安装和学习都非常困难;
  • 都什么年代了,谁还用 dvi 格式和 ps 格式啊,用 pdf 多方便啊。

对于这些历史原因引起的复杂性,现在早就解决了,只是很多书籍没有写清楚而已。我认为现在用 LaTeX 其实很方便的,理由如下:

  • Knuth 教授的 Tex 引擎用来瞻仰即可,实际工作中使用 XeTeX 引擎,完美支持 Unicode 字符集和 UTF-8 编码,中文再也不是问题;
  • 字体神马的,Knuth 教授的 METAFONT 早过时了,现在谁还不用 TrueType 啊?好的字体当然少不了像 Microsoft、Adobe、Apple 这些既有钱又有品味的公司出品了;
  • XeTeX 引擎可以直接使用操作系统中安装的字体,再也不用考虑把字体安装到 TeX 系统中了;
  • XeTeX 引擎直接输出 pdf 格式的文件;
  • 排版也可以有 IDE 工具,比如 TeXWorks 或 TexStudio;
  • 至于宏包太多这个问题,我们可以用现成的发行版嘛,比如 texlive 套装。

下面开始实战。我是在 Ubuntu 系统下使用 texlive,使用sudo aptitude search texlive命令,可以看到大量和 texlive 有关的包。考虑到我们需要使用中文,所以需要同时安装 texlive-lang-cjk 和 texlive-xetex。前面分析过,XeTeX 引擎和 XeLaTeX 引擎是支持Unicode 字符集和 UTF-8 编码的基础,而 texlive-lang-cjk 提供中文字体和中文排版的支持。和四年前相比,texlive 更加成熟,以上三个包安装完之后,不需要借用 Windows 的字体,也不需要修改任何配置文件,真正做到了开箱即用。这样安装 texlive:

sudo aptitude install texlive texlive-lang-cjk texlive-xetex

以前我使用 TeXWorks,现在在朋友的推荐下使用 TexStudio。使用以下命令安装 TexStudio:

sudo aptitude install texstudio

在使用 TexStudio 的时候,先进入它的设置界面,将引擎更改为 XeLaTeX,如下图:

然后写一段测试文字,Build 一下,然后预览,就可以看到排版效果了:

对于写写中文文档,使用 ctex 宏包就足够了,并不是很复杂。LaTeX 还有一些更加复杂的功能,比如制作幻灯片啊、绘图啊什么的,都有相应的宏包可以使用,而且安装 texlive 的时候,都安装了非常详细的帮助文档,只需要打开/usr/share/texlive/doc.html这个文件,就可以看到所有宏包和帮助文档的列表,我前面分享的《一份不太短的LaTeX介绍》里面有,经典的《Tex by Topic》里面也有,如下图:

看到这个一公里长的帮助文档列表,你有什么感想呢?

版权申明##

该随笔由京山游侠在2018年11月09日发布于博客园,引用请注明出处,转载或出版请联系博主。QQ邮箱:1841079@qq.com