Because I began to use many Unicode characters (Japanese, some unusual diacritics, etc.) I switched from LaTeX to XeLaTeX to render my documents. Unfortunately, if a font is missing, the letters are simply left out (for example, when I had forgotten to specify the font for Japanese) without any error (and I can't seem to spot a warning either). I will read the result, but I prefer to get some early warning if some character isn't available. Is there any way to get a warning about characters that have not been rendered? An error would be even better.
2 Answers
The log should list all missing characters in the form of:
Missing character: There is no <char> in font <font>
Where <char>
and <font>
is real character and TeX font name respectively. I usually use a simple grep
call to check for such messages in the log.
-
I’m afraid the fonts I need to care about (e.g. CMU Serif Italic and Latin Modern Roman Demi) seem to have lots of characters defined to be, respectively, a boxed x and a blank. Nothing shows up in the log, though a visual review will show problems in the former. Commented Aug 14, 2020 at 20:13
-
1@FlashSheridan tex.stackexchange.com/questions/23863/… may help. CMU Classical Serif Italic (
cmunci.otf
) has large coverage, 1561 glyphs, but lots of gaps: for example, it has left angle bracket (〈) in slot #9001, but nothing in slot #9000 (keyboard = ⌨). And so on. It has nonot.def
glyph either, so presumably display of non-existing glyphs falls back to the font renderer rather than the font.– CicadaCommented May 3, 2021 at 8:24
It is easy. Just try:
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\testfont[ExternalLocation]{persian-modern-regular}
\begin{document}
\setbox0=\hbox{\testfont A}
\ifdim\ht0=0pt Character A does not exist in font \else Character A exits in the font\fi
\end{document}
In the example above I used Persian Modern
font which does not have Latin Characters so I get a box of height 0pt for character A.
Another one:
\documentclass{article}
\usepackage{fontspec}
% font spec loads "LAtin Modern" font which does not contain Persian characters
\begin{document}
\setbox0=\hbox{و}
\ifdim\ht0=0pt Character Vav does not exist in font \else Character Vav exits in the font\fi
\end{document}
Edit1: Based on Khaled comments "If there is a missing glyph in the font XeTeX will show the .notdef glyph, most fonts have a .notdef glyph with non zero height and width". So we can perform a furthur test with characters from a script that is unlikely to be found in every font. Say, Avestan (an ancient Iranian script). Being a Zoroastrian myself, there are only few unicode fonts that contain Avestan chracters. So let's try (although there may be a better approach):
\documentclass{article}
\usepackage{fontspec}
\newfontfamily\testfont[ExternalLocation]{amiri-regular}
\begin{document}
\setbox0=\hbox{\testfont A}
\setbox1=\hbox{\testfont \char"10B00} % this is Avestan character A
\ifvoid0
Font does not have character A
\else
\ifdim\dp0=\dp1
\ifdim\ht0=\ht1
\ifdim\wd0=\wd1
Font does not have character A
\fi\fi\else
Font has character A
\fi\fi
\end{document}
Edit2: It seems that my previous answers was not needed because etex provides \iffontchar
primitive which has the following syntax:
\iffontchar ⟨font⟩ ⟨code⟩ ⟨true text⟩ \else ⟨false text⟩ \fi
The primitive \iffontchar
can be used to check whether a certain glyph exists in a font. For this purpose it takes a font and the code of a character and performs the test. If the character exists the then branch is expanded otherwise the else branch.
An example would be:
\documentclass{article}
\usepackage{fontspec} % this loads Latin Modern font
\begin{document}
Font \iffontchar\font`ج has Persian character Jim\else does not have Persian character Jim\fi
\end{document}
-
Normally when a character does not exist you get the little blank square or a question mark, wouldn't this have a width? Can you provide a full MWE?– yannislCommented Apr 26, 2012 at 15:59
-
-
If there is a missing glyph in the font XeTeX will show the
.notdef
glyph, most fonts have a.notdef
glyph with non zero height and width. Commented Apr 26, 2012 at 16:26 -
-
1"Most fonts" - that's true. But mostly common (default one) Latin Modern does not! All U+01C4-U+01CC are missing, and all of them have positive width, height and depth. See: github.com/reutenauer/polyglossia/issues/216. Therefore, I find the
\iffontchar
approach the best (it also fits the WYSIWYM paradigm). Kind regards, Ivan Commented Aug 1, 2019 at 22:52