マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

将来のpLaTeXでマフラーの色を指定する方法


これは「TeX & LaTeX Advent Caleandar 2022」の12日めの記事です。
(11日めは munepi さん、13日めは doraTeX さん です。)

将来のpLaTeXは素敵(かも)

今年の「ゆきだるま☃の日」の記事ではpLaTeXが将来に本質的☃になる(かもしれない)」という話を紹介しました。かいつまんで言うと、「数年後の公開を目指して現在LaTeXチームが行っているLaTeXカーネルの大規模改修について、現在のpLaTeXの実装の改修が追いつかなくなり、その回避策として、将来、pLaTeXの実装が本質的☃になる(かもしれない)」というものでした。

本質的なpLaTeXの出力(素敵😊)

つまり、将来のpLaTeXは「用紙サイズだけ決めれば自動的に本質的で素敵な出力☃が得られる(かもしれない、以下同様)」というわけです。文書の内容を考えるのは極めて面倒な作業であるため、その苦労から解放されるというのはトッテモ素晴らしいことですね! pLaTeXの普及がドンドン進むことでしょう!

しかし多様性(マフラーの色)は重要

これについて、文書が本質的になるのはいいとしても、その内容が完全に画一になることについては不満がある人がいるかもしれません。

「やっぱり、青マフラーのやつの方がよい……」

確かに、文書の本質性のために内容をゆきだるま☃に統一することは必然だとしても、そのマフラーの色が赤である必要はなく、青やオレンジなどの他の色であっても本質性は担保されるはずです。それゆえ「マフラーの色を指定したい」という要望は十分に理に適っています。

ご安心ください。新しい本質的pLaTeXはこの「マフラーの色の変更」という要望もしっかりサポートしています。しかし、その説明をするには、まず本家のLaTeXカーネルの新機能の話から始めないといけません。

将来のフツーのLaTeXの話

pLaTeXが将来的に本質的になる」を単なる🙃な冗談だと思っている人もいるかもしれません(実際、可能性の一つに過ぎない)が、この節に書いてある「LaTeXの将来」はマジで本当の話です。

現状のLaTeXの構文についてLaTeXチームが問題にしているのが

「文書全体に関わる設定」を記述する適当な場所がない

という点です。ここで「文書全体に関わる設定」に該当するのは「使用するDVIウェアの種類(いわゆる“ドライバオプション”)」「文書の基底言語」「出力PDFバージョン」などです。現状のLaTeXではこのような「文書全体に関わる設定」を文書クラスのオプションとして指定する慣習になっていて、この用法は特に「グローバルオプション」と呼ばれています。例えば、dvipdfmxを利用する文書を作る場合、\documentclass命令のオプションにdvipdfmxを指定することが求められます。

% LaTeX+dvipdfmx用の文書
\documentclass[dvipdfmx,a4paper]{article}%←'dvipdfmx'が必要
\usepackage{graphicx}
\usepackage{scsnowman}
%...(略)

しかし、クラスオプションは本来は文書クラスの動作を制御するためのものであり、それを「文書全体に関わる設定」のために使うことは本来の目的から外れていて解りにくいとも考えられます。

そこで、将来のLaTeX(冒頭で述べた大改修)では専ら「文書全体に関わる設定」を記述することを目的とする「文書メタデータという仕組が導入されることになっています。現在策定中の仕様では、この「文書メタデータ」は \DocumentMetadata という命令を文書ファイルの冒頭(つまり\documentclassよりも前)に以下のような感じで書いて指定します。

% LaTeX(将来)+dvipdfmx用の文書
\DocumentMetadata{%←文書メタデータの記述
  pdfversion = 1.7,    % 出力PDFバージョン
  lang = en-US,        % 文書の基底言語
  backend = dvipdfmx,  % ドライバオプション
}
%↓"グローバルオプション"のdvipdfmxは不要になる
\documentclass[a4paper]{article}
\usepackage{graphicx}
\usepackage{scsnowman}
%...(略)

将来の本質的なpLaTeXの話(かも)

さて話を本質的pLaTeXの方に戻しましょう。例の記事で述べた通り、この新しいpLaTeXは本家のLaTeXカーネルとは別に独自に(plainを元にして)実装されたものですが、そもそも「新しいLaTeXの仕様に追随させる」ことを目的としています。ということは当然、先ほどの \DocumentMetadata 命令にも対応しています。

※ただし「そもそも本質的な文書では意味がない」などの理由のため、現状で意味をもつ(本家と互換の)設定項目はbackend(ドライバオプション)のみとなっています。

% pLaTeX(本質的)+dvipdfmx用の文書
\DocumentMetadata{%←文書メタデータの記述
  backend = dvipdfmx, % dvipdfmxを使う
}
%↓"グローバルオプション"のdvipdfmxは不要
\documentclass[paper={200mm,200mm}]{jlreq}
\usepackage{tikzlings-owls}
%...(略, というかここは無視される)

この文書は「ドライバオプションがdvipdfmxである」ことをグローバルオプションではなく文書メタデータ\DocumentMetadata命令)で指定していますが、新しい本質的pLaTeXはこれを正しく解釈するので、dvipdfmxで処理可能なDVIファイル(赤マフラー)を出力します。

出力結果(赤マフラー)

素敵😊

\DocumentMetadataでマフラーの色を指定できる(かも)

実は、新しい本質的pLaTeXでは文書メタデータによりマフラーの色を指定することも可能です。具体的には\DocumentMetadata命令の引数の中に以下のような値指定(mufflerキー)を含めることで出力中のマフラーの色を指定できます。

muffler = {<マフラーの色>}

ここで色は「xcolorの色式 (color expression)」で指定します1。例えばマフラーが「やや暗い緑色」である文書を出力したい場合は以下のように書きます。

% pLaTeX(本質的)+dvipdfmx用の文書
\DocumentMetadata{% 文書メタデータ
  backend = dvipdfmx,
  muffler = {green!50!black}, % マフラーの色の指定
}
\documentclass[paper={200mm,200mm}]{jlreq}
%...(略)

出力結果(緑マフラー)

緑マフラーのやつも素敵😊

\DocumentMetadataでもっともっと素敵にする(かも)

ところで、新しい本質的pLaTeXでは文書に2段組の設定をするとゆきだるま☃が2つ出力されるのでした(もっと素敵😊) この場合のマフラーの色は「赤と青」になります。

% pLaTeX(本質的)+dvipdfmx用の文書
%↓"twocolumn"オプションで2段組を指定
\documentclass[dvipdfmx,paper={320mm,180mm},twocolumn]{jlreq}
%...(略)

出力結果(赤マフラーと青マフラー)

赤マフラーと青マフラーが並んでいてもっと素敵😊

文書メタデータmufflerキーでは各々のゆきだるま☃のマフラー色を指定できます。次のようにコンマ区切りで複数の色(色式)を書くと、それらの色が順に使われます。

% pLaTeX(本質的)+dvipdfmx用の文書
\DocumentMetadata{% 文書メタデータ
  backend = dvipdfmx,
  muffler = {red!45,cyan!75}, % コンマ区切りで複数の色を指定できる
}
\documentclass[paper={320mm,180mm},twocolumn]{jlreq}
%...(略)

出力結果(ピンク色マフラーと水色マフラー)

ピンク色マフラーと水色マフラーが並んでいるのももっと素敵😊

「文書を2段組にすると☃も2つになってもっと素敵になる」ということがわかると、今度は「3段組、4段組のようにもっともっとカラム数を増やした文書(もっともっと素敵😊)を作りたい」と思い始めるでしょう。しかし残念なことに、3段以上の段組をサポートしている文書クラスは見当たりません2

そこで、新しい本質的pLaTeXの文書メタデータでは「文書のカラム数」も指定できるようにしています。次のように、\DocumentMetadata命令のcolumnsキーでカラム数を指定します。

columns = <整数>

このcolumnsキーを利用して3段組の文書を作ってみましょう。

% pLaTeX(本質的)+dvipdfmx用の文書
\DocumentMetadata{% 文書メタデータ
  backend = dvipdfmx,
  columns = 3, % 3段組
  muffler = {red,blue,green!50!black}, % 色も3つ指定する
}
\documentclass[paper={320mm,180mm}]{jlreq}
%...(略)

出力結果(赤マフラーと青マフラーと緑マフラー)

もっともっと素敵😊😊

なお、カラム数に対してマフラーの色の個数が不足している場合は「色を使い切ったあとはもう一度最初から使う」という動作になります。例えばmufflerキーの既定値はred,blueであるため、columnsに大きな値を指定してmufflerを指定しないと、赤マフラーと青マフラーが交互に並ぶことになります。

% pLaTeX(本質的)+dvipdfmx用の文書
\DocumentMetadata{% 文書メタデータ
  backend = dvipdfmx,
  columns = 6, % 6段組!
  % mufflerは無指定
}
\documentclass[paper={500mm,100mm}]{jlreq}
%...(略)

出力結果(マフラーたくさん)

もっともっともっと素敵😊😊😊

まとめ(かも)

来たるべき3pLaTeX本質化時代」においても、あなた好みのマフラー色を駆使して個性的な文書☃をつくりましょう!💁💁💁


  1. ただしxcolor自体はLaTeX専用のパッケージであり、新しい本質的なpLaTeXは実際にはplainベースであるため、ここで指定される色式を解釈しているのはxcolorではなくTikZパッケージ(のplain用実装)です。残念ながら、TikZによる色式のサポートは部分的なものに留まっています。具体的には「単純な色名指定」および「2色のブレンド」(つまり“‹色名1›!‹割合›!‹色名2›”)の形式のみが使用可能です。ただし \colorlet 命令はサポートされているのでこれを用いると実質的に多色のブレンドが指定できます。
  2. LaTeXの文書クラスは当然“LaTeX専用”であるため、実際には本質的なpLaTeXは文書クラスのファイルの内容は全く読んでおらず、代わりに「一部の特定の文書クラスの特定のオプション」の動作をエミュレートしています。なので、仮に3段以上の段組をサポートする文書クラスがあったとしても、それは本質的なpLaTeXでは“サポートされない”ことになります。
  3. えっ、来てほしくない?😲