TeX Live 2024 で which context を叩き、返ってきたパスを ls -l で覗くと、context -> luametatex と出ます。ConTeXt を呼び出すコマンドの正体は、ConTeXt 開発陣が自分たちのために作った luametatex というエンジンそのものだった、というわけです。この一行に ConTeXt という企ての全体が要約されています——ConTeXt は LaTeX に足すパッケージではなく、LaTeX の代わりに使う文書作成システム であり、しかも土台のエンジンごと自前で持っている。このページでは、\setup... 中心の書き方、MkII / MkIV / LMTX という三代の系譜、最初の実行がなぜ遅いのか、そして 誰が本当に ConTeXt を選ぶべきか を、実際のログを読みながら見ていきます。
ConTeXt は LaTeX のパッケージではない
\usepackage{context} のような命令は存在しませんし、ConTeXt 文書の中で \usepackage と書くと Undefined control sequence で止まります。LaTeX と ConTeXt は同じ TeX を土台にした 兄弟のフォーマット で、互いの命令はまったく通じません。ファイル名が同じ .tex でも、処理するのは pdflatex でも lualatex でもなく context コマンドです。共同執筆者や CI が LaTeX のつもりで走らせて失敗する事故は珍しくないので、README に「この文書は context main.tex で作る」と 1 行書いておくと事故が減ります。
$ cat up.tex
\usepackage{amsmath}
\starttext
Hi
\stoptext
$ context up.tex
tex error > tex error on line 1 in file ./up.tex: Undefined control sequence
mtx-context | fatal error: return code: 1ConTeXt を書いてきたのはオランダの Hans Hagen と、その会社 PRAGMA ADE(Advanced Document Engineering)です。名前は「TeX で書く text」、つまり con-tex-t から来ています。学術的な副産物ではなく、自社の受注仕事のための製作道具 として育ったことが性格を決めていて、教育教材・マニュアル・カタログのような「版面を自分で設計する」仕事に向いた作りになっています。歴史の古さもソースを開けば分かります——TeX Live 2024 に入っている cont-nl.mkxl のヘッダは version=1997.08.19、author=Hans Hagen、copyright={PRAGMA ADE & ConTeXt Development Team} のままです。
ConTeXt と LaTeX の違い——\setup... と \start…/\stop…
一番の違いは 体裁の指定がすべて 1 つの命令族に集約されている ことです。LaTeX では余白は geometry、色は xcolor、脚注の体裁は別の何か……とパッケージごとに文法が違いますが、ConTeXt では用紙が \setuppapersize、本文フォントが \setupbodyfont、段落の空きが \setupwhitespace と、すべてが \setup で始まり、すべてが key=value を取ります。数がすごいのかというと本当にすごくて、TeX Live 2024 の LMTX ソース(tex/context/base/mkxl)を走査すると \setup で始まる命令は 498 種類 あります。覚えるべきは命令名ではなく 命名の規則 だ、という設計です。
マークアップの側も規則的です。LaTeX が \begin{env}…\end{env} で環境を書くところ、ConTeXt は \start… と \stop… の対 を使います。本文は \starttext … \stoptext、節は \startsection … \stopsection、別行立ての数式は \startformula … \stopformula。そして LaTeX の \documentclass に当たる 必須の宣言はありません。冒頭にいきなり \setuppapersize[A4] と書いて本文へ入れます。「クラスを選んでから、それに合うパッケージを探す」という LaTeX の思考手順が、そのまま消えるわけです。
% first-context.tex -- compile with: context first-context.tex
\setuppapersize[A4]
\setupbodyfont[12pt]
\starttext
\startsection[title=Introduction]
Hello, \ConTeXt!
\startformula
E = mc^2
\stopformula
\stopsection
\stoptext| LaTeX | ConTeXt | したいこと |
|---|---|---|
\documentclass{article} | (不要) | 文書クラスの宣言は必須ではない。体裁は \setup... に置く |
\begin{document} | \starttext | 本文の開始。終わりは \stoptext |
\section{...} | \startsection[title=...] | 節。見出しだけなら \section も使える |
\[ ... \] | \startformula … \stopformula | 別行立ての数式 |
\usepackage{geometry} | \setuppapersize ほか \setup... | 用紙・余白・版面。パッケージを足す発想が無い |
pdflatex | context | 処理コマンド。.tex でも LaTeX 用コマンドは使えない |
LMTX とは——MkII・MkIV・LMTX の三代
LMTX が現行世代 です。ConTeXt は土台にするエンジンの世代ごとに三つに分かれていて、MkII は pdfTeX(および XeTeX)の上で動く最古の系統、MkIV は LuaTeX の上で動く Lua 時代の書き直し、LMTX(内部名 MkXL)は LuaMetaTeX の上で動く現行系統です。TeX Live 2024 で context --version を実行すると context.mkiv と context.mkxl の両方が同じ日付で報告されます——MkIV も同梱されているのです。しかし context コマンド自体は luametatex への symlink なので、何も指定せずに走らせれば LMTX が動きます。実行ログの 1 行目がそれを明言します: ConTeXt ver: 2024.02.27 09:18 LMTX。
$ ls -l $(which context)
context -> luametatex
$ luametatex --version
This is LuaMetaTeX, Version 2.11.02
Functionality : level 20240226
$ context --version
mtx-context | ConTeXt Process Management 1.06
mtx-context | main context file: .../tex/context/base/mkiv/context.mkiv
mtx-context | current version: 2024.02.27 09:18
mtx-context | main context file: .../tex/context/base/mkxl/context.mkxl
mtx-context | current version: 2024.02.27 09:18鍵は LuaMetaTeX です。これは Hans Hagen たち ConTeXt 開発陣が LuaTeX の後継として ConTeXt のために作り直した軽量エンジン で、思い切っているのは足したものではなく 削ったもの のほうです。PDF 出力のバックエンド、フォント処理、多くのプリミティブを LuaTeX から意図的に取り除き、それらは ConTeXt 側の Lua コードで実装する。結果として外部ライブラリに依存せず、複雑なビルド環境も要らず、OS をまたいで移しやすくなりました。実際 LMTX の実行ログには used backend: pdf と出ますが、その PDF は Lua 側の実装が書き出しています。ここで正直に書いておくべきことがひとつあります——LuaMetaTeX を本格的に使っているのは、いまのところ事実上 ConTeXt だけ です。汎用エンジンではなく、ConTeXt の一部と考えるのが実態に近いでしょう。
古い世代がどこに残っているかも、設定ファイルを見れば分かります。TeX Live の fmtutil.cnf には cont-en pdftex - -8bit *cont-en.mkii と cont-en xetex - -8bit *cont-en.mkii の 2 行があり、これが MkII 用のフォーマット定義 です。つまり MkII は pdfTeX と XeTeX の上で今も焼ける状態で残っている。一方 LMTX はこの仕組みを使わず、後述するように自前のキャッシュにフォーマットを作ります。新しく始めるなら迷わず LMTX で、MkII と MkIV は「昔の文書がそこにあるから残っている」と考えて構いません。
最初の 1 回だけ遅い理由——mtxrun --generate とキャッシュ
ConTeXt はフォーマットをキャッシュに自分で焼くので、初回だけ時間がかかります。 実測すると、まっさらな状態からの 1 回目は total runtime: 3.559 seconds、同じファイルの 2 回目は 0.248 seconds——14 倍の差です。その 1 回目のあいだにキャッシュへ生成されたのが約 19 MB の cont-en.fmt で、以後はこれを読むだけになります。そのさらに手前に、mtxrun --generate によるファイルデータベースの作成があります。これを済ませていない環境で context --version を叩くと、次のような一見わけのわからないエラーが出ます。
# before the file database exists
$ context --version
mtxrun | unknown script 'mtx-context.lua' or 'mtx-mtx-context.lua'
$ mtxrun --generate # builds the file database
mtxrun | elapsed lua time: 3.034 seconds
$ context first.tex # run 1: also dumps ~19 MB cont-en.fmt
system | total runtime: 3.559 seconds
$ context first.tex # run 2: format is cached
system | total runtime: 0.248 secondsこのエラーの正体は、mtx-context.lua が存在しないことではなく、ファイル一覧がまだ作られていないので見つけられない ことです。mtxrun --generate を一度走らせれば解消します。ここまでを済ませたあと、ConTeXt にはもう一つ LaTeX 利用者を驚かせる性質があります——相互参照や目次のために自分で複数回まわる のです。目次を含む文書を context toc.tex と 1 回叩くだけで、ログには --c:currentrun=1 と --c:currentrun=2 の 2 回の内部実行が記録され、上限を示す --c:maxnofruns=9 も見えます。LaTeX で「2 回まわす」「latexmk を使う」と気にしていた部分が、ここでは既定の挙動です。生成される補助ファイルの拡張子も .aux ではなく .tuc になります。
MetaPost が同じコンパイルの中で走る
ConTeXt の目玉のひとつは、作図言語 MetaPost が本体に組み込まれていて、外部プログラムを起動せずにその場で図を描く ことです。文書の中に \startMPcode … \stopMPcode と書くだけで、コンパイル中に図が生成されます。ログを見ると This is MPLIB for LuaMetaTeX, version 3.14, running in double mode と loading metafun for lmtx が並びます——MetaPost がライブラリ MPlib として engine の中に住んでいる証拠です(MPlib は Taco Hoekwater と Hans Hagen が 2007 年に MetaPost をライブラリ化したもの)。MetaPost はクヌースの METAFONT の記述法を受け継ぐ言語なので、線や曲線を「制約として」書けるのが特徴です。
\starttext
\startMPcode
fill fullcircle scaled 3cm withcolor .6red;
draw fullcircle scaled 3cm withpen pencircle scaled 1mm;
\stopMPcode
\stoptext
% one run of `context` produces the PDF; no external MetaPost binary is calledこれは見た目より大きな違いです。図が別プロセスではなく同じ実行の中にあるので、本文の寸法を図が参照できます——本文幅ぴったりの図、節番号に連動した装飾、データから生成する罫線や背景といったものが、後処理なしで書けます。ConTeXt 使いが罫線や背景まで MetaPost で作るのはそのためで、LaTeX で TikZ を使う感覚とは少し違い、ページ要素そのものを描く道具 として使われます。
誰が ConTeXt を選ぶべきか——正直なところ
答えは「版面を自分で設計できる仕事をしている人」 です。教材、マニュアル、カタログ、社内出版物、XML やデータベースから大量に生成する組版——つまり体裁の決定権が自分にある仕事では、\setup... に設定を集約できる ConTeXt の一体設計が効きます。逆に 投稿先が LaTeX テンプレートを指定している論文・学位論文には向きません。学会テンプレート、revtex のようなクラス、共著者の環境、arXiv の処理系——どれも LaTeX 前提であり、ConTeXt に移す労力に見合う見返りがありません。この線引きは能力の優劣ではなく、どちらが版面の決定権を握っているか の問題です。
- 向く仕事。 冊子・教材・カタログ・マニュアルなど、版面を自分で設計するもの。設定が
\setup...に集まるので、あとから版面を変えるときに 1 か所を見れば済みます。 - 向く仕事。 XML やデータから自動生成する組版。ConTeXt は XML を直接読んで組む機構を持っており、Lua で処理を書けます。
- 向く仕事。 図と本文を 1 つのソースで完結させたいもの。MetaPost が同じ実行の中にあるので、後処理も画像ファイルの管理も要りません。
- 向く仕事。 スライド。TeX Live 2024 には
s-present-borings-present-darks-present-punkなど 20 種類以上のプレゼン用スタイルが同梱されていて、MetaPost で装飾まで作り込めます。 - 向かない仕事。 投稿先が LaTeX クラスを指定している論文・学位論文。テンプレートに従うほうが速く、安全です。
- 向かない仕事。 共著者が LaTeX しか使わない原稿。ConTeXt の資料は LaTeX に比べて少なく、詰まったときに聞ける相手も限られます。
資料の集まり方も LaTeX とは違います。LaTeX の知識は世界中の本・Q&A サイト・パッケージ文書に散っていますが、ConTeXt は 公式 wiki の contextgarden と『ConTeXt: an excursion』のような入門書に比較的よく集約されており、開発者と利用者が顔を合わせる 年次 ConTeXt Meeting があります。量は少ないが中心がはっきりしている、と考えると当たらずとも遠からずでしょう。もうひとつ ConTeXt らしい細部を挙げておくと、この処理系は 命令名を母語に翻訳したインターフェース を持っています。TeX Live 2024 の LMTX ソースには英語のほかチェコ語・ドイツ語・フランス語・イタリア語・オランダ語・ペルシア語・ルーマニア語・英国英語のフォーマット定義が並んでいます。オランダ語版 cont-nl が残っているのは、この処理系がどこで生まれたかの記念碑のようなものです。
最後に、始め方の実際を。ConTeXt は TeX Live に同梱されているので、まずは手元の TeX Live で context first.tex を叩けば足ります。常に最新を追いたい場合は、ConTeXt グループが独自に配布する LMTX 配布(旧称 ConTeXt Standalone) を使うのが定番で、こちらは ConTeXt 関連だけを軽く固めて頻繁に更新されます。書き始めるときのコツは、LaTeX の「足りない機能はパッケージを探す」という反射をいったん捨てることです。まず \starttext・\startsection・\startitemize で骨組みを作り、余白やフォントの指定は冒頭の \setup... にまとめる。章が育つにつれて設定を足していけば、本文の中に体裁が散らばらず、版面を変えたくなったときに見る場所が 1 か所で済みます。