# 編寫數學表達式
> 原文:[Writing mathematical expressions](http://matplotlib.org/users/mathtext.html)
> 譯者:[飛龍](https://github.com/)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
你可以在任何 matplotlib 文本字符串中使用子 TeX 標記,將它放在一對美元符號(`$`)內。
注意,你不需要安裝 TeX,因為 matplotlib 提供了自己的 TeX 表達式解析器,布局引擎和字體。 布局引擎是 Donald Knuth 的 TeX 中的布局算法的一種相當直接的適配版,所以質量是相當不錯的(matplotlib 還為那些想要調用 TeX 生成文本的人提供一個`usetex`選項(參見[使用 LaTeX 渲染文本](http://matplotlib.org/users/usetex.html#usetex-tutorial) )。
任何文本元素都可以使用數學文本。 你應該使用原始字符串(在引號前面加一個`'r'`),并用美元符號(`$`)包圍數學文本,如 TeX。 常規文本和數學文本可以在同一個字符串內交錯。 Mathtext 可以使用 Computer Modern 字體(來自 (La)TeX),STIX 字體(為與 Times 混合使用而設計)或你提供的 Unicode 字體。 可以使用自定義變量`mathtext.fontset`選擇 mathtext 字體(請參閱[自定義 matplotlib](http://matplotlib.org/users/customizing.html#customizing-matplotlib))
> 注意
> 在Python的 『narrow』 構建中,如果使用 STIX 字體,你還應該將`ps.fonttype`和`pdf.fonttype`設置為 3(默認值),而不是 42。否則一些字符將不可見。
下面是個簡單的例子:
```py
# plain text
plt.title('alpha > beta')
```
生成`alpha > beta`。
但是這個:
```py
# math text
plt.title(r'$\alpha > \beta$')
```
生成 。
> 注意
> Mathtext 應該放在一對美元符號(`$`)之間。 為了易于顯示貨幣值,例如`$ 100.00`,如果整個字符串中存在單個美元符號,則它將被逐字顯示為美元符號。 這是常規 TeX 的一個小改變,其中非數學文本中的美元符號必須被轉義(`'$'`)。
> 注意
> 雖然一對美元符號(`$`)內的語法是 TeX 風格的,但是外面的文本不是。 特別是,字符:
> ```
> # $ % & ~ _ ^ \ { } \( \) \[ \]
> ```
> 在 TeX 中的數學模式之外有特殊的意義。 因此,根據`rcParam text.usetex`標志這些字符的表現有所不同。 更多信息請參閱[`usetex`教程](http://matplotlib.org/users/usetex.html#usetex-tutorial)。
## 下標和上標
為了制作下標和上標,使用`_`或者`^`符號:
```py
r'$\alpha_i > \beta_i$'
```

一些符號會自動將它們的下標或上標放在操作符的底部或頂部,例如,為了編寫 0 到無窮的  的和,你可以:
```py
r'$\sum_{i=0}^\infty x_i$'
```

## 分數、二項式和堆疊數
可以使用`\frac{}{}`,`\binomial{}{}`和`\stackrel{}{}`命令分別創建分數,二項式和堆疊數字:
```py
r'$\frac{3}{4} \binom{3}{4} \stackrel{3}{4}$'
```
產生

分數可以任意嵌套:
```py
r'$\frac{5 - \frac{1}{x}}{4}$'
```
產生

請注意,在分數周圍放置圓括號和花括號需要特別注意。 這種明顯的方式會產生太小的括號:
```py
r'$(\frac{5 - \frac{1}{x}}{4})$'
```

解決方案是在括號前面加上`\left`和`\right`以通知解析器這些括號包含整個對象:
```py
r'$\left(\frac{5 - \frac{1}{x}}{4}\right)$'
```

## 根式
根式可以有`\sqrt[]{}`產生,例如:
```py
r'$\sqrt{2}$'
```

方括號內可以(可選地)設置任何底數。 請注意,底數必須是一個簡單的表達式,并且不能包含布局命令,如分數或上下標:
```py
r'$\sqrt[3]{x}$'
```

## 字體
用于數學符號的默認字體是斜體。
> 注意
> 此默認值可以使用`mathtext.default` `rcParam`更改。 這是非常有用的,例如,通過將其設置為`regular`,使用與常規非數學文本相同的字體作為數學文本。
為了修改字體,例如,以羅馬字體編寫`sin`,使用字體命令來閉合文本:
```py
r'$s(t) = \mathcal{A}\mathrm{sin}(2 \omega t)$'
```

這里`s`和`t`是斜體(默認)的變量,`sin`是羅馬字體,振幅`A`是書法字體。 注意在上面的例子中,`A`和`sin`之間的間距被擠壓。 你可以使用間距命令在它們之間添加一些空格:
```
s(t) = \mathcal{A}\/\sin(2 \omega t)
```

所有字體的可用選項為:
| 命令 | 結果 |
| --- | --- |
| `\mathrm{Roman}` |  |
| `\mathit{Italic}` |  |
| `\mathtt{Typewriter}` |  |
| `\mathcal{CALLIGRAPHY}` |  |
使用 STIX 字體時,你也可以選擇:
| 命令 | 結果 |
| --- | --- |
| `\mathbb{blackboard}` |  |
| `\mathrm{\mathbb{blackboard}}` |  |
| `\mathfrak{Fraktur}` |  |
| `\mathsf{sansserif}` |  |
| `\mathrm{\mathsf{sansserif}}` |  |
| `\mathcircled{circled}` |  |
還有三個全局『字體集』可供選擇,它們使用`matplotlibrc`中的`mathtext.fontset`參數進行選擇。
`cm`: Computer Modern (TeX)

`stix`: STIX (為和 Times 混合使用而設計)

`stixsans`: STIX sans-serif

此外,你可以使用`\mathdefault{...}`或其別名`\mathregular{...}`來使用用于 mathtext 之外的常規文本的字體。 這種方法有一些限制,最明顯的是,可以使用很少的符號,但可用于將數學表達式與圖中的其他文本混合。
## 自定義字體
mathtext 還提供了一種對數學公式使用自定義字體的方法。 這種方法使用起來相當棘手,應該看做為有耐心的用戶準備的試驗特性。 通過將`rcParam mathtext.fontset`設置為`custom`,你可以設置以下參數,這些參數控制用于特定數學字符集的字體文件。
| 參數 | 相當于 |
| --- | --- |
| `mathtext.it` | `\mathit{}` 默認斜體 |
| `mathtext.rm` | `\mathrm{}` 羅馬字體(upright) |
| `mathtext.tt` | `\mathtt{}` 打字機(monospace) |
| `mathtext.bf` | `\mathbf{}` 粗體 |
| `mathtext.cal` | `\mathcal{}` 書法 |
| `mathtext.sf` | `\mathsf{}` sans-serif |
每個參數應該設置為`fontconfig`字體描述符(在尚未編寫的字體章節中定義)。
所使用的字體應該具有 Unicode 映射,以便找到任何非拉丁字符,例如希臘語。 如果要使用未包含在自定義字體中的數學符號,可以將`rcParam mathtext.fallback_to_cm`設置為`True`,這將導致自定義字體中找不到特定字符時,數學文本系統使用默認的 Computer Modern 字體中的字符。
請注意,Unicode 中規定的數學字形隨時間而演進,許多字體的字形對于 mathtext 可能不在正確位置。
## 重音符號
重音命令可以位于任何符號之前,在其上添加重音。 他們中的一些些擁有較長和較短的形式。
| 命令 | 結果 |
| --- | --- |
| `\acute a` 或 `\'a` |  |
| `\bar a` |  |
| `\breve a` |  |
| `\ddot a` 或 `\"a` |  |
| `\dot a` 或 `\.a` |  |
| `\grave a` 或 `\`a` |  |
| `\hat a` 或 `\^a` |  |
| `\tilde a` 或 `\~a` |  |
| `\vec a` |  |
| `\overline{abc}` |  |
另外有兩個特殊的重音符號,可以自動調整為符號的寬度:
| 命令 | 結果 |
| --- | --- |
| `\widehat{xyz}` |  |
| `\widetilde{xyz}` |  |
當把重音放在小寫的`i`和`j`上時應該小心。 注意下面的`\imath`用來避免`i`上額外的點:
```py
r"$\hat i\ \ \hat \imath$"
```

## 符號
你也可以使用更大量的 TeX 符號,比如`\infty`,`\leftarrow`,`\sum`,`\int`。
| 小寫希臘字母 | | |
| --- | --- | --- |
|  `\alpha` |  `\beta` |  `\chi` |  `\delta` |  `\digamma` |
|  `\epsilon` |  `\eta` |  `\gamma` |  `\iota` |  `\kappa` |
|  `\lambda` |  `\mu` |  `\nu` |  `\omega` |  `\phi` |
|  `\pi` |  `\psi` |  `\rho` |  `\sigma` |  `\tau` |
|  `\theta` |  `\upsilon` |  `\varepsilon` |  `\varkappa` |  `\varphi` |
|  `\varpi` |  `\varrho` |  `\varsigma` |  `\vartheta` |  `\xi` |
|  `\zeta` |
| 大寫希臘字母 | | |
| --- | --- | --- |
|  `\Delta` |  `\Gamma` |  `\Lambda` |  `\Omega` |  `\Phi` |  `\Pi` |
|  `\Psi` |  `\Sigma` |  `\Theta` |  `\Upsilon` |  `\Xi` |  `\mho` |
|  `\nabla` |
| 希伯來文 | | |
| --- | --- | --- |
|  `\aleph` |  `\beth` |  `\daleth` |  `\gimel` |
| 分隔符 | | |
| --- | --- | --- |
|  `/` |  `[` |  `\Downarrow` |  `\Uparrow` |  `\Vert` |  `\backslash` |
|  `\downarrow` |  `\langle` |  `\lceil` |  `\lfloor` |  `\llcorner` |  `\lrcorner` |
|  `\rangle` |  `\rceil` |  `\rfloor` |  `\ulcorner` |  `\uparrow` |  `\urcorner` |
|  `\vert` |  `\{` |  `\|` |  `\}` |  `]` |  `|` |
| 大型符號 | | |
| --- | --- | --- |
|  `\bigcap` |  `\bigcup` |  `\bigodot` |  `\bigoplus` |  `\bigotimes` |
|  `\biguplus` |  `\bigvee` |  `\bigwedge` |  `\coprod` |  `\int` |
|  `\oint` |  `\prod` |  `\sum` |
| 標準函數名稱 | | |
| --- | --- | --- |
|  `\Pr` |  `\arccos` |  `\arcsin` |  `\arctan` |
|  `\arg` |  `\cos` |  `\cosh` |  `\cot` |
|  `\coth` |  `\csc` |  `\deg` |  `\det` |
|  `\dim` |  `\exp` |  `\gcd` |  `\hom` |
|  `\inf` |  `\ker` |  `\lg` |  `\lim` |
|  `\liminf` |  `\limsup` |  `\ln` |  `\log` |
|  `\max` |  `\min` |  `\sec` |  `\sin` |
|  `\sinh` |  `\sup` |  `\tan` |  `\tanh` |
| 二元運算符和關系符號 | | |
| --- | --- | --- |
|  `\Bumpeq` |  `\Cap` |  `\Cup` |
|  `\Doteq` |  `\Join` |  `\Subset` |
|  `\Supset` |  `\Vdash` |  `\Vvdash` |
|  `\approx` |  `\approxeq` |  `\ast` |
|  `\asymp` |  `\backepsilon` |  `\backsim` |
|  `\backsimeq` |  `\barwedge` |  `\because` |
|  `\between` |  `\bigcirc` |  `\bigtriangledown` |
|  `\bigtriangleup` |  `\blacktriangleleft` |  `\blacktriangleright` |
|  `\bot` |  `\bowtie` |  `\boxdot` |
|  `\boxminus` |  `\boxplus` |  `\boxtimes` |
|  `\bullet` |  `\bumpeq` |  `\cap` |
|  `\cdot` |  `\circ` |  `\circeq` |
|  `\coloneq` |  `\cong` |  `\cup` |
|  `\curlyeqprec` |  `\curlyeqsucc` |  `\curlyvee` |
|  `\curlywedge` |  `\dag` |  `\dashv` |
|  `\ddag` |  `\diamond` |  `\div` |
|  `\divideontimes` |  `\doteq` |  `\doteqdot` |
|  `\dotplus` |  `\doublebarwedge` |  `\eqcirc` |
|  `\eqcolon` |  `\eqsim` |  `\eqslantgtr` |
|  `\eqslantless` |  `\equiv` |  `\fallingdotseq` |
|  `\frown` |  `\geq` |  `\geqq` |
|  `\geqslant` |  `\gg` |  `\ggg` |
|  `\gnapprox` |  `\gneqq` |  `\gnsim` |
|  `\gtrapprox` |  `\gtrdot` |  `\gtreqless` |
|  `\gtreqqless` |  `\gtrless` |  `\gtrsim` |
|  `\in` |  `\intercal` |  `\leftthreetimes` |
|  `\leq` |  `\leqq` |  `\leqslant` |
|  `\lessapprox` |  `\lessdot` |  `\lesseqgtr` |
|  `\lesseqqgtr` |  `\lessgtr` |  `\lesssim` |
|  `\ll` |  `\lll` |  `\lnapprox` |
|  `\lneqq` |  `\lnsim` |  `\ltimes` |
|  `\mid` |  `\models` |  `\mp` |
|  `\nVDash` |  `\nVdash` |  `\napprox` |
|  `\ncong` |  `\ne` |  `\neq` |
|  `\neq` |  `\nequiv` |  `\ngeq` |
|  `\ngtr` |  `\ni` |  `\nleq` |
|  `\nless` |  `\nmid` |  `\notin` |
|  `\nparallel` |  `\nprec` |  `\nsim` |
|  `\nsubset` |  `\nsubseteq` |  `\nsucc` |
|  `\nsupset` |  `\nsupseteq` |  `\ntriangleleft` |
|  `\ntrianglelefteq` |  `\ntriangleright` |  `\ntrianglerighteq` |
|  `\nvDash` |  `\nvdash` |  `\odot` |
|  `\ominus` |  `\oplus` |  `\oslash` |
|  `\otimes` |  `\parallel` |  `\perp` |
|  `\pitchfork` |  `\pm` |  `\prec` |
|  `\precapprox` |  `\preccurlyeq` |  `\preceq` |
|  `\precnapprox` |  `\precnsim` |  `\precsim` |
|  `\propto` |  `\rightthreetimes` |  `\risingdotseq` |
|  `\rtimes` |  `\sim` |  `\simeq` |
|  `\slash` |  `\smile` |  `\sqcap` |
|  `\sqcup` |  `\sqsubset` |  `\sqsubset` |
|  `\sqsubseteq` |  `\sqsupset` |  `\sqsupset` |
|  `\sqsupseteq` |  `\star` |  `\subset` |
|  `\subseteq` |  `\subseteqq` |  `\subsetneq` |
|  `\subsetneqq` |  `\succ` |  `\succapprox` |
|  `\succcurlyeq` |  `\succeq` |  `\succnapprox` |
|  `\succnsim` |  `\succsim` |  `\supset` |
|  `\supseteq` |  `\supseteqq` |  `\supsetneq` |
|  `\supsetneqq` |  `\therefore` |  `\times` |
|  `\top` |  `\triangleleft` |  `\trianglelefteq` |
|  `\triangleq` |  `\triangleright` |  `\trianglerighteq` |
|  `\uplus` |  `\vDash` |  `\varpropto` |
|  `\vartriangleleft` |  `\vartriangleright` |  `\vdash` |
|  `\vee` |  `\veebar` |  `\wedge` |
|  `\wr` |
| 箭頭符號 | | |
| --- | --- | --- |
|  `\Downarrow` |  `\Leftarrow` |
|  `\Leftrightarrow` |  `\Lleftarrow` |
|  `\Longleftarrow` |  `\Longleftrightarrow` |
|  `\Longrightarrow` |  `\Lsh` |
|  `\Nearrow` |  `\Nwarrow` |
|  `\Rightarrow` |  `\Rrightarrow` |
|  `\Rsh` |  `\Searrow` |
|  `\Swarrow` |  `\Uparrow` |
|  `\Updownarrow` |  `\circlearrowleft` |
|  `\circlearrowright` |  `\curvearrowleft` |
|  `\curvearrowright` |  `\dashleftarrow` |
|  `\dashrightarrow` |  `\downarrow` |
|  `\downdownarrows` |  `\downharpoonleft` |
|  `\downharpoonright` |  `\hookleftarrow` |
|  `\hookrightarrow` |  `\leadsto` |
|  `\leftarrow` |  `\leftarrowtail` |
|  `\leftharpoondown` |  `\leftharpoonup` |
|  `\leftleftarrows` |  `\leftrightarrow` |
|  `\leftrightarrows` |  `\leftrightharpoons` |
|  `\leftrightsquigarrow` |  `\leftsquigarrow` |
|  `\longleftarrow` |  `\longleftrightarrow` |
|  `\longmapsto` |  `\longrightarrow` |
|  `\looparrowleft` |  `\looparrowright` |
|  `\mapsto` |  `\multimap` |
|  `\nLeftarrow` |  `\nLeftrightarrow` |
|  `\nRightarrow` |  `\nearrow` |
|  `\nleftarrow` |  `\nleftrightarrow` |
|  `\nrightarrow` |  `\nwarrow` |
|  `\rightarrow` |  `\rightarrowtail` |
|  `\rightharpoondown` |  `\rightharpoonup` |
|  `\rightleftarrows` |  `\rightleftarrows` |
|  `\rightleftharpoons` |  `\rightleftharpoons` |
|  `\rightrightarrows` |  `\rightrightarrows` |
|  `\rightsquigarrow` |  `\searrow` |
|  `\swarrow` |  `\to` |
|  `\twoheadleftarrow` |  `\twoheadrightarrow` |
|  `\uparrow` |  `\updownarrow` |
|  `\updownarrow` |  `\upharpoonleft` |
|  `\upharpoonright` |  `\upuparrows` |
| 雜項符號 | | |
| --- | --- | --- |
|  `\$` |  `\AA` |  `\Finv` |
|  `\Game` |  `\Im` |  `\P` |
|  `\Re` |  `\S` |  `\angle` |
|  `\backprime` |  `\bigstar` |  `\blacksquare` |
|  `\blacktriangle` |  `\blacktriangledown` |  `\cdots` |
|  `\checkmark` |  `\circledR` |  `\circledS` |
|  `\clubsuit` |  `\complement` |  `\copyright` |
|  `\ddots` |  `\diamondsuit` |  `\ell` |
|  `\emptyset` |  `\eth` |  `\exists` |
|  `\flat` |  `\forall` |  `\hbar` |
|  `\heartsuit` |  `\hslash` |  `\iiint` |
|  `\iint` |  `\iint` |  `\imath` |
|  `\infty` |  `\jmath` |  `\ldots` |
|  `\measuredangle` |  `\natural` |  `\neg` |
|  `\nexists` |  `\oiiint` |  `\partial` |
|  `\prime` |  `\sharp` |  `\spadesuit` |
|  `\sphericalangle` |  `\ss` |  `\triangledown` |
|  `\varnothing` |  `\vartriangle` |  `\vdots` |
|  `\wp` |  `\yen` |
如果特定符號沒有名稱(對于 STIX 字體中的許多較為模糊的符號也是如此),也可以使用 Unicode 字符:
```py
ur'$\u23ce$'
```
## 示例
下面是個示例,在上下文中展示了許多這些特性。
```py
import numpy as np
import matplotlib.pyplot as plt
t = np.arange(0.0, 2.0, 0.01)
s = np.sin(2*np.pi*t)
plt.plot(t,s)
plt.title(r'$\alpha_i > \beta_i$', fontsize=20)
plt.text(1, -0.6, r'$\sum_{i=0}^\infty x_i$', fontsize=20)
plt.text(0.6, 0.6, r'$\mathcal{A}\mathrm{sin}(2 \omega t)$',
fontsize=20)
plt.xlabel('time (s)')
plt.ylabel('volts (mV)')
plt.show()
```
