upLaTeX + dvipdfmx でのCJK拡張の出力

upLaTeX + dvipdfmx でのCJK拡張の出力

- T M の投稿
返信数: 12
はじめまして。

upLaTeX と dvipdfmx を利用して CJK Extension B,C,D などの文字を出力したいのですが、うまくいきません。

環境はMac OS X 10.7.3、MacTexとTexLiveUtility でTexLiveを最新のものにアップデートしております。upLaTeX はtlptexliveリポジトリより導入しました。

upLaTeX は問題なく通りますが、dvipdfmx を実行すると以下のようなエラーが出ます。

** WARNING ** No character mapping available.
 CMap name: UniJIS-UTF16-H
 input str: <d860dd>

** WARNING ** No character mapping available.
 CMap name: UniGB-UTF16-H
 input str: <d860>

** WARNING ** No character mapping available.
 CMap name: UniCNS-UTF16-H
 input str: <d860dd50>

文字はいずれもU+28150(「無」と「足」を上下に並べたもの)です。

otf パッケージで uplatex オプションを適用し、¥UTF{28150}, ¥UTFM{28150}, ¥UTFT{28150}などで試しましたが、dvipdfmx を実行するといずれも以下のようなようなエラーが出て表示できません。

char=0x3348(13128)
Tried to set a nonexistent character in a virtual font


ただし、¥UTFC{28150}でのみ upLaTeX実行時に以下のようなエラーが出ました。

kpathsea: Running mktextfm utfcmrs-v
mktextfm: Running mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input utfcmrs-v
This is METAFONT, Version 2.718281 (TeX Live 2011)


kpathsea: Running mktexmf utfcmrs-v
! I can't find file `utfcmrs-v'.
<*> ...jfour; mag:=1; nonstopmode; input utfcmrs-v
 
Please type another input file name
! Emergency stop.
<*> ...jfour; mag:=1; nonstopmode; input utfcmrs-v
 
Transcript written on mfput.log.
grep: utfcmrs-v.log: No such file or directory
mktextfm: `mf-nowin -progname=mf \mode:=ljfour; mag:=1; nonstopmode; input utfcmrs-v' failed to make utfcmrs-v.tfm.
kpathsea: Appending font creation commands to missfont.log.
! Font JT2/utfc/m/s/10=utfcmrs-v at 9.6222pt not loadable: Metric (TFM) file no
t found.
<to be read again> 
                   relax 
l.122 \UTFC{28150}

ちなみに、dvipdfmx の map ファイルではupTeX関係は次の様に設定してあります。

urml UniJIS-UTF16-H !Ryumin-Light
urmlv UniJIS-UTF16-V !Ryumin-Light
ugbm UniJIS-UTF16-H !GothicBBB-Medium
ugbmv UniJIS-UTF16-V !GothicBBB-Medium

uprml-h UniJIS-UTF16-H !Ryumin-Light
uprml-v UniJIS-UTF16-V !Ryumin-Light
upgbm-h UniJIS-UTF16-H !GothicBBB-Medium
upgbm-v UniJIS-UTF16-V !GothicBBB-Medium
uprml-hq UniJIS-UCS2-H !Ryumin-Light
upgbm-hq UniJIS-UCS2-H !GothicBBB-Medium

upstsl-h    UniGB-UTF16-H        !STSong-Light
upstsl-v    UniGB-UTF16-V        !STSong-Light
upstht-h    UniGB-UTF16-H        !STHeiti-Regular
upstht-v    UniGB-UTF16-V        !STHeiti-Regular
upmsl-h        UniCNS-UTF16-H         !MSung-Light
upmsl-v        UniCNS-UTF16-V        !MSung-Light
upmhm-h        UniCNS-UTF16-H        !MHei-Medium
upmhm-v        UniCNS-UTF16-V        !MHei-Medium
uphysmjm-h    UniKS-UTF16-H        !HYSMyeongJo-Medium
uphysmjm-v    UniKS-UTF16-V        !HYSMyeongJo-Medium
uphygt-h    UniKS-UTF16-H        !HYGoThic-Medium
uphygt-v    UniKS-UTF16-V        !HYGoThic-Medium


ttk 氏のupTeX の解説を読みましたが、「U+FFFF以下の文字はset2で、U+FFFFを越える文字はset3で扱う」などのset2, set3の意味がわかりませんでした。

ご教示のほどよろしくお願いします。

T M への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- t tk の投稿
U+28150 は、 Adobe-Japan1-6 にも、Adobe-CNS1-6 にも、Adobe-GB1-5 にも発見できませんでした。
otfbeta-uptex の vf は、上記各 CMap の UniXXX-UTF16 に含まれる文字しか vf に入れておりません。(vf の肥大化を避けるため)
したがって、otfbeta-uptex 経由では、出力できないと思います。

それでも、otfbeta-uptex 経由で出力したいなら、
otfbeta/script/sp_list_j.txt
otfbeta/script/sp_list_t.txt
otfbeta/script/sp_list_c.txt
などに該当のコードポイントを書き足し、vf を作り直すことで
出力できるようになるはずです。

ただし、
Ryumin-Light, GothicBBB-Medium
STSong-Light, STHeiti-Regular, MSung-Light,
MHei-Medium, MHei-Medium や
UniJIS-UTF16, UniGB-UTF16, UniCNS-UTF16などを経由するのは
該当する文字が含まれていないため、おそらくNGだと思います。
そのあたりも対策が必要です。

また、upTeXに含まれている
upjpnrm-h.vf, upjpnrm-v.vf, upjpngt-h.vf, upjpngt-v.vf
upschrm-h.vf, upschrm-v.vf, upschgt-h.vf, upschgt-v.vf,
uptchrm-h.vf, uptchrm-v.vf, uptchgt-h.vf, uptchgt-v.vf,
では、Adobe-Japan1-6 などでの存在の有無をチェックせず、
CJK Extension B の文字は全て入れてあります。
それら経由でかつ実フォントでその文字が存在するならば
出力できると思います。

Reference:
AdobeのCMapの最新版は、以下から入手できます。
http://sourceforge.net/adobe/cmap/home/Home/

t tk への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- T M の投稿
大変ご丁寧なご教示有難うございます。

前半部分は何とか理解できました。


ただ最後の部分ですが、具体的にどのようにすればよいのかわかりません。

>また、upTeXに含まれている
>upjpnrm-h.vf, upjpnrm-v.vf, upjpngt-h.vf, upjpngt-v.vf
>upschrm-h.vf, upschrm-v.vf, upschgt-h.vf, upschgt-v.vf, 
>uptchrm-h.vf, uptchrm-v.vf, uptchgt-h.vf, uptchgt-v.vf, 
>では、Adobe-Japan1-6 などでの存在の有無をチェックせず、
>CJK Extension B の文字は全て入れてあります。
>それら経由でかつ実フォントでその文字が存在するならば
>出力できると思います。

実フォント、IPAmjMincho(ipamjm.ttf)、MingLiU-ExtB(MingLiU-ExtB.ttf)、HAN NOM B(HAN NOM B.ttf)などにその文字は確認できます。

申し訳ありません。あまりフォントのことに関してはよくわかっていないのに、不躾な質問ばかりして。

よろしくお願い申し上げます。

t tk への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- Z. R. の投稿

(実験したら予想外の結果になったので投稿します。)

繁体中国語用の uptchrm-h に MingLiU-ExtB を割り当てて使う、というのを PXbase パッケージでやってみました。

%% 文字コードは UTF-8
\documentclass[a4paper]{ujarticle}
% upTeX が用意する CJK 言語の「和文」フォントを babel の枠組で
% 使用可能にする. その他の設定は何も変えない.
\usepackage[english]{babel}
\usepackage[main=japanese]{pxbabel}
% フォントマップを文書内に書いてしまう
\dvipdfmxmapline{upmsl-h unicode :0:mingliub.ttc}
  % upmsl-h は uptchrm-h が参照する JFM
  % MingLiU-ExtB は mingliub.ttc の 0 番
% 繁体中国語に切り替えて出力する
\newcommand*{\TI}[1]{\foreignlanguage{tchinese}{#1}}
% Unicode 符号値入力
\newcommand*{\TU}[1]{\TI{\UI{#1}}}
\begin{document}
% 直接入力   ★をU+28150に置き換えてください!
あいうえお\TI{★}漢字
% Unicode 符号値入力
あいうえお\TU{28150}漢字
\end{document}

ここで、CMap は Uni~ だと上手くいくはずがないので unicode にしています。

これを uplatex (TeX Live + tlptexlive 最新)でコンパイルした結果の DVI は予定通り次のようになっています。

...
special1 43 'pdf:mapline upmsl-h unicode :0:mingliub.ttc'
...
fd1 34 0 630600 655360 0 9 '' 'uptchrm-h'
fn34
...

ところが、dvipdfmx で処理すると次のように失敗します。

** WARNING ** No character mapping available.
 CMap name: mingliub.ttc,000-UCS4-H
 input str: <0000d8>

** WARNING ** No character mapping available.
 CMap name: mingliub.ttc,000-UCS4-H
 input str: <0000dd>

** WARNING ** No character mapping available.
 CMap name: mingliub.ttc,000-UCS4-H
 input str: <0000d8>

** WARNING ** No character mapping available.
 CMap name: mingliub.ttc,000-UCS4-H
 input str: <0000dd>
]
** WARNING ** UCS-4 TrueType cmap table...
** WARNING ** Format 12 cmap table ... untested
** WARNING ** No Unicode mapping available: GID=0
** WARNING ** Failed to load ToUnicode CMap for font "MingLiU-ExtB"

D8 とか DD とかが出現しているので、どうやら UTF-16 が介在しているようです。「unicode」指定はもっと単純に処理されるかと思ってたのですが。

Z. R. への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- t tk の投稿
以前、花園明朝関係で川幡さんが
「花園明朝」用TeX VFフォント
というのを公開されていました。
何らかの事情があってか、現在は削除されております。
web.archive.org には残っています。
http://web.archive.org/web/20100926110231/http://kanji-database.sourceforge.net/fonts/hanazono.html

そこにもある、

pTeTeX に含まれる dvipdfmx は、非BMP文字コードには対応していません。この問題を修正する パッチをあててください。

という解説のところが以前から気になっていました。しかし、手が回らず、実験できていません。
ZR さんの現象と関係があるのかどうか、確証はありませんが、何かヒントになれば、と思いました。

t tk への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- Akira Kakuto の投稿
試みに川幡さんのパッチをあてたものを作成し,
%
% uptex
%
\font\xx=uptchrm-h at 12pt
\special{pdf: mapline upmsl-h unicode :0:mingliub.ttc}
\xx\char"28150
\bye

をテストすると dvipdfmx で U+28150 がタイプセット
できました。パッチをあてていないものは,ZR さんと
同じで失敗します。

Akira Kakuto への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- Akira Kakuto の投稿
XeTeX (0.9997.6) では

%
% xetex + xdvipdfmx
%
\font\xx="MingLiU-ExtB"
\xx\char"28150
\bye

で U+21850 がタイプセットできました。

Akira Kakuto への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- Z. R. の投稿

(pTeX系エンジンの使用が必須である場合、)「当該の文字だけを XeLaTeX で PDF ファイルに出力して、それを upLaTeX で画像として読み込む」という方法があります。

まず次の文書を u28150.tex として保存して「xelatex u28150.tex」を実行すると u28150.pdf が得られます。

% 文字コードは UTF-8
% xelatex で組版する
% 一文字だけを含む(余白のない)文書を作る
\documentclass{article}
\usepackage[papersize={10pt,10pt},
  margin=0pt,noheadfoot]{geometry}
% ↓日本製のフォントの場合(*)を8.8otにする
\setlength{\topskip}{8.0pt}%(*)
\setlength{\parindent}{0pt}
\pagestyle{empty}
\usepackage{fontspec}
\setmainfont{MingLiU-ExtB}
\begin{document}
\symbol{"28150} % 直接U+28150を書いてもよい
\end{document}

これを置いたまま次の文書を uplatex で組版すると当該の文字の入った PDF になります。

% 文字コードは UTF-8
% uplatex + dvipdfmx で組版する
\documentclass[a4paper]{ujarticle}
\usepackage[dvipdfmx]{graphicx}
\newcommand*{\xTheChar}{%
  \raisebox{-0.12zw}[0.88zw][0.12zw]{%
    \includegraphics[width=1zw]{u28150.pdf}}}
\begin{document}
何々で{\xTheChar}で云々。
\end{document}
Z. R. への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- T M の投稿
皆様

色々と回答し、アドヴァイス頂き、有難うございます。

日本語の出版物を準備している関係で、できれば pTeX エンジンを利用したいので、現状、最後に Z. R. さんに提示して頂いた方法が私にとっての現実的な解決方法かと思います。

(Kakuto さんが試してくれた川幡さんのパッチですがどのようにパッチを当てればよいのかわかりませんでした。)

ともかく、皆様、色々と有難うございました。


T M への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- Akira Kakuto の投稿
> U+28150(「無」と「足」を上下に並べたもの)
全く知らないのですが,U61-4E00.pdf をみると ( 淶 )
のような文字に見えます。これとは別文字でしょうか?

Akira Kakuto への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- KUROKI Yusuke の投稿
16進法で 28150 ということのようです.
適切なURLかどうかわかりませんが,unicode.org/charts/PDF/U20000.pdf をみると,なるほど「無」の下に「足」になっているようです.
Akira Kakuto への返信

Re: upLaTeX + dvipdfmx でのCJK拡張の出力

- 匿 名 の投稿
>> U+28150(「無」と「足」を上下に並べたもの)

花園明朝Bを選んで、XeLaTeXで処理、目的の文字は表示されました。花園明朝Aには入っていないですね。