LaTeX を入れた瞬間、あなたのディスクには一つの図書館が載ります。TeX Live 2024 の texmf-dist/doc を数えると CTAN(Comprehensive TeX Archive Network)由来のドキュメントが PDF だけで 10,099 本、ツリー全体では 3.7 GB あり、その大半は一度も開かれません。手元のコピーを開く鍵は texdoc という一語のコマンドです。このページでは、CTAN という archive がどう動いているかと、それ以上に役に立つこと——すでに持っている LaTeX のドキュメントの読み方(texdoc、kpsewhich、tlmgr info、そして .dtx から説明書を組み直す方法)を扱います。
texdoc パッケージ名——手元のマニュアルを一秒で開く
texdoc booktabs と打つと、いま入っている booktabs の説明書 PDF がそのまま開きます。オンライン検索ではなく、ディスク上のファイルです。これが重要なのは、開くのが「導入済みバージョンの」文書だからです——ウェブで拾った記事が二世代前の書き方でも、texdoc が出す PDF はあなたの環境そのものを説明しています。既定は view モード(マニュアルの言い方では「もっとも良いと思われる結果」を一つ開く)で、オプションを付ければ挙動が変わります。-l は候補を並べて番号で選ばせ、-m は候補が一つなら開き複数なら一覧、-s は普段は隠される低評価の結果まで出します。
texdoc booktabs # open the manual for the version you have installed
texdoc -l siunitx # list every candidate, then pick one by number
texdoc -I -l booktabs # plain list, no interactive prompt
texdoc -M -l lshort # machine-readable: name, score, path, language
texdoc bootabs # a typo still finds booktabs (fuzzy search)texdoc が賢いのは、ファイル名の一致だけで探していないからです。文書ツリー(TEXDOCS)を走査するのに加えて、TeX Live のデータベース texlive.tlpdb を引き、名前.sty や 名前.cls を含むパッケージまで辿ります。だから texdoc shortvrb と打つと、shortvrb.sty を抱えている latex パッケージの中から doc.pdf が正しく開きます(既定の設定ファイルに alias shortvrb = base/doc が書かれています)。候補には数値スコアが付き、名前.pdf は高得点、Makefile は -1000 といった具合に調整されます。綴りを間違えても、まったく一致が無ければもっとも近いパッケージ名を探し直すので、texdoc bootabs は booktabs の文書に着地します。どうしても見つからないときのメッセージは Unfortunately, there are no good matches for "..." で、続けて texdoc.org 上の同名文書への案内が出ます。
| オプション | 動作 | 使いどころ |
|---|---|---|
(none) | 最良の 1 件をビューアで開く | 名前がわかっているとき。既定の動作 |
-l | 候補を並べ、番号で選ばせる | 本体以外に例集や技術メモがあるパッケージ |
-m | 良い候補が 1 件なら開き、複数なら一覧 | 普段使いの折衷案 |
-s | 低評価の結果も含めて全部出す | README や CHANGES まで見たいとき |
-I | 対話プロンプトを出さず素の一覧を出す | スクリプトやログに残したいとき |
-M | 名前・スコア・パス・言語をタブ区切りで出す | 他のツールから呼ぶとき。-I を含む |
-f | 使われている設定ファイルの一覧を出す | 個人設定をどこに書くか確かめたいとき |
もう一つ、多言語で読む人に効く仕掛けがあります。texdoc はシステムのロケールから読み手の言語を推測し、名前-言語コード.pdf に加点するのです。texdoc -l booktabs を叩くと、英語の booktabs.pdf と並んで booktabs-de と booktabs-fr のディレクトリが出てきます——訳された説明書が TeX Live に同梱されているからです。同じ理由で texdoc -l lshort は 60 件以上を返し、その頭には各言語の版が [fr] [zh] [ko] といった印つきで並びます。自動判定が外れる環境なら、texdoc --files が教えてくれる個人設定ファイル(macOS なら ~/Library/texmf/texdoc/texdoc.cnf)に lang = ja の一行を足せば固定できます。同じファイルに mode = list と書けば、以後は毎回 -l を付けたのと同じ挙動になります。
その .sty はどこにあるのか——kpsewhich と tlmgr info
kpsewhich booktabs.sty は、LaTeX が実際に読むファイルの絶対パスを一行で返します。文書がおかしな挙動をしていて説明書と食い違うとき、最初に疑うべきはバージョンではなく「読んでいるファイルが思っているものと違う」可能性で、それを一発で確かめられるのがこのコマンドです。さらに --all を付けると、検索順にすべての候補が出ます。kpsewhich --all article.cls を試すと二行返ってきます——texmf-dist/tex/latex/base/article.cls と texmf-dist/tex/latex-dev/base/article.cls です。同名のファイルが複数あって、前にある方が後ろを隠している状態が目に見えるわけです。自分で .sty を書いてホームに置いた覚えがあるなら、kpsewhich -var-value=TEXMFHOME が返すディレクトリ(macOS なら ~/Library/texmf)を疑ってください。ファイルが見つからなければ何も表示せず終了コード 1 を返すので、スクリプトの条件分岐にも使えます。
kpsewhich booktabs.sty # which file will TeX actually read?
kpsewhich --all article.cls # every copy, in search order
kpsewhich -var-value=TEXMFHOME # your personal tree
tlmgr info booktabs # version, licence, collection, sizes
tlmgr info --list booktabs # run / source / doc files, one by onetlmgr info booktabs は、パスではなくカタログの記述を返します——一行の説明、長い説明、収録コレクション、ライセンス(lppl1.3c)、src / doc / run それぞれの容量、そしてバージョン。ここに cat-contact-bugs や cat-contact-repository が並ぶこともあり、それがそのパッケージの issue tracker の住所です。さらに tlmgr info --list booktabs を叩くと、パッケージが何を配っているかが三つの区分で並びます。この三分割こそ TeX Live のディレクトリ構造そのもので、tex/latex/booktabs/booktabs.sty(実行時に読まれる本体)、doc/latex/booktabs/booktabs.pdf(texdoc が開く説明書)、source/latex/booktabs/booktabs.dtx と .ins(両方が作られる元)という三つ組になっています。
| ディレクトリ | 中身 | 探し方 |
|---|---|---|
texmf-dist/tex/ | \usepackage が読み込む .sty と .cls。TeX Live 2024 では .sty が 6,296 本 | kpsewhich booktabs.sty |
texmf-dist/doc/ | 説明書。PDF が 10,099 本、ツリー全体で 3.7 GB | texdoc booktabs |
texmf-dist/source/ | .dtx と .ins。TeX Live 2024 の .dtx は 2,746 本 | tlmgr info --list booktabs |
TEXMFHOME | 自分で置いた .sty や設定。既定より優先されるので事故の元にもなる | kpsewhich -var-value=TEXMFHOME |
.dtx と .ins——ソースがそのまま説明書になっている
.dtx は、コードと解説を一つのファイルに同居させたものです。同じファイルを二通りに処理できます——tex パッケージ名.ins を走らせると docstrip が解説行を捨てて .sty を吐き、pdflatex パッケージ名.dtx を走らせると今度はコードが逐一の注釈つきで組版され、説明書 PDF になります。手元で multirow を試すと、tex multirow.ins が multirow.sty・bigstrut.sty・bigdelim.sty の三つを生成し、pdflatex multirow.dtx が 30 ページの注釈つきソースを出しました。この形式が使えると何が嬉しいかというと、texdoc が出す説明書に書かれていない挙動を追えることです。実装がそこに全部あるので、「なぜこのオプションだとこうなるのか」を最後まで読み切れます。
# copy the two source files out of the tree first, then:
tex multirow.ins # docstrip: writes multirow.sty, bigstrut.sty, bigdelim.sty
pdflatex multirow.dtx # the same .dtx typeset as an annotated source PDF
pdflatex multirow.dtx # run twice so the cross-references settleこの仕組みが極まった例が LaTeX 本体です。texdoc source2e を叩くと『The LaTeX 2ε Sources』が開きます——Johannes Braams、David Carlisle、Alan Jeffrey、Leslie Lamport、Frank Mittelbach らの名前が並ぶ、1,308 ページの注釈つきカーネル全文です。もう一つ、説明書を読む習慣が身につくと面白いものに気づきます。tlmgr info booktabs が返すバージョンは 1.61803398——これは黄金比 φ = 1.618033988… の桁を一つずつ増やしたもので、booktabs.dtx の中にも「(converging to phi, the golden ratio)」と書いてあります。バージョン番号が数列になっているのは冗談ですが、冗談だと確かめられるのは .dtx を開いたときだけです。
CTAN とは何か——1992 年に作られた一つの住所
CTAN(Comprehensive TeX Archive Network、ctan.org)は、TeX 関連のものを置く場所を一つに決めるために作られました。1992 年、ドイツの Rainer Schöpf と Joachim Schrod、英国の Sebastian Rahtz、そして米国の George Greenwade——「CTAN」という名前を出したのはこの人です——が構築し、1993 年に英国 Aston での EuroTeX 会議で正式に発表されました。発想そのものは 1991 年の討論に遡ります。それ以前は、マクロやフォントがあちこちの FTP サイトに散らばっていて、同じものを別々の人が別々に集め直していました。だから CTAN が解いた問題は「置き場所が無い」ではなく、「置き場所が多すぎる」ことでした。
今日の CTAN の入口はパッケージページ ctan.org/pkg/<名前> です。ここには Sources(ソースの置き場)、Documentation(PDF)、Version、Licenses、Copyright、Maintainer、Contained in(TeX Live / MiKTeX に入っているか)、Topics(トピック分類)が並びます。実務で効くのは最後の二つです。Contained in を見れば、tlmgr install で入るのか手で入れる必要があるのかが即座にわかります。Topics は「名前を知らないが機能はわかっている」ときの入口で、たとえば表組みを探しているなら table トピックからたどれます。ライセンス欄はほとんどが LPPL(LaTeX Project Public License)で、これは配布と改変の条件を定めた TeX 界の標準ライセンスです。
「Network」という語は飾りではありません。CTAN は中核サイトと世界中の公式ミラーで構成され、ミラーは自動で同期します(現在の目安はディスク 50 GB ほど)。だからダウンロード URL に mirror.ctan.org を書くと、近いミラーへ自動的に振り分けられます——TeX Live の公式ガイドも、既定のパッケージ取得先は https://mirror.ctan.org 経由で自動選択されると明記しています。特定のミラーに固定したければ一覧が ctan.org/mirrors にあります。逆向きの流れもあって、作者は新規・更新パッケージを中核サイトの受付領域へアップロードし、CTAN チームの処理を経てミラーへ伝播します。この投稿を助ける道具まで TeX Live に入っていて、ctanify は CTAN が好む構造の tarball を作り、ctan-o-mat は送る前に妥当性を検証します。そして TeX Live 自体が「CTAN のスナップショット」です——つまりあなたのディスクの 3.7 GB の文書は、この archive の写しなのです。
ローカルの文書とオンラインの文書、どちらを信じるか
手元でコンパイルが通るかどうかを決めているのは、手元の文書です。 だから「なぜ動かないのか」を調べるときは texdoc を先に開いてください。逆に「この機能は追加されたのか」を調べるときは CTAN のパッケージページや texdoc.org を見ます——そちらは常に最新です。両者がずれる場面は実際にあります。TeX Live の各リリースはやがて凍結され、それ以降の更新は次のリリースに乗りますから、tlmgr info が返すバージョンやトピック分類が CTAN の表示より古いことは普通に起こります。ずれを見つけたら、まず tlmgr info <パッケージ名> で自分の版を確かめ、それから CTAN 側の記述と読み比べるのが安全な順序です。ウェブで拾ったコードが動かない原因の相当数は、記事の側が古いのではなく、自分の環境と記事の環境が違うことにあります。