Reemplazo de caracteres faltantes en el bloque ASCII/Latin

Reemplazo de caracteres faltantes en el bloque ASCII/Latin

Estoy trabajando con una fuente de visualización a la que le faltan muchos caracteres comunes, incluidos paréntesis, guión largo y "comillas direccionales" verdaderas.

Me gustaría encontrar una forma sencilla de reemplazarlos con caracteres coincidentes establecidos en otra fuente cuando los encuentre. Un general "si a la fuente principal le falta este carácter, use esta otra fuente" funcionaría, pero puedo identificar todos los caracteres que me interesan. No necesito cambiar el personaje; si el carácter que falta es, diga "(", será ( en la fuente alternativa. Solo estoy usando la fuente en circunstancias limitadas (\chapter y \section en memorias), lo que puede hacer que el problema sea más fácil o más difícil. De manera similar, Todas las fuentes involucradas son TrueType/OpenType.

nuevounicodecharyclases de ucharParece prometedor, pero el primero no interfiere con los caracteres ASCII y el segundo sólo funciona en bloques Unicode completos.

El mecanismo de clases interchar de XeTeX parece prometedor, y es mi plan B. Pero preferiría algo un poco más portátil, aunque solo sea entre XeLaTeX y LuaLaTex.

Ejemplo de trabajo mínimo, basándose en elfuente Cyberfunk gratuita.

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

ingrese la descripción de la imagen aquí

Puedo ofrecer un ejemplo más extenso y realista de cómo lo uso en mis memorias si eso resulta útil; pero fue mucho más largo.

Respuesta1

Aquí puede configurar un ciclo de tokens para buscar los glifos que faltan y reemplazarlos con glifos de una fuente alternativa, aquí tomada como Calibri.

Aquí, me he tomado la libertad de buscar y reemplazar los siguientes glifos/cadenas: (, ), , ', /, -, --y ---.

Tenga en cuenta que no es fácil cambiar los códigos cat dentro del ciclo del token, ya que los tokens se escanean con los códigos cat actuales antes de ejecutarlos. Esto afecta, por ejemplo, a los bloques textuales.

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

ingrese la descripción de la imagen aquí

Los tokens procesados ​​del ciclo se almacenan en un buffer y se emiten al finalizar el ciclo. Si el ciclo del token es muy grande (abarca todo el documento, por ejemplo), y a uno le preocupa exceder el tamaño del búfer interno, se puede indicarle al ciclo del token que borre el búfer después de cada desagrupado \par, agregando un \Macrodirective, de la siguiente manera:

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

información relacionada