からっぽのしょこ

読んだら書く!書いたら読む!同じ事は二度調べ(たく)ない

R Markdownで数式を使ったPDFを作成するときのメモ

はじめに

 R Markdownで数式をふんだんに使った勉強会用の資料を作ったときに使った記法あれこれのメモです。体系的でも網羅的でもないです。

文字

ギリシャ文字

出力 入力 出力 入力
$\alpha$ \alpha
$\beta$ \beta
$\gamma$ \gamma $\Gamma$ \Gamma
$\lambda$ \lambda
$\phi$ \phi $\Phi$ \Phi
$\theta$ \theta $\Theta$ \Theta
$\psi$ \psi $\Psi$ \Psi

 頭に\(バックスラッシュ)を付ければよい。頭文字を大文字にすると、ギリシャ文字の出力も大文字になる。ところで、大文字のないギリシャ文字があるのはなぜでしょうか?  

字体

出力 入力 意味
$\boldsymbol{\Phi}$ \boldsymbol{\Phi} 太字
$\hat{\alpha}$ \hat{\alpha} ハット
$\tilde{\beta}$ \tilde{\beta} チルダ
$\mathbb{E}$ \mathbb{E} 期待値など
${\cal X}$ {\cal X}
${\rm Dirichret}$ {\rm Dirichret} 非斜体
・argmax

【入力】

$$
\mathop{\rm argmax}\limits_{\boldsymbol{\phi}}
$$

【出力】

$$ \mathop{\rm argmax}\limits_{\boldsymbol{\phi}} $$

・うまくいかなかった例(クリックで展開)

【入力】

$$
\begin{aligned}
\max_x \\
{\rm arg} \max_x \\
{\rm argmax}_x \\
\text{argmax}_x
\end{aligned}
$$

【出力】

$$ \begin{aligned} \max_x \\ {\rm arg} \max_x \\ {\rm argmax}_x \\ \text{argmax}_x \end{aligned} $$


 \maxは用意されている。しかしargmaxの真下に$x$を持っていきたい。


・使用例(クリックで展開)

【入力】

$$
\mathop{\rm argmax}\limits_{\boldsymbol{\phi}}
    p(\boldsymbol{\phi} | \boldsymbol{W}, \beta)
  = \mathop{\rm argmax}\limits_{\boldsymbol{\phi}} \left[
         \log p(\boldsymbol{W} | \boldsymbol{\phi})
         + \log p(\boldsymbol{\phi} | \beta)
    \right]
$$

【出力】

$$ \mathop{\rm argmax}\limits_{\boldsymbol{\phi}} p(\boldsymbol{\phi} | \boldsymbol{W}, \beta) = \mathop{\rm argmax}\limits_{\boldsymbol{\phi}} \left[ \log p(\boldsymbol{W} | \boldsymbol{\phi}) + \log p(\boldsymbol{\phi} | \beta) \right] $$


上・下付き文字

出力 入力 意味
$y^n$ y^n 上付き文字
$y^{n+m}$ y^{n+m} 上付き文字
$x_i$ x_i 下付き文字
$x_{i,j}$ x_{i,j} 下付き文字

 上付き文字は、付けたい記号等を{}内に入れて、^{}(キャレット?ハット?)で繋ぐ。
 下付き文字は、付けたい記号等を{}内に入れて、_{}(アンダーバー)で繋ぐ。
 どちらも1文字なら{}はなくてもよい。

・使用例(クリックで展開)

【入力】

$$
\begin{aligned}
N_d &= \sum_{v=1}^V N_{dv}
\\
I(\alpha, \beta)
  &= \int_0^p
         x^{\alpha-1}
         (p-x)^{\beta-1}
     dx \\
  &= \left[
         \frac{1}{\alpha} x^\alpha (p - x)^{\beta-1}
     \right]_0^p
     - \int_0^p
           - \frac{1}{\alpha} x^\alpha
             (\beta - 1) (p - x)^{\beta-2}
     dx
\end{aligned}
$$

【出力】

$$ \begin{aligned} N_d &= \sum_{v=1}^V N_{dv} \\ I(\alpha, \beta) &= \int_0^p x^{\alpha-1} (p-x)^{\beta-1} dx \\ &= \left[ \frac{1}{\alpha} x^\alpha (p - x)^{\beta-1} \right]_0^p - \int_0^p - \frac{1}{\alpha} x^\alpha (\beta - 1) (p - x)^{\beta-2} dx \end{aligned} $$


記号

 四則演算記号や'(ダッシュ)などの基本的な記号はそのまま打てばよい。

等号系

出力 入力 意味
$=$ =
$\equiv$ \equiv
$\neq$ \neq
$\geq$ \geq
$\simeq$ \simeq
$\fallingdotseq$ \fallingdotseq
$\propto$ \propto
$\in$ \in
$\sim$ \sim

計算系

出力 入力 意味
$\log$ \log 対数
$\exp$ \exp 指数
$\frac{1}{2}$ \frac{1}{2} 分数
$\sum_{v=1}^V$ \sum_{v=1}^V 総和
$\prod_{v=1}^V$ \prod_{v=1}^V 総乗
$\partial$ \partial 偏微分のやつ
$\int$ \int 積分

括弧

・括弧の種類
出力 入力 出力 入力 意味
$($ ( $)$ ) 丸括弧
$\{$ \{ $\}$ \} 波括弧
$[$ [ $]$ ] 角括弧


 {}については、文法的な意味を持つ記号(何と呼ぶんだっけ)であるため、\(バックスラッシュ)を付ける必要がある。

・使用例(クリックで展開)

【入力】

$$
\begin{aligned}
& (\alpha - 1) \\
& v \in \{1, 2, \cdots, V\} \\
& \mathbb{E}_{q(\boldsymbol{\Theta})} [\log p(\boldsymbol{Z} | \boldsymbol{\Theta})]
\end{aligned}
$$

【出力】

$$ \begin{aligned} & (\alpha - 1) \\ & v \in \{1, 2, \cdots, V\} \\ & \mathbb{E}_{q(\boldsymbol{\Theta})} [\log p(\boldsymbol{Z} | \boldsymbol{\Theta})] \end{aligned} $$


・括弧のサイズ

・使用例

【入力】

$$
\exp \left(\Psi(\beta_v) - \Psi \Bigl(\sum_{v=1}^V \beta_v \Bigr) \right)
$$

【出力】

$$ \exp \left(\Psi(\beta_v) - \Psi \Bigl(\sum_{v=1}^V \beta_v \Bigr) \right) $$
  • \left\rightは、自動でサイズが調整される。
  • \Bigl\Bigrは、固定サイズ。他に\biglなど5段階くらいある。


 ちなみに、片方だけでは使えない。その場合は他方を括弧の代わりに.(ピリオド)にすると、表示されない。

【入力】

$$
\begin{aligned}
\left( \frac{1}{2} \right. \\
\Bigl. \alpha \Bigr)
\end{aligned}
$$

【出力】

$$ \begin{aligned} \left( \frac{1}{2} \right. \\ \Bigl. \alpha \Bigr) \end{aligned} $$

・使用例(クリックで展開)

【入力】

$$
\begin{aligned}
\mathbb{E}_{q(\boldsymbol{z})} \left[
     \sum_{d=1}^D \log \theta_{z_d}
\right]
  &= \mathbb{E}_{q(\boldsymbol{z})} \Bigl[
         \log \theta_{z_1} + \log \theta_{z_2}
\Bigr.\\
  &\qquad \Bigl.
         + \cdots + \log \theta_{z_D}
     \Bigr]
\end{aligned}
$$

【出力】

$$ \begin{aligned} \mathbb{E}_{q(\boldsymbol{z})} \left[ \sum_{d=1}^D \log \theta_{z_d} \right] &= \mathbb{E}_{q(\boldsymbol{z})} \Bigl[ \log \theta_{z_1} + \log \theta_{z_2} \Bigr.\\ &\qquad \Bigl. + \cdots + \log \theta_{z_D} \Bigr] \end{aligned} $$


 改行を跨いで\left( \\ \right)はできない。その場合は、改行前に\right.で連携を終わらせて、改行後に\left.で再開すればよい。

その他の記号

出力 入力 意味
$\cdots$ \cdots 横点
$\vdots$ \vdots 縦点
$\backslash$ \backslash バックスラッシュ

・使用例(クリックで展開)

【入力】

$$
\begin{aligned}
\boldsymbol{\theta}
  &= \theta_1, \theta_2, \cdots, \theta_K
\\
\prod_{k=1}^K \prod_{v=1}^V \phi_{kv}
  &= \phi_{1,1} * \phi_{1,2} * \cdots * \phi_{1V} \\
  &\qquad * \phi_{2,1} * \phi_{2,2} * \cdots * \phi_{2V} \\
  &\qquad \qquad \qquad \vdots \\
  &\qquad * \phi_{K,1} * \phi_{K,2} * \cdots * \phi_{KV}
\end{aligned}
$$

【出力】

$$ \begin{aligned} \boldsymbol{z}_{\backslash d} &= (z_1, z_2, \cdots, z_{d-1}, z_{d+1}, \cdots, z_D) \\ \prod_{k=1}^K \prod_{v=1}^V \phi_{k,v} &= \phi_{1,1} * \phi_{1,2} * \cdots * \phi_{1,V} \\ &\qquad * \phi_{2,1} * \phi_{2,2} * \cdots * \phi_{2,V} \\ &\qquad \qquad \qquad \vdots \\ &\qquad * \phi_{K,1} * \phi_{K,2} * \cdots * \phi_{K,V} \end{aligned} $$


数式

数式チャンク

 $$で挟んだ範囲が数式チャンクとなる。日本語は出力されない。そのとき、変換エラーにはならない。

【入力】

$$
p(A, B) = p(A) p(B)
$$

【出力】

$$ p(A, B) = p(A) p(B) $$


 スペースは無視される。なので、見やすいように適度に入れるが吉。

改行

 改行したいところで\\(バックスラッシュ*2)を入れる。
 加えて、$$\begin{aligned}\end{aligned}、あるいは\begin{align}\end{align}で数式全体を挟む。

・うまくいかなかった例(クリックで展開)

【入力】

$$
p(A) \\
p(B)
$$

【RStudio上の出力サンプル】

f:id:anemptyarchive:20190810190905p:plain
改行(RStudio)

【pdf上の出力】

f:id:anemptyarchive:20190810191419p:plain
改行(PDF)

(はてなでは、改行記号の\\\\\\にすれば改行できる)

・使用例

【入力】

$$
\begin{aligned}
p(A) \\
p(B)
\end{aligned}
$$

【出力】

$$ \begin{align} p(A) \\ p(B) \end{align} $$

イコールで揃える

・align

 各行内の&の位置が縦方向に揃うようになる。同じ行内に&を複数個指定したときの挙動がよく分からない…

・数式番号あり

【入力】

\begin{align}
p(A, B) &= p(A | B) p(B) \\
  &= p(B | A) p(A)
\end{align}

【出力】

f:id:anemptyarchive:20190810192456p:plain
align

 行ごとに自動で数式番号が付く。

・数式番号なし

【入力】

\begin{align*}
p(A, B) &= p(A | B) p(B) \\
  &= p(B | A) p(A)
\end{align*}

【出力】

f:id:anemptyarchive:20190810192538p:plain
align*

 *を付けて{align*}にすると番号が付かなくなる。(ちなみにはてなだとalign*はエラーalignに式番号は付かない)

・エラー

【入力】

$$
\begin{align*}
p(A, B) &= p(A | B) p(B) \\
  &= p(B | A) p(A)
\end{align*}
$$

【出力】

! Package amsmath Error: Erroneous nesting of equation structures;
(amsmath)                trying to recover with `aligned'.

 エラー: Failed to compile ファイル名.tex. See ファイル名.log for more info.
 実行が停止されました 

 通常の数式入力のように$$で挟むと、エラーとなり出力できない。(HTMLだとできる)
 しかし$$で挟まないと、RStudio上で出力のサンプルが表示されない。つらい…。そこで次のやつ。

・aligned

 alignと同様に、各行内の&の位置が揃う。

【入力】

$$
\begin{aligned}
p(A, B) &= p(A | B) p(B) \\
  &= p(B | A) p(A)
\end{aligned}
$$

【出力】

$$ \begin{aligned} p(A, B) &= p(A | B) p(B) \\ &= p(B | A) p(A) \end{aligned} $$

 {aligned}にすると$$で挟んでOK。逆に挟まないとエラー。
 ただし、{aligned}だと\tag{}が使えないので、任意の数式番号を付けられなくなる。つらい…。自動でも付かない。

・その他

 その他数式を任意に揃える手段にeqnarrayなどがあったが、使っていない。つまり使わない理由が伴う。もう覚えていない。

・数式番号

・setcounter

【入力】

\setcounter{equation}{10}
\begin{align}
f(x) = 0 \\
g(x) = 0 
\end{align}

【出力】

f:id:anemptyarchive:20190810193814p:plain
setcounter


 自動で振り付けられる数式番号は、各チャンク内ではなく資料内全ての数式に通じた番号である。任意の番号で始めたい場合には、\setcounter{equation}{}を使う。
 \setcounter{equation}{n}を設定すると、次の行の番号がn+1となり、そこから通し番号が自動で振られる。

・nonumber

 行末に\nonumberを付けると、その行には数式番号が振られなくなる。

【入力】

\begin{align}
p(\boldsymbol{W} | \boldsymbol{\phi})
  &= \prod_{d=1}^D p(\boldsymbol{w}_d | \boldsymbol{\phi})
\\
  &= \prod_{d=1}^D \prod_{n=1}^{N_d} p(w_{dn} | \boldsymbol{\phi})
\nonumber\\
  &= \prod_{d=1}^D \prod_{n=1}^{N_d} \phi_{w_{dn}}
\\
  &= \prod_{v=1}^V \phi_v^{N_v}
\nonumber
\end{align}

【出力】

f:id:anemptyarchive:20190810194113p:plain
nonumber

・tag

 \tag{}を使うと、{}内に指定した任意のテキストを行末に付けられる。

  ・使用例

【入力】

$$
p(\boldsymbol{W} | \boldsymbol{\phi})
  = \prod_{v=1}^V \phi_v^{N_v} \tag{2.1}
$$

【出力】

$$ p(\boldsymbol{W} | \boldsymbol{\phi}) = \prod_{v=1}^V \phi_v^{N_v} \tag{2.1} $$

数式の分割

・使用例

【入力】

$$
\begin{aligned}
  &\begin{split}
    \mathbb{E}\left[X^2 \right] 
     &= \sum_{x=0}^{1} x^2 p(X=x) \\ 
     &= \sum_{x=0}^{1} x^2 \phi^x (1 - \phi)^{1-x} \\
     &= 0^2 * \phi^0 * (1 - \phi)^{1-0} + 1^2 * \phi^1 * (1 - \phi)^{1-1} \\
     &= \phi \\
  \end{split}\\
  &\begin{split}
    Var\left[X \right] 
     &= \mathbb{E}\left[X^2 \right] - (\mathbb{E}\left[X \right])^2 \\
     &= \phi - \phi^2 \\
     &= \phi(1 - \phi)
  \end{split}
\end{aligned}
$$

【出力】

$$ \begin{aligned} &\begin{split} \mathbb{E}\left[X^2 \right] &= \sum_{x=0}^{1} x^2 p(X=x) \\ &= \sum_{x=0}^{1} x^2 \phi^x (1 - \phi)^{1-x} \\ &= 0^2 * \phi^0 * (1 - \phi)^{1-0} + 1^2 * \phi^1 * (1 - \phi)^{1-1} \\ &= \phi \\ \end{split}\\ &\begin{split} Var\left[X \right] &= \mathbb{E}\left[X^2 \right] - (\mathbb{E}\left[X \right])^2 \\ &= \phi - \phi^2 \\ &= \phi(1 - \phi) \end{split} \end{aligned} $$


 素直に数式チャンクを分けた方が楽だった。

場合分け

 \left\{のように片方だけでは使えない。その場合は\left\{ \right.のように、もう一方に.(ピリオド)を使用する。これに加えて、{array}{ll}を用いると場合分けの表記ができる。(これについてはよく知らない)\

・使用例

【入力】

$$
\begin{aligned}
D_{k \backslash d}
  = \left\{
\begin{array}{ll}
    D_k - 1 &\qquad \text{if} \quad z_d = k \\
    D_k &\qquad \text{if} \quad z_d \neq k
\end{array}  
  \right.
\end{aligned}
$$

【出力】

$$ \begin{aligned} D_{k \backslash d} = \left\{ \begin{array}{ll} D_k - 1 &\qquad \text{if} \quad z_d = k \\ D_k &\qquad \text{if} \quad z_d \neq k \end{array} \right. \end{aligned} $$


 \quad\qquadはスペース。\text{任意の文字列}で任意の文字列を斜体にならずに書くことができる。

 他にもやり方はあった。

その他

コメント

 \overbrace{}^{}の形で、数式中の項などの説明を加える。\overbrace{}の括弧内に、説明を加えたい項を書き、^{}の括弧内に任意のテキストを書く。

・使用例

【入力】

$$
F  = \overbrace{
         \int \sum_{\boldsymbol{z}}
             q(\boldsymbol{z})
             q(\boldsymbol{\theta})
             \log p(\boldsymbol{z} | \boldsymbol{\theta})
         d\boldsymbol{\theta}
     }^{\rm 1st\ term}
     + \overbrace{
           \int
               q(\boldsymbol{\theta})
               \log p(\boldsymbol{\theta} | \alpha)
           d\boldsymbol{\theta}
       }^{\rm 2nd\ term}
$$

【出力】

$$ F = \overbrace{ \int \sum_{\boldsymbol{z}} q(\boldsymbol{z}) q(\boldsymbol{\theta}) \log p(\boldsymbol{z} | \boldsymbol{\theta}) d\boldsymbol{\theta} }^{\rm 1st\ term} + \overbrace{ \int q(\boldsymbol{\theta}) \log p(\boldsymbol{\theta} | \alpha) d\boldsymbol{\theta} }^{\rm 2nd\ term} $$


 \ (バックスラッシュ+半角スペース)で、半角スペースを空けられる。

・まとめ(クリックで展開)

【入力】

\setcounter{equation}{0}
\begin{align}
\frac{\partial F(q(\boldsymbol{\Theta}))}{\partial q(\boldsymbol{\Theta})}
  =& \mathbb{E}_{q(\boldsymbol{Z})} [
       \log p(\boldsymbol{Z} | \boldsymbol{\Theta})
     ]
     + \log p(\boldsymbol{\Theta} | \alpha)
     - \log q(\boldsymbol{\Theta})
     + \lambda - C
       = 0
\\
\log q(\boldsymbol{\Theta})
  &= \mathbb{E}_{q(\boldsymbol{Z})} [
       \log p(\boldsymbol{Z} | \boldsymbol{\Theta})
     ]
     + \log p(\boldsymbol{\Theta} | \alpha)
     + \lambda - C
\\
q(\boldsymbol{\Theta})
  &= \exp \left(
       \mathbb{E}_{q(\boldsymbol{Z})} [
         \log p(\boldsymbol{Z} | \boldsymbol{\Theta})
       ]
       + \log p(\boldsymbol{\Theta} | \alpha)
       + \lambda - C
     \right)
\\
  &= \exp \left\{
       \sum_{d=1}^D \sum_{n=1}^{N_d} \sum_{k=1}^K
         q_{dnk} \log \theta_{dk}
       + \log \left(
           \frac{\Gamma(\alpha D)^K}{\Gamma(\alpha)^{DK}}
           \prod_{d=1}^D \prod_{k=1}^K
             \theta_{dk}^{\alpha - 1}
       \right)
       + \lambda - C
     \right\}
\nonumber\\
  &= \exp \left(
       \sum_{d=1}^D \sum_{k=1}^K
         \log \theta_{dk}^{\sum_{n=1}^{N_d} q_{dnk}}
       + \log \frac{\Gamma(\alpha D)^K}{\Gamma(\alpha)^{DK}}
       + \sum_{d=1}^D \sum_{k=1}^K
           \log \theta_{dk}^{\alpha-1}
       + \lambda - C
     \right)
\nonumber\\
  &\propto
     \exp \left(
       \sum_{d=1}^D \sum_{k=1}^K
         \log \theta_{dk}^{\sum_{n=1}^{N_d} q_{dnk} + \alpha - 1}
     \right)
\\
  &= \prod_{d=1}^D \prod_{k=1}^K
       \theta_{dk}^{\alpha + \sum_{n=1}^{N_d} q_{dnk} - 1}
\\
  &= \prod_{d=1}^D
       {\rm Dirichlet}(\boldsymbol{\theta}_d | \alpha_{d1}, \cdots, \alpha_{dK})
\nonumber
\end{align}

【出力】

f:id:anemptyarchive:20190810194720p:plain
いろいろ

私は割と慣れました。


Enjoy!

おわりに

 あくまでRStudioからLaTeX記法で数式を書くためのものです。私はまだLaTeX自体を触ったことがありません。でもRmdからレイアウトなどを弄るのは大変そうなので、keep_texしてtexで調整しようかと思う今日この頃。
 ところで、そろそろRStudioのバージョンアップをしたいのだけど挙動が変わるのだろうか…

 何かありましたら是非ご指摘ください。お願いします。最後まで読んでいただきありがとうございました。