Erkennen, ob alle erforderlichen Glyphen verfügbar sind

Erkennen, ob alle erforderlichen Glyphen verfügbar sind

In XeTeX wird eine Meldung in die Protokolldatei ausgegeben, wenn ein Glyph mit der aktuellen Schriftart nicht verfügbar ist. Die Eingabe

\documentclass{scrartcl}

\begin{document}
  α
\end{document}

führt zu folgendem Eintrag im Log:

Missing character: There is no α in font cmr10!

Gibt es eine Möglichkeit, für eine bestimmte Eingabe zu prüfen, ob alle zum Rendern erforderlichen Glyphen verfügbar sind, ohne sich auf die Protokolldatei verlassen zu müssen? Anscheinend gibt es keineBefehl zum Leeren der Protokolldatei, und (in einem Szenario, in dem ich in einen laufenden XeLaTeX-Prozess einsteige) möchte ich es wissen, bevor XeTeX beendet wird.

Antwort1

Längerer Beitrag

Diese Aufgabe war für mich vor vielen Jahren ein großes Problem, als ich Schriftsätze setzte und Vorschaubücher von Schriftarten erstellte, bei denen ich vor dem eigentlichen Satz alle möglichen Informationen über die Glyphen wissen musste. Ich habe die Antwort in drei kleine Teile aufgeteilt, die jeweils eine kompilierbare TeX-Datei enthielten.


Teil 1: xelatexund sein Werkzeug

Es gibt einen Weg hinein xelatex, er wird indirekt auf Seite 8 imReferenzhandbuch. Wir können den \XeTeXcharglyphBefehl verwenden und prüfen, ob die Ausgabe ist 0(oder .notdefob wir den Glyphennamen prüfen). Sobald eine Glyphe nicht definiert ist, wird dem Zeichenplatz der Nullwert zugewiesen.

Nach diesem Schritt können wir mit \ifnum...\else...\fieiner Anweisung entscheiden, was gesetzt werden soll, wenn überhaupt etwas. In dem Beispiel, das ich teste, sind vier Buchstaben definiert, ? A \ azwei davon sind definiert, die anderen beiden nicht. Ich habe RodgauApesInitials aus Manfred Kleins Sammlung heruntergeladen und installiert,http://moorstation.org/typoasis/designers/klein04/deco/rodgau_apes.htm

Wir führen es aus xelatex mal-kanji1.texund das Terminal sagt:

The glyph slot of 003F(hex) is: 0 (.notdef)
The glyph slot of 0041(hex) is: 3 (A)
The glyph slot of 005C(hex) is: 0 (.notdef)
The glyph slot of 0061(hex) is: 29 (a)

Dies ist der Code:

% run: xelatex mal-kanji1.tex
\documentclass[a4paper]{article}
\pagestyle{empty}
\usepackage{xltxtra}
\usepackage{fontspec}
\usepackage{pgffor}
\begin{document}
%\font\malfont=RodGauApes.ttf
\font\klein="RodGauApes Initials"
\font\cmr=cmr10%
\message{^^J}% One \n to the terminal...
% U+0041, A, dec 65
\def\checkme#1{%
\klein\message{The glyph slot of #1(hex) is: \the\XeTeXcharglyph"#1 \space 
  (\XeTeXglyphname\klein\XeTeXcharglyph"#1)^^J}%
%! Cannot use \XeTeXcharglyph with cmr10; not a native platform font.
\ifnum\XeTeXcharglyph"#1=0%
\cmr Undefined glyph!%
  \else 
\klein\char"#1%
\fi% End of \ifnum...
}% End of \checkme...
\foreach \malglyph in {003F,0041,005C,0061}% ? A \ a
  {\checkme\malglyph\cmr\par%
  }% End of \foreach...
\end{document}

mwe, Teil 1

Ich brauchte diese Strategie und habe sie auch verwendet, als ich ein Kanji-Vorschaubuch gesetzt habe. Ich habe viele verschiedene Schriftarten verwendet und musste genau wissen, wie viele Glyphen gesetzt werden sollten. Wenn eine oder mehrere Glyphen fehlten, lag es an mir, zu entscheiden, ob ich dieses Rechteck setzen sollte oder nicht. Ich muss sagen, dass es normal ist, dass in einer Schriftart einige CJKV-Zeichen fehlen, es gibt so viele davon. Ich füge einen Schnappschuss aus dem Buch bei, es ist eine Vorschau eines einzelnen japanischen Zeichens/Kanji.

Kanji-Buch: eine Momentaufnahme

Der große Nachteil ist, dass wir diese Strategie nur mit dem Format verwenden können xelatexund nur neuere Schriftarten (TTF, OTF) prüfen können. Mit PFB funktioniert sie nicht. Das ist eine ernsthafte Einschränkung bei der Arbeit. Lassen Sie mich Ihnen einen anderen Ansatz zeigen.


Teil 2:testfont.tex

Eines der Tools in der TeX-Distribution ist testfont.texfile. Wenn wir beispielsweise Folgendes ausführen:

pdftex testfont.tex

Wir werden nach dem Namen der Schriftart gefragt. Verwenden wir sie dmjhiraund drücken die Eingabetaste. Wenn wir sie verwenden und die Eingabetaste drücken, wird eine Liste mit Optionen angezeigt \help. Die übliche Option ist „schreiben“, \table\byegefolgt von „Eingabe“. Wir erhalten die testfont.pdfDatei und dies ist eine Vorschau davon.

mwe, Teil 2

Ein Problem besteht darin, dass wir es nicht anpassen können und keine TTF- und OTF-Schriftarten eingeben können, ohne die Schriftarten zu installieren und einzurichten. Es lohnt sich, einen anderen Ansatz zu prüfen.

Teil 3: Messen einer TeX-Box (Hiragana und Katakana als Testfälle)

Der Kern von TeX besteht in der Messung von Boxen. Dies ist der Ansatz, den wir verwenden und testen werden. Wir werden ein einzelnes Glyph testen, aber wir könnten problemlos fast alles messen. Nachdem wir eine neue Box definiert haben ( \newbox), füllen wir die Box virtuell aus ( \setbox) und können Breite, Höhe und Tiefe der Box messen ( \wd, \htund \dp).

Im folgenden Beispiel setzen wir Hiragana, eine japanische Silbenschrift, aber wir entdecken mehrere Mängel. Es gibt einen offenen Zwischenraum, Zeilenumbrüche sind nicht ideal, Zwischenräume schrumpfen und dehnen sich aus, wir haben keine Ahnung, wie viele Glyphen gesetzt wurden. Aber es ist ein Ausgangspunkt für weitere Untersuchungen.

Erwähnenswert ist, dass wir jeden gängigen latexMotor betreiben können und wenn wir beispielsweisefontspecPaket können wir Glyphen in den TTF-, OTF- und einigen dfont-Dateien testen, wenn wir lualatexoder ausführen xelatex. Ich füge den TeX-Code und eine Vorschau des Ergebnisses bei.

% run: *latex mal-kanji2.tex
\documentclass[a4paper]{article}
\pagestyle{empty}% No page number please...
\parindent=0pt% No indentation please...
\rightskip=6cm% And TeXie, :-), please narrow the text width somehow...
\begin{document}
\font\hira=dmjhira at 2ex% Setting up a new font face (Hiragana)...
\newcount\malcounter% Setting up a new counter...
\malcounter=-1% The initialization of the counter
\loop% The core of this example...
  \advance\malcounter by 1% Move on to the next glyph...
  {\hira\char\malcounter} % Show me the glyph, add space...
  %\discretionary{}{}{}% Allow a page break after the glyph... (the first alternative)
   \allowbreak% (the second alternative)
\ifnum\malcounter<255\repeat% Run all 256 characters in the font...
\end{document}

mwe, Teil 3a


Wir setzen eine Glyphe nur, wenn die Glyphenbreite ungleich Null ist. Es gibt einige Ausnahmen bei Ornamentschriften, aber das gilt als schlechte Schriftkunst. Wir fügen einen Zähler ( \newcount) hinzu, der sich um die Anzahl der gesetzten Glyphen kümmert, wir begrenzen Leerzeichen auf feste Dimensionen ( \fontdimen3, 4 und 7), wir lassen Zeilenumbrüche zu, einfach gesagt, wir haben jetzt die volle Kontrolle über die Ausgabe.

Ich füge ein Beispiel und eine Vorschau der PDF-Datei mit Katakana, einer japanischen Silbenschrift, bei.

% run: *latex mal-kanji3.tex
\documentclass[a4paper]{article}
\pagestyle{empty}
\parindent=0pt
\begin{document}
\newbox\emptybox
\setbox\emptybox=\hbox{}
\newbox\malbox
\font\kata=dmjkata% A new font face to be used (Katakana)...
\newcount\counter 
\counter=-1% The counter of glyphs...
\fontdimen3\font=0pt \fontdimen4\font=0pt \fontdimen7\font=0pt 
% Eliminate the stretch in spaces, or, we could use \makebox...
\loop% Process all the glyphs...
  \advance\counter by 1% Go to the next glyph...
  \setbox\malbox=\hbox{\kata\char\counter}% Measure the glyph...
  \ifnum\wd\malbox=\wd\emptybox\relax\else% Is width 0pt? Height is not tested (\ht, \dp)...
    \texttt{\ifnum\counter<10 0\fi% Add zero in front of number <10...
    \the\counter.\copy\malbox\ }% Show me the glyph...
    \discretionary{}{}{}%Allow the line break, or, \allowbreak...
  \fi% End of \ifnum condition...
\ifnum\counter<255\repeat% Show me all the glyphs in range 0-255...
\end{document}

mwe, Teil 3b


Schlussfolgerungen

Diese Methoden haben einige Einschränkungen. Wir können nicht testen, ob zwei Glyphen nicht einfach gedreht, gespiegelt oder skaliert sind, und wir listen auch keine Glyphen außerhalb des Bereichs 0-255 auf. Falls Sie so etwas benötigen, verwenden SieFontForge, es kann dort durchgeführt werden, da es eigeneSkriptspracheund eine Unterstützung fürPython-Skripte.

Falls Sie sich fragen, was das für ein Spritzer im allerersten Beispiel im letzten Buchstaben unter dem Buchstaben war: Oh ja, das ist ein Affe vom großen, legendären Schriftschöpfer Manfred Klein höchstpersönlich! Ich füge einen Screenshot vonFontForgeund eine Vorschau seiner Schriftart mit 26+26 Buchstaben.

Manfred Klein, Teil 1

Manfred Klein, Teil 2

Antwort2

Als Erweiterung der hervorragenden Antwort von Malipivo wollte ich erwähnen, dass Sie auch \iffontcharwie im folgenden Beispiel gezeigt verwenden können. Beachten Sie, dass LuaLaTeX hier andere Ergebnisse liefert als XeLaTeX – es sieht so aus, als ob XeLaTeX hier keine Glyphen in den oberen Bereichen von Unicode mag (vielleicht über U+F0000).

Der Code sollte ziemlich offensichtlich sein, aber die Idee ist, dass Sie aufrufen

\fontrange {xits-math.otf} {1} {"FFFFF} { \texttt{\small #2}:\quad #3\par}

wobei das erste Argument die Fontspec-Schriftart ist, das zweite der Start-Glyphpunkt, das zweite der End-Glyphpunkt und das vierte Argument definiert, wie das Ergebnis gesetzt wird ( #2ist der Hex-Code des Glyphs und #3ist das dem Glyph selbst entsprechende Zeichen).

\documentclass[a4paper]{article}
\usepackage{fontspec,multicol}
\usepackage[margin=2cm]{geometry}
\begin{document}

\ExplSyntaxOn
\DeclareDocumentCommand \fontrange { m m m +m }
 {
  \group_begin:
  \cs_set:Npn \__typeset:nnn ##1 ##2 ##3 {#4}
  \fontspec{#1}
  \int_step_inline:nnnn {#2} {1} {#3}
   {
    \iffontchar\font ##1\relax
      \__typeset:nnn {##1} { \int_to_Hex:n {##1} } { \char ##1 \relax }
    \fi
   }
  \group_end:
 }
\ExplSyntaxOff

\begin{multicols}{5}
\fontrange{xits-math.otf}{1}{"FFFFF}
  { \texttt{\small U+#2}:\quad #3\par}
  % #1 = glyph slot, decimal
  % #2 = glyph slot, hex
  % #3 = char
\end{multicols}

\end{document}

verwandte Informationen