到底什么是「内容与样式分离」

写这篇文章的原因有两个。

  1. 时至今日仍然有很多人在按「这一行要缩进两个字符、加粗」的方式来使用 LaTeX;
  2. 市面上关于 LaTeX 的资料大都宣称「LaTeX 是内容与样式分离的」,却不对此做进一步解释,含混而过。

我认为有必要对此稍作解释(或者是重新解释),形成一篇短文,填上这一空白。

介绍

内容与样式分离在英文环境中,更多地被称作:内容与表现分离(separation of content and presentation)。这里的「表现」指的是内容呈现出来的状态,即英文:「the state of being presented」。这一原则的本意是一篇文档的实际内容和逻辑结构与这篇文档呈现给读者看到的样式是相互独立的。举个栗子。ememphasis 的缩写。于是 HTML 语法中的 <em> 标签和 LaTeX 语法中的 \emph{} 命令,都是用来强调文档中的一部分内容使用的。通常,被强调的内容的样式是「倾斜体」。但请注意,「被强调的内容」与「倾斜体」之间的关系,既不充分也不必要。这也就是说,被强调的内容既可以是倾斜体,也可以不是倾斜体——例如可以用增加下划线或者用更高的字重(即用粗体);另一方面,倾斜体也不一定是被强调的内容——排版诗歌时,一般就会用到倾斜体。

由此也可见得,「内容与样式分离」这一原则并非只属于 LaTeX。它是一种通用的原则,并非 LaTeX 家专属。

思维流

基于这些对「内容与样式分离」的理解,我们可以看看在内容与样式分离这一原则之下,写作时的思维流应该是怎样的。思维流是我自创的概念;在我的理解中

$$ \text{思维流} = \text{思考方式} + \text{思考的内容}. $$

这里我们以下面的内容为例,看一看思维流是怎样的。

定理 1 (勾股定理). 设直角三角形的三条边长分别是 $a$, $b$ 和 $c$,其中 $c$ 是斜边边长,则有 $a^2 + b^2 = c^2$ 成立.

内容与样式不分离

对于内容与样式不分离的思维流,书写这段文字的时候大概是这样的:

  • 加粗
  • 定理
  • 空格
  • 数字 1
  • 左括号 (
  • 勾股定理
  • 右括号 )
  • 句点 .
  • 空格
  • 结束加粗
  • 倾斜体
  • 设直角三角形的三条边长分别是 $a$, $b$ 和 $c$,其中 $c$ 是斜边边长,则有 $a^2 + b^2 = c^2$ 成立.
  • 结束倾斜

翻译成 LaTeX 代码大概会是这样:

1
\textbf{定理 1 (勾股定理).} \textsl{设直角三角形的三条边长分别是 $a$, $b$ 和 $c$,其中 $c$ 是斜边边长,则有 $a^2 + b^2 = c^2$ 成立.}

不遵守内容与样式分离的原则时,作者的思维是非结构化的。作者思考的是「这一小块内容应该是加粗还是倾斜,是多大字号」这些问题。然后,作者在书写内容时,不得不边写边调整格式。

内容与样式分离

对于内容与样式分离的思维流,书写这段文字的时候大概是这样:

  • 这是一个 定理
  • 它的编号是 1
  • 它的名字是 勾股定理
  • 它的内容是 设直角三角形的三条边长分别是 $a$, $b$ 和 $c$,其中 $c$ 是斜边边长,则有 $a^2 + b^2 = c^2$ 成立.
  • 把它们分别放在恰当的标记中(在 LaTeX 中是定理环境)

翻译成 LaTeX 代码大概会是这样:

1
2
3
\begin{theorem}[勾股定理]
设直角三角形的三条边长分别是 $a$, $b$$c$,其中 $c$ 是斜边边长,则有 $a^2 + b^2 = c^2$ 成立.
\end{theorem}

在内容与样式分离的原则下,作者的思维流是结构化的。具体来说,作者会思考:「这一小块内容起到了什么作用,属于什么结构」,然后相应地标记(在 LaTeX 中是命令或者控制序列)这些内容。例如,在这个例子中,作者用 theorem 环境把定理的各个方面标记起来。这种情况下,作者无需边写边调整格式,只需在撰写文档开始前或者结束后,统一定义各个标记的具体样式即可。

一个问答

很多人使用 LaTeX 时往往会有这种疑惑:不是说 LaTeX 是内容与样式分离的吗?为什么为用 LaTeX 写文章的时候,还要不停去调整格式?

对此,我的回答如下:

  1. LaTeX 是按照「内容与样式分离」的原则设计的没错,但是具体能不能遵循这一原则,还要看具体使用的人。事实上,从 Office 2003 开始,Microsoft Word 也引入了样式的功能,可以在这一原则下写作。这一点与 LaTeX 是一样的。但是有多少人会「正确地使用 Word」呢?
  2. 如果写作的过程中会需要你不停调整格式,说明你没有完全遵循内容与样式分离的思维流。你需要做的事情是切换思维流:
    • 遇到一段内容,比如 foo bar baz,你打算将其加粗并将字体放大。比如使用 \textbf{\LARGE foo bar baz}
    • 你需要做的是停下,然后去思考这一段内容究竟起到什么作用?属于什么结构?比如,你发现它是练习题的名字,接下来还会有练习题的内容。
    • 那么你需要在导言区定义一个命令或者环境,用于标记练习题。比如定义一个带有一个参数的环境 MyExercise。此时你可以不去设计这个环境的具体格式,只需要有一个框架即可。
    • 然后,你应该在恰当的位置使用该环境。
    • 最后,当你文章写完之后,如果还有尚未确定样式的命令或环境,再去慢慢设计就好了。
1
2
3
4
5
6
7
8
9
10
% ...
\newenvironment{MyExercise}[1]{#1\par}{\par}
% ...
\begin{document}
% ...
\begin{MyExercise}{foo bar baz}
% ...
\end{MyExercise}
% ...
\end{document}
俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。