standaloneクラスの中で数式モードを使う際の注意

はじめに

図や表のサイズに合わせてPDFを出力できるstandaloneクラスですが, ディスプレイ数式モードで出力する環境(equationやalign)などを含めた時にはエラーが発生します. この対処法について説明します.

注意

この先に出てくるソースコードは全てuplatex+dvipdfmxを使ってタイプセットすることを前提としています.

standaloneクラス

standalnoeクラスは図や表に合わせてPDFを出力することができるクラスで, TikZなどで作成した図を画像として出力したい時などに使います. 例えば以下の例だと,

\documentclass[dvipdfmx]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}
\begin{document}
\begin{tikzpicture}
  \begin{axis}[axis lines=center]
    \addplot[samples=200,domain=-1:1]{tan(deg(x))};
  \end{axis}
\end{tikzpicture}
\end{document}

このようなPDFが生成されると思います. f:id:muscle_keisuke:20170519215141p:plain

このPDFをPNGに変換してしまえばブログなんかにも簡単に貼り付けることができます. 実際,この画像はそのような手順で生成してここに載せています.

standaloneクラスでは数式が使えない?

症状

standaloneクラスで図や表だけのPDFを作れるということは数式だけのPDFも作れそうですよね. では,以下のソースコードをタイプセットしてみます.

\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts}
\begin{document}
\begin{equation}
G_{2k}(\tau) = \sum_{(m,n)\in\mathbb{Z}^2\backslash(0,0)}\frac{1}{(m+n\tau)^{2k}}
\end{equation}
\end{document}

すると,次のようなエラーが出てしまいます.

! Missing $ inserted.

構文的にはどこも間違っていません. しかし,standaloneクラスでタイプセットを行う際に,このようなディスプレイ数式モードで出力するような環境を使うと,エラーが起きてしまいます.

対処法

$…$と\displaystyleを使う

LaTeXのみで何とかするならこれです.$…$のみで囲うとインライン数式モードになるのですが,\displaystyleを呼ぶと,明示的にディスプレイ数式モードに切り変えることができます. $…$のみで囲う場合と,\displaystyleを使う場合を見てみます.

  • $…$のみで囲う場合
\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts}
\begin{document}
$
G_{2k}(\tau) = \sum_{(m,n)\in\mathbb{Z}^2\backslash(0,0)}\frac{1}{(m+n\tau)^{2k}}
$
\end{document}

f:id:muscle_keisuke:20170520164600p:plain

  • $…$と\displaystyleを使う場合
\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts}
\begin{document}
$\displaystyle
G_{2k}(\tau) = \sum_{(m,n)\in\mathbb{Z}^2\backslash(0,0)}\frac{1}{(m+n\tau)^{2k}}
$
\end{document}

f:id:muscle_keisuke:20170520164820p:plain

大型の演算子を使っているので違いは一目瞭然ですね. このように\displaystyleを使うと,equation環境等を使った時と同じようなスタイルで数式を出力することができます. 連立方程式や行列などの縦にスペースを取る数式も$…$と\displaystyleでタイプセットすることができます.

\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts, amsmath}
\begin{document}
$\displaystyle
\left(\frac{p}{a}\right) =
\begin{cases}
  +1 \quad (a:QR \quad \bmod p \text{のとき}) \\
  -1 \quad (a: NR \quad \bmod p  \text{のとき})
\end{cases}
$
\end{document}

f:id:muscle_keisuke:20170520170803p:plain

  • 行列
\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts, amsmath}
\begin{document}
$\displaystyle
\text{Res}(f,g) = \text{det}
\begin{pmatrix}
  f_m & f_{m-1} & \cdots  &        & f_0     &        &        &     \\
      & f_m     & f_{m-1} & \cdots &         & f_0    &        &     \\
      &         & \ddots  &        &         &        & \ddots &     \\
      &         &         & f_m    & f_{m-1} & \cdots &        & f_0 \\
  g_n & g_{n-1} & \cdots  &        & g_0     &        &        &     \\
      & g_n     & g_{n-1} & \cdots &         & g_0    &        &     \\
      &         & \ddots  &        &         &        & \ddots &     \\
      &         &         & g_n    & g_{n-1} & \cdots &        & g_0 \\
\end{pmatrix}
$
\end{document}

f:id:muscle_keisuke:20170520172343p:plain

  • 連分数展開
\documentclass[dvipdfmx]{standalone}
\usepackage{amssymb,amsfonts, amsmath}
\begin{document}
$\displaystyle
\sqrt{2} = 1 + \cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{2+\cfrac{1}{\cdots}}}}}}
$
\end{document}

f:id:muscle_keisuke:20170520172730p:plain

しかし,途中式などを含み,複数行に渡る式に関しては $…$と\displaystyleだけではどうにもなりません. この場合は,LaTeXのコードだけで何とかしようせずに別のコマンドに頼ることにしましょう.

pdfcropコマンドを使う

pdfcropコマンドというコマンドが標準のTeX Liveにはついています. これはタイプセット済みのPDFに対して余白を削ってくれるコマンドです. これを使って途中式を含む式をタイプセットしてみます.

\documentclass[dvipdfmx,uplatex]{jsarticle} % クラスは通常通り
\usepackage{amssymb,amsfonts, amsmath}
\pagestyle{empty} % ページ番号を排除する
\begin{document}
\begin{align*} % 式番号を排除する
  a^p &= \{1 + (1 + 1 + \cdots + 1)\}^p \\
  &\equiv 1^p + \{1 + (1 + 1 + \cdots + 1)\} \\
  & \cdots \\
  & 1^p + 1^p + \cdots + 1^p \\
  & a \pmod p \\
  a^{p-1} &\equiv 1 \pmod p
\end{align*}
\end{document}

できたhoge.pdfをpdfcropで切り取ります.

pdfcrop hoge.pdf

コマンドを実行すると,hoge-crop.pdfが生成されます. これが,hoge.pdfに対し,余白を切り取ってできたPDFファイルです. hoge-crop.pdfはこのようになっています. f:id:muscle_keisuke:20170520181520p:plain

このようにして,コマンド一つでPDFの余白を排除することができます.