当方 macOS Catalina で TeX Live 2020 を使っています。
にしき的フォント [1] に含まれる、補助私用領域(U+F0000 以降)の文字を
LuaLaTeX で用いようと思ったのですが、見当違いなグリフが表示され、うまく
いきません [2]。補助私用領域に文字が含まれるフォントを、にしき的フォント
以外に知らないので、フォントの問題なのかそうでないかの切り分けができない
のですが、この現象に対して、どのように対処すればよろしいでしょうか。
[1] http://hwm3.gyao.ne.jp/shiroi-niwatori/nishiki-teki.htm
[2] Twitter への投稿で申し訳ありませんが、
https://twitter.com/CareleSmith9/status/1274878014107422720
解決策ではありませんが……。
あくまで自分の推測ですが、luaotfloadでは
「既定でUnicode文字に結びついていないグリフ(異体字とか)」
を、U+F0000以降の符号位置に“便宜的に”割り当てて処理をしているような気がしtます。例えば、IPAex明朝で(存在しないはずの)U+F0000以降の文字を出力させると、半角字形や縦書き字形が出てきます。
\documentclass{article} \usepackage{fontspec} \setmainfont{IPAexMincho} \begin{document} \symbol{"F0001}\symbol{"F0002}\symbol{"F0003}\symbol{"F0004}% \symbol{"F0005}\symbol{"F0006}\symbol{"F0007}\symbol{"F0008}% \symbol{"F0010}\symbol{"F0020}\symbol{"F0030}\symbol{"F0040}% \symbol{"F0080}\symbol{"F0100}\symbol{"F0180}\symbol{"F0200}% \end{document}
にしき的フォントでしか試していませんが……,
====
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode}
\begin{luacode*}
my = my or {}
function my.pua(n)
local t, c = font.getfont(font.current()), 0
if t and t.shared and t.shared.rawdata and t.shared.rawdata.descriptions then
for i,v in pairs(t.shared.rawdata.descriptions) do
if not v.name and v.unicode==n then c=i; break end
end
end
tex.sprint(tostring(c))
end
\end{luacode*}
\def\PUACHAR#1{\char\directlua{my.pua(\the\numexpr#1)}}
\setmainfont{Nishiki-teki}
\begin{document}
\PUACHAR{"F0000} \PUACHAR{"F0001} \PUACHAR{"F00A5} \PUACHAR{"F00B3} \PUACHAR{"F012B}
\end{document}
====
% ...shared.rawdata.descriptions[c] は luaotfload が符号位置 c に割り当てたグリフ
% の情報を格納するテーブルですが,この中の unicode エントリを見るとそのグリフの
% 元々の Unicode 符号位置がわかるようです.
% ただ,例えば notdef も「にしき的フォント」の U+F0000 も unicode エントリの値は
% 0xF0000 なので,よくわかりません(上で書いている name の有無では怪しい?)…….
====
\documentclass{article}
\usepackage{fontspec}
\usepackage{luacode}
\begin{luacode*}
my = my or {}
function my.pua(n)
local t, c = font.getfont(font.current()), 0
if t and t.shared and t.shared.rawdata and t.shared.rawdata.descriptions then
for i,v in pairs(t.shared.rawdata.descriptions) do
if not v.name and v.unicode==n then c=i; break end
end
end
tex.sprint(tostring(c))
end
\end{luacode*}
\def\PUACHAR#1{\char\directlua{my.pua(\the\numexpr#1)}}
\setmainfont{Nishiki-teki}
\begin{document}
\PUACHAR{"F0000} \PUACHAR{"F0001} \PUACHAR{"F00A5} \PUACHAR{"F00B3} \PUACHAR{"F012B}
\end{document}
====
% ...shared.rawdata.descriptions[c] は luaotfload が符号位置 c に割り当てたグリフ
% の情報を格納するテーブルですが,この中の unicode エントリを見るとそのグリフの
% 元々の Unicode 符号位置がわかるようです.
% ただ,例えば notdef も「にしき的フォント」の U+F0000 も unicode エントリの値は
% 0xF0000 なので,よくわかりません(上で書いている name の有無では怪しい?)…….
ZR 様、北川様
返信ありがとうございます。
うまくいかなかった理由は理解できましたし、北川さんの
\PUACHAR で得たい出力を得ることができました。
確かに、LuaTeX-ja の資料 [1] に、Unicode にデフォルト
で存在しない文字は U+F0000 以降に移動されると書いて
ありますね。(果たして、もとから U+F0000 以降に存在
していた文字も含めて移動させるのは、期待されている
動作なのかはよくわかりませんが)
[1] https://ja.osdn.net/projects/luatex-ja/wiki/%E8%B3%87%E6%96%99-luaotfload%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
返信ありがとうございます。
うまくいかなかった理由は理解できましたし、北川さんの
\PUACHAR で得たい出力を得ることができました。
確かに、LuaTeX-ja の資料 [1] に、Unicode にデフォルト
で存在しない文字は U+F0000 以降に移動されると書いて
ありますね。(果たして、もとから U+F0000 以降に存在
していた文字も含めて移動させるのは、期待されている
動作なのかはよくわかりませんが)
[1] https://ja.osdn.net/projects/luatex-ja/wiki/%E8%B3%87%E6%96%99-luaotfload%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6