Detectar si todos los glifos requeridos están disponibles

Detectar si todos los glifos requeridos están disponibles

En XeTeX, se imprime un mensaje en el archivo de registro si un glifo no está disponible con la fuente actual. la entrada

\documentclass{scrartcl}

\begin{document}
  α
\end{document}

conduce a la siguiente entrada en el registro:

Missing character: There is no α in font cmr10!

¿Hay alguna manera de verificar una entrada determinada si todos los glifos necesarios para representarla están disponibles, sin depender del archivo de registro? Al parecer, no hayComando para vaciar el archivo de registro, y (en un escenario en el que conecto un proceso XeLaTeX en ejecución) me gustaría saberlo antes de que finalice XeTeX.

Respuesta1

Publicación más larga

Esta tarea fue un gran problema para mí hace muchos años cuando estaba escribiendo y generando libros de vista previa de fuentes donde necesitaba conocer todo tipo de información sobre los glifos antes de escribir la composición. Dividí la respuesta en tres partes pequeñas, cada una con un archivo TeX compilable.


Parte 1: xelatexy su herramienta

Hay una manera de hacerlo xelatex, se menciona indirectamente en la página 8 delmanual de referencia. Podemos usar el \XeTeXcharglyphcomando y verificar si la salida es 0(o .notdefsi verificamos el nombre del glifo). Una vez que no se define ningún glifo, el valor cero se asigna al espacio del carácter.

Después de ese paso, podemos usar \ifnum...\else...\fila declaración para decidir qué componer, en todo caso. En el ejemplo, estoy probando cuatro letras, ? A \ ados están definidas y las dos restantes no. He descargado e instalado RodgauApesInitials de la colección de Manfred Klein,http://moorstation.org/typoasis/designers/klein04/deco/rodgau_apes.htm

Corremos xelatex mal-kanji1.texy la terminal dice:

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 es el 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}

mwe, parte 1

Necesitaba y usé esta estrategia cuando escribí un libro de vista previa de kanji. Estaba usando muchas fuentes diferentes y necesitaba saber exactamente cuántos glifos se iban a componer. Si faltaba un glifo o más, dependía de mí decidir si componer ese rectángulo o no. Debo decir que es normal que a una fuente le falten algunos caracteres CJKV, hay muchísimos. Adjunto una instantánea del libro, es una vista previa de un solo carácter/kanji japonés.

libro de kanji: una instantánea

La gran desventaja es que podemos usar esta estrategia solo con el xelatexformato y solo podemos verificar fuentes más nuevas (TTF, OTF), no funciona con PFB. Esa es una limitación grave en el trabajo. Déjame mostrarte otro enfoque.


Parte 2:testfont.tex

Una de las herramientas de la distribución TeX es testfont.texel archivo. Si ejecutamos, por ejemplo:

pdftex testfont.tex

Se nos pregunta sobre el nombre de la fuente, usémosla dmjhiray pulsamos Enter. Hay una lista de opciones cuando usamos \helpy presionamos Enter. La opción común es escribir \table\byeseguido de Enter. Estamos obteniendo el testfont.pdfarchivo y esta es una vista previa del mismo.

mwe, parte 2

Un problema es que no podemos personalizarlo y no podemos ingresar fuentes TTF y OTF sin instalar y configurar las fuentes. Vale la pena comprobar otro enfoque.

Parte 3: Medir una caja TeX (Hiragana y Katakana como casos de prueba)

El núcleo de TeX está en las cajas de medición. Es el enfoque que vamos a utilizar y probar. Probaremos un solo glifo, pero fácilmente podríamos medir casi cualquier cosa. Después de definir una nueva caja ( \newbox), cumplimos virtualmente la caja ( \setbox) y podemos medir el ancho, alto y profundidad de la caja ( \wd, \hty \dp).

En el siguiente ejemplo escribimos Hiragana, un silabario japonés, pero podemos detectar varios defectos. Hay un espacio de apertura, las líneas no se rompen idealmente, los espacios se encogen y se estiran, no tenemos idea de cuántos glifos se escribieron. Pero es un punto de partida para futuras exploraciones.

Vale la pena mencionar que podemos ejecutar cualquier latexmotor importante y si usamos, por ejemplofontspecpaquete, podemos probar glifos en TTF, OTF y algunos archivos dfont cuando ejecutamos lualatexo xelatex. Adjunto el código TeX y una vista previa del 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}

mwe, parte 3a


Computamos un glifo solo cuando el ancho del glifo es un valor distinto de cero. Hay algunas excepciones en las fuentes ornamentales, pero se considera una mala tipografía. Agregamos un contador ( \newcount) que se ocupa de una cantidad de glifos tipográficos, limitamos los espacios a una dimensión fija ( \fontdimen3, 4 y 7), permitimos saltos de línea, simplemente decimos que ahora tenemos control total sobre la salida.

Adjunto un ejemplo y una vista previa del archivo PDF con Katakana, un silabario japonés.

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

mwe, parte 3b


Conclusiones

Existen algunas limitaciones de estos métodos. No podemos probar si dos glifos no solo se rotan, invierten o escalan; tampoco enumeramos glifos fuera de la región 0-255. En caso de que necesites algo así, usaFuenteForge, se puede hacer allí ya que es propio.Lenguaje de escrituray un apoyo parasecuencias de comandos de Python.

En caso de que te preguntes qué fue ese toque en el primer ejemplo de la última letra debajo de la letra: ¡Oh, sí, es un simio del gran creador de fuentes legendario Manfred Klein! Adjunto una captura de pantalla deFuenteForgey una vista previa de su fuente con 26+26 letras.

Manfred Klein, parte 1

Manfred Klein, parte 2

Respuesta2

Como extensión de la excelente respuesta de Malipivo, quería mencionar que también puedes usar \iffontcharcomo se muestra en el siguiente ejemplo. Tenga en cuenta que LuaLaTeX ofrece resultados diferentes a los de XeLaTeX aquí: parece que a XeLaTeX no le gustan los glifos en los rangos superiores de Unicode aquí (quizás por encima de U+F0000).

El código debería ser bastante evidente, pero la idea es que llames

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

donde el primer argumento es la fuente fontspec, el segundo es el punto de glifo inicial, el segundo es el punto de glifo final y el cuarto argumento define cómo se compone el resultado ( #2es el código hexadecimal del glifo y #3es el carácter correspondiente al glifo en sí).

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

información relacionada