16

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.

1

2 Answers 2

10

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.

2
  • 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. 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 no not.def glyph either, so presumably display of non-existing glyphs falls back to the font renderer rather than the font.
    – Cicada
    May 3, 2021 at 8:24
7

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}
5
  • 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? Apr 26, 2012 at 15:59
  • Edited the answer.
    – Simurgh12
    Apr 26, 2012 at 16:24
  • 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. Apr 26, 2012 at 16:26
  • EDited my answer.
    – Simurgh12
    Apr 26, 2012 at 17:11
  • 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
    – ivankokan
    Aug 1, 2019 at 22:52

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.