マクロツイーター

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

2023年のパズル年賀状

今年の年賀状。

以前に述べたとおり、年賀状にはその年の数に関連した数学パズルを載せるのが通例である1。去年は割と余裕をもってパズル問題を作ることができたのだが、結局(例によって)チョット変わった虫食い算になった。

肝心のパズル問題の部分の文字が(例によって)小さくで読みづらいが、以下のように書かれている。

次の条件に従って掛け算の虫食い算を解きなさい。

  • 出現する数字は全部で 5種類に限られる。
  • 赤いマスには 023 の何れかが入る。
(問題の図)

一番上にあるのはウクライナ語での新年の挨拶。


  1. 新しいpTeXエンジンの開発に時間を取られている人が多いためか、年を追うごとに年賀状で数学パズルを見ることが少なくなっているようで感じる。

unicode-mathとか暮れのごあいさつとか

本記事のunicode-mathに関する部分を加筆した上でQiitaに投稿しました。
 ・徹底解説! unicode-mathパッケージでココが変わる

unicode-mathを語る

今年の「TeX & LaTeX Advent Calendar」ではunicode-mathパッケージに関する記事が公開されました。このパッケージは「fontspecの数式フォント版」に相当するもので、「数式フォントをUnicodeのものにする」とともに「簡単に好きなOpenType数式フォントを指定できるようにする」という機能を提供します。LuaLaTeXの普及とともに「unicode-mathの新しい機能についての解説」の文書も増えていくものだと思われます。

このように便利なunicode-mathパッケージですが、注意点もあります。unicode-mathにおける数式書体の扱いはUnicodeの数式書体の考えを取り入れていて、従来より多機能になっています。それだけならいいのですが、問題は、それに伴って「従来の書き方と比べると正しい書き方が変わる」点が生じているということです。具体的には\mathrmなどの「数式のフォント選択(太字・斜体など1)の命令」の体系についてunicode-mathでは大きな変更があります。

実際には「従来の書き方を続けても実害がでない」ように互換性が配慮されています。だからといって漫然と従来の書き方を続けていると、将来unicode-mathが普及したときには、もしかしたら「未だに \rm や \bf を使っている奴らと同類」の立場に追いやられるかも知れないわけです。

本記事では一般のLaTeXユーザ向けに、unicode-mathにおける​「数式フォント選択の命令」​について、従来の書き方から変わる点に話を絞って解説します。

従来のLaTeXの数式フォントの話

unicode-mathの話の前に、まずは従来の標準(LaTeXカーネルおよびamsfontsの範囲)における数式フォントの扱いについて復習しておきましょう。

従来の数式フォント選択命令

テキスト(非数式)と数式では「書体の違い」が意味するものが異なるため、LaTeXではテキストと数式でフォント選択命令を使い分けられています。数式用のフォント選択命令2\mathXXという形の名前をもち、文字(数字や英字)にのみ作用するのでした。標準の範囲では次の数式フォント命令が用意されています。

  • \mathrm{«文字»}:立体(正確には“セリフ・中字・立体”3
  • \mathit{«文字»}:斜体4(“セリフ・中字・斜体”)
  • \mathbf{«文字»}:太字立体(“セリフ・太字・立体”)
  • \mathsf{«文字»}サンセリフ立体(“サンセリフ・中字・立体”)
  • \mathtt{«文字»}:等幅立体(“等幅・中字・立体”)
  • \mathcal{«文字»}筆記体
  • \mathbb{«文字»}:黒板太字
  • \mathfrak{«文字»}:ドイツ文字

数式用の書体として日本では太字の斜体もよく使われますが、標準の数式フォント命令の範囲ではこれはサポートされていないので、例えばbmパッケージの\bm命令のような「別系統の命令」を利用する必要がありました。

“数式イタリック”

LaTeXの数式フォントについて注意すべき点は「“数式イタリック” と “普通のイタリック” の区別があること」です。数式フォント命令(\mathXX)を指定しない状態で英字を書くとそれは斜体(イタリック)になるのですが、その字体はいわゆる “数式イタリック” であり、「文字が1文字だけで識別子を表す」場合にのみ用いることが想定されている(その用途で適切に見えるように字形や字間がデザインされている)のでした。複数文字からなる斜体の識別子を書くときには\mathit命令を指定して “普通のイタリック” を使う必要があります。

しかし従来のLaTeXでは “1文字” と “複数文字” で区別をつけるのは斜体だけで、その他の書体、例えば立体については “1文字” でも “複数文字” でも区別せずに\mathrmを使うことになっていました。

unicode-mathの数式フォントの話

1文字用の数式フォント命令

unicode-mathパッケージでは、先述の「“1文字” と “複数文字” の区別」をより広範の書体について行うように設計されています。次の表に示すように、従来の\mathXXという名前の数式フォント命令は “複数文字用” のものと規定されていて、新たに\symXXという名前の命令が “1文字用” の数式フォント命令として用意されます。

フォントの種類1文字用命令複数文字用命令
立体(セリフ・中字・立体)\symup\mathrm
斜体(セリフ・中字・斜体)\symit\mathit
太字立体(セリフ・太字・立体)\symbf\mathbf
太字斜体(セリフ・太字・斜体)\symbfit
サンセリフ立体(サンセリフ・中字・立体)\symsf\mathsf
等幅立体(等幅・中字・立体)\symtt\mathtt
筆記体\symscr―※1
黒板太字\symbb―※1
ドイツ文字\symfrak―※1

(※1) 筆記体・黒板太字・ドイツ文字は「複数文字の識別子を書くことが想定されていない」ため複数文字用のフォント選択命令は用意されていません5

また、従来のLaTeXではサポートされていなかった「太字の斜体」についても、\symbfitという数式フォント命令が用意されている6ので、「太字斜体だけ他の書体と扱いが異なる」という不自然な状況も解消されます。unicode-mathの既定の状態7での出力例を示します。

よく見ると、斜体(\symit\symbfit)を指定したときも数字は立体で出力されています。これは数式で斜体の数字が用いられることは想定されていない8からです。

また、従来の\mathcal\mathbbは英字大文字にのみ対応していたのに対して、unicode-mathの\symscrは英字小文字にも対応9していて、また\symbbは英字大文字小文字に加えて数字にも対応しています。これらの文字のために別のパッケージを読み込む必要はありません。

なお、従来のLaTeXでは数式フォント命令を指定しない場合の書体は特別な “数式イタリック” でしたが、unicode-mathでは “数式イタリック” に相当するもの(1文字用の斜体)が\symitなので、英字10については既定の書体は\symitと同等になります。つまり普通は\symitを用いる必要はありません。

ギリシャ文字の話もしてみる

従来の標準のLaTeXの範囲ではギリシャ文字の扱いは英字(ラテン文字)と色々な点で異なっていて厄介で、さらにギリシャ小文字については標準の範囲では斜体のみに限られていました。unicode-mathではギリシャ文字(大文字・小文字ともに)についても普通に数式フォント命令で書体を変えることができます。

  • \symup{α}\symup{\alpha}\symup{Ω}\symup{\Omega} → 立体
  • \symit{α}\symit{\alpha}\symit{Ω}\symit{\Omega} → 斜体

ただし太字については注意が必要です。先ほどの表では「太字」の数式フォント命令は\symbfでしたが、これを使うと(従来の習慣を踏襲するため)ギリシャ小文字が「太字斜体」になってしまいます。そこで代わりに明示的に「太字の立体」を指定する命令である\symbfupを使う必要があります。まとめると、ギリシャ文字に使うべき数式フォント命令は以下のようになります(これ以外の書体はサポートされない11)。

フォントの種類1文字用命令
立体(セリフ・中字・立体)\symup
斜体(セリフ・中字・斜体)\symit
太字立体(セリフ・太字・立体)\symbfup
太字斜体(セリフ・太字・斜体)\symbfit

unicode-mathの既定の状態でのギリシャ文字の出力例を示します。

まとめ

今年も一年、ありがとうございました!

除夜のアレ(ざんねん🙃)

ZR「というわけで、来年も当(くだらない)ブログをよろしくお願いします!」
*「なんか最近、このブログが放置される傾向がどんどん強まっている感じなんだけど……」
ZR「………………」


  1. この記事でいう「フォント」とは「Times」のような具体的な書体種別ではなく「太字」「斜体」などの抽象的な区別を指します。「斜体」にどの具体書体を充てるかといった設定の機構はこの記事では扱いません。
  2. 「数式用のフォント選択命令」を表す正式な用語は「数式英字命令(math alphabet command)」のようです。
  3. テキストのフォントには「ファミリ」「シリーズ」「シェープ」という3つの属性に分けて管理されていて、テキストのフォント選択命令は1つの属性のみを変更する(例えば\textbfならシリーズを「太字」に変える)仕組になっています。これに対して、数式のフォントは(少なくともテキストフォントにあるような)属性をもっていません。従って、数式のフォント選択命令は常に特定の1つの書体を指定する(例えば\mathbfなら「セリフ・太字・立体」に変える)役割をもっています。
  4. 数式では真の斜体(oblique)を用いることはないので、この記事では「斜体」を「イタリック体」と同義として扱うことにします。
  5. 一応、互換性のために\mathcal\mathbb\mathfrak命令が\symscr\symbb\symfrakの別名として定義されていますが、これらは「名前が “\math…” なのに実態は1文字用命令である」という紛らわしい状況になっているので使用は推奨されません。
  6. なお滅多に使われないと思いますが(一応従来のLaTeXの範囲に含まれるので補足しておくと)、「太字の筆記体」に対する\symbfscr、「太字のドイツ文字」に対する\symbffrakという数式フォント命令も用意されています。
  7. unicode-mathの既定状態では具体書体としてOpenType版の「Latin Modern Math」が使われます。このフォントは従来のComputer Modernの数式フォントの書体を継承するものです。
  8. もちろん「複数文字の斜体の識別子に数字が含まれる」場合にはその数字も斜体になるべきですから、“複数文字用” の\mathitでは数字も斜体になります。
  9. ただし既定の具体書体である「Latin Modern Math」は英字小文字の筆記体の字形をもっていないようで、そのため例出の画像では既定の(斜体の)字形が代替出力されています。英字小文字の筆記体の字形をもつ数式フォントに切り替えるとちゃんとその字形が出力されます。
  10. 数字の既定の書体は\symupと同等になります。先述の通り、数字は決して斜体にはなりません。
  11. これは嘘で、実際には「サンセリフ太字の立体・斜体」もサポートされています。不思議なことにサンセリフギリシャ文字は太字だけがサポートされていて中字が入っていません。これはUnicodeの数式書体がそのように定められているからなのですが、そもそもUnicodeの規定がなぜこうなっているかが全くの謎です。

今年も Merry TeXmas! ― \end{texadvent2022}


TeX & LaTeX Advent Calendar 2022
*  *  *

アドベントカレンダー完走!

{\^^$^^%^^&\!{\^^$^^%^^&}\!\&{\^^%^^$^^%^^&}\!\?{\^^-^^%^^!^^.^^)^^.^^'}
\!\:{\^^$^^)^^-^^%^^.^^$^^%^^&}\!\+{\^^'^^,^^/^^"^^!^^,^^`}\!\.{}{}\!\_{
}\:\*\^^:@\*\^^:@\!\@^^!{\:\^^!\*}\!\@^^.{\@^^!\&\^^!{\!\^^!\<{}}\^^!%!!
\:\^^"\*\&\@{\^^"\>}\!\^^"{\^^!}}\!\<{\?\^^$^^)^^-^^%^^.}\!\>{\?\*}\@^^.
\&\^^(@{\@}\!\<{\?\^^$^^)^^-^^%^^.}\:\@\@^^.^^%\!\>{\?\@}\@^^.\&\^^)@{\@
}\:\%\*\&\@{\!\%##\^^)@{\:##\^^)@\*}}\@\:\@^^(\^^)@\^^(@\!\<{\?\@^^(}\:%
\@`^^&\!\>{\?\@}\@^^.\&\^^*@{\@}\%\^^,@@\@^^!\&\^^"{\^^!\??}\&\@{\!\^^!%
##\^^)@##\^^*@?{\!\^^,@@{##\^^)@}}}\@\^^"\!\^^)^^&@?{}\&\@{\@^^)^^&?{%.>
^^,^^%\^^,@@}}\%\=\&\@{\@\=\@}\@\%\$\&\@{\=\$\@^^)^^&?{^^#^^!\^^,@@\.%:%
^^#^^/^^$^^%}}\@\$`\,\$`\^\$`\'\$`\^\$`\|\$`\~\%\@^^/\%\@^^/@\%\@\&\@%\#
{\!\@''/##\,,)@##\,,*@{\:\@`##\^^)@\@^^/@\&##\,,*@{\@}}}\@\!\@,,/@{\!\<%
{\?\@''(}\&\>{\?\@}\@^^.}\@''/\,,&\,,*@\@''/\^^'\''+@\@''/\^^(\'',@\@''/
\,,)\''-@\@''/\^^*\^^.@\@,,/\^^+\^^(,,:@\%\^^(@@\%\''*@@\%\''+@@\%\^^-@@
\@''!\&\''"{\,,!\?^<}\&\@{\!\^^!##\^^)@##\''*@##\''+@##\,,,@##\^^-@##%!!
\,,.@<{\!\''(@@{##\''+@}\!\,,*@@{##\,,-@}\!\''+@@{##\^^)@}\!\,,-@@{##%\?
\^^*@}}}\@\^^"\@''!\&\@{\''!\@,,),,&?{''&''/,,.\,,,@@\.^^.''!,,-^^%}%:\=
\@^^)^^&?{\'',@@\.''%,,.,,",,&}<}\%\,,),,:@@\&\''!{\!\''!##\,,)@##\,,*@%
##\''+@##\'',@##\^^-@<{\!\^^)^^:@@{##\'',@}}}\''!\@\%\,,#,,.\%\,,%,,!\%%
\''%,,.\@''!\&\,,!{\!\^^!##\^^)@##\''*@##\^^+@##\'',@##\''-@##\''.@##%**
\''(,,:@{\=\^^#,,.##\'')@\=\''%^^!##\^^*@\=\''%''.##\,,(,,:@}}\''!%%~/|>
\@^^)^^&?{''%\^^)'':@@\''(@@\.^^!^^.,,$''!,,&\'',@@\.^^%\^^*@@}\^^!%/_|\
\@,,)''&?!\''%''!\=\,,%''!\''.''%\,,#,,.\.,,.^^/''%\'')^^:@@\^^(@@\.%%**
''!,,.,,$\''%,,.\^^%''!\=\,,%,,!\,,+\,,#,,.\.,,#''/\,,-@@\.^^.\^^,@@\.@%
\,,%,,.\&|{\!\,,.^^%|##\^^)@{\,,+\^^#''.\.^^.\^^-@@\.''-,,%\,,)^^:@@%.`:
\''(@@\^^*@@\''%,,.\''++\^^)@{}\,,#''.\''-@@\.''#,,#''/,,$,,%\^^%''.`##%
\,,)@\,,+}}|\^^+\'',@\^^('':@|_|-|*|;|+|/|.|:|(|)\''+`\@\_|[|]|!|?|<|>%<
\$`_\$`?\$`$\$`\~\$`&\$`\~\=|\''*@\&${|\''(@}\&&{\,,+@|}\&|{|''%}\!\@{%%
/!.+./../!++/_*(*;;-*!*;&*)*;;;:]:]/!.+./../!;>:]/!:_.+...;.>.!.>:*:;:+.
-.;.];_$:?/!:;./:+.*.>:(;(/!.(.*.>:($:+.>*;;-.*:_:]/!;>:_:/:;.(:];_$.:$;
_$+::?*;;;/!;>:_.>:_/!.(:;:;:?/!.(:+;(;?*;&.*:_/!:_.+...(.>:*.).:.).<;_:
_:+/!:_.+..:..>:*.).:.).<;_:_:+/!:_.+..:_.-.:./::.).+:+.(/!::.+;(/!:_.+.
.:_.-.:./.(./.).:.(:+/!.(:+;(/!:;.(.):_.>:/:+/!.*.>:(;(:?:?/!.+./../!+;+
&;;-*;&:]/!;>:;./:+:]*;;-$:*.:$*;&$/*+::?:?/!.+./../!+&;;-:]/!+;+;:]*;;-
:?:]*;;-:?:?/!.!./:+/!++/!:_.+...!.):+./:*.-.!/!++/_*(;+;(;_*!;;;.;_*):]
/!+;:];_|;_&$;_|&;($;_:?/!++:];_$;_$;+;(;_$;;;.;_$:*./$..:?/!+;:];-$;_|;
($;_|;;:?/!++:]&;);_$;;;;;_$.?$&;);_$;;;/;:|;.$&;.;:|;.$;;;(;_$&;+;_$;;;
(;_$.;$&;-&|;+$;;;(;_$;-;);_$;;;/;:|;.$;-;);_$;;;;;_$.;$;-;);_$;;;_&|;+$
&;-&|;+$&;(;_$&;+;_$&;(;_$.;$&;.;:|;.$&;(;_$&;);_$;;;_&|;+$&;);_$;;;;;_$
.;$..:?/!+;:];_|;;$;_|&$;_|;-:?/!++:]&&;($;;;-;($.?$&&;($;;&;;|;/$&&;+|;
+$;;&;($&&;_$;;&;($.;$&;-;/|;.$;;&;($&;-&$;;&;;|;/$&;-&$;;;-;($.;$&;-&$;
;;-&|;/$&;-;/|;.$;;;_;($&&;_$;;;_;($.;$&&;+|;+$;;;_;($&&;($;;;-&|;/$&&;(
$;;;-;($.;$..:?/!++:]&;.;($;;;-;($.?$&;.;($;;&;;|;/$&;.;+|;+$;;&;($&;.;_
$;;&;($.;$&;/;/|;.$;;&;($&;/&$;;&;;|;/$&;/&$;;;-;($.;$&;/&$;;;-&|;/$&;/;
/|;.$;;;_;($&;.;_$;;;_;($.;$&;.;+|;+$;;;_;($&;.;($;;;-&|;/$&;.;($;;;-;($
.;$..:?/!++:];.$::$;-$+[$&&&$;;;+;($.?$&;;;+|&$;;;/;/$&;+;/|;($;;;/;/$&;
/;($;;;+;($.;$/;:?/!+;+;:];-$;-$;-:?:];_$;_$;_:?/!++:]&|;.$::$;-$.[$;-$+
[$&;+;_|;-$;.;-|;+$.?$&;.;/|;)$;.;-|;+$&;(;(|;-$;+;(|;+$&;(;(|;-$&;)|;)$
.;$&;(;(|;-$&&|;/$&;(;_|;($;-;/|;-$&;:;-|;.$;)|;/$.;$&;);;|;($;+$;;;_;;$
*?;-&|;:$;;;_;;$*?&;/|;:$.;$;;;_;;$*?;+;($&;(;.$*?;/;:$&;:;;$*?;/;:$.;$&
;_;:$*?;/;:$.!$;-;);+$*?;/;:$;-;:;:$*?;+;($;-;:;:$*?&;.$.;$;-;:;.|;)$*?;
-&|;:$;-;(;.|;;$;+$&;_;(|;.$;)|;/$.;$;-;);)|;;$;-;/|;-$;-;);-|;($&&|;/$;
-;);-|;($&;)|;)$.;$;-;);-|;($;+;(|;+$&;-;+|;-$;.;-|;+$&;+;_|;-$;.;-|;+$.
;$.*:?/!+;:];_$;_$;_:?/!++:]&|;.$::$;-$.[$;-$+[$&&;/|;-$;;;-|;($.?$&&;/|
;-$;;;+|;($&&;;|;.$;;;:|;;$&&;-|;+$;;;:|;;$.;$&;-;)|;+$;;;:|;;$&;-;:|;($
;;;+|;($&;-;:|;($;;;-|;($.;$&;-;:|;($&;(|;:$&;-;)|;+$&;.|&$&&;-|;+$&;.|&
$.;$&&;;|;.$&;.|&$&&;/|;-$&;(|;:$&&;/|;-$;;;-|;($.;$..:?/!++:]&|;.$::$;-
$.[$;-$+[$&;.&|;;$;;;-|;($.?$&;.&|;;$;;;+|;($&;.;_|;.$;;;:|;;$&;/;(|;.$;
;;:|;;$.;$&;/;.|;+$;;;:|;;$&;/;+|;($;;;+|;($&;/;+|;($;;;-|;($.;$&;/;+|;(
$&;(|;:$&;/;.|;+$&;.|&$&;/;(|;.$&;.|&$.;$&;.;_|;.$&;.|&$&;.&|;;$&;(|;:$&
;.&|;;$;;;-|;($.;$..:?/!++:]&|;.$::$;-$.[$;-$+[$&&;-|;+$;-;.|;)$.?$&;;;_
|;($;-;-|;+$&;+;)|;;$;-;-|;+$&;/;(|;.$;-;.|;)$.;$/;:?/!+;+;:];-$;_$;_:?:
];_$;_$;_:?/!++:]&|;.$::$;-$.[$;-$+[$&;-&|;;$;.;-|;+$.?$&;-&|;;$;.;-|;+$
&;-&|;;$;);-|;-$&;+;_|;-$;);-|;-$.;$&;+;_|;-$;);-|;-$&;+;+|;.$;);-|;-$&;
/;+|;($;);-|;-$.;$&;/;+|;($;);-|;-$&;:;:$;);-|;-$&;(&|;.$;(;_$.;$&;(&|;.
$;(;_$&;(&|;.$;(;_$&;(;_|;($;:;(|;-$.;$&;(;_|;($;:;(|;-$&;.;)|;.$;(;/|;/
$&;.;_|;+$;(;-|;($.;$&;.;_|;+$;(;-|;($&;.;)|;.$;:&|;/$&;.;:|;($;.;-|;+$.
;$&;+;_|;-$;.;-|;+$&;-&|;;$;.;-|;+$&;-&|;;$;.;-|;+$.;$.*:?/!+;+;:];-$;-$
;-:?:];_$;_$;_:?/!++:]&|;.$::$;-$.[$;-$+[$&;-&|;;$;/&|&$.?$&;-&|;;$;/&|&
$&;_;.|;.$;/;;|;-$&;_;.|;.$;/;:|;:$.;$&;_;.|;.$;/;:|;:$&;_;.|;.$;.&|;;$&
;-&|;;$;.;;|;;$.;$&;-&|;;$;.;;|;;$&;+;_|;-$;.;/|;-$&;.;:|;($;.;;|;;$.;$&
;.;:|;($;.;;|;;$&;:;;|;+$;.&|;;$&;:;;|;+$;/;:|;:$.;$&;:;;|;+$;/;:|;:$&;:
;;|;+$;/;;|;-$&;.;:|;($;/&|&$.;$&;+;_|;-$;/;_|;;$&;-&|;;$;/&|&$&;-&|;;$;
/&|&$.;$.*:?/!+;:];_$;_$;_:?/!++:]&;);_$;:;(|;-$.?$&;);_$;(;-|&$&;(;:|;/
$;(;;|;:$&;(;+|;+$;(;;|;:$.;$&;(;-|;+$;(;;|;:$&;:;(|;)$;(;-|&$&;:;(|;)$;
:;(|;-$.;$&;:;(|;)$;:;/$&;(;-|;+$;:&|;/$&;(;+|;+$;:&|;/$.;$&;(;:|;/$;:&|
;/$&;);_$;:;/$&;);_$;:;(|;-$.;$..:?/!+;:];-$;-$;-:?/!++:]&;(;(|;-$;:;(|;
-$.?$&;(;(|;-$;(;_|;-$&;(;.|;/$;(;-|;($&;(;+|;+$;(;-|;($.;$&;(&|;+$;(;-|
;($&;(;_|;($;(;_|;-$&;(;_|;($;:;(|;-$.;$&;(;_|;($;:;.|;-$&;(&|;+$;:;+|;+
$&;(;+|;+$;:;+|;+$.;$&;(;.|;/$;:;+|;+$&;(;(|;-$;:;.|;-$&;(;(|;-$;:;(|;-$
.;$..:?/!+;:];-$;_$;_:?/!++:]&|;.$::$;-$.[$;-$+[$;-;);:|;;$;-;.|;)$.?$&&
;/|;-$*?;-|;.$&;/;+|;($*?;-|;.$&;(&|;.$;-;.|;)$.;$&;(;.|;+$;-;;|&$&;(;(|
;-$;)|;/$&;);_$;+$.;$&;);_$;_|;;$&;(;.|;+$*?;;|;+$&;(&|;.$*?;/|;;$.;$&;(
;+$*?;-;-$&;(;+$*?;-;/$&;(;($*?&;+$.;$&;(;.$*?&;.$&;(;-$*?&;($&;:;_$*?&;
)$.;$&;:;_$*?&&$&;.;($*?;-;.$&;.;+$*?;)$.;$&&;/|;-$*?;-;.|;+$&;_;.|;.$*?
;:|;-$;-;);-|;($;+$.;$;-;);;|;.$;-;-|;+$;-;);/|;.$;-;/|;-$;-;);:|;;$;-;.
|;)$.;$.*:?/!+;:];-$;-$;_|;.:?/!:*.-.):;./;-;:&.*:_/!.(.*.>:($:+.>;+;(;_
.*:_:]/!...>.<:+/!..;?./.&?.-.<:+:+.;.*$.-:+;+;_:_:+$/!../!.(:;:;$/;././
$/).>:/$+<./:(:+$/)./.-:**-/!.(:;:;:?:?/!.*:)./$$+?./:*:*:)$/+.//(.?.-:;
}\&\@{\^^#''.\''-@@\,,(@@\''(@@\.,,%\''*@@\.^^#,,!\,,+@@\.^^%\^^%^^.{\!%
\''.,,%\@{\@}}}\@\+\&\@{\,,%^^!\^^.,,%\''#''.\^^+@@\.,,#^^!^^.\^^,@@\.%.
,,/''+''%^^.\''+@@\^^%,,.{\^^#^^.\.\,,(@@\.,,$,,&\''-@@\.,,.^^%%~>/\~>~>
\''+@@\.^^#,,!\^^(@@\.,,%,,(^^%\,,),,:@@\''%^^.\,,%''!{\@}}}}\@%/_\//_/_
(コンパイル方法)

というわけで、11回目の開催となる TeX & LaTeX Advent Calendar 2022 も、素敵なTeXネタを途絶えさせることなく無事にクリスマスの日を迎えられました。今年の参加者は全部で16名、うち4名が初参加でした。参加者の皆様に心からの感謝を捧げたいと思います。

今年の重点テーマは前回のものを継続することを意図して「やっぱりTeX言語(とか)しましょう!」としました。改めて見返すと、今年もそれなりに多様なプログラミング言語が登場1したといえるでしょう。

なんと、(author-levelの)LaTeXプログラミング言語になってしまったようです。これは完全に予想外でした🙃

TeX & LaTeX Advent Calendar 2022 を楽しんでくれた皆さんに、

ありがとう!

そして


  1. 例によって登場したものを全て列挙しました。

将来の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. えっ、来てほしくない?😲

なにげにアドベントがはじまった ― \begin{texadvent2022}


TeX & LaTeX Advent Calendar 2022

TeX界における年末の恒例イベントとなったといっても過言ではないことにしたいアドベントカレンダーが今年も始まりました。今年は11回目の開催となります。

重点テーマ

今年の重点テーマはコレです。

やっぱりTeX言語(とか)しましょう!

イロイロと事情があってTeX言語・expl3・WEB言語の普及を図る必要があったため昨年の重点テーマを継続しています。とはいえ「やっぱりTeX言語しましょう!」ではなくて「やっぱりTeX言語(とか)」になっています。つまり、やっぱり対象範囲はTeX言語のみには限りません。

やっぱりTeX言語しましょう的なネタ、やっぱりexpl3しましょう的なネタ、やっぱりWEB言語しましょう的なネタ、やっぱりLuaTeXでLuaしましょう的なネタ、やっぱりPythonTeXでRubyしましょう的なネタ、やっぱりTeXで自作言語しましょう的なネタ、その他アレコレ、とにかく「TeXでのプログラミング」の魅力を大いに語りましょう!

※例によって、重点テーマは「必須」ではありません。あらゆるTeXネタを歓迎しております。

で、初日のネタは

こちらになります。

qiita.com

まだ参加できます!

TeX & LaTeX Advent Calendar 2022(#texadvent2022)は

まだまだ参加者募集中です。

LaTeXなネタ、TeX言語なネタ、pLaTeX(和文文書)なネタ、pLaTeX(赤マフラー)なネタ、pLaTeX(青マフラー)なネタ、 pLaTeX(緑マフラー)なネタ、npTeXなネタ、その他、お持ちの方はぜひぜひ、

ご参加おねがいします!

今ならまだ好きな日を選べます! 登録はお早めに!


例によって「TeX以外」な人はこっち。

SATySFi Advent Calendar 2022

去年のアレ(非アレ以外)を振り返ってみる


TeX & LaTeX Advent Calendar 2022

昨年(2021年)の「TeX & LaTeX Advent Calendar」はこんな感じでした。

12/01zr_tex8rTeX言語学習に関する“CAP定理”
12/02h20y6m独自TeX Liveリポジトリを作ってみる話
12/03CareleSmith9[TikZ] TikZ でテキスト装飾
12/04h20y6m(u)pLaTeXでPDF出力?
12/05doraTeX品詞記号出力マクロを設計しよう
12/06doraTeXmylatexformat を用いてコンパイル時間を短縮しよう!
12/07zr_tex8rTeXでもSATySFiでもコンパイル可能なファイルを作りたい話
12/08zr_tex8rLaTeXでもSATySFiでもコンパイル可能なファイルを作れた話
12/09wtsnjp新作 (La)TeX パッケージ情報の追いかけ方
12/10t-kemmochi(LaTeXで作った)PDFのスライドを画像化してPowerPointに貼り付けるマクロ
12/11hilsshOpenCv-PythonとpdfLaTeXで自炊pdfファイルの位置調整
12/12yukishitaAtCoderに登録したら解くべき精選過去問10をLaTeX(expl3)で解いてみた
12/13h-kitagawae-(u)pTeX をいじってみた話
12/14DaijiTeX で迷路を自動生成(expl3)
12/15mod_poppoStandard ML on LuaTeXしてみる
12/16CareleSmith9[TeX][TikZ] TikZ でカード作成
12/17mattskalaMakeでLaTeX言語のビルドしましょう
12/18Hirol3keys の紹介
12/19hid_alma1026Speedata Publisherのマークアップ
12/20hilsshLaTeXで宛名ラベルシールの差し込み印刷をする
12/217danmoroboshi本文に直接 mathbf と書くのをやめよう 〜LaTeX 初心者よ,見栄えと構造の分離を意識せよ〜
12/22t-kemmochitcolorboxでスライドを作る
12/23wtsnjpjlreq + expl3 で学会文書クラスを作った話
12/24golden_luckyTeXで使うプログラミング言語まとめ
12/25golden_luckyなぜあなた(ぼく)はTeXでプログラミングできないのか

というわけで、今年はこれを皆式参考にせずに、自分が素敵だと思うネタを全力でぶつけていきましょう!

今年もなにげにTeXでAdvent Calendarする件について

なにげに!!


TeX & LaTeX Advent Calendar 2022

TeXLaTeX Advent Calendar 2022

とっておきのTeXLaTeXネタを皆で持ち寄って楽しむ
TeX & LaTeX Advent Calendar」
今年は 11回目 の開催となります。
皆さんの、心をこめた素敵なネタを例によってお待ちしております!
ハッシュタグは「 #texadvent2022 」
TeXLaTeX初心者大歓迎。 ←重要
TeXLaTeX非初心者大歓迎。

なにげに重点テーマですが、昨年はコレでした。

TeX言語の話がいっぱい集まったので「TeX言語はもういいかな」とも思ったのですが、どうやらツイッタァーによると……。

TeX言語の需要はまだまだあるようです。

というわけで、今年の重点テーマはコレです!!

今年の重点テーマ

今年の重点テーマはコレです。
「やっぱりTeX言語(とか)しましょう!」

昨年の重点テーマは「やっぱりTeX言語(とか)しましょう!」であり、実際にTeX言語とかexpl3言語とかWEB言語とかの素敵なネタがたくさん集まりました。きっと、TeX言語とかexpl3言語とかWEB言語とかの普及がチョット進んだことでしょう。

しかし、昨今は諸般の事情もあってTeX言語とかexpl3言語とかWEB言語とかの普及をもっともっと進める必要があり、そのため、このカレンダーでもTeX言語とかexpl3言語とかWEB言語とかのネタをもっともっと集めることにしました。

TeX言語とかexpl3言語とかWEB言語とかの魅力を大いに語りましょう!

……あつ、もちろんTeX言語とかexpl3言語とかWEB言語とか以外のプログラミング言語のネタでもいいですよ!

例によって「重点テーマ」は「制限」ではありません。

(前略)……以下のいずれかテーマに該当する何かを書きます。

  • 「やっぱりTeX言語(とか)しましょう!」に大いに関連するTeXLaTeXネタ。
  • 「やっぱりTeX言語(とか)しましょう!」にチョット関連するTeXLaTeXネタ。
  • 「やっぱりTeX言語(とか)しましょう!」にサッパリ関連しないTeXLaTeXネタ。

このように、以前と同じく、TeXに関連するもの(LaTeXとか、plain TeXとか、ZzTeXとか、Pandocとか、KaTeXとか、朝起きがけの \expandafter とか、……)ならやっぱり何でも構いません。

皆さんの、心温まるTeXネタで寒い冬を乗り越えましょう☃︎️!