Cuaderno de GNUtas

Hacer un test rápido de una fuente en Dired con LuaTeX

La idea para esta función de Emacs es la siguiente. Estamos ante un listado de archivos de fuentes en el navegador de ficheros de Emacs, Dired. Si llamamos a nuestra función, se nos abrirá a la derecha una ventana que nos mostrará un PDF con un test rápido de la fuente donde se sitúa el cursor, generado en LuaTeX. Esos PDF estarán nombrados como la fuente, y se podrán ir almacenando.

Los pasos:

  1. Creamos un directorio donde generar y almacenar los PDF de pruebas.
  2. Creamos, en esa carpeta, un archivo *.tex que nos sirva de preámbulo para generar los PDF en LuaTeX. Allí incluiremos una versión modificada a nuestro gusto de este comando para LaTeX, muy práctico, que se comenta aquí. El comando usa de fondo fontspec.
  3. Escribimos nuestra función en Elisp, que haga lo siguiente:
    1. Extraer el nombre del archivo de la fuente donde tengamos el cursor, por un lado, y la ruta por otro. Ambas cosas serán los valores de sendas variables.
    2. Generar un archivo *.tex temporal donde se aplique lo anterior.
    3. Compilarlo.
    4. Mostrarnos el PDF resultante, renombrado con el nombre de la fuente, a la derecha.

Nuestro directorio para almacenar los PDF

Allí crearemos un archivo *.tex con un preámbulo «permanente». El mío lo he nombrado test.tex y se parece a esto:

%% Modificado a partir de https://tex.stackexchange.com/questions/328951/testing-specific-fonts-for-specific-available-characters

\documentclass{article}
\usepackage{fontspec}
\usepackage[greek.ancient,spanish]{babel}

\NewDocumentCommand{\fonttest}{O{}m}{{%
  \par\parindent=0pt
  \newfontfamily\myfont[#1]{#2}
  \myfont
  \textbf{#2} font test:\par

  AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz? \par
  \textit{AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz?} \par
  1234567890\par
  {\addfontfeature{Numbers=Lowercase}1234567890\par}
  Åå Çç Øø\\
  Ẽẽ Ĩĩ Ũũ Ỹỹ \par
  IPA: ʔǝŋɲɾʧɨɔɛʃʤɸɣβɡɑɐɒʙðɕʑɻɚ\par
  griego: ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\par αβγδεζηθικλμνξοπρσςτυφχψω \par
  Ligaduras:
    fluffier soufflé fisticuffs fb fh ffh fj ffj fk ffk ft fft tt Qu Th ch ck ct \par
  \textsc{\ldots{} Y probando algunas versalitas}\par

  \vspace{1em}

  Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec hendrerit
  tempor tellus. Donec pretium posuere tellus. Proin quam nisl, tincidunt et, mattis eget,
  convallis nec, purus. Cum sociis natoque penatibus et magnis dis parturient montes,
  nascetur ridiculus mus. Nulla posuere. Donec vitae dolor. Nullam tristique diam non
  turpis. Cras placerat accumsan nulla. Nullam rutrum. Nam vestibulum accumsan nisl. Lorem
  ipsum dolor sit amet, consectetuer adipiscing elit. Donec hendrerit tempor tellus. \par

  \vspace{1em}

\selectlanguage{greek}
  βουλεύεται ὅπως μήποτε ἔτι ἔσται ἐπὶ τῷ ἀδελφῷ, ἀλλά, ἢν δύνηται, βασιλεύσει ἀντ᾽
  ἐκείνου. Παρύσατις μὲν δὴ ἡ μήτηρ ὑπῆρχε τῷ Κύρῳ, φιλοῦσα αὐτὸν μᾶλλον ἢ τὸν βασιλεύοντα
  Ἀρταξέρξην. ὅστις δ᾽ ἀφικνεῖτο τῶν παρὰ βασιλέως πρὸς αὐτὸν πάντας οὕτω διατιθεὶς
  ἀπεπέμπετο ὥστε αὐτῷ μᾶλλον φίλους εἶναι ἢ βασιλεῖ. καὶ τῶν παρ᾽ ἑαυτῷ δὲ βαρβάρων
  ἐπεμελεῖτο ὡς πολεμεῖν τε ἱκανοὶ εἴησαν καὶ εὐνοϊκῶς ἔχοιεν αὐτῷ. τὴν δὲ Ἑλληνικὴν
  δύναμιν ἥθροιζεν ὡς μάλιστα ἐδύνατο ἐπικρυπτόμενος, ὅπως ὅτι ἀπαρασκευότατον λάβοι
  βασιλέα.\par

}}

Nuestra función en Elisp

Definimos antes estas dos funciones. La primera extrae el nombre del archivo de la fuente. La segunda, la ruta, que vendrá muy bien para especificarla más abajo como propiedad de Fontspec. Útil para fuentes que no forman parte del sistema.

(defun nombre-fuente-sola ()
    (interactive)
    (let
        ((nombre (dired-get-file-for-visit)))
      (replace-regexp-in-string ".+/" "" nombre)))

  (defun ruta-fuente ()
    (interactive)
    (let
        ((nombre (dired-get-file-for-visit)))
      (replace-regexp-in-string "\\(.+/\\).+" "\\1" nombre)))

Y vamos ahora con la función que nos generará el test de la fuente (en mi caso, el directorio donde crear y almacenar los PDF es ~/Tipografía/Fuentes/fuentes-test/).

(defun fuente-test ()
  (interactive)
  (let
      ;; definimos estas dos variables locales
      ((nombre-fuente (nombre-fuente-sola))
       (ruta (ruta-fuente)))
    (save-window-excursion
      ;; creamos el archivo tex temporal
      (shell-command "touch ~/Tipografía/Fuentes/fuentes-test/temp.tex")
      (find-file "~/Tipografía/Fuentes/fuentes-test/temp.tex")
      ;; insertamos en él lo necesario para hacer el test de la fuente escogida
      (insert (concat "\\input{test.tex}"
                      "\n\\begin{document}"
                      (format "\\fonttest[Path=%s]{%s}" ruta nombre-fuente)
                      "\n\\end{document}"))
      ;; por alguna razón, el carácter del guión bajo se vuelve aquí activo.
      ;; Para hacer que se comporte como un carácter normal, hay que
      ;; anteponerle `\\string'.Así no dará errores en las fuentes cuyo nombre
      ;; lleve un guión bajo.
      (save-excursion
        (goto-char (point-min))
        (replace-string "_" "\\string_" nil))
      ;; salvamos y compilamos con LuaTeX
      (save-buffer)
      (shell-command "lualatex ~/Tipografía/Fuentes/fuentes-test/temp.tex")
      ;; renombramos el PDF resultante con el nombre de la fuente
      (shell-command (concat "mv" " " "~/Tipografía/Fuentes/fuentes-test/temp.pdf" " "
                             (format "~/Tipografía/Fuentes/fuentes-test/%s.pdf" nombre-fuente)))
      ;; eliminamos todos los ficheros temporales
      (shell-command "rm ~/Tipografía/Fuentes/fuentes-test/temp.*"))
    (kill-buffer "temp.tex")
    ;; abrimos una ventana a la derecha y mostramos el pdf
    (split-window-right)
    (other-window 1)
    (find-file (format "~/Tipografía/Fuentes/fuentes-test/%s.pdf" nombre-fuente))))

Y aquí un vídeo donde se muestra el resultado en acción:

Hacer un test rápido de una fuente en Dired (Emacs) con LuaTeX from Juan Manuel Macías Chaín on Vimeo.

Publicado: 10/08/2019

Última actualización: 21/01/22


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs