コンテンツへスキップ
Topos Uranos

要約

この回は、表と図を扱う本講座の第五単元を締めくくる。最も単純な表から、フロートに入れた TikZ の図に至るまでの原理と仕組みの連鎖を組み立て直し、各環でどの原理が使われ、それがどの回で確立されたかを示す。達成したことを講座の計画の中に位置づけ、ここでは予告にとどめ、以降の単元に残した問題を明らかにする。終了テストでは開始テストの技能を繰り返す。最後に、各回の問題より難しく、いくつもの回を組み合わせることを求める六つの挑戦課題を置く。学部の規程に従って実験レポートの表を組むこと、警告なしにコンパイルされながら六つの欠陥を示す文書を診断すること、写真と描いた模式図で一つの図を組むこと、データファイルから表を生成すること、2 段組に移すと崩れる図を作り直すこと、そして三つの異なる表の環境を選ぶことである。

学習目標

  1. 単元の仕組みの順序を組み立て直し、それぞれが依拠する原理を特定できる。
  2. 表、画像、フロートの多くの欠陥がなぜ警告なしにコンパイルされるのか、そしてその痕跡を出力のどこに探すべきかを説明できる。
  3. 単元が確立したことと、予告しただけで以降の単元が展開することとを区別できる。
  4. 揃えた数値、キャプション、名前、参照、サブ図、作図を組み合わせた表と図を組み、それらを組み合わせたソースが何を出力するかを予測できる。
  5. 表、画像、作図のそれぞれについて、文書の変更に耐える環境、寸法、位置を選べる。

単元で達成したこと

この単元の目標は、論文のデータ、画像、図が本文と同じ明快さで読め、節や数式と同じように番号を付けて参照され、著者が手で指定しなくてもページ上の居場所を見つけることであった。この目標は、導入が前の単元から既知とみなしたことに支えられて達成された。すなわち、ラベルが何を記録するかに左右される相互参照、各 \\ が行を開き各 & がセルを区切る前の単元の整列、そして決定を一度だけ下す場所である、独自の命令を備えたプリアンブルである。こうして、たどってきた道は五つの区間からなる一本の連鎖として読める。

読みやすい表

読みやすい表の回は、整列の原理を本文に持ち込んだ。tabular は \\ ごとに行を、& の組ごとにセルを作り、セルごとに一つの列指定文字が対応し、全体はエンジンが丸ごと配置するボックスである。数え方の規則から二種類のエラーを導いた。\\ が抜けると次の行で報告される「うるさい」エラー「Extra alignment tab」と、セルの少ない行という「静かな」エラーで、後者をエンジンは受け入れる。格子を booktabs の三本の罫線に置き換え、切り詰めた \cmidrule と \addlinespace を使った。siunitx の S 列で数値を小数点に揃えた。その table-format は場所を確保するが、それより幅の広い数値はその場所をはみ出し、ログに「Overfull \hbox」を一つ残すほかは何の痕跡も残さない。また S 列は既定で小数点「.」を出力し、これは日本語の慣行に合う(小数点の記号は babel からではなく \sisetup で決まる)。単位は見出しに移し、S 列では波括弧で囲んだ。そして \raggedright\arraybackslash で右端をそろえない文章を組んだ。

複雑な表と長い表

複雑な表と長い表の回は、数え方の規則を、複数のセルの場所を占める \multicolumn に広げ、先頭の & を忘れるとグループ見出しがずれてもエンジンが気づかないことを示した。部分罫線は自分の列番号だけに従うからである。tabularx、あるいは tabular* と \extracolsep{\fill} で表に行幅を与え、文字の大きさを変えてしまう \resizebox を退けた。longtable で長い表を複数ページに分けた。longtable は見出しを繰り返し、続きの部分に \caption[] を置けば番号を一度だけ付け、列幅を確定するためにもう一度のコンパイルを求め、table に入れると行を失う。そして、唯一の出所であるデータファイルから csvsimple と pgfplotstable で表を生成し、overwrite のない filecontents* はファイルを書き直さないことに注意を促した。

文書中の画像

文書中の画像の回は、\includegraphics がボックスを作り、エンジンがそれを大きな文字のように行に置くことを確立し、そこから、画像を行幅からはみ出させる段落の字下げ、画像を中央に置く方法、二つの画像を横に並べる方法を導いた。寸法は、置かれた場所に合わせて変わる \linewidth を基準に表した。keepaspectratio なしで幅と高さを指定すると警告なしに変形すること、オプションは書いた順に適用されることを示した。PDF で書き出すベクトルのグラフと、エンジンが解像度を確かめない写真とを区別した。そしてファイルの探索を学んだ。拡張子を省くと、PDF が PNG より警告なしに優先され、\graphicspath には二重の波括弧が要る。

図表のフロート

図表のフロートの回は、分割できないボックスからフロートを導いた。分割できず収まらないものは収まる場所へ運ばれ、だから番号で参照される。配置指定子を許される場所として説明し、[h] が [ht] に広げられること、[H] の作る空白、置き場所のない図がほかの図を引き止めることを示した。キャプションを組んだ。キャプションは番号を付け、一覧に書き込み、表では caption パッケージの間隔とともに上に置く。\setlocalecaption で表の一覧の見出しを「表目次」から「表一覧」に変えた。babel は \renewcommand を打ち消すからである。そして cleveref を \crefname で直した。caption がキャプションの前に置いたラベルを暴くことを確かめた。サブ図、一つの figure の中の独立した図、threeparttable による表の注を組んだ。その前に、フロートの中の \footnote が本文を失うことを示した。

TikZ による作図

TikZ による作図の回は、挿入する画像から書く画像へと移った。まずプリアンブルから始めた。luatexja も日本語の babel も TikZ の使う記号には触れないが、多くの言語のモジュールは記号をアクティブにする(スペイン語のモジュールは > をアクティブにし、\usetikzlibrary{babel} がなければ最初の矢印でエラーが連鎖する)。そこで babel ライブラリは習慣として読み込む。直交座標、極座標、相対座標を、+ と ++ の違いとともに学んだ。パス、線のオプション、arrows.meta の矢じり、名前とアンカーを持ち positioning で互いの位置を決めるノード、\tikzset のスタイルと \foreach による繰り返し、さまざまな分野の図、正弦が警告なしに度で測られる関数のグラフ、そして pgfplots を扱った。最後に図をフロートに入れ、縮小の三つの方法を比べた。

次の図は五つの区間を一本の連鎖にまとめたものである。列の各ノードは仕組みまたは規則であり、互いに依拠する順に番号が振られ、それが使う前の環と弧で結ばれている。周囲には支えが浮かんでいる。連鎖が繰り返し頼る原理のことで、それぞれ、自分に依拠する環とは実線で、自分が確立される環とは点線で結ばれる。前の単元で確立された支えは輪として描かれる。支えを押すと、それを使うすべての環が強調され、各環はそれを学ぶ回へのリンクになっている。

鎖の支え

  • Aラベルが記録するもの. ラベルは、自分より前に、自分の環境の中で割り当てられた最後の番号を記録する。自分が何に結び付いているかは知らない。第三単元で確立。 この単元では証明なしに認める。
  • B整列は表である. 整列の環境は \\ ごとに行を、二つの & の間の区間ごとにセルを作る。行が不完全でもそうする。前の単元で確立。 この単元では証明なしに認める。
  • C一度だけ決める. 一か所で決めたもの(プリアンブルの命令や書式、スタイル、データファイル)は、そこを変えれば文書全体で変わる。手で写したものは食い違っていく。前の単元で確立。 この単元では証明なしに認める。
  • Dコンパイルの回数. エンジンは一回のコンパイルで計算したことを補助ファイルに書き、次の回でそれを使う。第一単元で確立。 この単元では証明なしに認める。
  • Eluatexja と babel のすること. luatexja は日本語を組むが、自動で付く名前は訳さない(Figure、Table のまま)。\babelprovide で読み込む日本語の babel は「図」「表」「表目次」を与え、それらを文書の始まりで、プリアンブルをすべて読み終えた後に設定する。どちらも数値の小数点をコンマに変えず、記号もアクティブにしない。そうするモジュールもある(スペイン語は < と >)。一部は前の単元で確立。 この単元では証明なしに認める。
  • Fボックスは分割されない. 表、画像、作図はボックスであり、エンジンはそれを大きな文字のように丸ごと置き、二つのページにまたがって切ることはない。 確立される環: 1. 行とセル.
  • G正しいものは警告されない. エンジンが警告するのは組めないものだけである。正しいソースが著者の意図と違うことを言っていても、警告なしにコンパイルされ、欠陥は出力でしか見えない。 確立される環: 1. 行とセル.
  • Hフロートと参照. 分割できず、書いた場所に収まらないものは、収まる場所へ運ばれる。だからフロートは番号で参照し、決して位置では参照しない。 確立される環: 13. なぜフロートするか.
  1. 第 1 区間 読みやすい表

    • データの引かれ方に応じて、表、箇条書き、図のどれにするかを選ぶ。
    • tabular と booktabs の罫線で、格子なしの表を組む。
    • S 列で数値を小数点に揃える。
    • 表のエラーを、警告の出ないものも含めて診断する。
    1. 行とセル. tabular は整列の規則を本文に持ち込む。列ごとに一文字、セルの間に &、行末に \\。セルの多すぎる行は「Extra alignment tab」となり、\\ が抜けていれば次の行で報告される。セルの少ない行は正しく、全体は分割されないボックスである。

      支え: B (整列は表である), F (ボックスは分割されない), G (正しいものは警告されない). 証明される授業: 読みやすい表.

    2. 格子の代わりに罫線. 縦罫も二重罫も使わない。\toprule、\midrule、\bottomrule、切り詰めた \cmidrule、\addlinespace。これらに \hline を混ぜても警告は出ず、二系統の罫線が残る。

      使う結果: 1. 行とセル. 支え: G (正しいものは警告されない). 証明される授業: 読みやすい表.

    3. 小数点で揃う数値. S 列は区切り記号で揃える。table-format は場所を確保し、幅の広い数値ははみ出して、名前のない「Overfull \hbox」を一つ残すだけである。siunitx は既定で小数点を出力し、小数点の記号を babel から受け取らず、\sisetup で決める。千の位を区切るコンマは小数点として読まれる。

      使う結果: 1. 行とセル. 支え: E (luatexja と babel のすること), G (正しいものは警告されない), C (一度だけ決める). 証明される授業: 読みやすい表.

    4. 見出しと文章. 単位は見出しに一度だけ書き、S 列の見出しは波括弧で囲む。\makecell は長い見出しを改行する。右端をそろえない段落の列には \raggedright\arraybackslash を付け、\arraybackslash がないと「Misplaced \noalign」が出る。

      使う結果: 3. 小数点で揃う数値, 2. 格子の代わりに罫線. 支え: B (整列は表である). 証明される授業: 読みやすい表.

  2. 第 2 区間 複雑な表と長い表

    • 列をまとめ、各行のセルを数える。
    • 拡大縮小せずに表に行幅を与える。
    • 長い表を複数ページに分ける。
    • データファイルから表を生成する。
    1. 複数の列にまたがるセル. \multicolumn は複数のセルの場所を占め、行の数は列指定を超えてはならない。先頭の & を忘れるとグループが警告なしにずれる。\cmidrule は自分の列番号にしか従わないからである。余った幅はグループの最後の列に行く。

      使う結果: 1. 行とセル, 2. 格子の代わりに罫線. 支え: B (整列は表である), G (正しいものは警告されない). 証明される授業: 複雑な表と長い表.

    2. 行の幅. tabularx は X 列、あるいは \newcolumntype で宣言した L 列を広げる。tabular* は \extracolsep{\fill} で列の間に余白を配る。\resizebox は退ける。表ごとに文字の大きさが変わってしまうからである。

      使う結果: 4. 見出しと文章. 支え: F (ボックスは分割されない), C (一度だけ決める). 証明される授業: 複雑な表と長い表.

    3. 複数ページの表. longtable は分割でき、\endfirsthead と \endhead で見出しを繰り返す。\caption で番号を付け、\caption[] で続ける。列幅を記録し、もう一度のコンパイルを求める。table の中では再びボックスとなり、行を失う。

      使う結果: 5. 複数の列にまたがるセル. 支え: F (ボックスは分割されない), D (コンパイルの回数). 証明される授業: 複雑な表と長い表.

    4. データから作る表. データの出所はファイル一つである。csvsimple はその文字を写し、pgfplotstable はその数値を整形する。overwrite のない filecontents* は既存のファイルを書き直さず、そのことを知らせるだけである。

      使う結果: 3. 小数点で揃う数値, 7. 複数ページの表. 支え: C (一度だけ決める), G (正しいものは警告されない). 証明される授業: 複雑な表と長い表.

  3. 第 3 区間 文書中の画像

    • 画像の寸法を行を基準に決め、その大きさを予測する。
    • 画像ごとに形式を選び、解像度を確かめる。
    • 画像ファイルに名前を付け、置き場所を決め、見つける。
    • 画像を文字のように行の中に置く。
    1. 画像は大きな文字. \includegraphics はベースラインに乗るボックスを作る。段落の字下げの後では width=\linewidth の画像がはみ出す。中央に置くには行を中央揃えにし、二つの画像は行に収まれば横に並ぶ。

      支え: F (ボックスは分割されない). 証明される授業: 文書中の画像.

    2. 寸法とオプションの順序. \linewidth を基準にした寸法は場所に合わせて変わる。keepaspectratio なしで幅と高さを指定すると警告なしに変形する。オプションは書いた順に適用される。trim には clip が要り、存在しないページはコンパイルを止める。

      使う結果: 9. 画像は大きな文字. 支え: G (正しいものは警告されない). 証明される授業: 文書中の画像.

    3. 形式と解像度. グラフはベクトルで、使う大きさで PDF に書き出す。写真はビットマップで、1 インチあたり約 300 ピクセルを要するが、エンジンはそれを確かめない。SVG は前もって変換し、EPS は graphicx が変換する。

      使う結果: 10. 寸法とオプションの順序. 支え: G (正しいものは警告されない). 証明される授業: 文書中の画像.

    4. 名前とパス. 拡張子を省くと、エンジンは決まった順序で試し、警告なしに PNG より先に PDF を使う。\graphicspath は二重の波括弧を要し、一重だと一文字ずつがフォルダーになる。ドラフトモードはどのファイルが使われたかを示す。

      使う結果: 11. 形式と解像度. 支え: G (正しいものは警告されない). 証明される授業: 文書中の画像.

  4. 第 4 区間 図表のフロート

    • 図がなぜフロートするかを説明し、番号で参照する。
    • フロートの位置を導き、制限する。
    • 各フロートにキャプション、名前、ラベルを与える。
    • サブ図と表の中の注を組む。
    1. なぜフロートするか. figure と table はボックスを収まる場所へ運び、参照は番号で行う。文字は許される場所であり、[h] は [ht] までしか広がらず、[H] は空白を残し、置き場所のない図は同じ種類の図を引き止める。

      使う結果: 1. 行とセル, 9. 画像は大きな文字. 支え: F (ボックスは分割されない), H (フロートと参照). 証明される授業: 図表のフロート.

    2. キャプション. \caption は番号を付け、組み、一覧に書き込む。一覧にはもう一度のコンパイルが要り、短いタイトルも指定できる。表では上、図では下に置き、caption パッケージが文書全体の間隔と書式を決める。

      使う結果: 13. なぜフロートするか. 支え: D (コンパイルの回数), C (一度だけ決める). 証明される授業: 図表のフロート.

    3. 名前と参照. \setlocalecaption{japanese}{listtable}{表一覧} は表の一覧の見出しを変え、babel は \renewcommand{\listtablename} を打ち消す。日本語のオプションを持たない cleveref には \crefname{table}{表}{表} が要る。ラベルはキャプションの後に置き、caption があれば置き場所を誤ったラベルは警告と二つの疑問符を生む。

      使う結果: 14. キャプション. 支え: A (ラベルが記録するもの), E (luatexja と babel のすること). 証明される授業: 図表のフロート.

    4. サブ図と注. subcaption は図の部分に文字を付け、cleveref はそれを「図 1b」と呼ぶ。独立した図は一つの figure の中の minipage に入れ、決して逆にはしない。フロートの中の \footnote は警告なしに本文を失い、threeparttable が注を表に結び付ける。

      使う結果: 15. 名前と参照, 9. 画像は大きな文字. 支え: H (フロートと参照), G (正しいものは警告されない). 証明される授業: 図表のフロート.

  5. 第 5 区間 TikZ による作図

    • 作図のために文書のプリアンブルを整える。
    • 絶対座標、極座標、相対座標で点を置く。
    • 名前の付いたノードと独自のスタイルで図を組む。
    • 図をフロートに入れ、本文の文字の大きさを失わずに縮小する。
    1. babel ライブラリ. 日本語の文書では矢印はこのライブラリなしでも動くが、記号をアクティブにするモジュールは矢印を壊す。スペイン語では読み込み順にかかわらず最初の矢印でエラーが連鎖する。\usetikzlibrary{babel} がそれを直すので、習慣として読み込む。arrows.meta や positioning がないと、メッセージは「Unknown arrow tip kind」と「Unknown function of」になる。

      支え: E (luatexja と babel のすること). 証明される授業: TikZ による作図.

    2. 座標とパス. 座標には直交座標、極座標、相対座標がある。++ は基準点を動かし、+ は動かさない。セミコロンの書き忘れは次の行で報告され、sin(\x) は警告なしに角度を度で測る。

      使う結果: 17. babel ライブラリ. 支え: G (正しいものは警告されない). 証明される授業: TikZ による作図.

    3. ノードとスタイル. ノードは名前とアンカーを持つボックスである。positioning は縁と縁の距離で別のノードに対する位置を決めるので、図はひとりでに配置し直される。\tikzset がスタイルを決め、\foreach が繰り返す。

      使う結果: 18. 座標とパス. 支え: F (ボックスは分割されない), C (一度だけ決める). 証明される授業: TikZ による作図.

    4. フロートの中の図. 図はボックスであり、キャプションとラベルとともに figure に入れる。scale は文字の大きさを保ち、transform shape は文字を縮め、\resizebox はすべてを縮める。compat を指定した pgfplots は小数点を出力し、babel はその数値を変えない。

      使う結果: 19. ノードとスタイル, 15. 名前と参照, 6. 行の幅. 支え: H (フロートと参照), E (luatexja と babel のすること). 証明される授業: TikZ による作図.

参考文献へ. 連鎖は、表、画像、図が組まれ、番号を付けられ、参照されたところで止まる。データや他人の画像の出典は、ここでは出典の行に手で書いたが、次の単元では文献データベースから、分野ごとのスタイルで引用することになる。