最近一段时间迷上了 (La)TeX,也看了不少资料。LaTeX 排版过程中有不少 de facto(约定俗成的)规则,它们不是必须,但是是区别「熟练掌握 LaTeX」与「会使用 LaTeX」的关键因素。我本身就是对细节有强迫症的人,比如修改了 WordPress 的 style.css 后我可以对所有文章的代码都修改一遍,仅仅只为了图片和图注之间的间隔更加美观一些……
过一段时间后也许我会不记得这些 LaTeX 的小细节,因此这里稍加记录,以作备忘。
• 严格区分文字和公式
这一条应该是 LaTeX 用于科学文章排版的最基本要求。在文本输入中应该严格避免出现 \mathbf{}
、\mathrm{}
等语句,同理,在公式的编辑中也应该严格避免出现 \textbf{}
、\textrm{}
等。当然,如果使用了 AMSMath 宏包,则 \text{}
是在公式中输入文本的一种很好的方法。虽然大部分情况下读者是无法分辨一个公式中 \mathbf{}
和 \textbf{}
的区别,但是这毕竟是应该遵守的语法规则。
• 正确处理单词间距
这一条仅适用于英文排版,中文中水平间距的讲究要少得多,基本用一个 xeCJK 就都帮你搞定。
英文排版时 TeX 通常默认句号 .
表示一句话的结束,因此在处理句号时会留出稍宽一点的水平间距。但是有些情况下,句号并不代表句子的结尾,比如「i.e. a word」和「e.g. a word」。按照 TeX 默认规则,这里的宽度会比正常句中单词之间的间隔稍大一些,因此我们需要使用 \
(即一个反斜杠 + 一个空格)来消除这个过大的间距:i.e.\ a word
以及 e.g.\ a word
。
然而还有一种特殊情况下,TeX 并不会认为句号表示句子的结尾,那就是句号跟在一个大写字母的后面。此时 TeX 会认为这个句号表示人名缩写的间隔符,因此仍然按照正常间距来排版,比如 「A. Einstein」。然而这个看似贴心的规则在一些情况下会适得其反,比如一句话明明以缩略语结尾,TeX 反而认为这并不是一句话的结尾:「…… in NBA. He…」。此时,排版出的「He」之前的空格会小于正常的句间间距。这种情况下,需要使用 \@.
(反斜杠 + @ + 句号 + 空格)来取代原先的句号,即 ... in NBA\@. He...
。\@
用来强制告诉 TeX 这里的的确确是一个句子的结尾。
如下所示:
Two people i.e. you and me...
Two people i.e.\ you and me...
... played in NBA. He was ...
... played in NBA\@. He was ...
以上规则除句号外,同样适用于感叹号和问号。
• 公式中的间距设置
积分公式中的微分符号 $\mathrm{d}x$ 前应该加入一个间距 \,
,这个大多数人都知道。不仅如此,一条公式结尾处的标点符号和公式之间,也应该有一个间距 \,
。另外,对于积分公式,积分符号 $\int$ 与被积项之间通常间距过大,这个时候可以利用 \!
来缩小这一间距。差别如下(上式为偷懒写法,下式为强迫症写法):
$\int_a^bf(x)dx = \alpha.$\\
$\int_a^b\!f(x)\,dx = \alpha\,.$
• 连字符(Hyphens)、连接号(En-dashes)、破折号(Em-dashes)及减号(Minus signs)
连字符 -
通常用来连接复合词,比如 daughter-in-law
。
连接号 --
通常用来表示范围,比如 see pages 5--7
。如果真的希望连续输入两个连字符,使用 {-}{-}
。
破折号 ---
是一个正规的标点符号,用来表示转折或者承上启下。要注意的是,破折号与其前后的单词之间不应该存在空格,例如 A specter is haunting Europe---the specter of Communism.
。
排版中的减号应该比连字符要长,因此用来表示减号或者负号时,请严格使用数学模式 $-5$
而不要使用文字模式 -5
。
以上四种区别如下:
• 转置符号
我搜了一下好像转置符号并没有严格的规定,好几种都在普遍被使用。但是有一点是明确的,转置符号不能是斜体。常见的转置符号大概有四种(自定义的不算):
$\mathbf{A}^\mathrm{T}$
$\mathbf{A}^\top$
$\mathbf{A}^\mathsf{T}$
$\mathbf{A}^\intercal$
各自效果如下图所示:
我个人倾向于使用第三或者第四个。其中 \intercal
符号需要使用 AMS 的字符包: \usepackage{amssymb}
。
• 数学公式中的括号和斜除号
不要粗暴地使用 \left(...\right)
(\left[...\right]
、\left\{...\right\}
同理),用 \big
、\bigg
、\Big
、\Bigg
会更美观。在写单边括号时我个人还喜欢使用 \bigl\{
或 \bigr\}
这种。
对于一些需要用到斜除号的地方,如果斜除号两边的字符比较高,用常规的 /
会导致式子很不协调,这个时候可以使用 \middle/
来使得斜除号的高度与两侧字符高度相匹配。如下所示:
$x = a^\frac{1}{2}/b$
$x = \left.a^\frac{1}{2}\middle/b\right.$
• 序号
英文中的序号 1st、2nd、3rd 等,通常用文字模式输入就可以,但是在数学中,经常会涉及「nth element,第 n 个元素」等序号问题。一般会使用连字符来表示,比如 $n$-th
。有的时候可能需要使用上标的方法,那么一般使用 $n^{\text{th}}$
。如果再强迫症一点,可以使用 $n^{\text{\tiny th}}$
使上标稍小一些。文字模式下,可以使用 \textsuperscript{th}
来显示为上标。或者使用 nth 宏包来方便输入(需要使用 [super] 选项来输入上标)。
以上几种方式总结如下:
\documentclass{article}
\usepackage[super]{nth}
\usepackage{amsmath}
\begin{document}
$n$th
$n$-th
$n^{\text{th}}$
$n^{\text{\tiny th}}$
1\textsuperscript{st}\quad 2\textsuperscript{nd}\quad n\textsuperscript{th}
\nth{1}\quad \nth{2}\quad \nth{4}
\end{document}
各自效果如下图:
• 避免数字出现在行首
这个细节大部分人应该都了解,使用 ~
来代替空格可以避免交叉引用或者输入人名时尴尬地被打破成两行,例如 如图~\ref{Fig1} 所示
,或者 as A.~Einstein said...
。
• 中英混排时空格的使用
对于中文排版或中英混排,推荐使用 xeCJK 而非古老的 CJK 或 CTeX。在 xeCJK 下(其他两个我没试过)(更正:这个其实是 XeLaTeX 的功劳,与 xeCJK 无关),中文与英文(或数字)之间,没有必要手动敲入一个空格,编译时会自动为中文与英文(或数字)之间添加合适的间距。但是有一个情况比较特殊,就是在交叉引用时,这个空格是需要手动敲入的,否则这个间距会消失。如下图所示:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xeCJK}
\begin{document}
\begin{equation}
\int_a^b\!f(x)\,dx = \alpha\,.
\label{eq1}
\end{equation}
\begin{center}
... 在式~\eqref{eq1}中,...
... 在式~\eqref{eq1} 中,...
\end{center}
\end{document}
• 其他
- 波浪号(经常在页面的 url 中出现)可以使用
\~{}
来输入,但是这样会造成位于偏上的位置,像 $\verb|~|$ 这样。这个时候可以通过$\sim$
来解决,效果为 $\sim$。 - 斜杠用来表示「或者」的关系时,最好不要简单地使用
/
,比如read/write
,因为这样 TeX 会认为这两个单词是一个整体,不允许在它们之间加入断号,导致有些情况下一行文字过密或过疏。这个时候推荐使用read\slash write
,即允许排版时把这两个单词隔在两行。而在输入单位的时候,仍然使用/
即可,比如5 MB/s
。 - 用
\mbox{}
来避免一个单词中两个字母粘在一起的情况。比如为了防止「Sheffield」的两个 f 以及 f 和 i 之间相邻过近,可以写成Shef\mbox{}f\mbox{}ield
。 - arydshln 宏包跟 array 宏包有冲突(也可能是 tabulary),需要把
\usepackage{arydshln}
放在最后。但是这会导致编译速度变得很慢。类似的做法也适合其他明明看上去很正常但是就是无法正确编译的情况,试试把某些宏包的声明放到最后。 - (参考自这里)使用
align
环境时,应该在对齐符号&
前后使用一个占位符{}
来避免不正确的缩进。比如\begin{align*} x+2y={}&1\\ 2x+y={}&1\\ &{}+1 \end{align*}
另外还有以下几点,不算细节的问题,但是是我这段时间学习到的一些经验:
• 谨慎使用 BibLaTeX
其实我是更偏向于使用 BibLaTeX,毕竟可定制化的地方更多一些,功能也更为强大。但是有不少的期刊并不接受 BibLaTeX,原因应该是 BibLaTeX 出现的时间太晚(2006年),而那些期刊早就有了自己固定的样式文件。例如我最近准备向 OSA 投稿,但是 OSA 提供的 LaTeX 模板中明确指定了使用 natbib 来生成参考文献。因此我的建议是,对于一些不是太正式的文档,可以利用 BibLaTeX 来生成文献引用,但是对于一些投稿的文档,则必须注意接稿方的要求,谨慎使用 BibLaTeX。
• 写文本之前明确文档类型
对于没有模板的文档,或者自己从头开始编写的文档,一定要先确定好文档类型,是 article 还是 report 还是 book。因为对于不同的文档类型,TeX 的层次结构是不一样的,如果写到一半时对文档类型进行变动,所有的层次、交叉引用的编号都会乱套。尤其对于中文排版,如果在导言区中自定义了一些针对不同层级的 renewcommand,结果会更惨…… 虽然可以通过一些方法对这个问题进行挽救,但是在写文档前就应该考虑清楚文档类型,尽量避免这种不必要的麻烦。
• 允许 MathJax 使用单美元符号输入行内公式
最后再补充一点跟排版无关的内容。我使用 MathJax 来使 WordPress 支持 (La)TeX,但是 MathJax 的默认配置是不允许使用单美元符号 $ ... $
来输入行内公式的,而必须使用括号形式 \( ... \)
。官方的理由是单美元符号 $ 出现频率太高,因此用括号的形式能够避免一些不必要的麻烦。但是在大部分的 .tex 文档中,我们往往习惯使用单美元符号来输入行内公式,这个时候,只需要在主题的 header.php 文件中加入 MathJax 的配置说明:
MathJax.Hub.Config({
tex2jax: {
inlineMath: [['
,'
], ['\\(','\\)']],
processEscapes: true}
});
这段配置通常放在原有调用 MathJax 语句下面即可,这时候 header.php 文件应该是这个样子:
References
- Stack Exchange, What is the best symbol for vector/matrix transpose?, http://tex.stackexchange.com/questions/30619/what-is-the-best-symbol-for-vector-matrix-transpose
- Martin J. Osborne, some common (la)tex errors, https://www.economics.utoronto.ca/osborne/latex/LTXERR.HTM
- Will Robertson, Correct punctuation spaces, http://latex-alive.tumblr.com/post/827168808/correct-punctuation-spaces
- Dr How, 强迫症玩转 LaTeX, http://zhuanlan.zhihu.com/p/19683504
- Tobias Oetiker et.al., The Not So Short Introduction to LaTeX2ε, https://tobi.oetiker.ch/lshort/
- Stack Exchange, bibtex vs. biber and biblatex vs. natbib, http://tex.stackexchange.com/questions/25701/bibtex-vs-biber-and-biblatex-vs-natbib
- Wilson_NJUer, LaTeX 写作新手须知, http://weibo.com/ttarticle/p/show?id=2309403955741387052924
强迫症患者的福音,感谢博主!
文章不错支持一下吧
ff 和 fi 看上去粘连的问题更可能是字体具有连字功能,应该不用手动处理
参见
https://zh.wikipedia.org/wiki/%E5%90%88%E5%AD%97
您好,有个关于学位论文参考文献的问题请教,模板的每条参考文献后面都没有加’.’,这个问题通过什么方式修改会比较快?
可以参考这两个:
https://tex.stackexchange.com/questions/192920/biblatex-number-followed-by-dot-in-bibliography
https://tex.stackexchange.com/questions/14183/how-to-use-1-number-followed-by-dot-format-instead-of-1-format-in-bibliogra
纠正强迫症一个强迫症应该不犯的错误
积分微元的「d」不应该是斜体 应该\text{d}
我觉得更应该打成\mathrm{d}
高级强迫症了. 话说效果有区别么? 是不是如果更改字体会有影响?
老哥还有个问题,为什么我的Markdown写文章的时候支持类似$x_i$的行内公式,但我用为知笔记编写的md文件发送到博客,显示的$x_i$还是换行的,?
苍天哪,大地啊,我google 了16个页面终于结局了 $$行内公式的问题了,谢谢博主。五星好评,交叉点赞
看来 google 还是不够智能啊……
你说的 Markdown,是下载了 WordPress 的 Markdown 插件吗?我用的是原生的编辑器,所以不太清楚 Markdown 下的情况
好文章啊,read/slash write, 改成read\slash write
多谢,已修正。看得好仔细啊。
微分好像是正体的写法比较正规吧?
$\int\!\!\!\int_{\Omega} g(u,v)\, \mathrm{d}u\, \mathrm{d}v$
是的,我在正式论文里还是都会采用正体写法,用了 hcl 推荐的语句
\newcommand{\D}{\mathrm{d}}
不建议博主在wordpress中用单$符号,容易跟内置函数冲突。
你说的这些,有好多我根本就不知道。
学习了。
谢谢博主分享,很详细。另外博客很简洁
也在研究中
看看您的博客!
研究研究,学习学习。
这款主题非常的简洁,能否共享下?如果可以的话能否发我下邮件?
这是付费主题,抱歉。
http://themeforest.net/item/flexform-retina-responsive-multipurpose-theme/4258755
同样支持微分符号采用正体,尽管很多文献、书籍并没有这样做,一些 $\LaTeX$ 的教程也没有提到这点,但是考虑到阅读者的阅读体验,有必要对微分符号 $\mathrm{d}$ 与变量 $d$ 加以区分,我认为这样是对阅读者的负责任的态度。
多谢指教。顺便问一下,有没有办法在导言区加入一些 renewcommand 使得微分符号 $\textrm{d}$ 能够快速输入呢?否则一篇积分公式的文章如果每次都需要手动修改一次的确要增加不少工作量的。
个人一般使用的是下面的语句
\newcommand{\D}{\mathrm{d}}
输入大写D的时候正好小指可以按到 Shift,而且输入最少 🙂
不过你也可以用
\renewcommand{\d}{\mathrm{d}}
当然以上都是对于非强迫症的方法。
这里也有更多的相关方法:http://tex.stackexchange.com/questions/60545/should-i-mathrm-the-d-in-my-integrals
另外,个人也又查阅了一下相关资料,根据 ISO 31-11 标准(http://www.ise.ncsu.edu/jwilson/files/mathsigns.pdf),微分 $\mathrm{d}$,确实应该使用正体而非斜体,Typesetting mathematics for science and
technology according to ISO 31/XI ( http://www.tug.org/TUGboat/Articles/tb18-1/tb54becc.pdf ),这篇文章也介绍了适用于强迫症的方法(重点解决了微分号的前后缩进问题)。
还有,如果不想那么麻烦可以直接引用 commath 宏包。
也许可以这样 `\newcommand*{\dif}{\mathop{}\!\mathrm{d}}`
你们可以试试phisics包,重复造车轮并不是一件值得提倡的事:)
积分里的dx中的d要正着放
这一点有待商榷吧,是有不少人推崇正体的 d,但是不少权威的文档,包括 The LaTeX companion,都没有加以区分。
`texdoc mathmode`
看examples里积分怎么写的
写的很好!