Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I have an automatically generated document (using Doxygen) that has many different Unicode characters for many languages: Hebrew, Japanese, Greek, Arabic and more.

Some parts of text displayed using monospace fonts.

I've tried to use the DejaVu Sans font, which includes most of glyphs but I still miss some Japanese characters and some characters in the monospace fonts.

Is there any way to tell XeLaTeX to make automatic substitutions if the font is missing glyphs?

So it would for example use one font as main and if something is missing would fall back to another font or at least to a non-monospace font that has the correct glyphs?

share|improve this question
    
This looks like a direct application of XeTeX's interchar class mechanism. Read more here. –  Andrey Vihrov Jul 14 '11 at 16:53
    
@Andrey can you be more specific, at least I can't find information abut this mechanism in the link your provided. –  Artyom Jul 16 '11 at 13:50
    
It's Chapter 3. I haven't tried it, but the workflow for, say, treating Japanese characters specially looks as follows: you assign non-zero to \XeTeXinterchartokenstate; you then use \XeTeXinterchartoks 0 1 = { \SwitchToJapaneseFont } \XeTeXinterchartoks 1 0 = { \SwitchToDefaultFont }. For finer control you will want to use \newXeTeXintercharclass and \XeTeXcharclass. Chapter 3 also has a simple example. –  Andrey Vihrov Jul 16 '11 at 14:19
add comment

1 Answer

up vote 7 down vote accepted

As Andrey points out, the key is the concept of "interchar tokens". Suppose you have some CJK characters that doesn't appear in the normal font and you want to use another for them; say that the characters are U+4E01 and U+4E02.

Then the following will do:

\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{<a font>}
\newfontfamily{\JapSubstFont}{<another font with the missing chars>}

\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\JapSubst

\XeTeXcharclass"4E01=\JapSubst
\XeTeXcharclass"4E02=\JapSubst

\XeTeXinterchartoks 0 \JapSubst = {\begingroup\JapSubstFont}
\XeTeXinterchartoks 255 \JapSubst = {\begingroup\JapSubstFont}
\XeTeXinterchartoks \JapSubst 0 = {\endgroup}
\XeTeXinterchartoks \JapSubst 255 = {\endgroup}

Each time that a character in the \JapSubst charclass will be at the start or end of a "word" or be preceded or followed by a "normal" character, it will be typeset in the \JapSubstFont.

One can also specify a range:

\count255="4E01
\loop\ifnum\count255<"5000
  \XeTeXcharclass\count255=\JapSubst
  \advance\count255 by 1
\repeat
share|improve this answer
    
Thanks it may suit you... But is there a way to specify for example a range of Unicode not each character particularly? Because for example for CJK it may be HUGE set? –  Artyom Jul 18 '11 at 5:24
    
Thanks... I hadn't thought about loop. I forgot that LaTeX is Turing complete language :-) –  Artyom Jul 18 '11 at 6:09
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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