替換 ASCII/拉丁語區塊中缺少的字符

替換 ASCII/拉丁語區塊中缺少的字符

我正在使用的顯示字體缺少許多常見字符,包括括號、破折號和真正的“定向引號”。

我想要一種簡單的方法,在遇到時用另一種字體中的匹配字元集替換它們。一般的「如果主要字體缺少這個字符,請使用其他字體」是可行的,但我可以識別我關心的所有字符。我不需要改變性格;如果缺少的字元是,說“(”,它將是(在後備字體中。我只在有限的情況下使用該字體(回憶錄中的\chapter和\section),這可能會使問題變得更容易或更困難。

新的unicodecharuchar類看起來很有前途,但前者不會幹擾 ASCII 字符,而後者僅適用於整個 Unicode 區塊。

XeTeX 的 interchar 類別機制看起來很有前途,這是我的 B 計劃。

最小工作範例,依賴免費 Cyber​​funk 字體

\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
}

相關內容