Números romanos en versalitas (Emacs y LaTeX)
Si en nuestro documento para LaTeX queremos normalizar los números romanos de ciertos contextos en versalitas, podemos escribir una muy
simple función para Emacs que busque la expresión regular \(\b[IVXLCDM]+\b\)
y encierre el número romano en un comando
que previamente hayamos definido. Por ejemplo, algo así como
\def\miscrom#1{\textsc{\MakeLowercase{#1}}}
Claro, con una función así no podríamos fiar todo en la automatización, pues nos entregaría falsos positivos por todas partes. Así que se me ocurrió lo siguiente, que es un poco de andar por casa, pero no he sido capaz de encontrar una solución mejor:
- Que la función busque y reemplace sólo en unos pocos contextos en que podemos estar seguros (casi al 90%) de que son números romanos y de que ahí los queremos en versalitas. Por ejemplo, detrás de «siglo», «s.», «p.» o con un guión entre medias que indique un rango: XX-XXI, etc.
- Y, acto seguido y por si las moscas, nos entregue en un búfer aparte todos los pasajes encontrados (tanto los
sustituidos como los que no), gracias a la expresión
occur
, con número de línea y contexto, por si se nos ha colado un falso positivo o un falso negativo.
Definimos primero una función para ejecutar los reemplazos, con dos argumentos: antes
y despues
(defun reemplaza (antes despues) (interactive) (save-excursion (goto-char (point-min)) (while (re-search-forward antes nil t) (replace-match despues t nil))))
Y la función resultante se parecería a esta:
(defun romanos-en-versalitas () (interactive) (reemplaza "siglo \\(\\b[IVXLCDM]+\\b\\)" "siglo \\\\miscrom{\\1}") (reemplaza " s. \\(\\b[IVXLCDM]+\\b\\)" " s. \\\\miscrom{\\1}") (reemplaza " p. \\(\\b[IVXLCDM]+\\b\\)" " p. \\\\miscrom{\\1}") (reemplaza "\\(\\b[IVXLCDM]+\\b\\)–" "\\\\miscrom{\\1}–") (reemplaza "–\\(\\b[IVXLCDM]+\\b\\)" "–\\\\miscrom{\\1}") (save-excursion (goto-char (point-min)) (occur "\\(\\b[IVXLCDM]+\\b\\)")))
Y como un gif vale más que mil palabras:
∞
Publicado: 01/05/2019
Última actualización: 21/01/22
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.