standalone

standalone は、図やTikZの絵、表といった「ひとつの部品」だけを、それ自体で完結した一枚の文書として組むためのクラスです。出力は中身にぴったり合わせて切り詰められ、余白もページ番号もない、図そのものだけのPDFになります。同名のパッケージと組み合わせると、その図ファイルを本文に \input でそのまま取り込めるのが最大の特徴です。Martin Scharrer 氏による定番パッケージで、一枚の図を単体でも本文の一部としても使い回せます。

standalone とは何か

大きな文書を書いていると、図やTikZの絵を別ファイルに切り出して本文へ取り込みたくなります。ただ、その図ファイルを単体でコンパイルして確認しようとすると、\documentclass\begin{document} といった「枠」を毎回書き足さねばならず、しかも出力は本文用の大きな白いページの片隅に図が乗っただけのものになります。standalone クラス はこの両方を解決します。図ファイルの先頭で \documentclass{standalone} と書いておけば、その一枚を単体でコンパイルでき、出力は 中身の大きさにぴったり切り詰められた PDF(や DVI/PS)になります。ページ番号やヘッダ・フッタも出ません。

standalone には二つの顔があります。ひとつは図ファイル側で使う クラス\documentclass{standalone})、もうひとつは本体文書側で読み込む パッケージ\usepackage{standalone})です。クラスが「一枚を単体で組む」役を、パッケージが「その一枚を本体に取り込む」役を担い、二つで一組になっています。まずクラスから見ていきましょう。

なお standalone クラス・パッケージはどちらも xkeyval パッケージを必要とします。さらにパッケージ側は、取り込むファイル名を追跡するために currfile(内部で filehook を使用)を、画像へのビルド機能のために gincltexfilemod を必要とします。これらは TeX Live・MiKTeX に最初から含まれています。

クラスとしての基本

使い方はふつうの LaTeX 文書と変わりません。\documentclass{standalone} でクラスを選び、プリアンブルでその図に必要なパッケージ(TikZ なら tikz など)を読み込み、\begin{document} から \end{document} の間に中身を直接書きます。クラスが既定で **crop オプション**(後述)を働かせ、出力を中身の大きさへ切り詰めます。

figure.tex
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw (0,0) rectangle (2,1) node[midway] {Example};
\end{tikzpicture}
\end{document}

これを単体でコンパイルすると、長方形の絵だけが入った、外周ぴったりの一枚 PDF ができます。書くときに気をつけたいのは、中身の前後に空行を入れない ことと、\begin{document}\end{document} をそれぞれ独立した行に置くことです。standalone クラスは中身全体をひとつの塊として扱うため、末尾の空行があると幅 \linewidth の段落とみなされ、図の右側に余分な余白が生じることがあります。

TikZ の絵を組むなら、\documentclass[tikz]{standalone} のように **tikz オプション** を付けるのが簡便です。これは tikz パッケージを読み込み、tikzpicture 環境を一枚のページとして切り出すよう設定までしてくれます(内部的には multi=tikzpicturevarwidth=false を設定)。PSTricks の絵には対応する pstricks オプションがあります。

主なクラスオプション

オプションは角括弧にカンマ区切りで並べます。standalone のオプションはほとんどが真偽値で、値を省くと true、特に指定がなければ初期値は false です。これらのオプションは下層のクラス(既定では article)には渡されず、名前の衝突を避けるため standalone 自身が解釈します。代表的なものは次の通りです。

オプション効果既定
crop中身を箱に収め、ページを中身+指定余白の大きさに切り詰めるtrue(v1.0 以降)
border切り詰め時に付ける余白(別名 margin)。1値=四辺、2値=左右と上下、4値=左下右上0pt
varwidth中身を varwidth 環境で包み、段落を含む内容でも自然な幅にする。varwidth=幅 で上限指定off
tikztikz を読み込み、tikzpicture を一枚に切り出す(multi=tikzpicturevarwidth=falseoff
multi中身を複数ページに分ける。各ページが個別に切り詰められる。対象環境名を指定可off
class下層に読み込むクラスを指定(例 class=reportarticle
previewpreview パッケージで切り詰める旧方式。crop と排他で、TikZ シェーディングで問題が出た場合の代替off
beamer切り詰めを行わず、中身を一枚の beamer フレームとして組むoff

最もよく使うのは **border** です。\documentclass[border=5pt]{standalone} とすれば、切り詰めた図の四辺に 5pt の余白が付きます。複数の値を空白区切りで渡すときは値全体を波括弧で包み、border={10pt 5pt} のように書きます。bordervarwidth は文書全体には効かない設定なので、プリアンブルや(multi 有効時は)本文の途中でも **\standaloneconfig{...}** で後から変更できます。

歴史的な注意点が一つ。v1.0 より前は preview オプションが既定で、既定の余白も約 0.5bp ありました。v1.0 以降は crop が既定となり、余白は 0pt に変わっています。古い挙動に戻したい場合は、設定ファイルに \standaloneconfig{preview,border=0.50001bp} と書くか、オプションとして明示します。

パッケージとして本体に取り込む

standalone のもう一つの顔が パッケージ です。本体文書のプリアンブルの できるだけ早い段階\usepackage{standalone} を読み込むと、パッケージは \documentclass を再定義し、\input で取り込んだ図ファイルの \documentclass から \begin{document} までを 読み飛ばす ようにします。図ファイルの document 環境は単なる TeX グループとして扱われ、本体側の本物の document 環境はそのまま機能します(\end{document} の後ろにある記述も無視されます)。つまり、図ファイル側のプリアンブルは取り込み時に取り除かれ、\input{figure} と書くだけで中身だけが本文に流れ込みます。

前提として、図ファイルが必要とするパッケージは、本体文書側でもすべて読み込んでおく 必要があります。図ファイルのプリアンブルは取り込み時に飛ばされるため、tikz などはあくまで本体が読み込む点に注意してください。次は、本体文書が standalone パッケージを読み込み、図を figure 環境の中で \input する公式例です。

main.tex
\documentclass{article}
% load the standalone package early
\usepackage{standalone}
% load everything the sub-files need
\usepackage{tikz}

\begin{document}
% ...
\begin{figure}
  \input{figure}% the standalone file from above
  \caption{A sub-file}
\end{figure}
% ...
\end{document}

同じ figure.tex が、単体でも本体経由でも 一字も変えずに 使えるのが要点です。単体でコンパイルすれば切り詰めた一枚 PDF になり、本体から \input すれば図だけが本文に収まります。float(図表のフロート)は本体側で管理し、figure 環境は本体に置いて中身だけを standalone ファイルにするのが推奨されます(standalone クラスでは croppreview が動くよう float は既定で false)。

本体側で図ファイルのプリアンブルを 自動的に集めたい ときは、\usepackage[subpreambles=true]{standalone} のように読み込みます。すると各図ファイルのプリアンブルが補助ファイルにまとめられ、次回処理で本体に取り込まれます。さらに sort オプションを加えると、各図が読み込むパッケージとそのオプションが重複なく集約され、\PassOptionsToPackage 経由でオプション衝突を避けつつ読み込まれます。手作業で本体プリアンブルに書き写したい場合は print オプションが一覧を出力します。

画像へのビルドと、似たしくみ

standalone には、ソースを取り込む代わりに 図を画像に焼いて取り込む 機能もあります。本体側で \input{figure} の代わりに \includestandalone{figure} と書くと、必要に応じて図ファイルを別途コンパイルして画像(PDF など)を作り、それを \includegraphics で取り込みます。複雑な図を毎回再コンパイルせずに済み、本体のビルドが速くなるのが利点です。ただしこの機能は外部コマンドを呼ぶため、コンパイル時に -shell-escape オプションが必要です。

さらに convertpngjpgsvg などのオプションを使えば、standalone ファイル自体を画像へ書き出す変換機能も使えます(外部の変換ツールが必要)。図を単体で PNG や SVG として配布したいときに便利です。

似た目的のしくみとして **subfiles と、TikZ の external ライブラリ** があります。subfiles は方向が逆で、子ファイルが本体(メイン)のプリアンブルを取り込むのに対し、standalone は子ファイルのプリアンブルを本体側へ取り込めます。そのため、一枚の図を論文・スライド・学位論文など 複数の文書で使い回す 用途には standalone が向き、subfiles は本体と子の一対一の関係に向きます。TikZ の external は本体から一時画像を書き出すしくみで、standalone とは反対向きに働きます。