Cómo usar Troff para formatear documentos PDF en Linux

Una imagen de las manos de una persona escribiendo en el teclado de una laptop.

Troff es un procesador de texto de documentos minimalista pero poderoso para sistemas Linux. Te permite crear documentos listos para imprimir fácilmente al compilar archivos fuente desde la línea de comandos. A diferencia de LaTeX, Troff es increíblemente ligero y está preinstalado en la mayoría de los sistemas Linux. Este tutorial te muestra cómo usar Troff para formatear documentos PDF en Ubuntu.

Tabla de Contenidos

  • ¿Qué es Troff y por qué usarlo?
  • Instalando Troff
  • Creando tu primer documento Troff
  • Entendiendo el formato Troff
  • Creando texto en negrita, cursiva y subrayado
  • Creando nuevas secciones de documentos
  • Creando listas en Troff
  • Creando tablas con preprocesadores en Troff
  • Preguntas Frecuentes

¿Qué es Troff y por qué usarlo?

En un sentido básico, Troff es un programa de procesamiento de texto que convierte scripts similares a código en documentos imprimibles. A diferencia de los procesadores de texto, Troff no se basa en el paradigma “WYSIWYG”. En cambio, requiere que uses tipos específicos de código para manejar tu formato.

La pantalla predeterminada de Libreoffice Writer.

Una de las mayores ventajas de este enfoque es la simplicidad. Una instalación básica de Troff tendrá todo lo que necesitas para crear un documento. Además, su falta de una interfaz gráfica de usuario significa que puedes crear un documento incluso a través de SSH.

Una sesión remota de OpenBSD ejecutando Troff.

Consejo: aprende cómo reenviar aplicaciones GUI a través de SSH en Linux.

Instalando Troff

Troff a menudo viene incluido por defecto en la mayoría de las distribuciones de Linux. Puedes verificar si lo tienes en tu sistema ejecutando su bandera -h. Esto mostrará una breve lista de todas las banderas que tu instalación de Troff acepta.

troff -h

Una pantalla de terminal ejecutando la bandera -h en Troff.

Hay casos en los que las distribuciones no incluyen Troff por defecto. En ese caso, puedes instalarlo buscando el paquete “groff”.

Una ventana de terminal ejecutando el comando apt info para groff.

Esta es una reimplementación de los programas Troff y Nroff por el Proyecto GNU, que incluye una serie de características nuevas y modernas.

Puedes instalar groff en Ubuntu usando el siguiente comando:

sudo apt install groff

Una ventana de terminal mostrando el comando apt install para groff.

Creando tu primer documento Troff

Similar al código fuente, cada documento Troff es un archivo de texto que contiene instrucciones sobre cómo crear un documento. Estas incluyen el ancho de la página y los márgenes, así como el espaciado de letras y páginas.

Una ventana de terminal mostrando una macro Troff compleja.

Este nivel de control te permite manipular el programa para crear cualquier tipo de documento. Para simplificar eso, los desarrolladores de Troff crearon “macros” que condensan estos comandos a una sintaxis más simple.

instalar troff linux 08 ms macros manual 609x400

Una de las macros más comunes que usarás en Troff es “ms”. Creará un documento en un estilo de artículo. Puedes crear un documento ms usando el comando touch:

touch my-first-document.ms

Dado que todos los documentos Troff son texto, puedes abrir tu documento usando un editor de texto. En mi caso, estoy usando vim. Alternativamente, puedes usar cualquiera de estos editores de texto para Linux.

vim my-first-document.ms

Una ventana de terminal mostrando un nuevo documento ms.

Entendiendo el formato Troff

Todos los documentos Troff siguen una estructura similar. Cada comando de formato que realices necesita estar en una línea separada en el contenido que está tratando de formatear. Como tal, un documento Troff típico se verá algo así:

.COMMAND1  
Este es un contenido en un documento Troff.  
  
.COMMAND2  
Este es un contenido diferente en un documento Troff.

Dos de los comandos más básicos que usarás en ms son .TL y .PP. El primero convierte tu texto en un título y lo centra en tu documento, mientras que el segundo formatea tu texto para seguir un estilo de párrafo.

Por ejemplo, el siguiente extracto utiliza tanto los comandos .TL como .PP:

.TL  
Mi primer documento Troff  
  
.PP  
Este es un contenido que quiero que se vea como un párrafo en mi documento final. No es un contenido muy largo, pero es mi primer documento Troff y estoy orgulloso de ello. Tiene aproximadamente tres oraciones de largo y debería ajustarse correctamente al documento.

Una ventana de terminal mostrando un documento Troff básico.

Desde aquí, crea tu documento pasando tu archivo al programa Troff.

groff -ms-Tpdf ./my-first-document.ms > output.pdf

Una salida PDF de un documento Troff básico.

Consejo: si prefieres algo más simple, aprende cómo escribir en formato MLA en Google Docs.

Creando texto en negrita, cursiva y subrayado

Al igual que un procesador de texto regular, la mayoría de las macros de Troff suministran una serie de comandos de estilo para personalizar tu documento. Para ms, estos son .B, .I, .UL y .BX.

  • El comando .B cambia el texto a negrita.
  • El comando .I cambia el texto a cursiva.
  • .UL y .BX son comandos que dibujan un subrayado y un cuadro alrededor de tu texto, respectivamente.

Similar a los comandos anteriores, usar estos en tu documento requiere que separes cada estilo en su propia línea:

.TL  
Mi primer documento Troff  
  
.PP  
Este es  
.B  
contenido  
.R  
que quiero que se vea como un párrafo en mi documento final. [...]

En este ejemplo, creé una nueva línea antes de la palabra “contenido” y añadí el comando .B para cambiarlo a negrita, luego creé una nueva línea y añadí el comando .R. Esto permite que Troff regrese a su estilo anterior.

Una salida PDF de un documento Troff que muestra una sola palabra en negrita.

Es importante notar que siempre necesitas añadir el comando .R al cambiar de estilo. Por ejemplo, el siguiente extracto no terminará el comando .I ya que Troff no vio un .R después de él:

.TL  
Mi primer documento Troff  
  
.PP  
Este es  
.I  
contenido  
que quiero que se vea como un párrafo en mi documento final. [...]

Una salida PDF de un documento Troff que muestra la mayor parte del cuerpo en cursiva.

Creando nuevas secciones de documentos

Similar a LaTeX, Troff también soporta secciones y detección de jerarquía, por lo que no necesitas organizar y emparejar el nivel de cada encabezado cuando estás editando.

Para crear una nueva sección en tu documento, usa el comando .NH seguido del nombre de tu encabezado.

.TL  
Mi primer documento Troff  
  
.NH  
Mi primer encabezado  
.PP  
Este es un contenido que quiero que se vea como un párrafo en mi documento final.

Una salida PDF de un documento Troff con un solo encabezado numerado.

Por defecto, cada encabezado Troff tiene un valor de nivel que dicta cómo el programa estructura y muestra su contenido en el documento final. Sabiendo eso, puedes cambiar este valor para ajustar el nivel de un encabezado.

Por ejemplo, lo siguiente crea un encabezado de nivel 2 inmediatamente debajo de su padre:

.TL  
Mi primer documento Troff  
  
.NH  
Mi primer encabezado  
.NH 2  
Mi primer subtítulo  
.PP  
Este es un contenido que quiero que se vea como un párrafo en mi documento final.

Una salida PDF de un documento Troff que muestra una página con un encabezado anidado numerado.

Aparte de los encabezados numerados regulares, Troff también puede crear encabezados en blanco que aún seguirán la jerarquía de niveles del documento.

Para hacer esto, reemplaza .NH con el comando .SH:

.TL  
Mi primer documento Troff  
  
.SH  
Mi primer encabezado  
.SH 2  
Mi primer subtítulo  
.PP  
Este es un contenido que quiero que se vea como un párrafo en mi documento final.

Una salida PDF de un documento Troff que muestra un encabezado anidado sin numerar.

Consejo: descubre cómo cambiar los márgenes en Google Docs.

Creando listas en Troff

La simplicidad de Troff también te permite adaptar su comportamiento a lo que necesites. Por ejemplo, las listas no vienen por defecto en Troff ni en las macros ms. A pesar de eso, aún puedes crear una lista combinando algunos comandos ms.

Cada lista en Troff consiste en tres partes: una sangría, un viñeta y el contenido. Para crear la sangría, usa los comandos .RS y .RE. Estos moverán el nivel de sangría actual de cualquier texto dentro de ellos cuatro espacios.

.RS  
Este es mi primer ítem.  
.RE

Una salida PDF de un documento Troff que muestra un ítem de lista simple.

A continuación, crea la viñeta para tu ítem de lista usando .IP. Este es el comando “indent paragraph” que fija el margen izquierdo de tu texto a un cierto ancho.

El comando .IP también te permite establecer un punto de viñeta personalizado y el espacio entre él y tu texto. En este caso, estoy configurando mi viñeta a “[1]” y le daré cuatro espacios.

.RS  
.IP [1]4  
Este es mi primer ítem.  
.RE

Una salida PDF de un documento Troff que muestra un solo ítem de lista con un punto de viñeta.

Ahora copia y pega tu comando .IP para crear ítems de lista adicionales.

.RS  
.IP [1]4  
Este es mi primer ítem.  
.IP [2]4  
Este es mi segundo ítem.  
.IP [3]4  
Este es mi tercer ítem.  
.RE

Una salida PDF de un documento Troff que muestra tres ítems de lista básicos con puntos de viñeta.

Finalmente, automatiza este proceso creando una macro personalizada. Por ejemplo, el siguiente extracto vincula mi comando .IP a .QW:

.de QW  
.IP [-]4  
..  
  
.RS  
.QW  
Este es mi primer ítem.  
.QW  
Este es mi segundo ítem.  
.QW  
Este es mi tercer ítem.  
.RE

Una ventana de terminal que muestra el archivo fuente de un documento que usó macros para automatizar la creación de listas.

Creando tablas con preprocesadores en Troff

Una peculiaridad de Troff es que la mayoría de sus características existen como “preprocesadores”. En su mayor parte, estos son binarios fuera del programa que funcionan creando “scripts contenedores de preprocesadores” y convierten esos a código Troff de bajo nivel.

Una ventana de terminal que muestra el código Troff convertido de un preprocesador.

Tbl es un gran ejemplo de un preprocesador de Troff. Es un programa que gestiona tablas en un documento. Un contenedor básico de Tbl se ve algo así:

.TS  
allbox ;  
c c c.  
item1  item2  item3  
item4  item5  item6  
  
.TE
  • Los comandos .TS y .TE le dicen a Tbl que este es un entorno que puede leer.
  • La segunda línea le dice al programa cómo formatear esta tabla.
  • La tercera línea es un campo separado por espacios que dicta la cantidad de columnas y su alineación en tu tabla.
  • Las líneas cuarta y quinta son campos separados por tabulaciones que contienen los contenidos de tu tabla.

Una ventana de terminal que muestra el script de preprocesador para Tbl.

Compilar un documento con Tbl es ligeramente diferente a un archivo Troff regular. Primero, carga tu archivo:

tbl my-first-document.ms > preprocessed.ms

A continuación, alimenta la salida del programa a Troff:

groff -ms-Tpdf ./preprocessed.ms > output.pdf

Por último, automatiza este proceso usando tuberías de UNIX:

tbl my-first-document.ms | groff -ms-Tpdf> output.pdf

Una salida PDF de un documento Troff que muestra una tabla básica.

Bueno saber: aprende más sobre tuberías de UNIX y redirección de archivos con sed.

Preguntas Frecuentes

¿Es posible usar Troff en Windows?

Por defecto, ni Troff ni Groff están oficialmente portados a Windows. A pesar de eso, aún puedes usar Groff junto con otras utilidades de GNU instalando el Subsistema de Windows para Linux.

¿Troff tiene una función de seguimiento de bibliografía?

Sí. Refer es un preprocesador simple que utiliza un archivo de bibliografía externo para rastrear automáticamente las referencias en un documento Troff. Puedes aprender más sobre cómo funciona visitando su página de manual ejecutando man refer.

¿Cómo puedo solucionar el error “missing DESC” al compilar Troff?

Este problema se debe probablemente a una dependencia faltante en tu sistema o a un archivo de versión incompatible. Para solucionarlo, instala el paquete groff adecuado desde el repositorio de tu distribución.

Crédito de la imagen: Simon Hattinga Verscheure a través de Unsplash. Todas las alteraciones y capturas de pantalla por Ramces Red.