日本語 TeX 開発コミュニティの活動近況
これは「TeX & LaTeX Advent Calendar 2020」の 17 日目の記事です。昨日(16 日目)は T-Stream さんでした。明日(18 日目)は tamuratak さんです。(公開が遅れてすみませんでした…。)
もうご存知かもしれませんが,世の中には「日本語 TeX 開発コミュニティ」という謎組織があります。ここではその謎を解いていきます。
私は何者か
コミュニティの話をする前に,私 (aminophen) が何者か。
- 謎組織「日本語 TeX 開発コミュニティ」の一員です。
- 顔は下のインタビュー記事に出ています。
TeX 界隈での発表履歴はこちら:
- TeX ユーザの集い 2014(LT: 発表の振り返り)
- TeX ユーザの集い 2016(一般講演: 発表の振り返り,資料)
- TeXConf 2018(LT: 資料)
- TeXConf 2019【中止】(一般講演: 資料)
- Online.tex 2020(一般講演: 資料)
あとは,このブログの記事と Twitter と GitHub の活動を見ていただければだいたいわかります。
日本語 TeX 開発コミュニティは何者か
さて,ここから謎コミュニティの話に入りましょう。
続きを読むpTeX のペナルティを LuaTeX-ja で試してみた
これは TeX & LaTeX Advent Calendar 2019 の 15 日目の記事です。昨日は hak7a3 さんでした。明日は keisuke495500 さんです。
今年は残念ながら TeXConf 2019 が中止になってしまいました。私は「pTeX のペナルティ」という題目で一般講演を申し込んでいたのですが,発表スライドを使う予定がなくなったのでここで公開します。
- 一般講演:山下弘展「pTeX のペナルティ」 -- 発表スライド(PDF 直リンク)
- TeXConf 2019 の講演スライドのソース (GitHub)
…さて,TeX & LaTeX Advent Calendar 2019 の重点テーマは「とにかく Lua(La)TeX しよう」です。pTeX ではありません。というわけで,先のスライドと同じことを LuaTeX (LuaTeX-ja) でやってみるとどうなるか,試してみることにしましょう。
おことわり:本稿はあくまで実験結果で,何らかの結論を導くものではありません。「ただやってみた」という程度に捉えてください。
続きを読む
TeX Live 2019 注目ポイントまとめ (2)
前回の続きです。
5. pTeX の仕様変更:\inhibitglue
の有効範囲の変更
これは TeX Forum でも告知した件ですが,再掲しておきます。
- TeX Live 2019 での \inhibitglue の挙動変更【予定】 (forum:2566)
- [ptex] \inhibitglue の効力 (GitHub:texjporg/tex-jp-build#28)
新仕様では,以下のように \inhibitglue の有効範囲が変わります。
- \inhibitglue は,その後にノードが挿入されると無効化する。つまり,\null や \hskip や \kern や \vrule といったノード挿入では必ず無効化される。
- \inhibitglue は,ノードを挿入しない処理であれば透過する(無効化しない)。つまり,\relax や \let\A\B や数値代入では無効化されない。
- \inhibitglue の効果は他のリストに波及しない。つまり,あるボックスの中で発行された \inhibitglue は,その外側には影響しない。
- \inhibitglue を無効化する \disinhibitglue という新プリミティブの追加。これは,上記 2. により \relax などが \inhibitglue を無効化しなくなったので,「効きすぎて困った」という場合の対策として使えることを想定。
詳細は上につけたリンク先 forum:2566 に説明したとおりです。
6. e-pTeX:\pdfsavepos
の改良,\readpapersizespecial
の新設
ページ内の現在位置を保存する \pdfsavepos
と,それを取得する \pdflastxpos
/ \pdflastypos
に関する改良です。
- papersize \specialと\pdflastypos (forum:2564)
- [eptex] \pdfsavepos の原点 (GitHub:texjporg/tex-jp-build#62)
- \pdfsavepos と \mag (e-pTeX チケット #36885)
この座標の原点位置は「ページの左下隅」ですが,より詳細には \pdfpagewidth
/ \pdfpageheight
に応じて決まります。しかし,DVI を経由する e-pTeX では,これらの寸法はゼロになっており,原点位置を設定することができません。そこで,e-pTeX では
papersize special を読み取って \pdfpagewidth
, \pdfpageheight
を設定する
という,pdfTeX にはない特殊な決まりがありました。e-pTeX バージョン 180901 以降では,この特殊仕様を無効化できるように,\readpapersizespecial
というプリミティブが追加されました。
\readpapersizespecial
内部整数値で,値が正であれば papersize special を読み取る。ゼロ以下ならば読み取らない。後方互換のため,既定値は 1(読み取る)。
また,「縦組の場合」や「\mag が使われた場合」に,原点位置が誤って計算されてしまうという問題がありましたが,同時に修正されました。
7. upTeX 1.24 で Latin Extended-B と Latin Extended Additional をデフォルトで欧文扱い
昨年の TeX Live 2018 において,upTeX 1.23 で仕様変更が行われ,
- Latin-1 Supplement のうち Latin-1 Letters (U+AA, U+BA, U+C0..D6, U+D8..F6, U+F8..FF)
- Latin Extended-A (U+0100..017F)
がデフォルトで欧文扱いになりました。TeX Live 2019 の upTeX 1.24 ではさらに,
- Latin Extended-B (U+0180..024F)
- Latin Extended Additional (U+1E00..1EFF)
も欧文扱いになりました。
- upTeX 1.24, upTeXの新元号対応 (forum:2570)
- [upTeX] Latin-1 ブロックの分割 (GitHub:texjporg/tex-jp-build#43)
この変更は,最新の inputenc パッケージ(2018年7月以降)がサポートする Unicode 文字の範囲が広がったことに刺激されたものです。
この v1.24 では,このデフォルト値の変更作業中のミスでバグが混入してしまいました(参考)。v1.25 では修正され,しかも特に critical なバグであることから,TeX Live 2019 の期間中であるにもかかわらず,例外的に多くのプラットフォームでバイナリのリビルドが行われました。
8. pdfTeX / e-(u)pTeX / XeTeX の新プリミティブ「\expanded」
いかにも TeX 言語っぽいプリミティブ名です。今回追加された新しいプリミティブ \expanded
は,展開可能なマクロの定義に便利なものです。TeX 言語プログラミングではしょっちゅう,悪名高い(しかし一部の人🍣が大好きな)展開制御の「\expandafter
体操」の必要に迫られますが,\expanded
があればそれが少々簡略化できる,というわけです。
LuaTeX には相当昔から存在したプリミティブですが,TeX Live 2019 では pdfTeX,e-pTeX,e-upTeX,XeTeX にも新たに \expanded
が追加されました。
機能説明は別の誰かに譲ることとして,ここでは \expanded
の少々特殊な歴史をば少し:現在,pdfTeX はバージョン 1.40.? と付けられています。今でこそ pdfTeX は機能追加もほとんどなく,バグもほとんど発生しないという「安定」ですが,今から10年ほど前(2008年頃)までは pdfTeX にも新機能追加を目指した開発が行われていました(開発場所)。これは将来バージョン 1.50 としてリリースされるはずだったのですが,次第に開発者が離れてしまって現在に至ります。その 1.50 で追加される予定だったプリミティブの一つが \expanded
でした*1。
9. XeTeX:新しい pdfTeX 互換プリミティブ,\UCharcat
の拡張
今年から,XeTeX でも pdfTeX と同様のプリミティブが沢山使えるようになりました。ただし,従来の XeTeX 流の命名規則に則り pdf〜 の接頭辞を取ってあります。幾つかは TeX で乱数を使うために有用ですね!
\creationdate, \filedump, \filemoddate, \filesize \elapsedtime, \resettimer, \normaldeviate, \uniformdeviate, \randomseed
また,\Ucharcat プリミティブにも機能拡張が入っています。
これらはいずれも,LaTeX3 team がリクエストしたものです。「新しいプログラミング言語 expl3 を強力なものにするため,足りない機能を追加していく」という流れは今後も続くのではないかと思います。
10. pdfTeX の新プリミティブ \pdfomitcharset
「dvipdfmx で作った PDF」が Acrobat のプリフライトを通りやすくなった件を先ほど書きましたが,「pdfTeX で作った PDF」にも改良が入りました。
簡潔には,「/CharSet が不完全で PDF/A として不正になってしまう場合に,\pdfomitcharset プリミティブを発行すれば PDF に /CharSet を書き出さないようにできる」ということのようです。
11. MetaPost の制限版 r-mpost コマンドの追加
2016年11月28日に,制限付きシェル実行 (restricted shell escape) に関連するセキュリティホールが見つかったことを記憶している方もいるかもしれません。
これ以前は,MetaPost の起動コマンド mpost が shell_escape_commands リストに登録されていました。しかし,上記のセキュリティホールが見つかり,即日 mpost はこのリストから外されてしまいました。結果的に,例えばみなも氏の MePoTeX パッケージなどが(-shell-escape なしには)使えなくなってしまいました。
これは困った… というわけで,MetaPost 本体に改修が入りました。
- TeX Live 2017 で,MetaPost に「外部コマンド起動を抑制する
-restricted
オプション」が追加された。 - TeX Live 2019 で,「
r-mpost
」というコマンドを実行すると「mpost -restricted
」と同じ意味を表すことになった。
新設されたコマンド名は以下の通りです (r49614, r49616)。
- 制限付 mpost →「r-mpost」
- 制限付 pmpost →「r-pmpost」
- 制限付 upmpost →「r-upmpost」
このうち「r-mpost」は texmf.cnf の shell_escape_commands にも追加され (r49551),晴れて再び TeX から MetaPost を r-mpost という名前で呼び出せるようになりました。
余談:TeX Live にはいくつか「r」を頭につけて「制限付き」を表すことにしたコマンドが存在します。この慣例とは異なり,今回の mpost 系列では「r-」という接頭辞が付いていますので注意してください*2。
- epstopdf → repstopdf
- pdfcrop → rpdfcrop
12. dvisvgm が PDF → SVG 変換をサポート
DVI を SVG に変換するツール dvisvgm は,割と新しい SVG 画像作成ツールで,名前の通りメインは DVI → SVG 変換ツールです。pTeX で日本語文字が出てくる DVI も変換できるほか,EPS → SVG 変換もサポートしていることが知られています(過去記事も参照)。
TeX Live 2019 には,dvisvgm 2.6.3 が収録されています。この新しいバージョンで, PDF も入力ファイルに指定できるようになりました(v2.4 で新設)。つまり,dvisvgm を新しい PDF → SVG 変換ツールとして使うことができます。
通常の DVI 入力の場合はコマンドが dvisvgm hoge.dvi
ですが,PDF 入力の場合は dvisvgm --pdf hoge.pdf
とします。あるいは,長いオプション --pdf
を短縮形 -P
で代替することもできます。入力する PDF は複数のページを含んでいても問題ありません(v2.5 でサポート)。残念ながら,「マルチページ PDF をアニメーション SVG に変換」ということはできないようです。この用途には Windows と macOS 向けアプリケーションである TeX2img を使いましょう。
13. 新しいツール:dvispc と chkdvifont と ctwill
Windows ユーザの方は,dviout という DVI ビューアを知っているかもしれません。大島先生が開発された歴史あるビューアで,高機能のため,Windows 版 TeX Live に収録されている唯一の DVI ビューアです。実は,この dviout にはビューア本体の他に,いくつかの「単体でも便利なツール」が一緒に含まれています。そのうちの2つが,dvispc と chkfont でした。
- dvispc:バイナリである DVI とテキストファイルを相互変換する機能,DVI に使われている色指定の
\special
がページをまたぐ場合に修正する機能などを提供するプログラム。 - chkfont:DVI でどんなフォント(正確には TFM ファイルの名前)が使われているかを表示するプログラム。他に,TFM ファイルや PK ファイルなど,TeX 特有のフォント形式のファイルを読み取り,基本的な情報を表示することができる。
これまでも,TeX Live の Windows 版にはこっそり含まれていたのですが(c:/texlive/2018/tlpkg/dviout
の中の dvispc.exe と chkfont.exe がそれです),もっと Windows 以外の人にも使えるようにということで,TeX Live で正式に全てのプラットフォーム向けにビルドして配ることにしました(それを機に,chkfont は chkdvifont に改名されました)。機能の詳細については,それぞれ dvispc-ja.txt と chkdvifont-ja.txt を参照してください。
ctwill というのは,CWEB 関係のなにかのようです。CWEB と聞いてピンと来る人は見てみるといいかもしれません。 → cwebbin
14. dviconcat で縦組を含む DVI の ID を必ず 3 に
これは,昨年 dviselect などを pTeX に対応させた際の考慮漏れによるバグでした。
- [dviconcat] 縦組を含む DVI の ID (GitHub:texjporg/tex-jp-build#73)
通常の TeX が出力する DVI では ID が 2 ですが,pTeX には「DVI の中でどこか一箇所でも組方向変更する場合は,識別のため ID を 3 にする」という仕様が存在します。これに従わないと,dvipdfmx などが DVI を解釈するときにエラーをします。
ところが,昨年 pTeX に対応したつもりだった dviconcat で,最後に結合される DVI が横組だけの場合に誤って ID を 2 にしてしまうバグが見つかったので,今回 TeX Live 2019 では修正されています。
15. kanji-config-updmap(-sys) で noto / sourcehan サポート
TeX Live 2019 では,Noto Serif CJK / Noto Sans CJK あるいは源ノ明朝・源ノ角ゴシック (Source Han Serif / Source Han Sans) を kanji-config-updmap(-sys) で設定できるようになりました。ただし,サポートは完全ではありません。
これらのフォントをデフォルトで埋め込む場合は,下記のコマンドを実行します。
(sudo) kanji-config-updmap-sys noto
: Noto の OTF 版(sudo) kanji-config-updmap-sys noto-otc
: Noto の OTC 版(sudo) kanji-config-updmap-sys sourcehan
: Source Han の OTF 版(sudo) kanji-config-updmap-sys sourcehan-otc
: Source Han の OTC 版
ただし,以下の通り制約があります。
- 使えるのは upLaTeX + dvipdfmx だけです(つまり,pLaTeX では使えませんし,dvips を経由する場合も使えません)。さらに,upLaTeX + dvipdfmx であっても,クオート(ダブルクオート“”やシングルクオート‘’は使えません。
- OTF パッケージが提供する命令については,\UTF は使えますが,\CID は使えません。また,\aj~シリーズの一部や,横組み専用・縦組み専用仮名 (expert) やルビ専用仮名も使えません。
- 上記「使えません」は,現時点では,表示されない或いはエラーになるというわけではなく,フォントが非埋め込みになります。
おおざっぱな書き方のため,他にも多くの機能上の制約が存在すると思います。この点に注意してお使いください。これらの機能上の制約は,pxchfon パッケージを使うことで一部解消しますので,当方としてはこちらをお勧めします。
16. その他
細かい修正です。
- makejvf で明らかに間違った使い方を禁止
- upBibTeX がフリーズする問題の修正
- 特定の方法でsubstringを使うとフリーズするという問題が修正されました。
駆け足でしたが,私が把握している変更点は以上です。
TeX Live 2019 注目ポイントまとめ (1)
【最終更新 2019-05-01 14:50】ついに日本時間の昨日,TeX Live 2019 がリリースされました。
本ブログで毎年恒例の(昨年はこちら),TeX Live 2018 → 2019 の変更点まとめです。特にユーザレベルに影響しそうな項目は,下記目次で太字にしてあります。
目次
- いきなり番外編:新元号「令和」への対応
- 1. インストーラが新しくなった
- 2. mendex の文字コードを既定で UTF-8 に変更
- 3. LuaTeX がバージョン 1.10.0 に(Lua 5.3 へバージョンアップ)
- 4. dvipdfmx の大規模アップデート
- 5. pTeX の仕様変更:
\inhibitglue
の有効範囲の変更- 6. e-pTeX の修正:
\pdfsavepos
の改良,\readpapersizespecial
の新設- 7. upTeX 1.24 で Latin Extended-B と Latin Extended Additional をデフォルトで欧文扱い
- 8. pdfTeX / e-(u)pTeX / XeTeX の新プリミティブ「\expanded」
- 9. XeTeX:新しい pdfTeX 互換プリミティブ,
\UCharcat
の拡張- 10. pdfTeX の新プリミティブ
\pdfomitcharset
- 11. MetaPost の制限版 r-mpost コマンドの追加
- 12. dvisvgm が PDF → SVG 変換をサポート
- 13. 新しいツール:dvispc と chkdvifont と ctwill
- 14. dviconcat で縦組を含む DVI の ID を必ず 3 に
- 15. kanji-config-updmap(-sys) で noto / sourcehan サポート
- 16. その他(makejvf, upbibtex)
いきなり番外編:新元号「令和」への対応
「新元号に変わるので LaTeX が動かなくなります。アップデートしましょう。」
…ということは絶対にありえません。ただ,「LaTeX で令和できるとハッピー???」という方のために,最初に持ってきました。
今日の日付を表示する \today
を \和暦
な状態で使った時,2019 年 4 月 30 日までは「平成」,2019 年 5 月 1 日からは「令和」となります*1。
- pLaTeX 標準の jarticle, jbook, jreport, tarticle, tbook, treport
- upLaTeX 標準の ujarticle, ujbook, ujreport, utarticle, utbook, utreport
- jsclasses の jsarticle, jsbook, jsreport
- jlreq クラス
- babel パッケージの japanese オプション
- LuaTeX-ja の ltjsarticle, ltjsbook, ltjsreport, ltjarticle, ltjbook, ltjreport, ltjtarticle, ltjtbook, ltjtreport
もし,学会などのクラスファイルが対応していない状態で「令和」な日付を使いたくなったら,bxwareki パッケージの \warekitoday
という命令が新元号「令和」に対応していますので,利用すると良いでしょう。
また,OTF パッケージの \ajLig{令和} も令和の組文字 (U+32FF) になります。ただし,この U+32FF の組文字が PDF で正しく表示されるためには,埋め込むフォント自体に「令和」の組文字が存在する必要があります。また,この文字を PDF からコピーペーストできるようになるためには,ビューア(Adobe Acrobat Reader など)に内蔵されている CMap ファイルが十分新しいものでなければなりません。
続きを読む