マクロツイーター

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

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

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 版と同期した。

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

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

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

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

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

“あの”ゆきだるまが 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>
フォント指定のポイント

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

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

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

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

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

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

同様に、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>

まとめ

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


補足:Windows でない場合

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

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

scdviout-pgf がアヒルに対応した件

scdviout-pgf でアヒルしてみる

dviout で PGF/TikZ が扱えるようになる画期的な scdviout-pgf パッケージであるが、先日、このパッケージについてチョットした問題点が指摘された。

確かに、「出力をゆきだるま☃にする」ことは問題解決になっているが、「出力をアヒル🦆にする」ことでも問題を解決できる。ならば、ゆきだるま☃でなく、むしろアヒル🦆を出力すべきではないか。

「出力をアヒル🦆にする」という手法が有効であることは確かである。しかし、「ゆきだるま☃とアヒル🦆のどちらがより有効か」という議論は、無用な争いを生む恐れがあるため、是非とも避けたいところである。

そういうわけで、scdviout-pgf について、「ゆきだるま☃とアヒル🦆のどちらを出力するか」をオプションで選べるようにする」という改修を行った。

新しい 0.82 版では、scdviout-pgf パッケージのオプションに duck を指定することで、TIkZ の出力をアヒル🦆にすることができる。

% pLaTeX文書
\documentclass[dviout,a4paper]{jsarticle}% dvioutしたい!
\usepackage[duck]{scdviout-pgf}% アヒルしたい!!!
\usepackage{tikz}
\usetikzlibrary{calc}
\colorlet{myblue}{blue!80!black}
\begin{document}

\begin{center}
% "三角形の外心"の図をTikZで頑張って作ったよ
\begin{tikzpicture}[x=5mm,y=5mm]
  \coordinate (A) at (4,4);
  \coordinate (B) at (0,0);
  \coordinate (C) at (6,0);
  \coordinate (O) at (3,1);
  \draw[myblue!80] (O)--($(A)!.5!(B)$);
  \draw[myblue!80] (O)--($(B)!.5!(C)$);
  \draw[myblue!80] (O)--($(C)!.5!(A)$);
  \draw[myblue!80,overlay] (O) circle[radius=3.16228];
  \fill[myblue] (O) circle[radius=2pt] node[left=2pt] {O};
  \draw[thick] (A)--(B)--(C)--cycle;
  \fill (A) circle[radius=2pt] node[above=2pt] {A};
  \fill (B) circle[radius=2pt] node[left =2pt] {B};
  \fill (C) circle[radius=2pt] node[right=2pt] {C};
\end{tikzpicture}
\end{center}

\end{document}

これを platexコンパイルして dviout で開くと、以下のような素敵な出力が得られる。

一方で、次のように scdviout-pgf のオプションを snowman にした場合は:

\usepackage[duck]{scdviout-pgf}% ゆきだるま!!!

従来通り、以下のような(これまた)素敵な出力が得られる。

“dc”な dviout-pgf

なお、オプションを省略した場合の既定値は snowman である。これは単純に旧版との互換性のための仕様であるが、熱狂的なアヒル者にとっては不満があるかも知れない。無用な争いは是非とも避けたいので、対策として、dcdviout-pgf というパッケージを新たに提供した。これは、「出力選択の既定値が duck である」ことを除いて、scdviout-pgf と全く同じ機能を有するものである。

% (互換性のため)出力は'snowman'
\usepackage{scdviout-pgf}

% 出力は'duck'
\usepackage{dcdviout-pgf}

% オプションを明示した場合は両者の差異はない
\usepackage[snowman]{scdviout-pgf}% 出力は'snowman'
\usepackage[snowman]{dcdviout-pgf}% 出力は'snowman'
\usepackage[duck]{scdviout-pgf}% 出力は'duck'
\usepackage[duck]{dcdviout-pgf}% 出力は'duck'

おまけ:出力を「無」にする

次のように、scdviout-pgf のオプションに phantom を指定すると:

\usepackage[phantom]{scdviout-pgf}

TikZ の出力は「無」に変わる。

無愛好家にとっては、こちらの方が素敵かも知れない。

おまけ:dvipdfmx で scdviout-pgf する

scdviout-pgf パッケージはドライバ指定が dviout でないと動作しないのであるが、実は、このパッケージが行っていることは「PGF のドライバを“pgfsys-scdviout”に設定する」だけであり、この pgfsys-scdviout 自体は dvipdfmx でも動作する*1。次のように、直接 PGF のドライバを設定すればよい。

\documentclass[dvipdfmx,a4paper]{jsarticle}% dvipdfmx したい!
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN
\def\pgfsysdriver{pgfsys-scdviout.def}% でも出力はゆきだるま!!
%\def\scpgfsysessence{duck}% アヒルならさらにコレを追加
%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END
\usepackage{tikz}

*1:一般に、dvips 互換の color special および tpic special をサポートした DVI ドライバであれば動作するはずである。

TikZ を dviout に対応させる話(ただし画期的)

夏、真っ盛りですね! 夏の日差しを浴び………………(中略)……ゆきだるま☃!

ゆきだるま☃のスゴイ問題解決パワー

さて、本ブログでは以前から、☃のもつ強力な「問題解決能力」に注目してきた。ご存知の通り、TeX は激アレである。このため、LaTeX 上の開発においては、時に「本質的に解決困難な問題」にぶち当たってしまうことがある。こういう時に「出力を☃に変える」という画期的な方策を取ることで、たちどころに解決してしまう、という話である。具体的には、今まで次のような事例を紹介している。

そういうわけで、今年の「ゆきだるま☃の日*1」のネタとして、日本語の LaTeX 界隈において長く未解決のまま残されている問題に手を付けることにする。その問題とは

TikZ(およひ PGF)パッケージの dviout 対応

である。

dviout で TikZ するとアレ

例えば、TikZ で頑張って「三角形の外心」の図を描いたとする。

[triangle1.tex]
% pLaTeX文書
\documentclass[dviout,a4paper]{jsarticle}% dvioutしたいが…
\usepackage{tikz}
\usetikzlibrary{calc}
\colorlet{myblue}{blue!80!black}
\begin{document}

\begin{center}
\begin{tikzpicture}[x=5mm,y=5mm]
  \coordinate (A) at (4,4);
  \coordinate (B) at (0,0);
  \coordinate (C) at (6,0);
  \coordinate (O) at (3,1);
  \draw[myblue!80] (O)--($(A)!.5!(B)$);
  \draw[myblue!80] (O)--($(B)!.5!(C)$);
  \draw[myblue!80] (O)--($(C)!.5!(A)$);
  \draw[myblue!80,overlay] (O) circle[radius=3.16228];
  \fill[myblue] (O) circle[radius=2pt] node[left=2pt] {O};
  \draw[thick] (A)--(B)--(C)--cycle;
  \fill (A) circle[radius=2pt] node[above=2pt] {A};
  \fill (B) circle[radius=2pt] node[left =2pt] {B};
  \fill (C) circle[radius=2pt] node[right=2pt] {C};
\end{tikzpicture}
\end{center}

\end{document}

これは本来は次のような小奇麗な図を出力するはずである。(これは dvipdfmx で*2出力したものである。)

しかし周知の通り、TikZ は dviout に対応していない。そのため、前傾の文書をコンパイルした結果の triangle1.dvi を dviout で開くと、まず次のような不吉なエラーダイアログが出現する。

ここで[無視]を選ぶと、文書の版面が表示されるが、肝心の図は何だか訳のわからないゴミのようなものに化けてしまっている。無残である。

dviout の未対応は本質的な問題

PGF/TIkZ の dviout 対応が一向に進まない最大の原因は「誰もソレをやろうとしないから」であることは間違いない。しかし、実際に PGF の dviout 用のドライバの開発を本気で考え始めると、解決すべき様々な問題が待ち構えていることにすぐに気づくであろう。というのも…………………(省略☃)。

しかし、この数々の困難な問題も、ひとたび☃のパワーを借りればたちまち解決してしまう。賢明な読者の皆さんには、もう答えはお判りであろう。

TikZ の出力を☃に変えればよい!

単純明快である。

scdviout-pgf パッケージ

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

使い方はとても簡単で、tikz(あるいは pgf)パッケージを読み込む前に、dviout のドライバオプションを付けて scdviout-pgf パッケージを読み込む。(例によって、ドライバオプションはグローバルに指定してもよい。)

\usepackage[dviout]{scdviout-pgf}% これを書くだけ!
\usepackage{tikz}

これにより、PGF/TikZ のドライバとして同梱の pgfsys-scdviout.def が指定される。これは dviout 用に実装された(画期的な)ドライバであるため、PGF/TikZ の図が出力されるようになる。

dviout で TikZ できて、しかも素敵!

それでは早速使ってみよう。先ほどの triangle1.tex について、tikz の前に scdviout-pgf を読み込むように変更する。

% pLaTeX文書
\documentclass[dviout,a4paper]{jsarticle}% dvioutしたい!
\usepackage{scdviout-pgf}% これでTikZできる!
\usepackage{tikz}
%……あとはそのまま

なんとこれだけで、さっきは無残に失敗していた dviout での図の表示が、今度は何事もなく完了する。素晴らしい!

もっと dviout で TikZ してみる

もう少し頑張って、複数の図を含む文書を作ってみる(文書ソース triangle2.tex)。

もし、scdviout-pgf を読まない状態で dviout で見てみると……これはひどい

ところが、scdviout-pgf を読み込んだ状態だと……とっても素敵!

おめでとうございます!

まとめ

ゆきだるま☃のパワー、恐るべし!

*1:もう既にお馴染みであろうが、念のため補足しておく。毎年 8 月 8 日が「ゆきだるま☃の日」である。

*2:もちろんドライバ指定を dvipdfmx にして。

LuaTeX が実はそんなに遅くないかも知れない件

LuaTeX といえば「スゴイけど遅い」という印象がある。しかし最近は随分と速くなった感じもしている。というわけで、実際に「日本語文書のコンパイル速度の比較」をしてみた。

※詳細についてはこちら。

計測方法

  • テスト用の文書はコレ。BXJS クラスの標準設定を使っていて、A4 で 9 ページある。
    % BXJSクラスを使用してエンジンを自動判定させる.
    \documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard,
      a4paper]{bxjsarticle}
    \usepackage{bxjalipsum} % \jalipsum 命令
    \title{テスト的な何か}
    \author{某ZR}
    \date{コンパイル日付: \today}
    \begin{document}
    \maketitle
    
    \section{初恋}
    \begin{quote}
    \jalipsum{hatsukoi}% 島崎藤村「初恋」
    \end{quote}
    
    \section{草枕}
    \jalipsum{kusamakura}% 夏目漱石「草枕」冒頭13段落
    
    \section{吾輩は猫である}
    \jalipsum{wagahai}% 夏目漱石「吾輩は猫である」冒頭33段落
    
    \end{document}
    
  • (u)pLaTeX については、実際には ptex2pdf を用いて PDF まで変換する際の時間を測る。
  • Windows 10 上の TeX Live 2017 を使用。
  • updmap の jaEmbed の値は ipaex である。つまり、pdfLaTeXはipaex-type1が使われ、他は本物のIPAexフォントが使われる。
  • 3 回予備で実行した後、9 回実行して所要時間を計測、その中間にある 5 回分の平均値を求めた。

実験結果

エンジン所要時間(秒)
pLaTeX(ptex2pdf)2.98
upLaTeX(ptex2pdf)3.24
XeLaTeX4.07
pdfLaTeX4.36
LuaJITLateX6.54
LuaLaTeX7.68

まとめ

LuaLaTeX は pLaTeX/upLaTeX に比べると 2〜2.5 倍くらい遅い。昔は「20 倍くらい遅い」という状態だったので、それと比べると大幅に高速化が行われていることが判る。


おまけ:“重い”パッケージを使った場合

少々画期的な要素(ゆきだるま⛄が回転している、等)を含めるために“重い”パッケージ(TikZ や expl3 等)を読み込む場合は、LuaLaTeX と pLaTeX の所要時間の差が小さくなる。

例えば次の tcfaspin パッケージを利用した文書の場合。

\documentclass[autodetect-engine,dvi=dvipdfmx,ja=standard,
  a4paper]{bxjsarticle}
\usepackage{tcfaspin}
\usepackage{scsnowman}
\begin{document}
私は\scsnowman[muffler=red,hat,arms,snow,scale=1.5]よりも
\faSpin{\scsnowman[muffler=red,hat,arms,snow,scale=1.5]}の
方が好きです。
\end{document}
\end{document}

先と同じ要領で計測した所要時間は以下のようになる。

エンジン所要時間(秒)
pLaTeX(ptex2pdf)4.92
upLaTeX(ptex2pdf)5.59
XeLaTeX5.16
pdfLaTeX4.82
LuaJITLateX8.16
LuaLaTeX8.90

pLaTeX でも源ノ明朝したい話

今もうできること

新しい dvipdfmx(20170318 版以降)では「Unicode 直接アクセス指定」の機能が強化され、それにより従来は面倒であった「AJ1 でない OpenType フォント」への対応が格段に容易になった、という話は既に何度か述べた。

すなわち、最新の TeX Live 2017 では次のようにして源ノ明朝(Source Han Serif)を upLaTeX で使うことができるようになっている。

% upLaTeX文書
\documentclass[uplatex,papersize,a5paper]{jsarticle}
\usepackage[deluxe]{otf}
\usepackage[sourcehan-otc]{pxchfon}% 源ノアレ
\begin{document}
{\TeX}{\ajSnowman}\textbf{一切}関係ありません。
\end{document}

今まだできないこと

一方で、dvipdfmx の「Unicode 直接アクセス指定」を利用した方法には明らかな限界がある。それは「Unicode 以外の和文フォントには対応できない」ということである。このため、「pLaTeX の標準和文フォント」や「japanese-otf の \CID 入力」には対応できない。

例えば次の pLaTeX 文書があるとする。

\documentclass[papersize,a5paper]{jsarticle}% pLaTeX用
%\documentclass[uplatex,papersize,a5paper]{jsarticle}% upLaTeX用
\usepackage{otf}
\usepackage[kozuka-pr6n]{pxchfon}% 小塚フォント
%\usepackage[sourcehan-otc]{pxchfon}% 源ノアレ
\renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}}
\renewcommand{\labelenumi}{\theenumi}
\begin{document}
韓国プロ野球ではシーズン最多本塁打数の記録をもち
「アジアの大砲」と呼ばれ、日本の読売巨人軍に5年間在籍した
野球選手は誰か。
\begin{enumerate}
\item\UTF{9DD7}\item \UTF{9127}小平
\item \CID{13706}澤ひとみ
\item ウィリアム・ヘンリー・ゲイツ\ajRoman{3}\item またそのネタですか
\end{enumerate}
\end{document}

pxchfon のプリセットを kozuka-pr6n にした状態(上掲のソースのまま)では pLaTeX でのコンパイルは正常に行われる。

しかしプリセットを sourcehan-otc にした場合(4 行目の代わりに 5 行目を有効にする)は、pLaTeXコンパイルは無事に終わるが、dvipdfmx の実行で次のようなエラーが出て失敗する。要するに「フォントが Adone-Japan1 でないからダメ」ということである。*1

Character collection mismatched:
        Font: Adobe-Identity-0
        CMap: Adobe-Japan1-1

dvipdfmx:fatal: Inconsistent CMap specified for this font.

Output file removed.

また、同じ内容の文書を upLaTeX でコンパイルした場合(1 行目の代わりに 2 行目を有効にする)は、直接入力と \UTF 入力の文字は正常に出力されるが、\CID 入力は全て化けている。

でも何とかしてみる

これは dvipdfmx 自体がもつ制限なので、マップ設定を工夫することでは(物理フォントの種類に依存しない形では)解決できない。しかし、話を「pxchfon が扱う範囲(標準および japanese-otf の和文フォント)」に絞って考えると、突破口は存在する。

要するに、論理フォントの名目の情報(TFM 名および NFSS での位置)が全て既知であるため、「Unicode の論理フォントだけを参照する仮想フォント(VF)」として他の(非 Unicode の)論理フォントの代替物を作成し、LaTeX 側の(NFSS の)設定を代替物の方を使用するように変更すればよいのである。*2

というわけで、作ってみた。(最新の TeX Live および W32TeX には既に収録されている。)

この pxufont は単に \usepackage で読み込むだけでよい。(japanese-otf と併用する場合は otf パッケージの跡に読み込む。)

\documentclass[papersize,a5paper]{jsarticle}% pLaTeX用
%\documentclass[uplatex,papersize,a5paper]{jsarticle}% upLaTeX用
\usepackage{otf}
\usepackage{pxufont}% これでOK!
\usepackage[sourcehan-otc]{pxchfon}% 源ノアレ
\renewcommand{\theenumi}{\ajLabel\ajMaru{enumi}}
\renewcommand{\labelenumi}{\theenumi}
\begin{document}
韓国プロ野球ではシーズン最多本塁打数の記録をもち
「アジアの大砲」と呼ばれ、日本の読売巨人軍に5年間在籍した
野球選手は誰か。
\begin{enumerate}
\item\UTF{9DD7}\item \UTF{9127}小平
\item \CID{13706}澤ひとみ
\item ウィリアム・ヘンリー・ゲイツ\ajRoman{3}\item またそのネタですか
\end{enumerate}
\end{document}

今まで正常に扱えなかった非 Unicode のフォントが全て正常に出力されている。

もちろん、Unicode の論理フォントを参照している以上、Unicode にない文字には対応できない。(これは CID-keyed でない TrueType フォントを dvipdfmx で指定して普通に japanese-otf を用いた時と同様の制限である。)

% pLaTeX文書
\documentclass{jsarticle}
\usepackage{otf}
\usepackage[sourcehan-otc]{pxchfon}
\usepackage{pxufont}
\begin{document}
\begin{itemize}
\item \ajMaru{10}\ajMaru{20}\ajMaru{30}\ajMaru{40}%
      \ajMaru{50}\ajMaru{60}\ajMaru{70}\ajMaru{80}
\item \○A\○a\(A)\(a)\□A\□a\●A\●a
\item \ajLig{ドル}\ajLig{ポンド}\ajLig{ユーロ}\ajLig{ルーブル}%
      \ajLig{リラ}\ajLig{ルピー}\ajLig{バーツ}\ajLig{ドラクマ}
\item \○上\○下\○印\○秘\○正\○副\○問\○答
\item \ajSnowman\ajUmbrella\ajPostal\ajBall
      \ajUpHand\ajDownHand\ajRightScissors\ajLeftScissors
\end{itemize}
\end{document}

これの出力結果は以下の左の図のようになる。右の図は同じ内容の文書を小塚フォントで出力したものであり、これと比較すると一部の文字が正常に出力されないことが判る。((実を言うと、\ajSnowman\ajUmbrella\ajPostal の 3 つの記号は japanese-otf において最初から Unicode のフォントで扱われているのであるが。))

 

将来できるようになること

現状では、japanese-otf の機能を用いた異体字の区別はうまく働かない。

%\documentclass{jsarticle}% pLaTeX用
\documentclass[uplatex]{jsarticle}% upLaTeX用
% 2004JIS字形を指定する
\usepackage[jis2004]{otf}
\usepackage[sourcehan-otc,prefer2004jis]{pxchfon}
\usepackage{pxufont}
\begin{document}
\begin{itemize}
\item 葛餅で蓬餅で、かつ煎餅!
\item \CID{1481}城市から\CID{7652}飾区まで。% 字形の使い分け
\end{itemize}
\end{document}

pLaTeXコンパイルした場合は、ほぼ確実に 90JIS 字形が選択される。

upLaTeX でコンパイルした場合は、japanese-otf の jis2004 の有無は正常に考慮されるが、それでも \CID で「両方の字形を使い分ける」ことはできない。

しかし実はこれは 20170318 版の dvipdfmx に存在するチョットしたバグのせいである。最新の 20170627 版(W32TeX では既に利用可能である)ではこのバグは既に修正されているため、完全に意図通りの出力が得られる。

この新しい dvipdfmx が TeX Live で使えるようになるのは来年の TeX Live 2018 からということになる。この新しい dvipdfmx が普及すれば、「Unicode 直接アクセス指定」の活用の幅はもっと拡がることになるだろう。

*1:この「グリフ集合の整合性の検査」も新版の dvipdfmx で導入された。それまでは不整合であっても“適当に”処理が続けられたが、当該フォントの出力は完全に文字化けになっていた。

*2:pLaTeX の japanese-otf の中字・明朝体フォントを例にすると: NFSS から実の TFM へのマップは JY1/hmc/m/n → nmlminr-h → hminr-h である。しかし“Unicode 直接”前提の dvipdfmx のマップでは JIS コードの hminr-h は使えず Unicode の otf-ujmr-h しか使えない。従って、nmlminr-h と等価(つまり JIS コード)でマップ先を otf-ujmr-h とした新たな VF の zu-nmlminr-h を用意した上で、NFSS 側で JY1/hmc/m/n → zu-nmlminr-h → otf-ujmr-h というマップに置き換えるのである。