我正在使用的顯示字體缺少許多常見字符,包括括號、破折號和真正的“定向引號”。
我想要一種簡單的方法,在遇到時用另一種字體中的匹配字元集替換它們。一般的「如果主要字體缺少這個字符,請使用其他字體」是可行的,但我可以識別我關心的所有字符。我不需要改變性格;如果缺少的字元是,說“(”,它將是(在後備字體中。我只在有限的情況下使用該字體(回憶錄中的\chapter和\section),這可能會使問題變得更容易或更困難。
新的unicodechar和uchar類看起來很有前途,但前者不會幹擾 ASCII 字符,而後者僅適用於整個 Unicode 區塊。
XeTeX 的 interchar 類別機制看起來很有前途,這是我的 B 計劃。
最小工作範例,依賴免費 Cyberfunk 字體。
\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 對其進行掃描。例如,這會影響逐字塊。
\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
透過添加 a 來指示令牌循環在每次取消分組之後清除緩衝區,\Macrodirective
如下所示:
\Macrodirective{
\addcytoks{#1}\ifnum\tcdepth=0
\ifx\par#1\the\cytoks\cytoks{}\fi
\fi% CLEARS BUFFER ON UNGROUPED \par
}