Detecte se todos os glifos necessários estão disponíveis

Detecte se todos os glifos necessários estão disponíveis

No XeTeX, uma mensagem é impressa no arquivo de log se um glifo não estiver disponível com a fonte atual. A entrada

\documentclass{scrartcl}

\begin{document}
  α
\end{document}

leva à seguinte entrada no log:

Missing character: There is no α in font cmr10!

Existe uma maneira de verificar uma determinada entrada se todos os glifos necessários para renderizá-la estão disponíveis, sem depender do arquivo de log? Aparentemente, não háComando para liberar arquivo de loge (em um cenário em que eu entro em um processo XeLaTeX em execução) gostaria de saber antes que o XeTeX seja encerrado.

Responder1

Postagem mais longa

Essa tarefa foi um grande problema para mim há muitos anos, quando eu estava compondo e gerando livros de visualização de fontes, onde precisava saber todas as informações sobre os glifos antes da composição propriamente dita. Dividi a resposta em três pequenas partes, cada uma com um arquivo TeX compilável.


Parte 1: xelatexe sua ferramenta

Existe uma maneira de entrar xelatex, ela é mencionada indiretamente na página 8 domanual de referencia. Podemos usar o \XeTeXcharglyphcomando e verificar se a saída é 0(ou .notdefse está verificando o nome do glifo). Uma vez que qualquer glifo não é definido, o valor zero é atribuído ao slot do caractere.

Após essa etapa, podemos usar \ifnum...\else...\fia instrução para decidir o que compor, se for o caso. No exemplo estou testando quatro letras, ? A \ aduas estão definidas, as duas restantes não. Baixei e instalei RodgauApesInitials da coleção de Manfred Klein,http://moorstation.org/typoasis/designers/klein04/deco/rodgau_apes.htm

Corremos xelatex mal-kanji1.texe o terminal diz:

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)

Este é o código:

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

sim, parte 1

Eu precisava e usei essa estratégia quando compus um livro de kanji. Eu estava usando muitas fontes diferentes e precisava saber exatamente quantos glifos seriam compostos. Se faltasse um glifo ou mais, cabia a mim decidir se deveria compor aquele retângulo ou não. Devo dizer que é normal que faltem alguns caracteres CJKV em uma fonte, são tantos. Anexo um instantâneo do livro, é uma prévia de um único caractere/kanji japonês.

livro de kanji: um instantâneo

A grande desvantagem é que podemos usar essa estratégia apenas com o xelatexformato e podemos verificar apenas fontes mais recentes (TTF, OTF), não está funcionando com PFB. Essa é uma limitação séria no trabalho. Deixe-me mostrar outra abordagem.


Parte 2:testfont.tex

Uma das ferramentas da distribuição TeX é testfont.texo arquivo. Se executarmos, por exemplo:

pdftex testfont.tex

Somos questionados sobre o nome da fonte, vamos usar dmjhirae apertar Enter. Há uma lista de opções quando usamos \helpe pressionamos Enter. A opção comum é escrever \table\byeseguido de Enter. Estamos obtendo o testfont.pdfarquivo e esta é uma prévia dele.

sim, parte 2

Um problema é que não podemos personalizá-lo e não podemos inserir fontes TTF e OTF sem instalar e configurar as fontes. Vale a pena conferir outra abordagem.

Parte 3: Medindo uma caixa TeX (Hiragana e Katakana como casos de teste)

O núcleo do TeX está nas caixas de medição. É a abordagem que vamos usar e testar. Testaremos um único glifo, mas poderemos medir facilmente quase tudo. Após definir uma nova caixa ( \newbox), preenchemos virtualmente a caixa ( \setbox) e podemos medir largura, altura e profundidade da caixa ( \wd, \hte \dp).

No exemplo abaixo, formatamos o Hiragana, um silabário japonês, mas podemos detectar vários defeitos. Há um espaço de abertura, as linhas não se quebram idealmente, os espaços estão diminuindo e se esticando, não temos ideia de quantos glifos foram digitados. Mas é um ponto de partida para futuras explorações.

Vale a pena mencionar que podemos rodar qualquer latexmotor principal e se usarmos, por exemplofontspecpacote, podemos testar glifos no TTF, OTF e alguns arquivos dfont ao executar lualatexou xelatex. Incluo o código TeX e uma prévia do resultado.

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

sim, parte 3a


Compomos um glifo somente quando a largura do glifo é um valor diferente de zero. Existem algumas exceções em fontes ornamentais, mas é considerada uma fonte ruim. Adicionamos um contador ( \newcount) cuidando de uma série de glifos formatados, limitamos os espaços a dimensões fixas ( \fontdimen3, 4 e 7), permitimos quebras de linha, simplesmente dizendo que agora temos controle total sobre a saída.

Anexo um exemplo e uma prévia do arquivo PDF com Katakana, um silabário Japanase.

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

sim, parte 3b


Conclusões

Existem algumas limitações desses métodos. Não podemos testar se dois glifos não estão apenas girados, invertidos ou dimensionados; também não estamos listando glifos fora da região 0-255. Caso você precise de algo assim, useFontForge, isso pode ser feito lá, pois possuilinguagem de scripte um suporte paraScripts Python.

Caso você esteja se perguntando o que foi aquele splash no primeiro exemplo da última letra abaixo da letra: Ah, sim, é um macaco do próprio grande criador de fontes lendário Manfred Klein! Anexo uma captura de tela deFontForgee uma prévia de sua fonte com 26+26 letras.

Manfred Klein, parte 1

Manfred Klein, parte 2

Responder2

Como extensão da excelente resposta do Malipivo, gostaria de mencionar que você também pode usar \iffontcharconforme mostrado no exemplo a seguir. Observe que LuaLaTeX fornece resultados diferentes do XeLaTeX aqui - parece que o XeLaTeX não gosta de glifos nas faixas superiores do Unicode aqui (talvez acima de U+F0000).

O código deve ser bastante evidente, mas a ideia é que você chame

\fontrange {xits-math.otf} {1} {"FFFFF} { \texttt{\small #2}:\quad #3\par}

onde o primeiro argumento é a fonte fontspec, o segundo é o ponto inicial do glifo, o segundo é o ponto final do glifo e o quarto argumento define como o resultado é composto ( #2é o código hexadecimal do glifo e #3é o caractere correspondente ao próprio glifo).

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

informação relacionada