Hatena::ブログ(Diary)

マクロツイーター このページをアンテナに追加 RSSフィード Twitter

2017-09-23

jfmutil の新しいやつ(v1.1.0)

jfmutil パッケージの新しい版をリリースした。

TeX Live および W32TeX には既に反映されている。

いや、そもそも jfmutil って何?

jfmutil パッケージは jfmutil コマンドを提供する。だから TeX Live の最新版がインストールされている状態で jfmutil というコマンドを実行すると、次のようなヘルプ出力が得られる。

This is jfmutil v1.1.0 <2017/09/16> by 'ZR'.
[ZRTeXtor library v1.4.0 <2017/07/17> by 'ZR']

* ZVP Conversion
Usage: jfmutil vf2zvp0 [<options>] <in.vf> [<out.zvp0>]
       jfmutil zvp02vf [<options>] <in.zvp0> [<out.vf>]
       jfmutil vf2zvp [<options>] <in.vf> [<in.tfm> <out.zvp>]
       jfmutil zvp2vf [<options>] <in.zvp> [<out.vf> <out.tfm>]
       jfmutil zpl2tfm [<options>] <in.zvp0> [<out.vf>]
...(略)

で、この jfmutil コマンドは何かというと、要するに

pxutil コマンドとほとんど同じもの

である。PXutil パッケージTeX Live や W32TeX に入っていないので、自分でインストールする必要があった。しかし今では、pxutil を使いたいという場合は、代わりに jfmutil コマンドを使えばよい、ということである。

※現状では、GitHubレポジトリPXutil パッケージの下にぶら下がっている形になっている。

jfmutil と pxutil の間の違い
  • pxutil は ZRTeXtor モジュールに依存していて、これを別にインストールする必要がある。これに対して、jfmutil の方は jfmutil.pl ファイルだけで完結していて単体で動作する。CTAN に収録する場合に「ややこしいファイル構成を避けたい」と思って派生版を作ったわけである。
  • pxutil には設定ファイル(pxutil.cfg)が存在するが、jfmutil には無い。パラメタ値は全て既定値が使われる。
  • ただし、漢字コード設定については、pxutil とは異なり、外部・内部ともに“無効”( none )を指定している。すなわち、既定で -E オプションが指定されたのと同等になる。

※なお、pxutil/jfmutil の 1.0.0 版以降は、前の版(0.6.3 版)に比べて大幅に速度改善が行われている。

そして、新しい jfmutil の話

jfmutil の 1.1.0 版では新たに

pxcopyfont と同じことができるようになった。

つまり、「TeX の仮想フォント(VF・TFM ファイルの組)を別名で複製する」機能が追加された。

jfmutil で pxcopyfont する話

例えば、pxcopyfont パッケージの解説記事に冒頭にある、次の図のような複製を行いたいとする。

f:id:zrbabbler:20170922174252p:image

pxcopyfont を使うと、次のようにできる。(> はプロンプト)

> pxcopyfont upjisr-h foo-r-jy2 r-foo-r-jy2 r-foo-r-jy2x

これと同じことを、jfmutil を使って、次のようにできる。引数の書き方は pxcopyfont と全く同じである。

> jfmutil vfcopy upjisr-h foo-r-jy2 r-foo-r-jy2 r-foo-r-jy2x
jfmutil: number of base TFMs in 'upjisr-h': 2
jfmutil: id=0: uprml-h: r-foo-r-jy2
jfmutil: id=2: upjisr-hq: r-foo-r-jy2x
pxcopyfont のアレを jfmutil でやる

なお、pxcopyfont は引数が 1 つだけ(入力 VF しかない)の場合、その VF の参照 TFM の一覧を出力するという動作になる。

> pxcopyfont upjisr-h
VF 'upjisr-h' refers to:
000:uprml-h
002:upjisr-hq

この機能は、jfmutil では別のサブコマンドで利用できる。jfmutil vfcopy ではなくて、jfmutil vfinfo として実行する。(出力形式は少し異なる。)

> jfmutil vfinfo upjisr-h
0=uprml-h
2=upjisr-hq

というわけで

イマドキの TeX Live では、pxutil だけでなくて pxcopyfont もできる!

2017-09-17

PXchfon の新しいやつ(v1.1a)

W32TeXTeX Live では既に更新されている。

Unicode 直接指定に関するアレコレ

アドホックに拡張を続けていて複雑になっているので、一回整理してみた。ただ、何か機能を削ったわけではないので依然として複雑であり、一般のユーザが知る必要性も乏しいので詳細はブログでは扱わない。マニュアル*1の「Unicode 直接指定」の節(7 節)を参照してほしい。

要するに
  • dvipdfmx の 20170627 版 20170918 版以降であれば、pxchfon で unicode オプションを付けることで、「AJ1 でない OpenType フォント」が使用できるようになる。また、任意の OpenType フォント(TrueType グリフのものも含む)について、OpenType の機能を利用した機能(異体字の区別など)が使えるようになる。
  • dvipdfmx の 20170318 版(TeX Live 2017)の場合、残念ながら unicode は使えないが、代わりに“劣化版”である unicode* が使える。劣化版なので、一部の機能が異常になる。
  • Source Han 系のプリセットsourcehan(-otc)noto(-otc))は自動的に unicode を有効化する。
    • ただし、unicodeTeX Live 2017 で使えないため、「unicode* 状態に対してアレな細工を施して unicode 状態を模倣した」プリセットである sourcehan(-otc)+noto-(otc)+ を用意している。これらは unicode* が使える環境なら使える。
    • そして、TeX Live 2017 の期間の暫定措置として、Source Han 系のプリセットsourcehan など)は“+ 版”(sourcehan+ など)として扱われる。*2
    • yu-win10unicode を付けた状態」を(アレな細工をして)模倣したプリセットである yu-win10+ も存在する。(yu-win10 は従来通り非 unicode である。)*3
  • 前項以外の場合、unicodeunicode* も付けなければ「従来通り」(CMap 指定)になる。
  • “試験的”であるため、まだマニュアルにも書いてないこと:
    • unicode(*) が有効である場合、自動的に pxufont パッケージが読み込まれる。*4
    • これにより、pLaTeX でも unicode(*) 指定が機能するようになる。
    • また、japanese-otf の \CID 命令も正常になる。
要するに要するに

CSI 指定を正しくする

※上級者向けの話題である。

旧版の pxchfon において japanese-otf 併用で kozuka-pr6n プリセットを指定した場合、Identity-H の CMap を指定したマップ行(例えば otf-cjmr-h)は次のようになっていた。

otf-cjmr-h Identity-H KozMinPr6N-Regular.otf/AJ16

ところが、この中の /AJ16 のような指定(CSI 指定)は、本来は TrueType グリフのフォントを指定する場合にのみ付加すべきものであり、KozMinPr6N-Regular.otf のような CFF グリフのフォントの時に付加するのは正しくない。ただし、これまでのところ、不正に付けていても特に問題は起こらないようである。

フォントのグリフ種別を TeX で判別する」のは面倒であり*5、かつ実害もないため、これまで対策は敢えてしていなかった。しかし、フォントマップのダンプ機能が使われた場合、外から見えるファイルに書いてあるマップ行に問題がある、というのは許容し難いであろう。

そういうわけで、CSI 指定の付加を適切に行う機能を実装した。ただし、この機能は kpsewhich の呼出を伴うため時間がかかる。そのため、strictcsi オプションを付けたときにのみ働くようにした。そして、フォントマップダンプ機能(dumpmap(tl) オプション)が有効な場合は自動的に既定で有効になる。

以上より、新版でフォントマップダンプを行った場合、マップファイルには以下のような適切な(CSI 無しの)マップ行が出力される。

otf-cjmr-h Identity-H KozMinPr6N-Regular.otf
“strictcsi”オプション
  • strictcsi: Identity-H/V に対する CSI 指定を(仕様に厳密に従って)フォントが TrueType グリフの場合にのみ出力する。
  • nostrictcsi(既定): strictcsi の否定。Identity-H/V に対する CSI 指定は常に出力される。
    • dumpmap(tl) が指定された場合は strictcsi が既定になる。

もっと“アレな細工”する話

Source Han 系のプリセット(の“+版”*6)では「一部を中国語用のフォントに飛ばす」という“アレな細工”を行っているため、通常(unicode* 状態)では不正になる欧文クオートの出力が正常になる。

% upLaTeX文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[sourcehan-otc]{pxchfon}
\begin{document}
{\TeX}は“アレ”。
\end{document}
f:id:zrbabbler:20170917164510p:image

ところが、ここでもし「自分はもっと細い明朝体がよい」ということで、\setminchofont で Source Han Serif Light を設定したとする。この場合、“細工”が必要なクオートはどうなるか。

% upLaTeX文書
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage[sourcehan-otc]{pxchfon}
\setminchofont[0]{SourceHanSerif-Light.ttc}% 明朝体はLightにしたい
\begin{document}
{\TeX}は“アレ”。
\end{document}

旧版では、“細工”はプリセット指定で選択されたフォントにしか効果がなかった。だから、先の場合、クオートの出力は異常になる。

f:id:zrbabbler:20170917164501p:image

新版では、Source Han 系のプリセットが指定されている場合\set...font 命令で自分で指定した Source Han 系のフォントにも“細工”が適用される。従って、クオートは正常に出力されるようになる。*7

f:id:zrbabbler:20170917164507p:image

その他諸々

*1TeX Live や W32TeX では「texdoc pxchfon」で開く。

*2TeX Live 2018 のリリースの時点で本来の「unicode 版」に切り替わる予定である。TeX Live 2017 のユーザの便宜のため、“+ 版”も当面の間サポートされる。

*3TeX Live 2018 でどうするかは未定。yu-win10 を自動的に unicode 付きにすると、「古い dvipdfmx で yu-win10 を使っていた人が pxchfon をアップデートすると異常になる」という不具合を生じてしまうし、また同名の ptex-fontmap の設定とも食い違う。「yu-win10* を別に作る」という案もあるが、そもそも任意のプリセットunicode を付けることができるのだから、yu-win10特別扱いする必要もないようにも思える。

*4:正確ににいうと、「pxufont を読み込む」ことを指定する replace-legacycode というオプションが存在し、unicode(*) はこのオプションを既定で有効にする。apply-legacycode というオプションを指定するとこの指定は打ち消される。

*5:例えば「拡張子.otf である TrueType グリフのフォント」もあるので、ファイル名の拡張子では判別できない。

*6:前述の通り、現在は Source Han 系のプリセットは自動的に“+版”に振り替えられる。

*7:これは「中国語版の Source Han Serif Light」が使われているということなので、当該のフォントインストールされている必要がある。なお、noswitchfont というオプションを指定すると、この類の「別のフォントに振り替える」という“細工”を全て抑止することができる。もちろん、それにより出力が不正になるかも知れない。

2017-09-14

pTeX-ng のプリミティブを把握したい話

pTeX-ng(別名 Asiatic pTeX、ApTeX)とは何かについてはコレを参照。

pTeX-ng と e-upTeX の拡張プリミティブを比較してみた。

プリミティブ pdfTeX e-upTeX pTeX-ng
e-TeX のプリミティブ(※1)
pTeX 拡張のプリミティブ(※2)
upTeX 拡張のプリミティブ(※3)
(pdfTeX 拡張のプリミティブ)
\ifpdfprimitive
\pdfcompresslevel
\pdfcreationdate
\pdffiledump
\pdffilemoddate
\pdffilesize
\pdfhorigin
\pdflastxpos
\pdflastypos
\pdfmdfivesum
\pdfminorversion
\pdfpageheight
\pdfpagewidth
\pdfprimitive
\pdfsavepos
\pdfshellescape
\pdfstrcmp
\pdfvorigin
\quitvmode
(Omega 拡張のプリミティブ)
\odelcode
\odelimiter
\omathaccent
\omathchar
\omathchardef
\omathcode
\oradical
(e-pTeX 拡張のプリミティブ)
\epTeXinputencoding
\hfi
\lastnodechar
\pagefistretch
\vfi
pTeX-ng 拡張のプリミティブ)
\ngbanner
\ngostype
\shellescape
(※1) \synctex を含む。
(※2) \dtou\ifdbox\ifddir\ifmbox\ifmdir\iftbox\iftdir\ifybox\ifydir\kcatcode\scriptbaselineshiftfactor\scriptscriptbaselineshiftfactor\textbaselineshiftfactor を含む。
(※3) \disablecjktoken\enablecjktoken\forcecjktoken\kchar\kchardef\ucs

2017-09-13

BXjscls の新しいやつ(v1.6)

W32TeXTeX Live では既に更新されている。

※特に断らない限り、この記事では標準(standard)和文ドライバを前提にする。

重要かもしれないお知らせ

以前の記事で予告していた通り、1.6 版から bxjareport の“準拠元”の jsclasses クラスを「jsbook クラス + report オプション」から「jsreport クラス」に変更する。これにより、bxjsreport クラスについて、以下の事項について影響が出る。(詳しくは当該の記事を参照。)

  • abstract 環境の用途が異なる。
  • 2.両面印刷用出力(twoside オプション)の際に、titlepage 環境開始時の改ページの挙動が異なる。

もし、これらの事項について、1.5d 版以前の仕様を維持したい場合は、オプションに「layout=v1」を指定してほしい。

\documentclass[lualatex,ja=standard,layout=v1,a4paper]{bxjsreport}

その他諸々

  • •jsclasses の 2017/09/03 版と同期した。

2017-08-31

画期的なカラー絵文字フォント(SCAlleSnowman)を作ってみた

過ぎ行く夏の思い出に耽るには、ゆきだるま☃︎(特にカラーのやつ)を使った文書を作るのが一番である。 周知の通り、LaTeX文書を作るのであれば、画期的な scsnowman パッケージを利用すると、 文書にカワイイ☃︎を簡単に入れられる。

% pLaTeX文書
\documentclass[dvipdfmx,a4paper]{jsarticle}
\usepackage{scsnowman}% カラーゆきだるま!
\begin{document}
来年は、もっともっと素敵な
\scsnowman[hat,arms,snow,buttons,muffler=red]ネタに
出会えますように!
\end{document}
f:id:zrbabbler:20170831225044p:image

しかし、文書HTML で作りたい、という場合は話はそんなに簡単ではない。この場合、☃︎のカラー絵文字を使えばいいのであるが、しかし Windows の標準のカラー絵文字フォントの「Segoe UI Emoji」では、☃︎の絵文字がチョットアレなのである。

f:id:zrbabbler:20170831163501p:image:w200

代わりに、Twemoji などの「絵文字画像」を使うという手もあるが、多少面倒であるし、何よりも、scsnowman の熱狂的なファンであれば「scsnowman のカワイイ☃︎でないと納得できない」と考えるのも当然である。

f:id:zrbabbler:20170831225041p:image

“あの”ゆきだるまが HTML で使えるよ!

というわけで、作ってみた。

この中にある SCAlleSnowman.ttf が「ゆきだるま☃︎のカラー絵文字フォント」である。これを WIndowsインストールした上で、CSS の font-family に「SCAlleSnowman」を指定すると、「scsnowman の☃︎」が入った HTML 文書ができあがる。

<!DOCTYPE html>
<html><head><title>hoge</title>
<meta charset="UTF-8">
<style>
body { font-family: 'SCAlleSnowman', 'Yu Mincho', sans-serif; }
</style>
</head>
<body>
<p>雪あり→☃/雪なし→⛄</p>
<p>来年は、もっともっと素敵な☃ネタに出会えますように!</p>
</body></html>
f:id:zrbabbler:20170831231251p:image
フォント指定のポイント

SCAlleSnowman は〈☃︎〉(U+2603)と〈⛄︎〉(U+26C4)のみを含むフォントである。従って、CSS の font-family 指定において、'SCAlleSnowman' を先頭に追加することで、「他の文字には影響を与えずにこの 2 文字のみフォントを変更する」ことができる。

[CSS 指定]
/* ☃︎はSCAlleSNowman、それ以外は游明朝 */
body { font-family: 'SCAlleSnowman', 'Yu Mincho', sans-serif; }
[HTML 本文]
<p>8月は☃。</p>
f:id:zrbabbler:20170901000249p:image
非カラーなゆきだるま

SCAlleSnowman の☃︎は既定ではカラー絵文字になるが、☃︎の後にテキスト異体字セレクタ(text variation selector = VS15 = U+FE0E)を置くと白黒の☃︎に変わる。

[HTML 本文]
<!-- 敢えて実体参照形式で記述した -->
<p>☃は素敵、☃&#xFE0E;も素敵。</p>
f:id:zrbabbler:20170901000241p:image
非マフラーなゆきだるま

OpenType 属性の Style Set 1(ss01)を指定するとマフラー無しの☃︎になる。

[HTML 本文]
<p>☃は素敵、
<span style="font-feature-settings:'ss01'"></span>も素敵。</p>
f:id:zrbabbler:20170901000237p:image
マフラーの色を変える

同様に、OpenType 属性の Style Set 2〜6(ss02〜ss06)を指定すると様々な色のマフラーの☃︎が表示される。(ただし ss02 は既定と同じになる。)

<p><span style="font-feature-settings:'ss02'"></span>は素敵。
<span style="font-feature-settings:'ss03'"></span>も、
<span style="font-feature-settings:'ss04'"></span>も、
<span style="font-feature-settings:'ss05'"></span>も、
<span style="font-feature-settings:'ss06'"></span>も素敵。</p>
f:id:zrbabbler:20170901000229p:image

まとめ

scsnowman の☃︎HTML で使っても素敵。


補足:Windows でない場合

実は、SCAlleSnowman は「Microsoft 方式のカラーフォント」である。現状では、OS レベルでこの方式に対応しているのは Windows(10?)だけなので、他の OS 上のブラウザで見た場合は、☃︎は常に白黒で表示されてしまう。(残念……。)

ただし、FirefoxMicrosoft 方式のカラーフォントを自前でサポートしているので、素敵なカラーの☃︎が表示できる。なので、夏の思い出に浸りたい非 Windows 者は是非とも Firefox を使おう。