ASCII/라틴 블록에서 누락된 문자 바꾸기

ASCII/라틴 블록에서 누락된 문자 바꾸기

나는 괄호, 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
}

관련 정보