
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:
xelatex
y su herramienta
Hay una manera de hacerlo xelatex
, se menciona indirectamente en la página 8 delmanual de referencia. Podemos usar el \XeTeXcharglyph
comando y verificar si la salida es 0
(o .notdef
si 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...\fi
la declaración para decidir qué componer, en todo caso. En el ejemplo, estoy probando cuatro letras, ? A \ a
dos 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.tex
y 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}
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.
La gran desventaja es que podemos usar esta estrategia solo con el xelatex
formato 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.tex
el archivo. Si ejecutamos, por ejemplo:
pdftex testfont.tex
Se nos pregunta sobre el nombre de la fuente, usémosla dmjhira
y pulsamos Enter. Hay una lista de opciones cuando usamos \help
y presionamos Enter. La opción común es escribir \table\bye
seguido de Enter. Estamos obteniendo el testfont.pdf
archivo y esta es una vista previa del mismo.
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
, \ht
y \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 latex
motor importante y si usamos, por ejemplofontspec
paquete, podemos probar glifos en TTF, OTF y algunos archivos dfont cuando ejecutamos lualatex
o 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}
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 ( \fontdimen
3, 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}
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.
Respuesta2
Como extensión de la excelente respuesta de Malipivo, quería mencionar que también puedes usar \iffontchar
como 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 ( #2
es el código hexadecimal del glifo y #3
es 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}