知乎上的公式是怎么打出来的?

就像维基百科那些公式一样。 怎么打的?
关注者
490
被浏览
237,088

29 个回答

知乎上个月换了新的渲染引擎, 尘埃落定最终还是扔了原来自己瞎写的后端LaTeX方案换了MathJax.

我很早以前就在博客上部署了MathJax, 积累了一些经验分享给大家.

噫, 有没有可能知乎用了自研的 \mathcal{Z}_{\mathbb{\large H}^{\huge{\mathcal i}}}\TeX 呢...

很简单, 搞个递归宏 \def\foo{\bar}\def\bar{\foo}\bar\def\foo{\bar}\def\bar{\foo}\bar

MathJax: 哇, Zhihu你丫给我的什么破玩意儿, 老娘要溢出了...

事实上 \mathrm{MathJax}\ne\LaTeX ,他们使用相同的语法但是已经是不同的东西了.

下面开始我们的学习. 注意, 严格来讲, 下文偷懒写法 = 错误写法.

点击编辑栏上方的 \Sigma 或者按下Ctrl+Shift+E启动...手机就算了.


基础篇

  • \color{blue}{符号}

MathJax与LaTeX最大的不同就是支持Unicode字符...废话当年还没UTF呢, 不过能输入和能正常显示还是有点距离的...

简单地说,有些符号比如乘法在LaTeX中必须写成 a \times b但是现在可以直接打 a×b

我的输入法是能直接打中文出符号的, 这样的话可读性高, 但是在有些键盘上只能打英文.

运算符号: +-×(\times)÷(\div)±(\pm) 负正(\mp) 点乘 \dot
不等号: ≠(\ne\neq\not=) 大于>大于等于≥(\ge)小于等于≤(\le)恒等\equiv. 否定加\not.
约等于: 约等于≈ (\approx波浪\dot=等号加点) 近似不能用~,必须用\sim

点击编辑器的选项亦可, 但是能记命令就不用很麻烦的去点了...

反斜杠 \text{\\} 称为命令,括号 \texttt{\{ \} }被称为界定符, 用作消除歧义.

分数使用\frac{a}{b}, \frac{a}{b} ,不引起歧义可以省略括号比如\frac12, \frac12 ,不过不推荐这么写.


  • \color{blue}{函数}

函数在前面加一个 \ 符号即可, 比如\sin(x), \sin(x)

使用^上标如 a^x , a^x 使用 _ 下标如 \log_a(x), \log_a(x) .

开根号\sqrt{a}, \sqrt{a} 开高次根\sqrt[n]{a}, \sqrt[n]{a} ,其他写法 \root n \of a, \root n \of a .

绝对值|x|, |x| 回车上面那个符号.

大括号\{ \},因为大括号现在是界定符,要输入就要用命令,同理反斜杠是\\.

按照标准,自然底数需要写成 \mathrm{e}^x, \mathrm{e}^x ,但一般偷懒写 e^x即可, e^x .

你有函数就加个\试一试能不能正体,不行的话用下面的方法.

比如光学里有个函数叫菲涅尔S函数, 没法自动正体, 那么可以这样写\operatorname{FresnelS} , \operatorname{FresnelS}(v) ,可以偷懒写成\text{FresnelS}.


  • \color{blue}{微积分}

微积分使用比较特殊的符号规则,看上去差不多但是已经重载过了,或者叫宏.

极限:\lim_{x \to 0}f(x), \lim_{x\to0}f(x) ,可以看到下标_现在变成了正下方.

如果出于某些原因要下标那就要括起来屏蔽其影响{\lim}_{x\to0}f(x),{\lim}_{x\to0}f(x) .

求和\sum_{n=1}^\infty a_n, \sum_{n=1}^\infty a_n ,虽然\sum和\Sigma一模一样,但是行为完全不同,这就是重载.

求积一样的\sum改\prod即可 \prod_{n=1}^\infty a_n ,\prod和\Pi长得一样.

有时候可以看到这种: \textstyle f(x) = \textstyle \sum_{i=0}^{n} \frac{a_i}{1+x}

呀,这个作者搞错了吧,他写的\Sigma_{n=1}^\infty a_n 吗?
\Sigma_{n=1}^\infty a_n ,唉,好像不大一样?

不不,他写的没错,还是\sum_{n=1}^\infty a_n,但是style不同.

\begin{array}{ll} \texttt{\displaystyle} & \displaystyle f(x) = \sum_{i=0}^{n} \frac{a_i}{1+x} \\ \texttt{\textstyle} & \textstyle f(x) = \sum_{i=0}^{n} \frac{a_i}{1+x} \\ \texttt{\scriptstyle} & \scriptstyle f(x) = \sum_{i=0}^{n} \frac{a_i}{1+x} \\ \texttt{\scriptscriptstyle} & \scriptscriptstyle f(x) = \sum_{i=0}^{n} \frac{a_i}{1+x} \end{array}

style有四种,大多数网站区分前两种, 除了知乎所有公式前都加\displaystyle.

求导标准写法f^\prime(x), f^\prime(x) ,但是我都是偷懒写f'(x)的...

微分标准写法\frac{\mathrm{d}^n}{\mathrm{d}\,x^n}f(x), \frac{\mathrm{d}^n}{\mathrm{d}x^n}f(x) ,但我偷懒省略\mathrm.

偏微分标准写法,\frac{\partial^n}{\partial x^n}f(x), \frac{\partial ^n}{\partial x^n}f(x) ,这个没法偷懒了...

积分标准写法\int_a^b f(x)\,\mathrm{d}x, \int_a^b f(x)\,\mathrm{d}x ,当然偷懒省略\,\mathrm了咯...

二重积分\iint f(x,y)\,\mathrm{d}x\,\mathrm{d}y, \iint f(x,y)\,\mathrm{d}x\,\mathrm{d}y ,偷懒同上...

三重积分,\iiint,四重积分\iiiint,五重积分反正不是\iiiiint,五重以上就用\idotsint, \idotsint .

曲线曲面积分,\oint_{C}f(x)\, \mathrm{d}x + g(y)\, \mathrm{d}y, \oint_{C}f(x)\, \mathrm{d}x + g(y)\, \mathrm{d}y ,偷懒同上.

交集\bigcap_{i=1}^\infty p_i, \bigcap_{i=1}^\infty p_i 并集\bigcup_{i=1}^\infty p_i, \bigcup_{i=1}^\infty p_i .


  • \color{blue}{矩阵}
\begin{matrix} 
 1&2\\
 3&4\\ 
\end{matrix}

\begin{matrix} 1&2\\ 3&4\\ \end{matrix} ,要括号的话怎么办呢? 一种方法是使用自适应括号.

\left[\begin{array}{cc|c}
  1&2&3\\
\hline
  4&5&6\\
\end{array}\right]

\left[\begin{array}{cc|c} 1&2&3\\ \hline 4&5&6\\ \end{array}\right]

array可以用来画表

当然这种常用的肯定封装好了.

\begin{array}{lc} \texttt{smallmatrix}&\bigl(\begin{smallmatrix} a & b \\ c & d \end{smallmatrix}\bigr)\\ \texttt{matrix} &\begin{matrix} 1&2\\3&4\\ \end{matrix} \\ \texttt{pmatrix}&\begin{pmatrix}1&2\\3&4\\ \end{pmatrix}\\ \texttt{bmatrix}&\begin{bmatrix}1&2\\3&4\\ \end{bmatrix}\\ \texttt{Bmatrix}&\begin{Bmatrix}1&2\\3&4\\ \end{Bmatrix}\\ \texttt{vmatrix}&\begin{vmatrix}1&2\\3&4\\ \end{vmatrix}\\ \texttt{Vmatrix}&\begin{Vmatrix}1&2\\3&4\\ \end{Vmatrix}\\ \end{array}

向量用\vec,\vec可以作用在一个或两个字母上

\texttt{\vec}&\vec{x}\ \mathrm{or}\ \vec{AB}\\

\texttt{\vec}\ \vec{x}\ \mathrm{or}\ \vec{AB}

\begin{cases}
 a_1x+b_1y+c_1z=\frac{p_1}{q_1} \\[2ex] 
 a_2x+b_2y+c_2z=\frac{p_2}{q_2} \\[2ex] 
 a_3x+b_3y+c_3z=\frac{p_3}{q_3} \\[2ex] 
\end{cases}

\begin{cases} a_1x+b_1y+c_1z=\frac{p_1}{q_1} \\[2ex] a_2x+b_2y+c_2z=\frac{p_2}{q_2} \\[2ex] a_3x+b_3y+c_3z=\frac{p_3}{q_3} \\[2ex] \end{cases}

大括号可以用case, 后面[2ex] 用于调整间距.

当然用自适应括号也行, \left\{ XXX \right. 注意有个点, 加点表示什么也不显示.

  • \color{blue}{其他}

组合符号:\binom{k}{1}, \binom{k}{1} ,当然你不知道用矩阵打也是可以的...我干过...

连分式:

x = a_0 + \cfrac{1^2}{a_1
        + \cfrac{2^2}{a_2
        + \cfrac{3^2}{a_3 
        + \cfrac{4^4}{a_4 + \cdots}}}}

x = a_0 + \cfrac{1^2}{a_1 + \cfrac{2^2}{a_2 + \cfrac{3^2}{a_3 + \cfrac{4^4}{a_4 + \cdots}}}}

我不怎么喜欢这么写, 有点像Lisp, 在没有自动括号补全的情况下少打一个会很开心.

注意这种情况下要写\cfrac,不然会挤在一起

还有很多符号可以\dfrac,\dbinom,\tfrac,\tbinom,分别表示\displaystyle和\textstyle

x = a_0 + \frac{1^2}{a_1+}
          \frac{2^2}{a_2+}
          \frac{3^2}{a_3+} 
          \frac{4^4}{a_4+} \cdots

x = a_0 + \frac{1^2}{a_1+} \frac{2^2}{a_2+} \frac{3^2}{a_3 +} \frac{4^4}{a_4 +} \cdots

应该推广这种写法...还省空间不是...

\underset{j=1}{\overset{\infty}{\LARGE\mathrm K}}\frac{a_j}{b_j}

很有趣的一个事情, \sum到底是怎么重载的? 就是这样, \underset{j=1}{\overset{\infty}{\LARGE\mathrm K}}\frac{a_j}{b_j} .

更多测试参考:知乎公式编辑器测试


你也许会想,这么多命令怎么记得住?

当然记不住, 我又不是最强大脑,但我也不是高中生了, 没人考我记忆力.

忘记说明用不到, 说明不重要, 每天都用的命令是不会忘的.

偶尔遇到现在也不用查手册, 现在不有手写识别嘛

webdemo.myscript.com/vi

哦对了, Mathtype 这种玩意儿少用, 复制出来的代码毫无可读性,严重不符合标准.

何况有个合适的IDE打TeX比Mathtype快多了, 允许你用快捷键还是比你快...


进阶篇

  • \color{blue}{占位符}

回忆下积分的写法,\int_a^b f(x)\,\mathrm{d}x,其中\,称为占位符,用来调节间隔使公式更美观. 空格必须使用占位符否则不算...当然\text{ 空格 } 有效但是这是错误用法...

  1. 占位符以一个大写M为标准, 标为\quad
  2. \qquad 那就是双空格
  3. \, 相当于 3/18个 \quad
  4. \: 相当于 4/18个 \quad
  5. \; 相当于 5/18个 \quad
  6. \ 相当于 6/18个 \quad
  7. \! 相当于-3/18个 \quad
  • \color{blue}{字体字号}

MathJax支持以下九种字体\begin{array}{ll|l} \texttt{"normal"} &\texttt{} & ABCDEFGHIJKLMNOPQRSTUVWXYZ\\ \texttt{"blackboard"} &\texttt{\mathbb} &\mathbb{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"boldface"} &\texttt{\mathbf} &\mathbf{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"typewriter"} &\texttt{\mathtt} &\mathtt{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"roman"} &\texttt{\mathrm} &\mathrm{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"sans-serif"} &\texttt{\mathsf} &\mathsf{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"calligraphic"}&\texttt{\mathcal} &\mathcal{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"script"} &\texttt{\mathscr} &\mathscr{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \texttt{"fraktur"} &\texttt{\mathfrak}&\mathfrak{ABCDEFGHIJKLMNOPQRSTUVWXYZ}\\ \end{array}

正常不填就行, 强制转换的话那就是 \texttt{\mathnormal}

这个是AmsLaTeX里的, 其他字体可以试试\unicode

\unicode[Garamond]{x41} \unicode[Arial]{x41} 

\unicode[Garamond]{x41} \unicode[Arial]{x41} ,这不是标准里的, 这个和浏览器有关, 还和知乎开了什么css-family有关...

字号,字号从大到小依次为:

\Huge\huge\LARGE\Large\large\normalsize\small\footnotesize\scriptsize\tiny

暂时不可以用\fontsize \fontsize{15pt}{22pt}

  • \color{blue}{颜色}

啊,到了大家最关心的颜色环节了.

其实就是 \color{色调}表达式 ,比如标题就是\color{blue}{颜色}, \color{blue}{颜色}

内置的颜色列表应该是:知乎「插入公式」诀窍 列举的这些

\begin{array}{|lc|} \hline \verb+\color{black}{黑色}+ & \color{black}{黑色} \\ \verb+\color{gray}{灰色}+ & \color{gray}{灰色} \\ \verb+\color{silver}{银色}+ & \color{silver}{银色} \\ \verb+\color{white}{白色}+ & \color{white}{白色} \\ \hline \verb+\color{maroon}{栗色}+ & \color{maroon}{栗色} \\ \verb+\color{red}{红色}+ & \color{red}{红色} \\ \verb+\color{fuchsia}{桃红}+ & \color{fuchsia}{桃红} \\ \verb+\color{pink}{粉红}+ & \color{pink}{粉红} \\ \verb+\color{orange}{橙色}+ & \color{orange}{橙色} \\ \verb+\color{yellow}{黄色}+ & \color{yellow}{黄色} \\ \verb+\color{lime}{青柠}+ & \color{lime}{青柠} \\ \verb+\color{green}{绿色}+ & \color{green}{绿色} \\ \verb+\color{cyan}{青色}+ & \color{cyan}{青色} \\ \verb+\color{teal}{靛青}+ & \color{teal}{靛青} \\ \verb+\color{blue}{蓝色}+ & \color{blue}{蓝色} \\ \verb+\color{navy}{海蓝}+ & \color{navy}{海蓝} \\ \verb+\color{purple}{紫色}+ & \color{purple}{紫色} \\ \hline \end{array}

这张表是用MathJax画的哦...

支持16位色代码\color{#A00}{\texttt{#A00}}, \color{#A00}{\texttt{#A00}}

支持256位色\color{#00A000}{\texttt{#00A000}}, \color{#00A000}{\texttt{#00A000}}

不支持带透明通道颜色代码 #0000A000

不支持标准的实值颜色代码{\color[rgb]{1, 0, 0} \texttt{red}},知乎你开包开少了吧...

本来的话背景色一般该写成\pagecolor{色调},但是好像也不接受...

好吧,那就\bbox[颜色]{表达式},一样可以,\bbox[pink,2pt]{f(x)}, \bbox[pink,2pt]{f(x)}

\bbox还可以用来加框

\bbox[#EFF,5px,border:2px solid red]
{e^x=\lim_{n\to\infty} \left( 1+\frac{x}{n} \right)^n\qquad (1)}\\

\bbox[#EFF,5px,border:2px solid red] {e^x=\lim_{n\to\infty} \left( 1+\frac{x}{n} \right)^n\qquad (1)}\\

  • \color{blue}{环境}

知乎把宏取消掉了,那这个没啥好讲了

说个万能对齐环境 align

\begin{align}
f(x) & = (m+n)^2 \\
     & = m^2+2mn+n^2 \\
\end{align}

\begin{align} f(x) & = (m+n)^2 \\ & = m^2+2mn+n^2 \\ \end{align}

不知道用什么对齐那就用align(你知道就用专门的那个)

可以模拟一切对齐case,array,alignat等等的对齐

直接在需要对齐处加&即可

更多环境参考 Share Latex

  • \color{blue}{宏}

宏说白了就是替换

可是知乎上礼拜把宏取消掉了

宏也是最精彩最难的部分...

有宏的话我甚至能画出图来

宏有多强一门语言就有多强

强到极值这门语言强到了极点

我们统称这样的语言为Lisp



完成度1.0.0, 最后更新17.12.19(宏)

参考文档:

  1. 巨型TeX备份
  2. 知乎「插入公式」诀窍
  3. 知乎公式编辑器测试
  4. Help:数学公式
  5. Share Latex
  6. 知乎用户:自学 LaTeX 可以读什么书入门?

全面程度递增, 看完第六个 LaTeX 入门那绝对超越我了(其实看完第五个就能超我了)...

知乎公式是基于Tex的语法编写的,这里简单写写常用的公式,需要时读者们可以随时查询

代码框里的东西是源码


这里事先说明一下大括号{}的特点

如果大括号中只有一个数字或者只有一个以\开头的符号或者字母,如 \pi (\pi)

那么这个大括号可以省略


注意,比方说想表示 \pi x 时,不能直接\pix,要在\pi和x之间加一个空格,不然系统会以为pix是一个符号,请写成 \pi x

  • 1
1
  • 3.14
3.14
  • \frac{b}{a}
\frac{b}{a}
  • {a}^{b+c}
a^{b+c}
  • a^b+c
a^b+c
  • \sqrt{2+\sqrt2}
\sqrt{2+\sqrt2}
  • \sqrt[3]{125}=5
\sqrt[3]{125}=5
  • 0.\dot{1}4285\dot{7}
0.\dot{1}4285\dot{7}
  • y=\left| x \right|
y=\left| x \right|
  • y=\left\{ [(a+b)+c]+d \right\}
y=\left\{ [(a+b)+c]+d \right\}
  • y=\sin x
y=\sin x
  • y=\sinh x
y=\sinh x
  • f(x)=\mathrm e^{x}
f(x)=\mathrm e^x
  • f\prime(x)=\mathrm e^x
f\prime(x)=\mathrm e^x
  • a_1+a_2=3
a_1+a_2=3
  • \log_e{e^2}=2
\log_e{e^2}=2
  • \sum_{i=1}^{10} a_i
\sum_{i=1}^{10} a_i
  • \prod_{i=9}^{19} i^i
\prod_{i=9}^{19} i^i
  • 1,2,\cdots,100
1,2,\cdots,100
  • \lim_{x \to 100} \frac{x^2-10000}{x-100}=200
\lim_{x \to 100} \frac{x^2-10000}{x-100}=200
  • \lim_{x \to \infty}1+\frac{1}{x} =1
\lim_{x \to \infty}1+\frac{1}{x} =1
  • \Delta = \nabla^2 = \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}
\Delta = \nabla^2 =
  \frac{\partial^2 f}{\partial x^2} + \frac{\partial^2 f}{\partial y^2}
  • \int_a^b f(x) dx
\int_a^b f(x) dx
  • \oint_L \mathbf{A} \cdot d\mathbf{r}
\oint_L \mathbf{A} \cdot d\mathbf{r}
  • \vec{a}
\vec{a}
  • \left( \begin{array}{ccc} a & b & c \\ d & e & f \\ g & h & i \end{array} \right)
\left(
    \begin{array}{ccc}
      a & b & c \\
      d & e & f \\
      g & h & i
    \end{array}
  \right)
  • 60^\circ
60^\circ
  • \begin{eqnarray} \begin{cases} x + 4y = 7 & \\ 2x + 3y = 9 & \end{cases} \end{eqnarray}
\begin{eqnarray}
  \begin{cases}
    x + 4y = 7 & \\
    2x + 3y = 9 &
  \end{cases}
\end{eqnarray}
  • \bm{A} \times \bm{B}
\bm{A} \times \bm{B}