Estou trabalhando com uma fonte de exibição que está faltando muitos caracteres comuns, incluindo parênteses, travessão e ``aspas direcionais'' verdadeiras.
Gostaria de uma maneira direta de substituí-los por caracteres correspondentes definidos em outra fonte quando encontrados. Um geral "se faltar esse caractere na fonte principal, use essa outra fonte" funcionaria, mas posso identificar todos os caracteres que me interessam. Não preciso mudar de personagem; se o caractere ausente for, diga "(", será ( na fonte substituta. Só estou usando a fonte em circunstâncias limitadas (\chapter e \section no livro de memórias), o que pode tornar o problema mais fácil ou mais difícil. Da mesma forma, todas as fontes envolvidas são TrueType/OpenType.
novounicodechareucharclassesparece promissor, mas o primeiro não interfere nos caracteres ASCII e o último só funciona em blocos Unicode inteiros.
O mecanismo de classe interchar do XeTeX parece promissor, e é meu plano B. Mas eu preferiria algo um pouco mais portátil, mesmo que apenas entre XeLaTeX e LuaLaTex.
Exemplo Mínimo de Trabalho, contando com ofonte 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}
Posso fornecer um exemplo mais longo e realista de como estou usando isso com o livro de memórias, se isso for útil; mas foi muito mais longo.
Responder1
Aqui você pode configurar um ciclo de token para procurar os glifos ausentes e substituí-los por glifos de uma fonte alternativa, aqui considerada Calibri.
Aqui, tomei a liberdade de procurar e substituir os seguintes glifos/strings: (
, )
, ‘
, '
, /
, -
, --
, e ---
.
Observe que a alteração dos catcodes dentro do ciclo do token não pode ser realizada facilmente, uma vez que os tokens são verificados com os catcodes atuais antes de serem executados. Isso afeta bloqueios literais, por exemplo.
\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}
Os tokens processados do ciclo são armazenados em buffer e emitidos na conclusão do ciclo. Se o ciclo do token for muito grande (abrangendo todo o documento, por exemplo), e alguém estiver preocupado em exceder o tamanho do buffer interno, pode-se instruir o ciclo do token para limpar o buffer após cada ungrouped \par
, adicionando um \Macrodirective
, como segue:
\Macrodirective{
\addcytoks{#1}\ifnum\tcdepth=0
\ifx\par#1\the\cytoks\cytoks{}\fi
\fi% CLEARS BUFFER ON UNGROUPED \par
}