
XeTeXでは、現在のフォントでグリフが利用できない場合、ログファイルにメッセージが出力されます。入力
\documentclass{scrartcl}
\begin{document}
α
\end{document}
ログに次のエントリが記録されます。
Missing character: There is no α in font cmr10!
ログファイルに頼らずに、入力された文字がすべて利用可能かどうかをチェックする方法はありますか?どうやら、そのような方法はないようです。ログファイルをフラッシュするコマンドそして、(実行中の XeLaTeX プロセスにパイプするシナリオでは)XeTeX が終了する前に知りたいのです。
答え1
長い投稿
この作業は、私が何年も前にタイプセッティングをし、フォントのプレビュー ブックを生成していたときに大きな問題でした。そのときには、実際のタイプセッティングの前にグリフに関するあらゆる種類の情報を知る必要がありました。私はその答えを 3 つの小さな部分に分割し、それぞれをコンパイル可能な TeX ファイルにしました。
パート1:
xelatex
およびそのツール
には方法がありxelatex
、それは8ページに間接的に言及されています参考マニュアル\XeTeXcharglyph
コマンドを使用して、出力が0
(またはグリフ名をチェックしているかどうか) 確認できます.notdef
。グリフが定義されていない場合は、文字スロットにゼロ値が割り当てられます。
このステップの後、\ifnum...\else...\fi
ステートメントを使用して、タイプセットする文字を決定します。この例では、4 つの文字をテストしています。2? A \ a
つは定義されていますが、残りの 2 つは定義されていません。私は、Manfred Klein のコレクションから RodgauApesInitials をダウンロードしてインストールしました。http://moorstation.org/typoasis/designers/klein04/deco/rodgau_apes.htm
実行するxelatex mal-kanji1.tex
と、ターミナルに次のように表示されます。
The glyph slot of 003F(hex) is: 0 (.notdef)
The glyph slot of 0041(hex) is: 3 (A)
The glyph slot of 005C(hex) is: 0 (.notdef)
The glyph slot of 0061(hex) is: 29 (a)
コードは次のとおりです:
% run: xelatex mal-kanji1.tex
\documentclass[a4paper]{article}
\pagestyle{empty}
\usepackage{xltxtra}
\usepackage{fontspec}
\usepackage{pgffor}
\begin{document}
%\font\malfont=RodGauApes.ttf
\font\klein="RodGauApes Initials"
\font\cmr=cmr10%
\message{^^J}% One \n to the terminal...
% U+0041, A, dec 65
\def\checkme#1{%
\klein\message{The glyph slot of #1(hex) is: \the\XeTeXcharglyph"#1 \space
(\XeTeXglyphname\klein\XeTeXcharglyph"#1)^^J}%
%! Cannot use \XeTeXcharglyph with cmr10; not a native platform font.
\ifnum\XeTeXcharglyph"#1=0%
\cmr Undefined glyph!%
\else
\klein\char"#1%
\fi% End of \ifnum...
}% End of \checkme...
\foreach \malglyph in {003F,0041,005C,0061}% ? A \ a
{\checkme\malglyph\cmr\par%
}% End of \foreach...
\end{document}
私は漢字のプレビュー本をタイプセットするときにこの戦略が必要だったので、実際に使用しました。私はさまざまなフォントを使用していて、タイプセットされるグリフの数を正確に知る必要がありました。グリフが 1 つ以上欠落している場合、その四角形をタイプセットするかどうかは私が決めることになります。フォントに CJKV 文字がいくつか欠落しているのは普通のことです。CJKV 文字の数が非常に多いからです。本からのスナップショットを添付します。これは単一の日本語文字/漢字のプレビューです。
大きな欠点は、この戦略はフォーマットでのみ使用できxelatex
、新しいフォント (TTF、OTF) のみをチェックでき、PFB では機能しないことです。これは作業上の重大な制限です。別のアプローチを紹介しましょう。
パート2:
testfont.tex
TeX ディストリビューションのツールの 1 つにtestfont.tex
file があります。例えば、次のように実行します。
pdftex testfont.tex
フォント名を尋ねられたので、使用してdmjhira
Enter キーを押します。使用して Enter キーを押すと、オプションの一覧が表示されます\help
。一般的なオプションは、入力\table\bye
して Enter キーを押すことです。ファイルを取得しておりtestfont.pdf
、これがそのプレビューです。
問題は、カスタマイズできず、フォントをインストールして設定しないと TTF フォントと OTF フォントを入力できないことです。別のアプローチを検討する価値があります。
パート 3: TeX ボックスの測定 (テストケースとしてひらがなとカタカナを使用)
TeX の核心はボックスを測定することです。これが、これから使用してテストするアプローチです。単一のグリフをテストしますが、ほとんど何でも簡単に測定できます。新しいボックス ( \newbox
) を定義した後、ボックス ( ) を仮想的に実現し、ボックスの幅、高さ、奥行き( 、 )\setbox
を測定できます。\wd
\ht
\dp
以下の例では、日本語の五十音であるひらがなをタイプセットしていますが、いくつかの欠陥が見つかるかもしれません。空きスペースがあり、行が理想的に分割されておらず、スペースが縮んだり伸びたりしており、いくつのグリフがタイプセットされたかわかりません。しかし、これはさらに調査を進めるための出発点です。
特筆すべきは、主要なlatex
エンジンであればどれでも実行でき、例えばfontspec
lualatex
パッケージを使用すると、またはを実行するときに、TTF、OTF、および一部の dfont ファイル内のグリフをテストできますxelatex
。TeX コードと結果のプレビューを同封します。
% run: *latex mal-kanji2.tex
\documentclass[a4paper]{article}
\pagestyle{empty}% No page number please...
\parindent=0pt% No indentation please...
\rightskip=6cm% And TeXie, :-), please narrow the text width somehow...
\begin{document}
\font\hira=dmjhira at 2ex% Setting up a new font face (Hiragana)...
\newcount\malcounter% Setting up a new counter...
\malcounter=-1% The initialization of the counter
\loop% The core of this example...
\advance\malcounter by 1% Move on to the next glyph...
{\hira\char\malcounter} % Show me the glyph, add space...
%\discretionary{}{}{}% Allow a page break after the glyph... (the first alternative)
\allowbreak% (the second alternative)
\ifnum\malcounter<255\repeat% Run all 256 characters in the font...
\end{document}
グリフの幅がゼロ以外の値である場合にのみ、グリフをタイプセットします。装飾フォントには例外がいくつかありますが、これは不適切なフォントと見なされます。タイプ\newcount
セットされたグリフの数を処理するカウンター ( ) を追加し、スペースを固定サイズ ( \fontdimen
3、4、7) に制限し、改行を許可します。つまり、出力を完全に制御できるようになりました。
カタカナ表記のPDFファイルの例とプレビューを同封します。
% run: *latex mal-kanji3.tex
\documentclass[a4paper]{article}
\pagestyle{empty}
\parindent=0pt
\begin{document}
\newbox\emptybox
\setbox\emptybox=\hbox{}
\newbox\malbox
\font\kata=dmjkata% A new font face to be used (Katakana)...
\newcount\counter
\counter=-1% The counter of glyphs...
\fontdimen3\font=0pt \fontdimen4\font=0pt \fontdimen7\font=0pt
% Eliminate the stretch in spaces, or, we could use \makebox...
\loop% Process all the glyphs...
\advance\counter by 1% Go to the next glyph...
\setbox\malbox=\hbox{\kata\char\counter}% Measure the glyph...
\ifnum\wd\malbox=\wd\emptybox\relax\else% Is width 0pt? Height is not tested (\ht, \dp)...
\texttt{\ifnum\counter<10 0\fi% Add zero in front of number <10...
\the\counter.\copy\malbox\ }% Show me the glyph...
\discretionary{}{}{}%Allow the line break, or, \allowbreak...
\fi% End of \ifnum condition...
\ifnum\counter<255\repeat% Show me all the glyphs in range 0-255...
\end{document}
結論
これらの方法にはいくつかの制限があります。2つのグリフが回転、反転、拡大縮小されていないかどうかをテストすることはできません。また、0-255の範囲外のグリフもリストされません。そのようなものが必要な場合は、フォントフォージ、それは独自のスクリプト言語そしてサポートPython スクリプト。
一番最初の例の最後の文字の下にあるスプラッシュが何なのか疑問に思われるかもしれませんが、それは伝説のフォントクリエイターである偉大なマンフレッド・クライン本人が作った猿です。スクリーンショットを添付します。フォントフォージ26+26 文字が入ったフォントのプレビューです。
答え2
Malipivo の優れた回答の延長として、\iffontchar
次の例に示すように も使用できることを述べておきたいと思います。ここで、LuaLaTeX は XeLaTeX とは異なる結果を返すことに注意してください。XeLaTeX は、ここでは Unicode の非常に高い範囲 (おそらく U+F0000 より上) のグリフを好まないようです。
コードはかなり明白ですが、アイデアは次のように呼び出すことです。
\fontrange {xits-math.otf} {1} {"FFFFF} { \texttt{\small #2}:\quad #3\par}
ここで、最初の引数はフォント仕様フォント、2 番目は開始グリフ ポイント、3 番目は終了グリフ ポイント、4 番目の引数は結果の組版方法を定義します (#2
はグリフの 16 進コード、#3
はグリフ自体に対応する文字です)。
\documentclass[a4paper]{article}
\usepackage{fontspec,multicol}
\usepackage[margin=2cm]{geometry}
\begin{document}
\ExplSyntaxOn
\DeclareDocumentCommand \fontrange { m m m +m }
{
\group_begin:
\cs_set:Npn \__typeset:nnn ##1 ##2 ##3 {#4}
\fontspec{#1}
\int_step_inline:nnnn {#2} {1} {#3}
{
\iffontchar\font ##1\relax
\__typeset:nnn {##1} { \int_to_Hex:n {##1} } { \char ##1 \relax }
\fi
}
\group_end:
}
\ExplSyntaxOff
\begin{multicols}{5}
\fontrange{xits-math.otf}{1}{"FFFFF}
{ \texttt{\small U+#2}:\quad #3\par}
% #1 = glyph slot, decimal
% #2 = glyph slot, hex
% #3 = char
\end{multicols}
\end{document}