(Al igual que con el resto de mis artículos traduje también éste al inglés porque, aunque no la herramienta que comparto abajo que sirve específicamente para castellano, lo que explico aquí puede ser usado con cualquier idioma).
La característica elogiada de LaTeX es que, a diferencia de Groff, que lee línea por línea, LaTeX lee el párrafo completo antes de procesarlo; si uno observa detenidamente, nota cómo LaTeX reduce automáticamente el espacio entre palabras para ajustar los párrafos. En groff, se puede lograr el mismo o mejor resultado ajustando manualmente el espaciado con la solicitud .ss, pero, personalmente, prefiero no comprimir el texto. Una forma más honesta de evitar los huecos en el texto justificado es optimizar al máximo la separación silábica; en este artículo explico cómo usando un método alternativo de separación silábica se puede conseguir un justificado en algunos casos incluso más homogéneo que el observado en un mismo documento procesado con LaTeX (tengo mis novelas completas también transcritas en LaTeX, hablo con conocimiento de causa).
Para lograr la separación por sílabas, groff utiliza una versión simplificada del algoritmo que usa TeX, el cual lee archivos con listas de patrones que le indican dónde separar las palabras. Dado que cada idioma tiene diferentes reglas de separación de palabras, cada idioma necesita sus propios patrones. Groff también toma prestados de LaTeX estos patrones, en la distribución ya vienen incluidos los de inglés, alemán, francés, suizo y checo, para conseguir los de otros idiomas, castellano como en mi caso, hay que copiarlos uno mismo de la distribución LaTeX. Como se explica en la documentación de groff, hay que cargarlos con la siguiente solicitud:
.hla es \" Idioma de separación de palabras .hpf hyphen.es \" Fichero con patrones de LaTeX
Tal es la forma ‘oficial’, por llamarla de alguna manera, de lograr una separación silábica automática con groff. Así lo he estado haciendo durante años, hasta hace poco en que encontré una mejor manera. Hay una segunda forma de decirle a groff cómo dividir con guiones, la solicitud .hw, la cual permite agregar palabras en una misma o varias líneas en cualquier parte del documento:
.hw ca-sa te-lé-fo-no pe-dia-trí-a .hw re-tri-bu-ción
La documentación de Groff presenta esta opción como recurso para definir excepciones, pero nada nos priva de automatizar la tarea generando un archivo con todas las palabras del documento a editar, lo que se puede lograr, por ejemplo, con un script de shell que incluya algunos comandos tr(1), grep(1) y sed(1). Escribí tal script, una vez listo y corregido, comenté la entrada .hpf y usé solo el archivo generado con mi script (hyphen.tr):
.hla es \" Idioma de separación de palabras .\".hpf hyphen.es \" Desactivamos los patrones de LaTeX .so hyphen.tr \" Cargamos el fichero generado con el script
Evidentemente, una vez le hicimos saber a groff cómo separar en sílabas desde la primera hasta la última palabra del documento, la separación es la mejor posible. Muchos huecos que deja en el justificado el otro método de separación silábica desaparecen.
Pero para obtener el mejor resultado de nuestro nuevo método es indispensable un paso previo: deshabilitar la separación por guiones en inglés, la cual viene activada por defecto en la mayoría de sistemas. Para lograr esto, primero hay que crear un directorio tmac personal (tal vez usted ya tiene el propio) y salvar ahí una copia del fichero de configuración genérico, troffrc, que hallará en el directorio tmac donde su sistema haya instalado groff:
$ export GROFF_TMAC_PATH=~/.local/share/groff/site-tmac $ mkdir -p $GROFF_TMAC_PATH $ cp /usr/(local)/share/groff/current/tmac/troffrc \ $GROFF_TMAC_PATH
Para que la configuración anterior sea permanente:
$ echo 'export GROFF_TMAC_PATH=~/.local/share/groff/site-tmac' \ >> ~/.bashrc
Luego hay que abrir el mencionado fichero con nuestro editor de texto preferido y deshabilitar (comentando las entradas) la separación por guiones automática de inglés, reglas que obviamente no nos interesa que se molesten con las nuestras:
$ vi $GROFF_TMAC_PATH/troffrc
.\" Set the hyphenation language to 'us'. .\".do hla us . .\" Load hyphenation patterns and exceptions. .\".do hpf hyphen.us .\".do hpfa hyphenex.us
Al menos con la lengua castellana no fue fácil lograr un script para separar correctamente las palabras en sílabas, antes tuve que estudiar la forma de implementar las reglas de esta lengua (teniendo en cuenta hiatos, diptongos, etc.) en una forma económica. El código no quedó elegante pero me sirvió como maqueta para escribir un programa en C:
Descargar (hyphen-es.c)
Para que la herramienta fuera de propósito general, la diseñé de manera que, por defecto, imprima todo el texto tal cual lo lee, sólo separando las palabras con guiones:
$ echo Ayer pasé por tu casa... - J. Corona. | hyphen-es A-yer pa-sé por tu ca-sa ... - J. Co-ro-na.
Y que al agregar la opción -l (ele), genere una lista de palabra por línea en minúsculas, ignorando monosílabos:
$ echo Ayer pasé por tu casa... - J. Corona. | hyphen-es -l a-yer pa-sé ca-sa co-ro-na
Si queremos usarlo con un documento ya editado con roff, antes de procesarlo con hyphen-es conviene quitar el código y dejar sólo el texto. El siguiente es un ejemplo de un script sencillo que hace justamente esto (es posible que tenga que adaptarlo a sus necesidades):
#!/bin/sh # roff2txt.sh tmp=/tmp/$(basename $1 .tr)_$(date +%H%M%S) # Include .so files while read -r line; do if echo $line | grep -v hyphen.tr | grep -q '^\.so .*\.tr' then cat $(echo $line | awk '{ print $2 }') >> $tmp else echo $line >> $tmp fi done < $1 cat $tmp | sed 's/\\f[IPR]//g' | sed 's/\\&//g' | sed 's/^\..*$//' rm $tmp
Sumamos un poco de magia de tuberías de Unix a lo anterior y obtenemos un archivo listo para usar con nuestro documento groff (puede agregar un comando por el estilo a su Makefile):
$ roff2txt.sh ${doc}.tr | hyphen-es -l | \ sort | uniq | sed 's/^/.hw /' > hyphen_es.tr
Por último, sólo resta cargar el archivo desde su documento groff:
.so hyphen_es.tr