Ersetzen fehlender Zeichen im ASCII/Lateinblock

Ersetzen fehlender Zeichen im ASCII/Lateinblock

Ich arbeite mit einer Anzeigeschriftart, in der viele häufig verwendete Zeichen fehlen, darunter Klammern, Geviertstriche und echte „Richtungsanführungszeichen“.

Ich hätte gern eine einfache Möglichkeit, diese bei Bedarf durch passende Zeichen in einer anderen Schriftart zu ersetzen. Ein allgemeines „Wenn in der primären Schriftart dieses Zeichen fehlt, verwenden Sie diese andere Schriftart“ würde funktionieren, aber ich kann alle Zeichen identifizieren, die für mich von Bedeutung sind. Ich muss das Zeichen nicht ändern; wenn das fehlende Zeichen beispielsweise „(“ ist, wird es in der Ersatzschriftart ( sein. Ich verwende die Schriftart nur in begrenzten Fällen (\chapter und \section in Memoir), was das Problem einfacher oder schwieriger machen kann. Ebenso sind alle beteiligten Schriftarten TrueType/OpenType.

neuesUnicodecharUnduchar-Klassenscheinen vielversprechend, aber Ersteres lässt sich nicht mit ASCII-Zeichen bearbeiten und Letzteres funktioniert nur mit ganzen Unicode-Blöcken.

Der Interchar-Klassenmechanismus von XeTeX scheint vielversprechend, und ist mein Plan B. Aber ich würde etwas Portableres bevorzugen, und sei es nur zwischen XeLaTeX und LuaLaTex.

Minimales Arbeitsbeispiel, basierend auf demkostenlose Cyberfunk-Schriftart.

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

Bildbeschreibung hier eingeben

Ich kann ein längeres, realistischeres Beispiel für meine Verwendung in Memoiren liefern, falls das hilfreich ist; aber es war viel länger.

Antwort1

Hier können Sie einen Token-Zyklus einrichten, um nach den fehlenden Glyphen zu suchen und sie durch Glyphen einer anderen Schriftart zu ersetzen, in diesem Fall Calibri.

Hier habe ich mir die Freiheit genommen, die folgenden Glyphen/Zeichenfolgen zu suchen und zu ersetzen: (, ), , ', /, -, --, und ---.

Beachten Sie, dass das Ändern von Catcodes innerhalb des Token-Zyklus nicht einfach möglich ist, da die Token vor ihrer Ausführung mit den aktuellen Catcodes gescannt werden. Dies betrifft beispielsweise Verbatim-Blöcke.

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

Bildbeschreibung hier eingeben

Die verarbeiteten Token des Zyklus werden gepuffert und am Ende des Zyklus ausgegeben. Wenn der Token-Zyklus sehr groß ist (z. B. das gesamte Dokument umfasst) und man befürchtet, dass die interne Puffergröße überschritten wird, kann man den Token-Zyklus anweisen, den Puffer nach jedem ungrouped zu leeren \par, indem man ein hinzufügt \Macrodirective, wie folgt:

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

verwandte Informationen