Usar fuentes TTF, OTF o Type1 con Groff (English)

Script de shell (mi versión, hay otras) para convertir e instalar fuentes TTF, OTF o Type1 para ser usadas con Groff.  Para realizar la conversión usa fontforge

Motivación

Mis tres novelas están totalmente editadas con GNU roff, incluyendo gráficos y portadas, tanto la portada sencilla que incluyo en la versión HTML como la doble faz que subí a amazon.  La única excepción son los dibujos de las portadas que, como es evidente, los hice manualmente con lápiz y papel.

Use roff plano, escribí mis propios macros, los que he ido perfeccionando a lo largo de los años.  Como ejemplo este es el fichero tmac que hice para formatear mis novelas.  (También escribí un script de shell para convertir mi fichero roff a HTML, ya vio el resultado).

No soy necesariamente un esteta, pero últimamente, aburrido de la fuente Times, que viene por defecto con groff, quise probar la EBGaramond de Georg Duffner, que a mi parecer es más adecuada para una novela, y lo que es más importante, al ser más redonda y no tener los trazos verticales demasiado reforzados, como es el caso de la Times, disimula mejor los huecos en el justificado del texto.

Buscando en la web cómo convertir e instalar fuentes en Groff encontré tres scripts de shell.  El primero de Peter Schaffter (creador de los macros mom), que viene con una detallada explicación.  Un segundo que es un comprensible intento de simplificar el script de Schaffter y un tercero del cual no incluyo enlace dado que no vale la pena molestarse en leerlo.

De toda esta información destilé lo que a mí al menos me resultó efectivo y volqué en mi propio script de shell, que pego abajo.

Qué agregué

Aquí lo tiene

Descargar el fichero

#!/bin/sh
# groff-install-font.sh - (c) 2023 Walter Alejandro Iglesias
#
# Convert and install OTF, TTF or PFA font to use it with Groff.  You need
# fontforge installed.

# Directory where you want the font installed (a custom path needs to
# be added to GROFF_FONT_PATH).  To install the font in the default
# system wide groff location just leave this empty (you'll need to run
# this script as root in this case).
sitefont=$XDG_DATA_HOME/groff/site-font

prefix=/usr/local/share/groff

if [ "`uname`" = "Linux" ]; then
	prefix=/usr/share/groff
fi
if [ "$sitefont" = "" ]; then
	sitefont=$prefix/site-font
	if [ "`whoami`" != "root" ]; then
		echo "You must be root to install the font in $sitefont"
		exit 1
	fi
elif [ ! -d $sitefont/devps ] || [ ! -d $sitefont/devpdf ]; then
	mkdir -p $sitefont/dev{ps,pdf}
fi
if ! echo $1 | grep -E '.*(R|I|B|BI)+$' ||
   ! echo $2 | grep -E '\.(otf|ttf|pfb)$'; then
	echo "Usage: `basename $0` <groffname> <fontfile>.(otf|ttf|pfb)"
	echo "  groffname must be <name>(R|I|B|BI)"
	exit 1
fi
which fontforge >/dev/null 2>&1 || {
	echo "This script uses fontforge to convert fonts"
	exit 1
}
textmap=$prefix/current/font/devps/generate/textmap
enc=$prefix/current/font/devps/text.enc
groffname=$1
font=$2
name=`basename "$font" | sed -E 's/\.(otf|ttf|pfb)$//'`

fontforge -lang=ff -c "Open(\"$font\");Generate(\"$name.pfa\");"
fontforge -lang=ff -c "Open(\"$font\");Generate(\"$name.t42\");"
afmtodit -e $enc $name.afm $textmap $groffname
if ! grep -q '^ligatures' $groffname ; then
	sed -i '/kernpairs/i\
ligatures fi fl 0\
\
' $groffname
fi
mv $name.t42 $groffname $sitefont/devps
mv $name.pfa $sitefont/devpdf
rm $name.afm
ln -s $sitefont/devps/$groffname $sitefont/devpdf/$groffname
printf "$name\t$name.t42\n" >> $sitefont/devps/download
printf "\t$name\t$name.pfa\n" >> $sitefont/devpdf/download

# End of groff-install-font.sh

VOLVER A LA PORTADA