Определить, доступны ли все требуемые глифы

Определить, доступны ли все требуемые глифы

В 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}

мве, часть 1

Мне нужна была эта стратегия, и я ее использовал, когда набирал книгу предварительного просмотра кандзи. Я использовал много разных шрифтов и мне нужно было точно знать, сколько глифов будет набрано. Если глиф или несколько отсутствовали, мне приходилось решать, набирать этот прямоугольник или нет. Должен сказать, что это нормально, что в шрифте отсутствуют некоторые символы CJKV, их так много. Я прилагаю снимок из книги, это предварительный просмотр одного японского символа/кандзи.

Книга кандзи: краткий обзор

Большой недостаток в том, что мы можем использовать эту стратегию только с форматом xelatexи можем проверять только новые шрифты (TTF, OTF), она не работает с PFB. Это серьезное ограничение в работе. Позвольте мне показать вам другой подход.


Часть 2:testfont.tex

Одним из инструментов в дистрибутиве TeX является testfont.texфайл. Если мы запустим, например:

pdftex testfont.tex

Нас спрашивают о названии шрифта, давайте используем dmjhiraи нажимаем Enter. Есть список опций, когда мы используем \helpи нажимаем Enter. Обычный вариант — написать, \table\byeа затем нажать Enter. Мы получаем testfont.pdfфайл, и это его предварительный просмотр.

мве, часть 2

Проблема в том, что мы не можем его настроить и не можем ввести шрифты 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}

мве, часть 3а


Мы набираем глиф только тогда, когда ширина глифа не равна нулю. В орнаментальных шрифтах есть некоторые исключения, но это считается плохой фонографией. Мы добавляем счетчик ( \newcount), который заботится о количестве набранных глифов, мы ограничиваем пробелы фиксированным размером ( \fontdimen3, 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}

мве, часть 3б


Выводы

У этих методов есть некоторые ограничения. Мы не можем проверить, не повернуты ли два глифа, не перевернуты ли они или не масштабированы, мы также не перечисляем глифы за пределами области 0-255. Если вам нужно что-то подобное, используйтеFontForge, это можно сделать там, так как там есть свойязык сценариеви поддержка дляСкрипты Python.

Если вам интересно, что это за всплеск в самом первом примере в последней букве под буквой: О, да, это обезьяна от великого легендарного создателя шрифтов Манфреда Кляйна! Прилагаю скриншот сFontForgeи предварительный просмотр его шрифта с 26+26 буквами.

Манфред Кляйн, часть 1

Манфред Кляйн, часть 2

решение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}

Связанный контент