
В XeTeX сообщение выводится в файл журнала, если глиф недоступен в текущем шрифте. Входные данные
\documentclass{scrartcl}
\begin{document}
α
\end{document}
приводит к следующей записи в журнале:
Missing character: There is no α in font cmr10!
Есть ли способ проверить для заданного ввода, доступны ли все глифы, необходимые для его отображения, не полагаясь на файл журнала? По-видимому, нетКоманда для очистки файла журналаи (в сценарии, когда я подключаюсь к работающему процессу XeLaTeX) я хотел бы знать, прежде чем XeTeX будет завершен.
решение1
Более длинный пост
Эта задача была большой проблемой для меня много лет назад, когда я занимался набором и созданием книг предварительного просмотра шрифтов, где мне нужно было знать всю информацию о глифах до фактического набора. Я разделил ответ на три небольшие части, каждая с компилируемым файлом TeX.
Часть 1:
xelatex
и ее инструмент
Есть способ xelatex
, он косвенно упомянут на странице 8 всправочное руководство. Мы можем использовать \XeTeXcharglyph
команду и проверить, является ли вывод 0
(или .notdef
проверяется ли имя глифа). Если какой-либо глиф не определен, слоту символа присваивается нулевое значение.
После этого шага мы можем использовать \ifnum...\else...\fi
оператор, чтобы решить, что набирать, если вообще что-то набирать. В примере я тестирую четыре буквы, ? A \ a
две определены, оставшиеся две нет. Я скачал и установил RodgauApesInitials из коллекции Манфреда Кляйна,http://moorstation.org/typoasis/designers/klein04/deco/rodgau_apes.htm
Мы бежим xelatex mal-kanji1.tex
и терминал говорит:
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)
Вот код:
% 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}
Мне нужна была эта стратегия, и я ее использовал, когда набирал книгу предварительного просмотра кандзи. Я использовал много разных шрифтов и мне нужно было точно знать, сколько глифов будет набрано. Если глиф или несколько отсутствовали, мне приходилось решать, набирать этот прямоугольник или нет. Должен сказать, что это нормально, что в шрифте отсутствуют некоторые символы CJKV, их так много. Я прилагаю снимок из книги, это предварительный просмотр одного японского символа/кандзи.
Большой недостаток в том, что мы можем использовать эту стратегию только с форматом xelatex
и можем проверять только новые шрифты (TTF, OTF), она не работает с PFB. Это серьезное ограничение в работе. Позвольте мне показать вам другой подход.
Часть 2:
testfont.tex
Одним из инструментов в дистрибутиве TeX является testfont.tex
файл. Если мы запустим, например:
pdftex testfont.tex
Нас спрашивают о названии шрифта, давайте используем dmjhira
и нажимаем Enter. Есть список опций, когда мы используем \help
и нажимаем Enter. Обычный вариант — написать, \table\bye
а затем нажать Enter. Мы получаем testfont.pdf
файл, и это его предварительный просмотр.
Проблема в том, что мы не можем его настроить и не можем ввести шрифты TTF и OTF без установки и настройки шрифтов. Стоит проверить другой подход.
Часть 3: Измерение поля TeX (Хирагана и катакана в качестве тестовых случаев)
Ядро TeX — измерение ящиков. Это подход, который мы собираемся использовать и тестировать. Мы протестируем один глиф, но мы могли бы легко измерить почти все. После определения нового ящика ( \newbox
), мы виртуально заполняем ящик ( \setbox
) и можем измерить ширину, высоту и глубину ящика ( \wd
, \ht
и \dp
).
В примере ниже мы набираем хирагану, японскую слоговую азбуку, но мы можем заметить несколько дефектов. Есть пробел, строки не разрываются идеально, пробелы сжимаются и растягиваются, мы не имеем ни малейшего представления о том, сколько глифов было набрано. Но это отправная точка для дальнейших исследований.
Стоит отметить, что мы можем запустить любой крупный latex
двигатель, и если мы используем, например,fontspec
пакет, мы можем тестировать глифы в файлах TTF, OTF и некоторых файлах dfont при запуске lualatex
или xelatex
. Я прилагаю код TeX и предварительный просмотр результата.
% 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}
Мы набираем глиф только тогда, когда ширина глифа не равна нулю. В орнаментальных шрифтах есть некоторые исключения, но это считается плохой фонографией. Мы добавляем счетчик ( \newcount
), который заботится о количестве набранных глифов, мы ограничиваем пробелы фиксированным размером ( \fontdimen
3, 4 и 7), мы разрешаем переносы строк, проще говоря, теперь у нас есть полный контроль над выводом.
Я прилагаю пример и предварительный просмотр PDF-файла с катаканой, японской слоговой азбукой.
% 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}
Выводы
У этих методов есть некоторые ограничения. Мы не можем проверить, не повернуты ли два глифа, не перевернуты ли они или не масштабированы, мы также не перечисляем глифы за пределами области 0-255. Если вам нужно что-то подобное, используйтеFontForge, это можно сделать там, так как там есть свойязык сценариеви поддержка дляСкрипты Python.
Если вам интересно, что это за всплеск в самом первом примере в последней букве под буквой: О, да, это обезьяна от великого легендарного создателя шрифтов Манфреда Кляйна! Прилагаю скриншот сFontForgeи предварительный просмотр его шрифта с 26+26 буквами.
решение2
В качестве расширения превосходного ответа Malipivo я хотел бы упомянуть, что вы также можете использовать, \iffontchar
как показано в следующем примере. Обратите внимание, что LuaLaTeX дает здесь результаты, отличные от XeLaTeX, — похоже, XeLaTeX не любит глифы в самых верхних диапазонах Unicode (возможно, выше U+F0000).
Код должен быть достаточно очевидным, но идея в том, что вы вызываете
\fontrange {xits-math.otf} {1} {"FFFFF} { \texttt{\small #2}:\quad #3\par}
где первый аргумент — это шрифт fontspec, второй — начальная точка глифа, второй — конечная точка глифа, а четвертый аргумент определяет, как набирается результат ( #2
— шестнадцатеричный код глифа, #3
— символ, соответствующий самому глифу).
\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}