5.3 长代码片段的处理
有很多情况都会导致长代码的产生。长代码片段对题解的观感会造成不小影响。
对于长代码片段,推荐在正文中只贴出关键部分,而将完整代码置于云剪贴板中。
6 正确使用 LaTeX
进入本文的重点了。
这里希望能教会读者正确使用 LaTeX\LaTeXLATEX,规避一些错误用法。
6.1 什么东西该放在公式中?
并不是一切东西都该放在公式中的。滥用公式会导致渲染速度下降,排版混乱等后果。
下面是一个错误示例:
关于 SPFASPFASPFA,它死了。我们应该使用堆优化的 DijkstraDijkstraDijkstra 算法解决单源非负权最短路问题。
正确的写法是:
关于 SPFA,它死了。我们应该使用堆优化的 Dijkstra 算法解决单源非负权最短路问题。
所以什么东西不该放在公式中呢?
中文一般不要放在 LaTeX\LaTeXLATEX 中。
算法名,人名等非公式内容一般不要放在 LaTeX\LaTeXLATEX 中。
行内的程序代码(包括程序函数名称,变量类型,完整语句等)应该用行内代码框表示,而不放在公式中。
下面还是一个错误示例:
这是一个错误示例\huge{\text{这是一个错误示例}}这是一个错误示例
还是那句话,要强调的东西没必要弄得那么大。
即使是要放在公式里的东西,对于使用何种字体仍有要求,下面将会讲到。
6.2 正确使用不同的字体
请使用 Roman 体表示函数和运算。
LaTeX\LaTeXLATEX 中已经预先定义了很多常用的函数和运算,我们可以直接使用。
下面是一个错误的例子:
lcm(x,y)=\frac{x \times y}{gcd(x,y)}
lcm(x,y)=x×ygcd(x,y)lcm(x,y)=\frac{x \times y}{gcd(x,y)}lcm(x,y)=gcd(x,y)x×y
正确的写法应该是这样的:
\operatorname{lcm}(x,y)=\frac{x \times y}{\gcd(x,y)}
lcm(x,y)=x×ygcd(x,y)\operatorname{lcm}(x,y)=\frac{x \times y}{\gcd(x,y)}lcm(x,y)=gcd(x,y)x×y
又一个错误的例子:
f(x,y)=max(x,y)
f(x,y)=max(x,y)f(x,y)=max(x,y)f(x,y)=max(x,y)
正确的写法是这样的:
f(x,y)=\max(x,y)
f(x,y)=max(x,y)f(x,y)=\max(x,y)f(x,y)=max(x,y)
简单概括一下:
对于 gcd\gcdgcd,log\loglog 这些已经有定义的,请在书写它们的时候在前面直接加一个 \,例如 gcd\gcdgcd 请写成 \gcd。
对于 lcm\operatorname{lcm}lcm 这样没有定义的,请将它包含在 \operatorname{} 中。
接下来特别讲一下 mod 运算符。
mod 运算符有三种,\mod,\bmod,\pmod,其中较常用的是 \bmod 和 \pmod。下面举例说明它们的区别。
\bmod 一般用来表示模运算操作:
x = a \bmod b
x=a mod bx = a \bmod bx=amodb
\pmod 则一般用于书写同余方程:
3 \equiv 8 \pmod 5
3≡8(mod5)3 \equiv 8 \pmod 53≡8(mod5)
对于一些字符串常量,使用打字机字体看上去更加美观。
错误的示范:
S=abcdefg
S=abcdefgS=abcdefgS=abcdefg
正确的写法:
S=\texttt{abcdefg}
S=abcdefgS=\texttt{abcdefg}S=abcdefg
对于非公式内容,应该使用 \text{}。
错误的示范:
f(a) = \begin{cases}1 ,& a \in prime\\0 ,& otherwise.\end{cases}
f(a)={1,a∈prime0,otherwise.f(a) = \begin{cases}
1 ,& a \in prime\\
0 ,& otherwise.
\end{cases}f(a)={1,0,a∈primeotherwise.
正确的写法:
f(a) = \begin{cases}1 ,& a \in \text{prime}\\0 ,& \text{otherwise.}\end{cases}
f(a)={1,a∈prime0,otherwise.f(a) = \begin{cases}
1 ,& a \in \text{prime}\\
0 ,& \text{otherwise.}
\end{cases}f(a)={1,0,a∈primeotherwise.
6.3 行间公式
对于 ∑\sum∑ ∏\prod∏ 等巨运算符,放在行内公式会显得比较紧凑。
像这样:∑i=1nai\sum_{i=1}^n a_i∑i=1nai。
必要的场合请使用行间公式,这样这些巨运算符就不会显得太小,观感也会好不少。
∑i=1nai\sum_{i=1}^n a_ii=1∑nai
6.4 公式不是写代码的地方
我们写的是非常正规的数学公式,因此不要在非代码区域使用任何程序设计语言的表示方式。
下面是一些错误示范:
a=x\%px++a==ba <= ba<<15e7
a=x%pa=x\%pa=x%p
x++x++x++
a==ba==ba==b
a<=ba <= ba<=b
a<<1a<<1a<<1
5e75e75e7
正确的写法是这样的:
a=x \bmod px \gets x+1a=ba \leq ba \times 25 \times 10^7
a=x mod pa=x \bmod pa=xmodp
x←x+1x \gets x+1x←x+1
a=ba=ba=b
a≤ba \leq ba≤b
a×2a \times 2a×2
5×1075 \times 10^75×107
注:x←x+1x \gets x+1x←x+1 表示将 x+1x+1x+1 的值赋给 xxx(其实等号也可以表示赋值的含义,不过在这个场景下这种写法更加严谨)。
这里附一些常用符号的表示方法,以供参考:
小于等于号 a≤ba \leq ba≤b:\le 或 \leq;
大于等于号 a≥ba \geq ba≥b:\ge 或 \geq;
另一种格式的小于等于号 a⩽ba \leqslant ba⩽b:\leqslant;
另一种格式的大于等于号 a⩾ba \geqslant ba⩾b:\geqslant;
横向省略号(居于排版基线的位置){1,2,…,n}\{1, 2, \ldots, n \}{1,2,…,n}:\ldots;
横向省略号(居于排版基线与顶线中间)1+2+⋯+n1 + 2 + \cdots + n1+2+⋯+n:\cdots;
叉乘 a×ba \times ba×b:\times;
点乘 a⋅ba \cdot ba⋅b:\cdot;
整除 a∣ba \mid ba∣b:\mid;
更多资料可以在文末的 Reference 部分找到。
6.5 数组的表示
在题解中常常要写到数组,怎样表示比较优美呢?
我们推荐使用多元函数的形式表示数组。例如:f[i][j] 表示成 f(i,j)f(i,j)f(i,j)。
当然用下标的形式也是不错的选择。像上面的例子可以表示为 fi,jf_{i,j}fi,j。
6.6 分数
一般情况下,用 \frac{x}{y} 表示分数 xy\frac{x}{y}yx。
但是行内这个分数实在是太小了。
这种情况下我们更建议使用 \dfrac{x}{y} 表示分数 xy\dfrac{x}{y}yx。
(你会发现这个就大不少了)
6.7 特殊符号
不要使用输入法的插入特殊符号功能来插入我们下面要说的特殊符号。
下面是一些特殊符号在 LaTeX\LaTeXLATEX 的表示方法。
欧拉函数 φ\varphiφ:\varphi(注意不是 \phi);
黄金分割数 ϕ\phiϕ:\phi;
圆的直径 Φ\PhiΦ:\Phi;
莫比乌斯函数 μ\muμ:\mu;
圆周率 π\piπ:\pi;
空集 ∅\varnothing∅:\varnothing(注意不是 \emptyset)。
更多资料可以在文末 Reference 部分找到。
7 外部链接
在一篇题解中,有一些相关知识并不是题解内容的重点,但又属于理解题解所需的必不可少的内容。虽然在大多数情况下可以假设读者已经了解了相关知识,但在某些特殊情况下,还是需要给出一些外部链接,方便阅读该题解的同学学习。
例如,在 NOIp2001 一元三次方程求解 的题解区中,有好几篇题解都提及了盛金公式,却并没有对其进行任何解释,也没有给出外部链接。这很容易让阅读该题解的人感到疑惑。
后记
网上关于 Markdown 和 LaTeX 的资料其实并不少(在 Reference 部分已经列出),那为什么还要有这篇文章呢?
本文大多数常见的错误例子都是笔者在题解审核时经常遇到的。举这些错误例子也是希望各位读者引以为戒,在未来的专栏文章撰写中严格遵守格式规范,使题解的排版更加美观。
Reference
本文原文链接
如何贡献 - OI-wiki
LaTeX 入门
LaTeX 数学公式大全
Markdown 书写风格指南