나는 괄호, em-dash, 진정한 ``방향 인용부호''를 포함한 많은 공통 문자가 누락된 디스플레이 글꼴을 사용하고 있습니다.
나는 이러한 문자를 발견했을 때 다른 글꼴로 설정된 일치하는 문자로 바꾸는 간단한 방법을 원합니다. "기본 글꼴에 이 문자가 없으면 다른 글꼴을 사용하세요."라는 일반적인 방법이 효과가 있지만 관심 있는 모든 문자를 식별할 수 있습니다. 나는 성격을 바꿀 필요가 없습니다. 누락된 문자가 "("라고 말하면 대체 글꼴에서는 (가 됩니다. 제한된 상황(회고록의 \chapter 및 \section)에서만 글꼴을 사용하고 있으므로 문제가 더 쉽거나 어려울 수 있습니다. 마찬가지로, 관련된 모든 글꼴은 TrueType/OpenType입니다.
새로운 유니코드 문자그리고ucharclasses유망해 보이지만 전자는 ASCII 문자를 다루지 않으며 후자는 전체 유니코드 블록에서만 작동합니다.
XeTeX의 interchar 클래스 메커니즘은 유망해 보입니다., 그리고 내 계획 B입니다. 하지만 XeLaTeX와 LuaLaTex 사이에서만 좀 더 이식성이 뛰어난 것을 선호합니다.
최소 작업 예제에 의존무료 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로 사용되는 대체 글꼴의 글리프로 대체하는 토큰 주기를 설정할 수 있습니다.
(
여기서는 , )
, ‘
, '
, /
, -
, --
및 글리프/문자열을 자유롭게 검색하고 교체했습니다 ---
.
토큰 주기 내에서 catcode를 변경하는 것은 쉽게 수행할 수 없습니다. 토큰이 실행되기 전에 현재 catcode로 스캔되기 때문입니다. 예를 들어 이는 축어적 블록에 영향을 미칩니다.
\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
}