ASCII/ラテン文字ブロック内の欠落文字の置換

ASCII/ラテン文字ブロック内の欠落文字の置換

私は、括弧、em ダッシュ、および実際の「方向引用符」を含む多くの一般的な文字が欠落している表示フォントを使用しています。

遭遇したときに、別のフォントで設定された一致する文字にこれらを置き換える簡単な方法が欲しいです。一般的な「プライマリ フォントにこの文字がない場合は、この別のフォントを使用する」で十分ですが、必要な文字はすべて特定できます。文字を変更する必要はありません。不足している文字が、たとえば「(」である場合、フォールバック フォントでは ( になります。フォントは限られた状況 (memoir の \chapter と \section) でのみ使用しており、問題が簡単になるか難しくなる場合があります。同様に、関係するフォントはすべて TrueType/OpenType です。

新しいユニコード文字そしてucharclasses有望に思えますが、前者は ASCII 文字には干渉せず、後者は Unicode ブロック全体でのみ機能します。

XeTeXのintercharクラスメカニズムは有望に思える、そしてこれが私のプラン B です。しかし、XeLaTeX と LuaLaTex の間でだけでも、もう少し移植性の高いものを希望します。

最小限の動作例、無料のサイバーファンクフォント

\documentclass{article}
\usepackage{fontspec}
\begin{document}
``Dr. J---/Mr. H---'s (Missing Glyph) Day''

\fontspec{Cyberfunk}``Dr. J---/Mr. H---'s (Missing Glyph) Day''
\end{document}

ここに画像の説明を入力してください

役に立つなら、私が回想録でこれをどのように使用しているかについて、より長く、より現実的な例を挙げることもできますが、かなり長くなりました。

答え1

ここで、トークン サイクルを設定して、欠落しているグリフを検索し、代替フォント (ここでは Calibri) のグリフに置き換えることができます。

ここでは、、、、、、、、、および(のグリフ/文字列を検索して置換しました。)'/------

トークンは実行前に現在の catcodes でスキャンされるため、トークン サイクル内で catcodes を変更することは簡単には実行できないことに注意してください。これは、たとえば verbatim ブロックに影響します。

\documentclass{article}
\usepackage{fontspec,tokcycle}
\newif\ifemdash
\newif\ifendash
\newcommand\dashtest{\emdashfalse\endashfalse\tcpeek\Q
  \ifx-\Q\tcpop\Q\tcpeek\QQ\ifx-\QQ\tcpop\QQ\emdashtrue\else
  \endashtrue\fi\fi
}
\Characterdirective{%
  \ifx(#1\addcytoks{{\setmainfont{Calibri}(}}\else
  \ifx)#1\addcytoks{{\setmainfont{Calibri})}}\else
  \ifx`#1\addcytoks{{\setmainfont{Calibri}`}}\else
  \ifx'#1\addcytoks{{\setmainfont{Calibri}'}}\else
  \ifx/#1\addcytoks{{\setmainfont{Calibri}/}}\else
  \ifx-#1\dashtest
    \ifemdash\addcytoks{{\setmainfont{Calibri}---}}\else
    \ifendash\addcytoks{{\setmainfont{Calibri}--}}\else
    \addcytoks{{\setmainfont{Calibri}-}}\fi\fi
  \else
  \addcytoks{#1}\fi\fi\fi\fi\fi\fi
}
\begin{document}
``Dr. J---/Mr. H---'s (Missing Glyph) Day''

Endash -- and Hyphen -

\setmainfont{Cyberfunk}
\tokencyclexpress
``Dr. J---/Mr. H---'s (Missing Glyph) Day''

Endash -- and Hyphen -
\endtokencyclexpress
\end{document}

ここに画像の説明を入力してください

サイクルの処理されたトークンはバッファリングされ、サイクルの終了時に出力されます。トークン サイクルが非常に大きく (たとえば、ドキュメント全体にわたる場合)、内部バッファ サイズを超えることが心配な場合は、\par次のように を追加して、グループ化されていない ごとにバッファをクリアするようにトークン サイクルに指示できます\Macrodirective

\Macrodirective{
  \addcytoks{#1}\ifnum\tcdepth=0
    \ifx\par#1\the\cytoks\cytoks{}\fi
  \fi% CLEARS BUFFER ON UNGROUPED \par
}

関連情報