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 オプション(後述)を働かせ、出力を中身の大きさへ切り詰めます。

latex
\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 する公式例です。

latex
\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 とは反対向きに働きます。

本文に入れる前の点検

standalone ファイルは「単体で通る」ことが価値なので、本文へ入れる前に図ファイルだけを一度ビルドし、PDF を目で確認します。卒論や論文では図だけを差し替える場面が多いため、figures/experiment-flow.tex のように図の意味で名前を付け、本文側は \input{figures/experiment-flow} だけにしておくと、差し替え・再利用・レビューが楽になります。

  • 図の余白を見る。 端が切れているなら border=2ptborder=5pt を足し、逆に余白が広いなら末尾の空行や不要な \par を疑います。
  • プリアンブルをそろえる。 図ファイルで使う tikz、色、フォント設定は、本体文書にも同じものを読み込ませます。取り込み時に子ファイルのプリアンブルは基本的に飛ばされます。
  • フロートは本体に置く。 figure 環境、キャプション、ラベルは本体側に置き、standalone ファイルには絵そのものだけを書きます。
  • 提出時は再ビルドする。 \includestandalone や画像変換を使う場合は、キャッシュされた古い PDF/PNG が混ざらないよう、提出前に一度クリーンビルドします。

プロジェクトに組み込む形

実際の論文や技術文書では、standalone ファイルを「図のソース」として扱い、本文とは別に点検できる形にしておくと強いです。たとえば本文は paper.tex、図は figures/ に置き、本文では \input{figures/energy-flow} だけを書く。こうしておけば、図を直す人は figures/energy-flow.tex だけを単体でコンパイルして確認でき、本文側ではキャプション・番号・参照だけを管理できます。レビューでは、この単体 PDF を添えて「図だけを見て直す」回を作ると、本文全体の再ビルドを待たずに図の品質を上げられます。

terminal
paper.tex
figures/
  energy-flow.tex
  apparatus-layout.tex
  timing-diagram.tex

提出直前の判断もここで決めます。ソースを \input するだけなら外部コマンドは不要で、通常の LaTeX ビルドに乗ります。\includestandalone で図を別ビルドして画像として取り込むなら、ビルド設定に -shell-escape と生成物の消し方まで含めます。共同執筆では、生成済み PDF をリポジトリに入れるかどうかも明記しておくと、古い図が混ざる事故を防げます。