用标记和文本撰写文章

2021 09 29, Wed

用了一段时间的 Word,还是觉得很别扭。普及一下其他的选择,顺便说说我最近在用的 LaTeX。

TL;DR

除了比如man page有自己的格式 – 这种特殊用途的说明以外,不同种类的文档适合不同的目的:

  • 以网页形式呈现的文字:markdown
  • 技术文档:reStructedText
  • 排版文档:LaTeXxa

用 MSOffice Word 和替代软件的过程中的烦恼

不可否认的是 Word 在日常生活中还是很好用的软件,从小一直用到上班。但是用 Word 的过程中不得不说遇到过不少糟心事。

排版

首先要批判的是 Word 类软件的排版。

我们常说的 Word 软件一般都指微软开发的办公套件 Microsoft Office 中的 Word 组件。同时代出现的也有国产的金山 WPS Office、国外的 OpenOffice、LibreOffice等。

不管是各个软件之间,还是同一个软件的不同版本,还是同一个软件同一个版本在不同的操作系统上,都存在一定的格式偏差,打印出来格式会错乱。最离谱的是我打印资料,同一份资料在家门口打印店和在学校附近,没有编辑过的文档一个可以打 15 页,一个也就 10 页。

功能复杂,学习曲线指数上升

说复杂一方面是说功能需要人找,所以诞生了非常多的 Office 考试、培训。而且很多东西的默认值并不通用,揉合各种情况下的默认值并不会让这个默认值变得更通用,相反,这样其实会让人觉得迷茫。

另一方面,Word 的功能本身相当复杂,举个最简单的例子:域。域这个东西和很多元素都有关系,比如说图片、目录,诸如此类的,本身可以看作是一类可以和其他元素的属性,也有单独使用的情况。

鼠标定位劳累

用 GUI 和终端或者文本有一个事情也很不一样,用图形化客户端需要不停的用鼠标定位屏幕上的点,图片要多大、文本框要多大直接的操作都只能用鼠标拖动,要精确的定位或者要设置页面大小就需要到软件的各个地方去找设置项。

难以协作

不管是开源工具的 odt 文档还是发源于 Word 的 doc/x 格式,都是二进制格式,docx 后来有了开放的规范叫 OpenXML,但是仍然难以用于协作。大部分工具都选择了锁定文档然后编辑,少部分工具选择了转换格式再编辑,各有利弊。

难以集成其他工具

Office 虽然开放了插件开发能力,但是整体而言还是难以和其他工具集成使用。

比如说我要检查一个文档是不是符合一定的规范,很难用零散的工具组装满足需求,也很难用一个软件完成所有任务。

基于标记的工具和语言

啥叫基于标记

我们写一篇文档,如果用Office,通常情况下我们会习惯性的用键盘键入文字,用鼠标调整样式。比如说,如果我用Word写这一篇博客,就需要先设置好纸张、版式,敲好文章,然后一个个设置标题/正文的样式、字体,调整图片大小、位置。

标记就意味着之前用鼠标做的这些事情,都用文字来表示了,比如说我要写一篇文章,那么我用LaTeX的话,由于有现成的模板,就只需要告诉LaTeX工具套用什么样式的模板,然后写文字就好了:

选自https://www.overleaf.com/learn/latex/Chinese

\documentclass{ctexart}

\begin{document}

\tableofcontents

\begin{abstract}
这是简介及摘要。
\end{abstract}

\section{前言}

\section{关于数学部分}
数学、中英文皆可以混排。You can intersperse math, Chinese and English (Latin script) without adding extra environments.

這是繁體中文。

\end{document}

通过LaTeX工具渲染后,我们就可以得到固定的输出样式:

上面文章渲染以后的样子

除了文档类的标记语言,还有比如说SVG啊、HTML啊也都是类似的东西。

对比

标记语言

使用标记进行书写最主要的劣势就是需要学习标记的用法以及整理、积累模板。优势则是在积累了一定量的模板和习惯后,效率会有非常大的提升,同时由于标记都是文本文件,对同步工具、版本管理工具都会友好很多。

同时因为标记语言都是文本,虽然专门的编辑器支持会好一些,但是好一些无非是高亮和补全以及一定程度的集成和自动化,所以不需要特别的工具,只是使用可以拓展的编辑器就可以非常方便的编辑内容。

不同的标记语言有不同的用途,在特定用途下面标记语言会非常舒服,LaTeX可以提供非常专业稳定的排版,Markdown可以用最简单的标记完成网页内容的编辑,ReStructuredText可以非常方便的编辑结构性文档。主要的额外工作就是多学几种标记语言。

LaTeX类工具也非常在意编号、引用和自动化,比如说参考书目、图表之类的内容都会自动编撰好,自己完全不用担心编号、引用、跳转的问题。

Office Word及类似工具

对于简单的文档,Word不需要填格式,可以用一个差不多的预设进行初期的编排,再加上图形化界面可以引导人使用,上手成本会低很多。

所见及所得使得我们编辑文档的同时就可以知道结果是什么样的。

但是受限于图形界面,如果希望设置足够灵活,设置项就会过多、界面会复杂化,如果希望简单一些,就有很多设置项顾及不到。

常用的工具

对于文字类的编辑工作,常见的主要是Markdown和LaTeX这两种标记语言。

Markdown / 网页内容

Markdown是一种非常非常轻量的标记语言,就是为了给人用记事本写而诞生的,所以语法非常非常简单。在项目文档、博客、IM中都有很多应用,比如说项目中的README.md、Slack沟通工具、Ghost博客中,Markdown都是非常重要的部分。

Markdown语法基础部分大都一样,我们现在常用的Markdown都介于原版Markdown和 Github风味的Markdown ( Github Flavored Markdown ) 之间,语法来说#######一级六级标题,>是引用,**加粗**会渲染成加粗,而*斜体*会渲染成斜体~~删除~~会变成删除,无序列表用*或者-,有序列表直接用小数字标号就行,链接用[链接文字](链接地址),图片用![图片注释](图片地址)

除了GFM以外,其实也有一些其他的Markdown拓展,比如说我现在写这篇博客用的mdx,mdx则是把markdown的内容拓展到了React的JSX,可以写JSX标签或者JSX风格的HTML标签。比如说上面一段文字实际上是这样的:

Markdown语法基础部分大都一样我们现在常用的Markdown都介于原版Markdown和
    Github风味的Markdown
    (
        Github Flavored Markdown
    )
之间语法来说`#``######`<h1 style="display: inline">一级</h1><h6 style="display: inline">六级</h6>标题`>`是引用`**加粗**`会渲染成**加粗**`*斜体*`会渲染成*斜体*`~~删除~~`会变成~~删除~~无序列表用`*`或者`-`有序列表直接用小数字标号就行链接用`[链接文字](链接地址)`图片用`![图片注释](图片地址)`

比较常见的是在博客系统里面使用Markdown或者在项目中使用Markdown写README,本地编辑器的话VSCode + Markdown Preview插件或者Typora都是非常好用的工具,Jetbrains家IDE也内置Markdown支持。

LaTeX / 排版文档

LaTeX则是复杂了很多,是一个完整的排版引擎。由于需求本身复杂,所以语法也显得会复杂那么一些。

LaTeX是Tex的一个分支,类似的还有XeTeX、LuaTeX、LuaLaTeX、XeLaTeX,核心都还是TeX,大致来说XeTex系列使用Unicode所以可以混合各种语言在一起,LaTeX扩展了TeX让人可以更专注于内容本身,LuaTex或者类似的系列通过Lua拓展了TeX工具集同时解决了编码问题。语法都是一样的,只是扩展的数量、形式、内部工作原理略有差别。

同时因为功能复杂,所以基于LaTeX有很多扩展,我们称之为是(Package),和很多编程语言类似。同时为了方便安装,会有所谓的发行版,把各种包汇集起来打包安装。比如说为了中文社区编集的CTeX,后来不维护了,其中的包被跨平台的TexLive、MikTeX和macOS下的MacTeX。

由于是一个排版引擎,所以通常来说用途和导出结果,通常也都是PostScript或者PDF这种以打印和排版有限的文档。pdftex用来把tex文件编译成pdf文件,latexmk和synctex则是可以用pdftex等其他的工具方便你编辑、编译tex文件的工具。

比如说我们写中文文档常用模板ctexart,也就是CTeX的Article,解决了中文的排版问题,顺便设置了非常多的细节,比如说折行的配置。英文常用article模板。

\documentclass[UTF8]{ctexart}

\usepackage{outlines}
\usepackage{fontspec}

\setmainfont[
    BoldFont={FandolSong-Bold.otf},
]{FandolSong}

\title{一个范例}
\author{郭超}

\begin{document}

    \pagenumbering{gobble}
    \maketitle
    \newpage

    \pagenumbering{Roman}
    \tableofcontents
    \newpage

    \section{第一章}
    \subsection{第一节}
    \subsubsection{高尔基三步曲}
    \begin{outline}
        \1 童年
        \1 在人间
        \1 我的大学
    \end{outline}
\end{document}

编译以后会变成 这样的PDF文件