¡¡¡Atención!!! esta guía está pensada para dar explicaciones con cierto nivel de detalle. Ello proporciona una mayor comprensión, pero puede transmitir la falsa idea de que AsciiDoc es más difícil de lo que realmente es. Si usted quiere simplemente empezar a escribir un documento en el lenguaje AsciiDoc sin entrar en demasiados detalles sobre todas sus posibilidades, lo mejor es que salte directamente a la sección de nociones preliminares.

1. Introducción

1.1. Qué es AsciiDoc

AsciiDoc es un lenguaje de marcado, diseñado en 2002 por Stuart Rackham, quien pretendía obtener un lenguaje ligero, intuitivo y semánticamente equivalente a DocBook.

Para la comprensión de lo que es AsciiDoc se asume que el lector sabe lo que es un lenguaje de marcado. De no ser así se recomienda la lectura de esta entrada de la wikipedia, o la de alguna otra página web con información sobre dicha materia (hay muchas). También es útil saber lo que es DocBook, y para qué sirve; aunque no resulta imprescindible.

He dicho que AsciiDoc pretende ser un lenguaje ligero, intuitivo y semánticamente equivalente a DocBook. A continuación aclararé qué significan tales características:

Ligero:

Significa que las marcas constitutivas del lenguaje no han de ocupar más de uno o dos caracteres; y en la medida de lo posible han de estar constituidas por símbolos, no por letras o palabras; al menos las más usuales. Tanto en HTML como, sobre todo, en DocBook, las marcas son demasiado largas y están compuestas por letras. Esto provoca que (1) se invierta demasiado tiempo en la escritura de las marcas y que (2) se dificulte la lectura del fichero original en su formato de texto. Con AsciiDoc se pretende que ambos problemas desaparezcan.

Intuitivo:

La idea es que, en la medida de lo posible la marca elegida represente de alguna manera su función. Según la documentación oficial del lenguaje, quien lee un fichero escrito en AsciiDoc podría entender la función de la mayor parte de las marcas incluso sin saber nada del lenguaje. Esto, en mi opinión, se ha logrado, probablemente, con las marcas relativas a la estructura del documento. Respecto de las marcas de formato propiamente dichas, la cuestión me parece más dudosa.

Semánticamente equivalente a DocBook:

DocBook fue diseñado para la escritura de documentación técnica; lo que significa que tiene prevista una marca para la mayor parte de los elementos que se pueden encontrar en un libro, informe técnico o artículo académico. Lo mismo ocurre con AsciiDoc, que no es tan completo, pero casi.

En mi opinión el principal punto débil de AsciiDoc está en el tratamiento de las notas a pie de página. El lenguaje no está preparado para notas largas, o que tengan más de un párrafo. Con esa salvedad, es perfecto para escribir textos de todo tipo. Especialmente textos de extensión mediana o larga, destinados a ser publicados en Internet.

Como lenguaje de marcas ligero se le compara a menudo con Markdown, que es el campeón de los lenguajes de este tipo, al menos en popularidad. A mi modo de ver, el resultado de la comparación indica que ambos lenguajes son igual de ligeros, pero AsciiDoc es más completo, y por ello, como tiene muchas más prestaciones, su aprendizaje resulta algo más complejo; aunque no demasiado: Aprender a representar en AsciiDoc lo que también se puede representar en Markdown ocupa el mismo tiempo que aprender Markdown. Aprender las prestaciones extras requiere una inversión adicional de tiempo.

1.2. Sobre esta guía

Esta guía va dirigida a lectores que no tengan ningún conocimiento previo de AsciiDoc. Sí es conveniente, no obstante, tener cierta experiencia con lenguajes de marcas, con ficheros de texto y con formatos de texto. Los usuarios que durante toda su vida sólo han trabajado con Microsoft Windows, y que identifican la idea de fichero de texto con la de documento de Microsoft Word (documentos de extensión DOC, DOCX o RTF), tal vez tengan cierta dificultad inicial. Pensando en ellos he escrito la sección relativa a la Forma de trabajar con AsciiDoc, que los usuarios más avezados con los lenguajes de marcas posiblemente no necesiten leer.

La información necesaria para escribir esta guía se ha obtenido de las siguientes fuentes que pueden ser consultadas por el lector que desee ampliar algún aspecto y entienda razonablemente bien el inglés:

Hay dos especificaciones distintas de AsciiDoc (véase el próximo apartado). Esta guía se basa en la versión 2.0.18 de AsciiDoctor, liberada en octubre de 2022.

1.3. AsciiDoc y AsciiDoctor

Existe una cierta confusión entre los nombres AsciiDoc y AsciiDoctor, que tiene que ver con la historia de este lenguaje.

Como se ha dicho al principio, AsciiDoc fue diseñado originalmente en 2002. Su autor escribió también un programa en Python que permitía convertir los ficheros fuente de AsciiDoc a DocBook, a HTML o generar, a partir de ellos un fichero de ayuda tipo 'man' para sistemas Unix. El programa conversor se llamaba igual que el lenguaje: asciidoc.

Tal y como es costumbre en la documentación de los programas informáticos, en esta guía, para dejar claro cuándo me quiero referir al lenguaje y cuándo me quiero referir al programa conversor, para referirme al primero usaré el tipo de letra normal, y mayúscula inicial e intermedia («AsciiDoc»), mientras que cuando quiera referirme al programa conversor, escribiré su nombre totalmente en minúsculas y usaré un tipo de letra monoespaciada similar a la que se usa en las terminales y consolas informáticas («asciidoc»).

A día de hoy el mantenimiento del lenguaje está en manos de la Fundación Eclipse. La especificación del lenguaje ha cambiado algo respecto de la original, y también se ha desarrollado una nueva herramienta para la conversión de los ficheros fuente a otros formatos. El programa conversor ahora se llama «asciidoctor» y ha sido desarrollado con el lenguaje de programación Ruby. Por tanto, en la actualidad:

  • AsciiDoc es el nombre del lenguaje, y también es el nombre de un programa escrito en Python que convierte ficheros AsciiDoc a otros formatos.

  • asciidoctor es el nombre de un programa conversor de los ficheros escritos con el lenguaje AsciiDoc a otros formatos.

Hay, por lo tanto, dos programas conversores distintos: el original, escrito en Python y basado en la especificación inicial del lenguaje, y otro más moderno, escrito en Ruby y que aplica la especificación actual del lenguaje. El primero se llama asciidoc, y el segundo asciidoctor.

asciidoc y asciidoctor convierten un fichero escrito en lenguaje AsciiDoc a HTML, DocBook o ManPage. Para convertir a otros formatos, incluyendo PDF, se usan otros programas: a2x para aplicar la especificación original del lenguaje, y asciidoctor-pdf para aplicar la especificación actual.

La diferencia entre las dos especificaciones de AsciiDoc no es tan grande como para que los programas conversores fallen totalmente si se aplican a un fichero pensado para la otra especificación; pero sí es lo suficientemente importante como para que se pueda obtener algún resultado inesperado. Y como todo esto es muy líoso, creo que lo más razonable es olvidarnos de la especificación original y asumir que el lenguaje se llama AsciiDoc y el programa conversor AsciiDoctor.

Así lo hago en esta guía, en la que se explica solamente la especificación actual del lenguaje.

Para el conversor de la primera especificación del lenguaje, asciidoc, sigo en esta guía la convención de referirme a él siempre en letras minúsculas y con un tipo monoespaciado. Pero ello es porque el nombre del programa se puede confundir con el del lenguaje. Como en AsciiDoctor no existe ese problema, normalmente me refiero al programa con el tipo de letra normal en este documento y usando mayúscula inicial e intermedia («AsciiDoctor»). Sólo en los ejemplos en los que describo lo que debe teclearse en una terminal utilizaré letras minúsculas y tipo monoespaciado.

2. Nociones preliminares

2.1. Forma de trabajar con AsciiDoc

Crear un documento en AsciiDoc implica dos pasos fundamentales.

  1. En el primer paso escribimos el documento en un fichero de texto (Fichero Fuente) en el que, junto con el contenido propiamente dicho de nuestro documento incluimos una serie de marcas mediante las que describimos cómo se debe convertir y formatear el documento. A estas marcas las llamaré, genéricamente, marcas de formateo aunque, además del formateo de ciertos fragmentos, estas marcas permiten describir la estructura del documento, la función especial que en él desempeñan ciertos fragmentos, y otras varias características del documento.

  2. Una vez hemos escrito nuestro fichero fuente, le aplicamos un programa conversor que, a partir del fichero original, crea una nueva versión del mismo, en HTML, DocBook, ManPage o PDF en la que se aplican las instrucciones de formateado incluidas en el fichero fuente. A este segundo paso se le suele llamar procesado del documento.

2.1.1. El fichero fuente

Los ficheros fuente de AsciiDoc son ficheros de texto que (como todos los ficheros de texto) se crean y manipulan con un editor de textos.

Sobre ficheros de texto propiamente dichos, si se tienen dudas, lo mejor es consultar la entrada correspondiente de la wikipedia. Los ficheros generados por aplicaciones como Microsoft Word, no son ficheros de texto sino ficheros binarios. Por eso ese tipo de programas no se consideran editores de texto, sino procesadores de texto.

En relación con el fichero fuente ha de tenerse en cuenta que:

  • Podemos escribirlo con cualquier editor de textos. Desde un editor sencillo, como NotePad para Windows, TextMate para Mac OS o Nano para Linux, a un editor potente y cargado con funciones adicionales, como sublime-text, Emacs o Vim.

    Para quien tenga curiosidad este documento se ha escrito, en parte con Geany, y en parte con Vim.

    A diferencia de otros lenguajes de marcado más populares, no hay ---hasta donde yo se--- ningún editor de textos especializado en la edición de ficheros AsciiDoc. Pero sí son muchos los editores de texto capaces de reconocer el lenguaje y ajustar el coloreado del texto a la sintaxis de AsciiDoc.

  • El fichero debe ser codificado en utf-8. La palabra "ASCII" con que empieza el nombre del lenguaje no se refiere a la codificación del fichero sino a la gama de caracteres utilizada en el marcado del documento.

    Si usted no sabe lo que es la codificación de un fichero de texto puede consultar en esta página de la wikipedia en inglés. Hay también una entrada para este tema en la wikipedia en español, pero, a mi modo de ver, si se entiende razonablemente bien el inglés, es más clara la versión en ese idioma. Desgraciadamente esto ocurre mucho con los artículos relativos a cuestiones informáticas.

    UTF-8 es, por otra parte, a día de hoy, la codificación más corriente en los sistemas informáticos (al menos en el mundo Linux/Unix), por lo que lo más probable es que esa sea la codificación por defecto en su sistema y no tenga que preocuparse por esta cuestión.

  • La extensión del fichero suele ser "adoc". El creador del lenguaje recomendaba usar "txt", que es la extensión general de los ficheros de texto; pero si estamos trabajando con un editor de textos capaz de reconocer la sintaxis de AsciiDoc a menudo es preferible usar la extensión «adoc» ya que la mayor parte de los editores de texto usan la extensión del fichero para decidir qué tipo de contenido hay en él y activar el módulo de reconocimiento de sintaxis adecuado.

    La razón por la que el creador del lenguaje recomendaba usar la extensión "txt" era porque opinaba que una extensión diferente podría provocar que algunos usuarios no supieran qué hacer con ese tipo de ficheros. Y, a fin de cuentas, uno de los objetivos del lenguaje era facilitar la lectura de los documentos AsciiDoc en su formato de texto original. No obstante eso lo dijo el autor ANTES de que el lenguaje se popularizara y los editores de texto incorporaran módulos para el reconocimiento de su sintaxis.

2.1.2. Procesado del documento

El documento lo procesaremos usando el programa asciidoctor (para obtener una versión HTML, DocBook o ManPage) o asciidoctor-pdf (para obtener una versión PDF). Ambos programas se ejecutan, en principio, desde una terminal. Para ejecutar el programa conversor, en una terminal hay que escribir

$> asciidoctor [Opciones] [Fichero_a_procesar]
NOTA: Con la secuencia «$>» pretendo representar el prompt del sistema. No forma parte del comando.

Por ejemplo:

$> asciidoctor -b html5 MiFichero.adoc

procesará el fichero denominado «MiFichero.adoc» y generará un nuevo fichero llamado «MiFichero.html» que podrá ser visualizado con cualquier programa visor de páginas web.

Y si lo que queremos obtener es un fichero PDF habría que escribir:

$> asciidoctor-pdf MiFichero.adoc

Lo hasta ahora dicho es lo imprescindible para empezar a trabajar con AsciiDoc. Más adelante (XX) se volverá a hablar del procesado del documento, pero con mucho más detalle.

2.2. Tipos de documento en AsciiDoc

AsciiDoc dispone de tres modelos de documento: llamados ---en inglés--- article (artículo), book (libro) y manpage (Página de Manual). Dependiendo del tipo de documento de que se trate, ciertos detalles de la conversión cambian.

Documentos tipo Artículo (article):

Se trata de documentos de extensión media, estructurados mediante secciones y subsecciones anidadas hasta en cinco niveles, que pueden y suelen contener un índice sistemático, un índice analítico, un abstract o resumen previo, una bibliografía, un glosario, etc. La mayor parte de los documentos técnicos y de los documentos académicos encajan en este tipo, el cual es el tipo de documento que AsciiDoc aplica por defecto.

Documentos tipo Libro (book):

Documentos más extensos que los artículos, que requieren un mayor nivel de anidamiento en el seccionado, y en los que se admiten algunos elementos adicionales tales como el prefacio o el colofón.

Documentos de tipo Página de Manual (manpage):

En Unix (y en los llamados sistemas Unix-Like, como Linux o MacOS) está previsto que las distintas aplicaciones instaladas ---especialmente las aplicaciones o comandos de consola--- proporcionen su propia página de ayuda, la cual se muestra en una terminal cuando es invocada con el programa 'man'. El nombre de este comando es una abreviatura de Manual pues se supone que el conjunto de páginas de ayuda de las distintas aplicaciones forman una especie de Manual del sistema. Las páginas Man están escritas en uno de los primeros lenguajes de marcas que fueron diseñados Roff, o en alguno de sus derivados (nroff, troff o groff). Este tipo de páginas de manual pueden escribirse en AsciiDoc y luego ser formateadas correctamente por el programa conversor.

Si no se le indica lo contrario, AsciiDoc asume que el documento que se está escribiendo es un documento de tipo article.

Para indicar explícitamente el tipo de documento que se quiere obtener, hay dos procedimientos:

  1. Mediante la opción -d de asciidoctor en el momento de la compilación. Y así, por ejemplo, para obtener un documento de tipo book deberíamos ejecutar el siguiente comando:

    $> asciidoctor -d book MiFichero.adoc
  2. Indicándolo explícitamente en el fichero fuente mediante lo que en AsciiDoc se denomina un atributo de documento. Por ejemplo:

    :doctype: book

Téngase en cuenta que si se usan simultáneamente los dos procedimientos, siempre prevalece el primero (opción -d del programa conversor).

2.3. Anatomía básica de un documento en AsciiDoc

La mayor parte de los documentos de AsciiDoc constan de:

  1. Una cabecera que recoge el título del documento, los datos relativos al autor o autores del mismo, así como otros elementos a los que me referiré genéricamente como atributos de documento y que tienen distintos usos.

  2. Ocasionalmente, entre el final de la cabecera y la primera sección del documento se incluye un texto preliminar al que en la jerga de AsciiDoc se le denomina Preámbulo. Su peculiaridad está en que se formatea con un tamaño de letra ligeramente superior al del resto del documento.

  3. Varias secciones con sus correspondientes subsecciones, mediante las que se estructura el contenido del documento.

  4. El contenido del documento propiamente dicho, el cual consta siempre, en su mayor parte, de texto, si bien también puede incluir algunos elementos no textuales como imágenes, hiperenlaces o fragmentos de audio o vídeo incrustados en el documento.

2.4. Algunos elementos del lenguaje

A continuación se explican, con cierto detenimiento, algunos de los elementos fundamentales de AsciiDoc. He dudado mucho sobre si incluir o no este apartado aquí: De un lado una explicación sistemática del lenguaje exige que sus elementos básicos se expliquen al principio. Pero, desde otro punto de vista, para el lector que no sepa todavía nada del lenguaje, estas cuestiones pueden resultar muy abstractas y de difícil comprensión. Si este es su caso, mi consejo es que, en la primera lectura de esta guía se omita este apartado (saltando directamente a la sección relativa a la Secciones, subsecciones y otras divisiones estructurales del documento), y que se vuelva a él, en una segunda o ulterior lectura, o cuando nos aparezca por primera vez alguno de los conceptos aquí explicados.

2.4.1. Los atributos de documento

Los atributos de documento son una especie de variables o palabras clave que almacenan un valor que queda así asociado al nombre del atributo. Este valor puede referirse a algún metadato del documento (por ejemplo, el título, o el nombre del autor), o indicarle al programa procesador cómo debe procesar el documento: si debe o no tener índice, si las secciones deben o no numerarse, qué tipo de documento se debe generar, etc.

Asignación de valor a los atributos

La sintaxis para atribuir cierto valor a un concreto atributo es la siguiente:

:NombreAtributo: Valor

Es decir: el nombre del atributo encerrado entre signos de dos puntos al principio de una línea, seguido de un espacio en blanco, y, a continuación, el valor del atributo. Por ejemplo:

:author: Antonio Hernández Pelegrín

asignará el valor 'Antonio Hernández Pelegrín' al atributo llamado 'author'

El valor asignable a cada atributo depende del tipo de atributo de que se trate. Algunos atributos admiten cualquier texto, otros sólo reconocen como valores válidos ciertas palabras, los hay que esperan un valor numérico y, en fin, también hay atributos que no necesitan ningún valor, sino que producen efecto simplemente siendo declarados.

Así, en los siguientes cuatro ejemplos:

:author: Antonio Hernández (1)
:doctype: article (2)
:sectnumlevels: 3 (3)
:sectnums: (4)
1 El atributo 'author' admite como valor cualquier cadena de texto. El texto, por otra parte, no se entrecomilla salvo que se quiera que las comillas formen parte del valor del atributo.
2 El atributo 'doctype' sólo reconoce como valores válidos el nombre de alguno de los tres tipos de documento previstos en AsciiDoc: 'article', 'book' o 'manpage'.
3 El atributo 'sectnumlevels' espera un valor numérico.
4 El atributo 'sectnums' produce su efecto simplemente con ser declarado en la cabecera del fichero. No necesita que se le asigne explícitamente ningún valor.
No se preocupe si no sabe para qué sirven los atributos que se acaban de mencionar. Su presencia aquí es sólo para que sirva como ejemplo de la variedad de valores que admiten los atributos. En su momento se explicaran todos ellos.

Como regla, para cada atributo hay que usar una línea distinta. O sea: no se puede incluir, en la misma línea, más de un atributo, y cada atributo sólo puede usar una línea. No obstante esta segunda regla tiene una excepción: Podemos escribir el valor de un atributo usando más de una línea siempre que usemos el carácter de escape (la barra invertida) antes del salto de línea intermedio.

En terminología informática relativa al tratamiento de textos, al carácter «\» se le llama carácter de escape. Este carácter hace que, en una secuencia de texto, el carácter que va inmediatamente detrás se interprete de cierta forma especial y distinta a como normalmente se interpretaría.

Por ejemplo:

:pareado: Esta poesía \
gusta mucho a mi tía

En el anterior ejemplo la barra invertida justo antes del salto de línea advierte a AsciiDoc de que el salto de línea que viene a continuación no debe ser procesado, y por tanto el contenido de la línea siguiente se añadirá al valor del atributo. De esta manera el atributo llamado 'pareado' tendrá como valor el de 'Esta poesía gusta mucho a mi tía'.

Pero si lo que queremos es que un salto de línea forme parte del valor del atributo, hay que añadir, justo antes del carácter de escape, el carácter + seguido de un especio en blanco, que indica a AsciiDoc que el próximo salto de línea es un salto duro, o sea, que debe ser mantenido (véase la sección relativa a los Saltos de línea duros). Por ejemplo:

:sextilla: Esta poesía + \
gusta mucho a mi tía. + \
A mi tío, por el contrario, + \
le parece necesario + \
que mis versos tan perversos + \
nunca salgan del armario.
Desactivar un atributo

Algunos atributos, como ya se ha dicho, producen efectos simplemente por ser declarados en el documento. Por ejemplo el atributo 'sectnums' que determina si al procesar el documento hay, o no, que numerar automáticamente las secciones. Estos atributos funcionan como una especie de conmutadores que pueden adoptar dos valores: Activados y desactivados. Se activan simplemente declarándolos en el documento, y se desactivan con alguna de las siguientes dos sintaxis:

:!NombreAtributo:
:NombreAtributo!:

es decir: el nombre del atributo precedido o terminado con una exclamación, y todo ello encerrado entre signos de dos puntos. Por ejemplo:

:sectnums: (1)
...
... (2)
...
:!sectnums: (3)
1 En esta línea se activa el atributo 'sectnums' de tal manera que a partir de ella las secciones se numerarán automáticamente.
2 Aquí se supone que hay un fragmento más o menos extenso de texto, con sus correspondientes secciones, todas ellas numeradas.
3 En este punto se desactiva el atributo, de tal modo que a partir de él las secciones dejarán de estar numeradas.
Cambiar el valor de un atributo

En cualquier punto del documento podemos cambiar el valor de un atributo simplemente volviéndolo a declarar y asignándole un valor diferente. En este caso el nuevo valor se aplicará a partir del punto en el que se produjo la redefinición del mismo.

Hay, no obstante, algunos atributos que por su propia naturaleza no pueden cambiar de valor pues afectan a alguna característica del documento que una vez establecida no puede alterarse. Estos atributos deben establecerse en La cabecera del fichero.

El atributo 'toc' nos sirve como ejemplo de este tipo de atributos. Determina si el documento tendrá o no un índice, así como el lugar en el que el índice se ubicará. Este atributo, por su propia naturaleza, no puede cambiar a lo largo del documento, pues no es posible que el documento empiece teniendo índice y termine sin tenerlo: o lo tiene o no lo tiene.

Recuperar el valor de un atributo en el cuerpo del documento

En cualquier punto del documento podemos recuperar el valor de un atributo al que previamente se le haya asignado algún valor, simplemente escribiendo su nombre entre llaves. Por ejemplo:

:author: Nicanor Parra (1)
Entre los poetas de lengua española de la segunda mitad del
siglo XX destaca {author}, quien ... (2)
1 Primero hemos asignado al atributo llamado 'author' un determinado valor. En el ejemplo se ha hecho de forma expresa pero, como en seguida se verá (en la sección titulada Atributos relacionados con los autores del documento), a ese concreto atributo se le puede asignar valor de otras maneras.
2 Al procesar el documento el programa procesador sustituirá el texto '{author}' por el concreto valor que ese atributo tenga en ese momento.
Asignar valor a un atributo en el momento de procesar el documento

También es posible asignar cualquier valor a cualquiera de los atributos predefinidos de AsciiDoc en la llamada al procesador, desde la línea de comandos de nuestro sistema. Ello se hace mediante la opción -a del programa asciidoctor. Por ejemplo:

$> asciidoctor -a doctitle="Prueba de AsciiDoc" MiFichero.adoc

La anterior orden invocaría a AsciiDoctor para que procese el fichero llamado «MiFichero.adoc» asignando al atributo «doctitle» (que es un atributo predefinido por el lenguaje) el valor "Prueba de AsciiDoc". Obsérvese como ahora sí se han usado comillas para el valor del atributo; pero ello es porque dicho valor incluía espacios en blanco, y la sintaxis de la shell en la que se ejecuta la orden asciidoctor exige que los valores de opciones en los que haya espacios en blanco se encierren entre comillas.

Si usamos este procedimiento para asignar algún valor a un atributo al que ya se le asigna valor en el fichero fuente, prevalecerá siempre el valor asignado en la llamada al procesador.

Atributos definidos por el usuario

AsciiDoc permite que el usuario defina sus propios atributos y les asigne el valor que desee; y así podemos asociar cualquier valor a una palabra clave, lo que, unido a la posibilidad de recuperar en cualquier punto del documento el valor de un atributo tiene muchas utilidades. Así, por ejemplo, podemos establecer un atributo que encierre una palabra compleja que se repetirá muchas veces en nuestro documento, con lo que nos ahorraremos el trabajo de teclearla tantas veces y evitaremos el riesgo de cometer alguna errata en ella.

Así, en el siguiente ejemplo, se define un atributo llamado «epd», se le asigna un valor, y luego se recupera dicho valor en el cuerpo del documento:

:epd: epanadiplosis
La {epd} es una figura retórica que consiste en repetir al
principio y al final de una cláusula las mismas palabras,
como en la habitual frase con que se anuncian los
espectáculos taurinos: «Seis toros, seis»...

El nombre que asignemos al atributo así definido no puede contener espacios en blanco ni puntos. Debe empezar por una letra, un dígito o un guión bajo (carácter de subrayado). Se admiten los nombres con letras mayúsculas, pero debe tenerse en cuenta que internamente AsciiDoc convierte el nombre de todos los atributos a minúsculas. Por tanto los atributos «TOC» y «toc» se considerán el mismo atributo.

2.4.2. Bloques

Desde la perspectiva de AsciiDoc, un documento consiste en un conjunto de bloques de texto apilados verticalmente, uno sobre otro, y separados unos de otros por una o más líneas en blanco. A estos efectos, para AsciiDoc son bloques los párrafos, los títulos de las secciones, las tablas, las listas ordenadas o desordenadas, etc.

Aunque acabo de decir que los bloques están separados unos de otros por una línea en blanco, esto tiene algunas excepciones que más adelante se verán. De momento, sin embargo, para entender bien la noción de Bloque es mejor imaginarlos todos ellos separados por líneas en blanco.

Los bloques, por su parte, son de distinto tipo. AsciiDoc identifica el tipo de cada bloque por el carácter o caracteres inicial. Y así, por ejemplo, si un bloque (es decir: una línea con texto precedida de una línea vacía) empieza con la secuencia "==" seguida de uno o más espacios en blanco, AsciiDoc sabrá que ese bloque es un título de Nivel 1, y lo formateará de acuerdo con ello. Pero si el bloque empieza con un guión seguido de un espacio en blanco, AsciiDoc asumirá que se trata de una lista desordenada. Y si el bloque empieza con el texto "WARNING:" escrito con mayúsculas y terminado con ":", AsciiDoc asumirá que se trata de una admonición, etc…​ Hay muchos tipos distintos de bloque, y lo que aquí interesa es señalar que AsciiDoc identifica el tipo de cada concreto bloque fijándose en cómo empieza el bloque. Los bloques normales que no empiezan con ningún carácter o secuencia especial, serán tratados como párrafos ordinarios de texto.

Lo interesante de los bloques está en que en AsciiDoc todo bloque puede tener:

  • Un título.

  • Un conjunto de atributos que afecten a cómo se formateará.

Título de bloque

Todo elemento de bloque ---y recuérdese que, para AsciiDoc, los párrafos son elementos de bloque--- puede tener un título que será formateado de una forma especial dependiendo del tipo de bloque de que se trate.

AsciiDoc identifica que una línea que empiece por un punto no seguido de un espacio en blanco y que esté justo encima del inicio de un bloque, constituye el título de dicho bloque. Por ejemplo:

Bla, bla, bla... (1)
.Cuidado con los hombres-lobo (2)
Es una verdad universalmente admitida que
las personas alérgicas a los ácaros de los
perros también son alérgicas a los hombres
lobo, por lo que deben tener cuidado antes
de aventurarse a salir en las noches de
luna llena.
1 Texto del párrafo anterior
2 La línea que está encima del párrafo se identifica como título del mismo por empezar por un punto no seguido de ningún espacio en blanco.

En los párrafos normales el título se coloca al principio del párrafo, y con otro tipo de letra y color. Y así el ejemplo anterior se formatearía del siguiente modo:

Bla, bla, bla…​

Cuidado con los hombres-lobo

Es una verdad universalmente admitida que las personas alérgicas a los ácaros de los perros también son alérgicas a los hombres lobo, por lo que deben tener cuidado antes de aventurarse a salir en las noches de luna llena.

En otro tipo de bloques el título se formatea de manera diferente. Lo que importa aquí es tener claro que AsciiDoc identifica como título toda línea que, ubicada al principio de un bloque, empiece por un punto no seguido de un espacio en blanco.

Atributos de bloque

A los elementos de bloque se les puede asignar una serie de propiedades o atributos de bloque. Estos se indican entre corchetes en la línea inmediatamente anterior al inicio del bloque. Por ejemplo:

[.text-center]
Este párrafo se mostrará centrado
Si el bloque tiene un título, que también se debe indicar en la línea inmediatamente anterior a su inicio, es indiferente que se ponga antes el título y después los atributos, o al revés.

Como los atributos de bloque funcionan de modo similar a los atributos de elementos en línea, se dirá más sobre los atributos después de haber explicado lo que son los elementos en línea.

Indicación expresa del tipo de bloque

Antes se ha dicho que hay distintos tipos de bloques, y que AsciiDoc los identifica por los caracteres iniciales del bloque. Pero, hay tipos de bloque que se pueden indicar expresamente escribiendo su nombre entre corchetes al principio del bloque. Por ejemplo:

[example]
Este párrafo es un ejemplo, que se formateará
para que quede claramente diferenciado del
flujo del texto normal.
Este párrafo es un ejemplo que se formateará para que quede claramente diferenciado del flujo del texto normal.

Se observará que la forma de indicar expresamente el tipo de bloque de que se trata es igual a la forma de indicar los atributos de un bloque. Eso es así porque, en realidad, el tipo de bloque es un atributo del bloque. Es además un atributo posicional que, si se indica expresamente, debe ser el primer atributo.

Bloques abiertos

Si se desea agrupar varios bloques, para asignarles unos mismos atributos, se usa la siguiente sintaxis:

.Título (1)
[Lista de atributos] (2)
--
Bla, bla, bla, bla bla.
Bla, bla, bla, y más bla (3)
Bla, bla, bla, bla bla, bla, bla, bla. Bla
--
1 Título a aplicar al conjunto de bloques agrupado. Es opcional.
2 Atributos a aplicar al conjunto de bloques que se van a agrupar. También es opcional.
3 Obsérvese que el material a agrupar está enmarcado entre dos líneas idénticas que contienen solamente dos guiones. La primera línea indica donde empieza la agrupación, y la segunda línea indica dónde termina.

El mecanismo de los bloques abiertos se usa, principalmente, para agrupar párrafos.

2.4.3. Elementos en línea

Un elemento en línea es un fragmento de texto dentro de un bloque, que debe formatearse de cierta manera. Por ejemplo: si queremos indicar que cierta palabra o frase debe ir en cursiva, o en negrita, o se debe escribir en color azul…​ Todos esos fragmentos de texto formateados de manera diferente a como se ha de formatear el bloque en el que se encuentran son lo que AsciiDoc llama Elementos en línea.

En los elementos en línea es preciso indicar expresamente dónde empiezan y dónde acaban. Para ello se usa uno o dos símbolos al principio y al final del fragmento. El símbolo a usar depende del tipo de elemento en línea de que se trate. Por ejemplo: para indicar que un fragmento de texto ha de ir en cursiva, hay que encerrarlo entre guiones bajos:

Este texto va en letra normal, _y
este otro texto va en cursiva_.

Este texto va en letra normal, y este otro texto va en cursiva.

Los elementos en línea también pueden tener atributos, los cuales también se indican entre corchetes al principio del elemento. Por ejemplo:

Este texto va en letra normal,
[.red]_y este otro texto va en cursiva
y en color rojo_.

Este texto va en letra normal, y este otro texto va en cursiva y en color rojo.

2.4.4. Más sobre los atributos de bloque o de elemento en línea

Nombre y valor del atributo

En teoría un atributo (de bloque o de elemento en línea) se compone de dos partes: Nombre del atributo y valor del atributo. Y así, en el siguiente ejemplo, a la sección de primer nivel titulada "Primera Sección" se le asigna el atributo "id" con el valor "MiIdentificador".

[id=MiIdentificador]
== Primera Sección

Primero escribimos el nombre del atributo, luego el signo de igualdad, y después el valor asignado al atributo. Si queremos indicar dos o más atributos, éstos se separan unos de otros por una coma. Por ejemplo:

[id=MiIdentificador, options=discrete]
== Una sección "aparente"
Abreviaturas de tipo de atributo

Sin embargo, en la práctica esta forma de atribuir valores a los atributos se usa pocas veces, pues AsciiDoc proporciona una abreviatura para los tres nombres de atributo más corrientes que son 'options', 'id' y 'role':

«Options» (Optiones) es un nombre claro: este tipo de atrbuto está pensado para indicar diferentes opciones que varían según el tipo de objeto de que se trate. El atributo Id sirve para referencias internas y saltos dentro del documento (ver referencias cruzadas). Pero el nombre 'Role' para un tipo de atributos no resulta demasiado claro. Está tomado de CSS (Hojas en cascada para HTML). Explicarlo aquí excede de la finalidad de esta guía, por lo tanto lo tomaremos sólo como un nombre. En este enlace puede consultarse el significado original de este tipo de atributos.
  • El atributo "options" se abrevia como '%'.

  • El atributo "id" se abrevia como '#'.

  • El atributo "role" se abrevia como '.'

Cuando se usan estas abreviaturas, la abreviatura se antepone al valor del atributo sin necesidad de usar el signo "=".

Por tanto las siguientes declaraciones son equivalentes

[.text-center]
[role=text-center]
---
[id=MiIdentificador]
[#MiIdentificador]
---
[options=collapsible]
[%collapsible]

Si se quiere indicar más de un atributo, y éstos se indican por su nombre y valor, se deben separar unos de otros por comas. Pero si se indican usando las abreviaturas, no es preciso usar las comas. Por ejemplo:

[.text-center.purple]

indica que el bloque que viene a continuación debe centrarse y escribirse en color púrpura.

Atributos posicionales

Un tipo especial de atributo son los llamados atributos posicionales que se caracterizan porque en ellos AsciiDoc usa para identificar al atributo, no un nombre o una abreviatura de atributo, sino su posición en la lista de atributos. Por ejemplo:

[quote, García Márquez, Cien años de soledad]
Muchos años después, frente al pelotón de fusilamiento,
el coronel Aureliano Buendía había de recordar aquella
tarde remota en que su padre lo llevó a conocer el hielo.
Muchos años después, frente al pelotón de fusilamiento, el coronel Aureliano Buendía había de recordar aquella tarde remota en que su padre lo llevó a conocer el hielo.
— García Márquez
Cien años de soledad

En este ejemplo AsciiDoc atiende a la posición de cada atributo y asigna el primer atributo al tipo de párrafo (en este caso quote que se usa para citas literales), el segundo atributo de la lista se asigna al autor de la cita, y el tercer atributo al título de la obra de la que procede la cita.

3. La cabecera del fichero

Tal y como antes se dijo los ficheros AsciiDoc generalmente empiezan por una cabecera en la que se recogen los datos relativos al título, a los autores así como otrascaracterísticas principales del documento final, una vez haya sido procesado por el programa conversor.

La cabecera es opcional; pero si existe ha de encontrarse al principio:

  1. Debe empezar en la primera línea del documento que no sea un comentario (ver Comentarios) o una línea en blanco.

  2. No se admiten en la cabecera líneas indentadas por el lado izquierdo ni líneas en blanco.

  3. Cada elemento de la cabecera ha de ocupar exactamente una línea; aunque no hay límites respecto del número de caracteres que ésta puede tener.

Es decir, dentro de un elemento de la cabecera no puede haber ningún salto de línea. El salto de línea es el carácter que se introduce desde el teclado con la tecla "Intro", también llamada "Enter" o "Return". Ese carácter a veces es introducido automáticamente por el editor de textos cuando la longitud de la línea supere cierto número de caracteres. Si ese es nuestro caso, conviene inhabilitar esa función del editor mientras se escribe la cabecera, o estar pendiente para asegurarnos de que en ella no se introduce automáticamente ningún salto de línea.

La cabecera se separa del resto del documento por una o varias líneas en blanco.

3.1. Las líneas de título autor y revisión

El contenido típico de la cabecera incluye el título, los datos del autor, y los datos de revisión del documento. Este contenido se puede introducir mediante atributos de documento, o mediante las llamadas líneas de título, autor y revisión. Cuando se usa este segundo procedimiento esas tres líneas han de ser, necesariamente, las tres primeras líneas de la cabecera.

3.1.1. Línea de título (y de subtítulo)

El título del documento se introduce, normalmente, en la primera línea del fichero que no sea un comentario o una línea en blanco, mediante una línea (línea de título) que tiene la siguiente forma:

= Título : Subtítulo

Es decir:

  1. Empieza por el carácter «=» seguido de un espacio en blanco. Esos dos primeros caracteres de la línea, junto con el hecho de que la línea sea la primera del documento con texto que no sea un comentario, la identifican como línea de título.

  2. El texto que contenga la línea, excluidos los dos caracteres iniciales y los espacios en blanco que no sean estrictamente separadores de palabras, se asigna al título del documento.

  3. Por largo que sea el título, debe estar en una sola línea.

  4. Si en el texto del título existiera el carácter de los dos puntos, y el documento se convierte a DocBook, dicho carácter se usará para diferenciar el título propiamente dicho del subtítulo.

Sobre la distinción entre título y subtítulo hay que tener en cuenta que:

  • Sólo existe en determinados formatos del conversor. En HTML no se establece ninguna distinción. En DocBook sí. En otros formatos de salida, lo ignoro.

    He hecho algunas pruebas relativas a la conversión a PDF y en ellas no he encontrado ningún indicio de que se distinga entre un título y un subtítulo. Pero no estoy totalmente seguro.
  • Si en el título el carácter «:» aparece más de una vez, se asignará al subtítulo el texto que haya tras el último «:».

  • Es posible desactivar la distinción entre título y subtítulo, o cambiar la secuencia de caracteres que se usa para distinguir entre ambos elementos. Ello la sección relativa a Los atributos de documento.

3.1.2. Línea de autor

La segunda línea de la cabecera del fichero (línea de autor) recoge el nombre y correo electrónico del autor o autores. El formato de esta línea es el siguiente:

Nombre_Propio Nombre_Intermedio Apellido <correo_electrónico>
Obsérvese que este formato de nombre está pensando en el sistema de nombres propio de los Estados Unidos, en donde es corriente tener un Middle Name (Nombre intermedio) y en donde sólo hay un apellido. Más adelante se explica cómo adaptar esto al sistema español de nombre y dos apellidos.

El nombre intermedio y el correo electrónico, son optativos, y, si hubiera más de un autor, los nombres de los distintos autores — siguiendo el esquema que se acaba de indicar para cada uno de ellos — se incluirán en la misma línea, uno tras otro, separados entre sí por un punto y coma:

Autor1; Autor2; Autor3; ...

Si alguno de los elementos del nombre del autor (por ejemplo, el apellido) consta de más de una palabra, las distintas palabras que lo componen se deben separar entre sí, no por un espacio en blanco, sino por un guión bajo.

Por ejemplo:

Fernando Hortelano García <fhg@miorg.org> (1)
Fernando Hortelano_García <fhg@miorg.org> (2)
1 Si se indica así el nombre del autor AsciiDoc asumirá que «Hortelano» no es apellido, sino nombre intermedio; y que el apellido es «García».
2 En este segundo caso AsciiDoc asumirá (correctamente) que el nombre propio es «Fernando» y el apellido «Hortelano García».

3.1.3. Línea de revisión

La tercera línea del encabezado (línea de revisión) se dedica a recoger los datos relativos a la versión (o revisión) del documento y su fecha. Su formato es el siguiente:

Número-de-revisión, Fecha-de-revisión : Notas-sobre-la-revisión

De estos tres elementos sólo el primero es obligatorio:

  • El número de revisión ha de ser, como su propio nombre indica, un número compuesto exclusivamente de dígitos y puntos. Por ejemplo «1.0», o «2.5». Se puede incluir algún texto delante del número propiamente dicho como, por ejemplo, «Versión 1.0", pero AsciiDoc descartará dicho texto.

  • El número de revisión se separa de la fecha de revisión por una coma. El valor de la fecha se puede indicar en formato de fecha, o de cualquier otra forma.

  • Todo el texto que pueda haber en la línea de revisión detrás de los primeros dos puntos se considera "Notas de revisión", un pequeño comentario, opcional, sobre la versión del documento.

Por ejemplo, si en la línea de revisión hemos escrito:

Versión 1.0, marzo de 2024: Versión preliminar

AsciiDoc extraerá los siguientes metadatos de esta línea:

  • Nº de versión: «1.0».

  • Fecha de la versión: «marzo de 2024».

  • Notas de la versión: «Versión preliminar».

3.2. Introducción de la información sobre título, autores y revisión del documento mediante atributos

Habitualmente el título, autores y revisión del documento se introducen mediante las correspondientes líneas que se acaban de explicar; que deben estar en el fichero fuente exactamente en el orden en el que se han explicado. A partir de ellas AsciiDoc extrae los metadatos del documento y los va asignando a su correspondiente atributo. Pero también es posible indicar el valor de estos atributos mediante atributos de documento.

3.2.1. Atributos relacionados con el título del documento

En relación con el título del documento AsciiDoc predefine los siguientes atributos:

doctitle

Almacena el título del documento.

title-separator

Almacena la secuencia de caracteres que se usa para separar el título del subtítulo. Es útil cuando nuestro título contiene el carácter ":" pero con él no se quiere separar el título del subtítulo.

Para conseguir que no haya separación entre el título y el subtítulo podemos asignar a este atributo un valor vacío, o una secuencia de caracteres que no está presente en el texto del título. Por ejemplo:

:title-separator:
:title-separator: ;;
notitle

Este atributo determina que no se imprima el título en el documento final, pero se mantenga como metadato del mismo. Esto puede ser útil, por ejemplo, al convertir nuestro documento a HTML: la ventana del navegador incluirá el título del documento (pues los navegadores leen ese título de los metadatos) pero en el cuerpo del documento no habrá ninguna etiqueta que imprima el título.

3.2.2. Atributos relacionados con los autores del documento

Si sólo hay un autor del documento, los metadatos del mismo, que AsciiDoc extrae de la línea de autor, son los siguientes:

author

Recoge el nombre completo del autor.

firstname

Recoge el primer nombre del autor; al que en español llamamos nombre propio o, a veces (para los católicos), nombre de pila.

middlename

Recoge lo que en la cultura anglosajona se denomina nombre intermedio: un segundo nombre propio que es allí mucho más habitual que en la cultura española, donde también hay nombres compuestos pero no es algo tan habitual; aparte de que el nombre compuesto no cumple exactamente la misma función que el nombre intermedio anglosajón.

lastname

Recoge el apellido o apellidos del autor.

authorinitials

Recoge las iniciales del autor construidas a partir de la primera letra de firstname, la primera letra de middlename y la primera letra de lastname.

email

Recoge el correo electrónico del autor.

Si hubiera más de un autor, al nombre de cada uno de estos atributos se le añade la secuencia «_<n>» donde «n» representa el número de autor de que se trate; y así, por ejemplo, author_1 recogería el nombre completo del primer autor, y lastname_3, el apellido del tercer autor.

Si asignamos un valor a author y no asignamos expresamente ningún valor a los demás atributos que recogen el nombre del autor, AsciiDoc los calculará a partir del nombre del autor. De la misma manera, si asignamos valor a firstname, middlename y lastname, pero no asignamos ningún valor concreto a author, AsciiDoc lo calculará a partir del valor de dichos atributos. Pero si asignamos expresamente algún valor a todos los atributos, AsciiDoc no realizará ningún ajuste, incluso aunque el contenido de estos atributos sea inconsecuente.

Tratándose de nombres españoles, es conveniente tener en cuenta que:

  • Incluso en el caso de los nombres compuestos tales como «José Antonio», o «María del Carmen», el segundo nombre propio no equivale a lo que los anglosajones llaman «middlename», por lo que lo correcto sería asignar el nombre compuesto entero a firstname.

  • Cuando asignamos directamente un valor a firstname, middlename, o lastname, como AsciiDoc no tiene que descomponerlos, no importa si alguna de las partes del nombre consta de más de una palabra: podemos — y debemos — separar las distintas palabras mediante espacios en blanco, como en los siguientes ejemplos:

    :firstname: Miguel Ángel
    :lastname:  Pérez Martínez.
  • Por el contrario, si asignamos el nombre completo en la línea de autor, o al atributo author, para que sea el propio AsciiDoc quien lo descomponga en sus distintos elementos, cuando uno de los elementos conste de más de una palabra, dichas palabras hay que separarlas con un guión bajo en lugar de con un espacio en blanco. Por ejemplo:

    :author: Miguel_Ángel Pérez_Martínez
  • Tratándose de nombres españoles, AsciiDoc raramente determina correctamente las iniciales. Si queremos hacer uso de este atributo, lo mejor es establecer expresamente su valor, sin fiarnos demasiado del que AsciiDoc le asigne automáticamente.

3.2.3. Atributos relacionados con la revisión del documento

Hay cuatro atributos relacionados con la línea de revisión: El valor de los tres primeros lo extrae AsciiDoc automáticamente a partir de la línea de revisión, si la hay, mientras que el cuarto tiene un valor predefinido.

revnumber

Número de revisión del documento.

revdate

Fecha de la revisión del documento.

revremark

Observaciones o notas a la revisión de que se trate.

version-label

Etiqueta a usar antes del valor de revdate en el caso de que estemos convirtiendo nuestro fichero fuente a algún formato de salida en el que se imprima el número de revisión. El valor por defecto de este atributo es «Version». En documentos redactados en español debemos cambiarlo por «Versión», con tilde. Esto se haría mediante la siguiente línea en la cabecera del documento:

:version-label: Versión

Véase, no obstante, sobre esta última cuestión la sección relativa a cómo Españolizar nuestro documento.

3.3. Otros aspecto globales del documento configurables en la cabecera

Además de los datos relativos al título, a los autores y a la revisión, en la cabecera del fichero puede asignársele valor a cualquier atributo. En la práctica los atributos que más habitualmente se añaden son los siguientes:

backend

Informa al procesador (asciidoctor) del formato de salida que se desea. Esto también se puede indicar al invocar al programa conversor (XX).

description

Contiene una pequeña descripción del contenido del documento. Esta descripción forma parte de los metadatos del documento final, pero no se imprime en él.

docinfo

Indica el nombre de un fichero con contenido adicional para la cabecera del fichero convertido. Véase en XX.

doctype

Indica el tipo de documento que estamos generando: article, book o manpage. Véase al respecto lo dicho en la sección Tipos de documento en AsciiDoc.

keywords

Una lista de palabras clave, separadas por comas, que ayudan a clasificar el documento teniendo en cuenta su contenido, y por lo tanto, a los sistemas de búsqueda e indexación automática de documentos. Es bastante habitual incluir esta lista de palabras clave en los documentos técnicos, incluyendo los documentos académicos.

lang

Almacena el idioma principal del documento. Véase, sobre este atributo, lo que se dice en la sección Españolizar nuestro documento.

nofooter

En determinados formatos de salida se establece automáticamente un pie de página, normalmente con el número de página. Si establecemos este atributo impediremos que eso ocurra, de tal modo que la versión procesada no tendrá pie de página.

noheader

Similar al anterior, pero este atributo afecta a la posible impresión de una cabecera en el borde superior de las páginas.

noheaderfooter

Equivale al uso simultáneo de los dos atributos anteriores.

Los tres últimos atributos mencionados, nofooter, noheader y noheaderfooter, son atributos booleanos, lo que significa que: no necesitan ningún valor concreto, sino que producen efecto simplemente con que en el fichero fuente se les recoja. Por ejemplo:

:nofooter:

hará que el fichero de salida tras el procesado carezca de pies de página.

También se suelen incluir en el documento los atributos que controlan la existencia o no de un índice automático, así como su aspecto y contenido. Estos atributos se explican en XX.

3.4. Españolizar nuestro documento

AsciiDoc prevé el atributo lang para establecer en él el idioma principal del documento. Su formato es:

:lang: Idioma

donde Idioma es la abreviatura correspondiente al idioma de que se trate; esta abreviatura coincide con la nomenclatura internacional establecida por la tabla ISO-639-1; de tal manera que el español se representa como «es», el francés como «fr», el inglés como «en», etc.

No obstante, por alguna razón que no alcanzo a comprender, ni el procesador asciidoctor ni tampoco asciidoctor-pdf traducen las etiquetas que ellos mismos generan al idioma establecido en el atributo lang, sino que estas por defecto están en inglés, salvo que expresamente las traduzcamos en el propio fichero fuente, estableciendo el valor de los atributos que controlan a cada una de las etiquetas.

Por el contrario, los procesadores originales de AsciiDoc (asciidoc y a2x) si traducen las etiquetas y rótulos al idioma establecido por el atributo lang.

En la próxima tabla se recoge el nombre de los atributos predefinidos que controlan el contenido de las etiquetas generadas por el procesador, así como el valor por defecto de cada uno de ellos:

Nombre de atributo

Valor por defecto

appendix-caption

Appendix

appendix-refsig

Appendix

caution-caption

Caution

chapter-refsig

Chapter

chapter-signifier

Chapter

example-caption

Example

figure-caption

Figure

important-caption

Important

last-update-label

Last updated

listing-caption

(vacío)

manname-title

NAME

note-caption

Note

part-refsig

Part

part-signifier

Part

preface-title

(vacío)

section-refsig

Section

table-caption

Table

tip-caption

Tip

toc-title

Table of contents

untitled-label

Untitled

version-label

Version

warning-caption

Warning

Se observará que los atributos relacionados con el nombre de algunas unidades estructurales (part y chapter) parecen estar duplicados, pues para cada uno de ellos hay dos atributos uno con el nombre de la unidad estructural seguido de -signifier y el otro con el mismo nombre seguido de -refsig. En estos casos el primer atributo controla el nombre que se le asigna a la unidad estructural de que se trate y que eventualmente puede que se imprima como parte del título de la sección; el segundo atributo controla el nombre que para esa unidad estructural se devuelve en las referencias cruzadas.

De modo que para conseguir que el índice de contenido de nuestro documento se denomine «Índice sumario» y no «Table of contents» basta con incluir en nuestro fichero fuente la siguiente línea:

:toc-title: Índice sumario

o también podemos establecer dicho valor en la llamada al procesador desde la línea de comandos:

$> asciidoctor -a toc-title="Índice sumario" MiFichero.adoc

Estos procedimientos, sin embargo, tienen el inconveniente de que si habitualmente solemos escribir documentos en español, resulta muy pesado ir traduciendo en todos nuestros documentos, todas las etiquetas. Por ello lo mejor es automatizar la traducción creando (o descargando) un fichero con todas las traducciones y usar la directiva include para cargar en nuestro fichero fuente el fichero con la traducción de todas las etiquetas.

Sobre la directiva include, véase la sección XX.

En el repositorio de AsciiDoctor existe ya un fichero con la traducción al español de todas las etiquetas generadas por AsciiDoc. El fichero se denomina attributes-es.adoc. Podemos descargarlo en nuestro directorio local, o en el directorio de nuestra elección y, si alguna de las traducciones allí contenidas no nos gusta, editar el fichero y cambiarla. Una vez que disponemos de un fichero con las traducciones a nuestro gusto, podemos incluirlo en cualquier otro fichero fuente de AsciiDoc simplemente escribiendo en el preámbulo del documento en el que hay que cargar las traducciones la siguiente línea:

include::attributes-es.adoc[]

suponiendo que hayamos mantenido ese nombre para el fichero con las traducciones. Si el fichero a cargar no está en nuestro directorio de trabajo, tendremos que indicar en include la ruta de acceso al fichero (absoluta o relativa).

Si es corriente que escribamos documentos en diferentes idiomas, podemos descargar del repositorio de AsciiDoctor los ficheros con las traducciones de los idiomas con los que solemos trabajar, e incluir en el preámbulo de nuestros ficheros fuente la siguiente línea:

ifdef::lang[include::attributes-{lang}.adoc[]]
Para comprender bien esta línea, es imprescindible ver primero la información relativa a la compilación condicional y a la directiva include.
Auto-evaluación

Estimo que, con lo que ya se ha explicado en esta guía, el lector está en condiciones de entender todos los elementos de la anterior línea y por tanto, como ejercicio, propongo su análisis detenido.

  • La línea empieza invocando a la directiva de preprocesado ifdef que comprueba si el atributo o variable que se le indica ha sido o no establecido.

  • El atributo del que depende que la macro se ejecute es lang que, como sabemos, determina el idioma principal del documento.

  • Si el atributo lang está definido, entonces se ejecuta la orden encerrada entre corchetes que es la directiva include.

  • La directiva include cargará un documento llamado «atributes-{lang}.adoc».

  • En el nombre del documento a cargar hemos establecido una parte variable, que depende del valor del atributo lang. Por tanto si lang=es se cargará el fichero «attributes-es.adoc», pero si lang=it (italiano) se cargará el fichero «attributes-it.adoc».

4. Secciones, subsecciones y otras divisiones estructurales del documento

4.1. Tipos de secciones

El contenido de los documentos que tienen cierto nivel de complejidad, habitualmente se organiza mediante divisiones estructurales que pueden recibir diferentes nombres («partes», «capítulos», «secciones», etc.), y que, a su vez, pueden contener dentro de sí otras divisiones estructurales anidadas dentro de ellas (subsecciones, o subapartados). Para referirme genéricamente a todas estas divisiones estructurales usaré la palabra «sección».

En AsciiDoc se admiten hasta seis niveles de seccionado que se numeran a partir del 0. Por lo tanto el nivel de anidamiento de una sección puede ir de 0 a 5. Además, como regla, en un documento de tipo article o manpage sólo puede haber una sección de nivel 0 que coincide con el título del documento. En los documentos de tipo book por el contrario, puede haber varias secciones de nivel 0: la primera se asignará al título del documento, y las demás dividirán el documento en partes.

El anidamiento de las secciones ha de ser consistente: Dentro de una sección de nivel 0 puede haber una o más secciones de nivel 1; dentro de una sección de nivel 1 puede haber secciones de nivel 2, y así sucesivamente. Pero no puede haber saltos de nivel. Una sección de nivel 4, por ejemplo, sólo puede abrirse dentro de una sección de nivel 3, pero no podría iniciarse en el nivel 2 (o en el 1 o en el 0).

Si en nuestro fichero fuente cometemos una inconsistencia y, por ejemplo, iniciamos una sección de nivel 3 dentro de una sección de nivel 1, en el momento en el que el documento sea procesado, el programa procesador emitirá una advertencia de error, y ajustará el nivel de la sección en la que se ha cometido la inconsistencia. Pero el ajuste de nivel es parcial: La sección se numerará y se incluirá en el índice de contenido (si lo hay) de acuerdo con el nivel que debería tener, pero su título se formateará de acuerdo con el nivel que realmente tiene en el fichero fuente.

Para iniciar una sección nueva hay que indicar el punto del documento en el que ésta empieza y el nivel de la sección. Esto se puede hacer de dos maneras distintas: el modo antiguo (desaconsejado, pero que se mantiene por razones de compatibilidad) y el modo actual.

La sintaxis antigua (y desaconsejada) para especificar el nivel de anidamiento de una sección

En la primera especificación del lenguaje AsciiDoc se estableció un sistema para indicar el inicio de una sección, y su nivel de anidamiento en el que se usaban dos líneas consecutivas: La primera establece el título, y la segunda línea subraya a la primera con un carácter que representa el nivel del título. Por ejemplo:

Esto es un título del primer nivel (Nivel 0)
============================================

Aquí empieza un título del segundo nivel (Nivel 1)
--------------------------------------------------

Obsérvese que para indicar que el primer título es del primer nivel se ha subrayado con el signo «=»; y para indicar que el siguiente título es del segundo nivel el subrayado se ha hecho con guiones. Esto es porque, en esta sintaxis el nivel de anidamiento de un título se indica por el carácter con el que sea subrayado.

  • Un subrayado hecho con «=» indica que el título es de nivel 0.

  • Un subrayado hecho con «-» indica que el título es de nivel 1.

  • Un subrayado hecho con «~» indica que el título es de nivel 2.

  • Un subrayado hecho con «^» indica que el título es de nivel 3.

  • Un subrayado hecho con «+» indica que el título es de nivel 4.

El último nivel de anidamiento (nivel 5) no se puede indicar con esta sintaxis.

Sintaxis actual de las secciones

La sintaxis que se recomienda para establecer el inicio de una sección e indicar simultáneamente su nivel de anidamiento exige una sola línea que empieza por un número de signos «=» igual al nivel de anidamiento + 1 y sigue con el título de la sección:

= Título de una sección de nivel 0
== Título de una sección de nivel 1
=== Título de una sección de nivel 2
==== Título de una sección de nivel 3
===== Título de una sección de nivel 4
====== Título de una sección de nivel 5

Así por ejemplo, en este documento, las primeras secciones se establecen del siguiente modo:

= Creación y publicación...
== Introducción
...
== Nociones preliminares
==== Forma de trabajar con AsciiDoc

Si nos fijamos bien, la sintaxis para las secciones de nivel 0 es exactamente la misma que la sintaxis para establecer el título del documento cuando éste se establece mediante la línea de título. Ello es así porque en los documentos de tipo article y manpage AsciiDoc asume que el nivel 0 de seccionado se corresponde con el título del documento; siendo esta la razón de que en estos tipos de documento sólo pueda haber una sección de nivel 0; lo que además explica por qué AsciiDoc cuenta el nivel de las secciones desde el 0 y no desde el 1: porque en realidad el nivel 0 (en documentos que no sean de tipo book) no es una auténtica sección, sino que se corresponde con el título del documento.

Secciones al estilo MarkDown

AsciiDoc también reconoce el carácter "#" que se usa en MarkDown para indicar las secciones y su nivel.

Diferencias en el seccionado de los documentos de tipo book (libros)

El tratamiento de las secciones es ligeramente diferente en los documentos de tipo book:

  1. Puede haber más de una sección de nivel 0, en cuyo caso la primera sección de nivel 0 del documento se identificará con el título del mismo, siempre que se encuentre en la cabecera del documento; y las restantes secciones de nivel 0 se considerarán Partes del documento.

  2. Al formatear el documento, AsciiDoc añadirá a las secciones de nivel 0 la palabra «Parte» y a las secciones de nivel 1 la palabra «Capítulo» siempre y cuando se trate de secciones numeradas (véase más adelante XX).

    En realidad las palabras que se añadirán antes del número de la sección dependen de si el documento se ha españolizado o no (véase Españolizar nuestro documento). Por defecto las palabras a añadir son «Part» y «Chapter».

4.2. Numeración de las secciones

Por defecto las secciones no se numeran. Para numerarlas debemos activar la propiedad sectnums. Esta propiedad se puede activar y desactivar en cualquier punto del documento. Al procesar el documento cada vez que se llega a una nueva sección se comprueba el valor de sectnums, y, si está activado, esa sección se numera, y si no lo está, no se numera. Si deseamos que todas nuestras secciones se numeren, lo adecuado es incluir la activación de sectnums en la cabecera del documento.

Si queremos que una concreta sección no se numere, podemos desactivar para ella la propiedad sectnums y volverla a activar después. Pero también podemos usar una falsa sección.

Además del atributo sectnums, la numeración de las secciones está controlada por el valor del atributo sectnumlevels. Si no se asigna ningún valor a este atributo y se activa sectnums, se numerarán sólo las secciones pertenecientes a los niveles 1 a 3. Asignando un valor numérico entre 1 y 5 a sectnumlevels reduciremos o aumentaremos el número de secciones que se numerarán. Y así, por ejemplo,

:sectnums:
:sectnumlevels: 5

Hará que se numeren todas las secciones (salvo las de nivel 0). Eso mismo se conseguiría atribuyendo a sectnums el valor all:

:sectnums: all

Pero esta última orden afectaría también a las secciones especiales (véase Secciones especiales) que por defecto no se numeran, y que no se verían afectadas por ningún valor de sectnumlevels, pero sí se verán afectadas por sectnum=all.

sectnums no afecta nunca a las secciones de nivel 0. Estas, como ya sabemos, sólo pueden existir propiamente en los documentos de tipo book pues en el resto de documentos el nivel 0 se reserva para el título del documento que no es, en el sentido estricto de la palabra, una sección. Si en un documento de tipo book se usan las secciones de nivel 0 (que dividen al documento en partes), la numeración de éstas se debe activar mediante el atributo partnums.

4.3. Secciones especiales

Las tradiciones tipográfica y académica han establecido que ciertos tipos de publicaciones tengan o suelan tener ciertos apartados tales como, por ejemplo, una dedicatoria, un prefacio, un índice analítico, etc.

Para introducir alguna de estas secciones especiales, se sigue la siguiente sintaxis:

[Tipo-de-sección]
== Título de la sección

donde tipo de sección es el nombre, en inglés, del tipo de sección de que se trate: preface, abstract, appendix, etc. (véase más adelante un listado completo de las secciones especiales conocidas por AsciiDoc).

Por ejemplo:

[preface]
== Prefacio

En cuanto a cuáles son las concretas secciones especiales que AsciiDoc reconoce, éstas dependen del tipo de documento de que se trate:

  1. En documentos de tipo manpage no se ha previsto ningún tipo de sección especial.

  2. En documentos de tipo article se prevén cinco tipos especiales de sección: abstract, appendix, bibliography, glossary e index.

  3. En documentos de tipo book se admiten los siguientes tipos especiales: acknowledgments, appendix, bibliography, colophon, dedication, glossary, index. partintro y preface.

    La documentación oficial de AsciiDoctor afirma que en los documentos tipo book también se admite el tipo de sección especial abstract; sin embargo de acuerdo con mis pruebas el tipo abstract en un documento book es tratado como una sección normal. No he conseguido ver ninguna especialidad en ella.

No explicaré aquí para qué se usa cada una de estas secciones especiales, ni cómo se suelen formatear o en qué lugar del documento se suelen ubicar, pues ello excede al propósito de este documento que es sólo explicar el funcionamiento de AsciiDoc. Por ello tan sólo aclararé las siguientes cuestiones que tienen que ver con el comportamiento de AsciiDoc:

  • Por defecto estas secciones especiales no se numeran, salvo los apéndices (appendix), que, de acuerdo con la tradición tipográfica anglosajona, se numeran con letras: Apéndice A, Apéndice B, etc.

    Para conseguir que todas las secciones especiales se numeren hay que establecer el atributo sectnums con el valor de all:

    :sectnums: all
  • El índice analítico (index) sólo se incluye en el documento si en él se ha marcado algún término como entrada del índice. Véase lo que al respecto se dice en El índice analítico.

  • Aunque la tradición tipográfica que ha ido creando estas secciones especiales, también establece en qué lugar del documento debe ubicarse cada una de ellas, AsciiDoc no controla este aspecto y, por lo tanto, si ubicamos una sección de tipo preface, o abstract, al final del documento, no se produce ningún tipo de error.

Por otra parte, algunas de estas secciones especiales, como abstract, colophon, dedication, akcnowledgments o preface están pensadas para ir al principio del documento, lo que implica que dado que AsciiDoc controla la consistencia en el nivel del anidamiento, si estas secciones se encuentran al principio del documento, deberán ser secciones de nivel 1, lo que a su vez significa que su título se formateará con caracteres muy grandes (como el resto de las secciones de nivel 1). Pero, salvo en el caso de los prefacios, la tradición tipográfica que ha establecido el uso de resúmenes, dedicatorias o agradecimientos al principio de los documentos, también establece que estos apartados, o bien no tengan título, o, si lo tienen, que este se formatee con caracteres más pequeños que los que se usan para las secciones propiamente dichas.

Por ello, salvo en el caso de los prefacios (preface), creo que casi nunca nos interesará usar estas concretas secciones especiales que se suelen ubicar al principio del documento, pues obtendremos un resultado tipográficamente más correcto si el contenido de estas secciones se inserta como preámbulo y se formatea manualmente.

En el caso concreto del resumen inicial (abstract), se da, además, la circunstancia de que AsciiDoc proporciona un tipo de párrafo especial llamado también abstract que se formatea todo en cursiva; lo que puede ser más conveniente que usar una sección de tipo abstract como creo que se demuestra con el siguiente ejemplo, en el que un mismo resumen se formatea como párrafo tipo abstract y como sección de tipo abstract:

Un resumen formateado como párrafo de tipo abstract
.Resumen
[abstract]
El presente documento explica las complejidades de la filosofía
analítica cuando es practicada desde el sofá y con el televisor
encendido.
Resumen
El presente documento explica las complejidades de la filosofía analítica cuando es practicada desde el sofá y con el televisor encendido.
La documentación oficial de AsciiDoctor explica un procedimiento que permite evitar el inconveniente de que aquellas secciones especiales que deben aparecer al principio del documento hayan de ser secciones de nivel 1, y es aplicar la opción %untitled. Esta opción, sin embargo, parece ser que sólo tiene efecto si el formato de salida es DocBook.

Una cosa que sí podemos hacer para evitar el inconveniente del que estamos hablando, es asignar un nivel de seccionado inferior a estas secciones especiales. Por ejemplo:

[dedication]
==== Dedicatoria
A todas las personas a las que quiero, incluso a las que
son tan ingenuas como para quererme

Si hemos colocado la dedicatoria al principio del documento (como es habitual) esto generaría un aviso de error al procesar el documento, pues donde el procesador espera una sección de nivel 1, se encuentra con una sección de nivel 3. Pero ese error no impide el procesado del documento, y así conseguiremos que el título de la dedicatoria se formatee con un tamaño más adecuado para la tradicción tipográfica.

Pero mejor que esto — que, aunque funciona, genera un error de procesado — es utilizar una falsa sección en lugar de la sección especial.

4.4. Falsas secciones

Una sección falsa (sección discreta en la terminología de AsciiDoc) es un bloque de texto que ha sido formateado para que parezca el título de una sección, pero que en realidad no lo es y por lo tanto no se numera ni se integra en el índice de contenido del documento.

Su utilidad está en que:

  • Permite incluir en cualquier punto del documento una sección no numerada (o lo que parece ser una sección no numerada) sin necesidad de desactivar la numeración de secciones.

  • Permite incluir lo que aparentemente es una sección dentro de un bloque en el que normalmente AsciiDoc no lo autorizaría.

  • Permite saltarse las estrictas reglas del anidamiento de las secciones e incluir, por ejemplo, dentro de una sección de nivel 1, un título formateado como si fuera una sección de nivel 5.

Para introducir una falsa sección se sigue la siguiente sintaxis:

[discrete]
== Título de la falsa sección
En la documentación oficial corespondiente a la primera especificación de AsciiDoc se habla de unas «secciones flotantes» que yo creo que son lo mismo que las «secciones discretas» actuales. He probado a introducir una falsa sección usando la palabra float en lugar de discrete, y funciona perfectamente.

4.5. Hiperenlaces a las secciones

Una de las ventajas de los documentos electrónicos frente a los documentos en papel está en la interactividad que permite enlazar unas partes del documento con otras, de tal modo que mediante un simple click con el ratón sobre un enlace podemos saltar a algún otro punto del documento (o a algún documento externo…​ pero de eso se hablará en otro apartado).

Desde este punto de vista, las secciones son uno de los candidatos más obvios para convertirse en destino de un enlace por ello AsciiDoc:

  1. Por defecto genera automáticamente para cada sección del documento un atributo id que consiste en una cadena de texto única en todo el documento, que se puede usar internamente para generar un salto a la sección de que se trate.

    El atributo id, como todos los atributos, tiene su nombre en minúsculas. Sin embargo en general la documentación que habla de este tipo de atributos, suele referirse a ellos con el nombre en mayúsculas: ID. Así lo hago yo a lo largo de este documento, pero debe quedar claro que el nombre del atributo es en minúsculas.
  2. Permite, si le es más cómodo al autor del documento, introducir IDs personalizados así como múltiples IDs para una sola sección.

  3. Permite convertir con facilidad el título de una sección en un autoenlace.

En los próximos apartados se explicarán estas características. Téngase, no obstante, en cuenta que para ponerlas en práctica será preciso conocer también como generar el enlace propiamente dicho; lo que se explica en XX.

4.5.1. IDs automáticos de las secciones

Por defecto AsciiDoc genera automáticamente, para cada sección del documento, sea del nivel que sea, e incluso aunque se trate de una sección especial o de una falsa sección, un atributo ID que sirve para identificar el punto en el que empieza la sección como lugar de destino de un hipervínculo.

Es posible desactivar la generación automática de IDs de sección desactivando, en la cabecera del documento, el atributo sectids.

Para generar el ID AsciiDoc parte del título de la sección, y le aplica las siguientes transformaciones:

  • Todos los caracteres se convierten a minúsculas.

  • Se eliminan algunos caracteres que no pueden válidamente formar parte de un ID como, por ejemplo, las referencias HTML/XML.

  • Los espacios en blanco, guiones y puntos se sustituyen por el carácter de subrayado (_, guión bajo). Si alguno de estos caracteres separadores (espacios en blanco, guiones o puntos) está repetido, se deja sólo uno.

  • Se antepone a la cadena así obtenida un guión bajo.

  • Si la cadena de texto obtenida de acuerdo con las reglas anteriores ya ha sido asignada como ID a otro título, se añade un número para evitar que haya IDs repetidos.

Por ejemplo, el título de esta sección es «IDs automáticos de las secciones». Aplicando las reglas que se acaban de exponer, el ID de la misma sería:

_ids_automáticos_de_las_secciones

Hay dos atributos que nos permiten influir en cómo se calcula el ID automático de una sección:

idprefix

Contiene el carácter que se añade al principio del ID automático. Su valor, por defecto es _.

idseparator

Contiene el caracter que sustituirá a los espacios en blanco, guiones y puntos de separación de las palabras del título de la sección. Tiene por defecto el mismo valor que idprefix: _.

Y así, por ejemplo, si en el preámbulo de nuestro documento añadimos:

:idprefix: id_
:idseparator: -

El ID automático de esta sección pasaría a ser el siguiente:

id_ids-automáticos-de-las-secciones
La documentación de AsciiDoctor señala que el valor por defecto de idprefix puede ocasionar algún problema y recomienda que siempre se cambie el valor de dicho atributo. Si así se hace téngase en cuenta que un ID no puede empezar por un número.

4.5.2. IDs manuales

Trabajar con IDs automáticos no siempre es fácil. En primer lugar porque para utilizarlos debemos tomarnos el trabajo de calcular el ID de la sección con la que deseamos enlazar. Pero, sobre todo, porque si después de haber establecido un enlace a una sección a partir de su ID generado automáticamente, modificamos el documento y cambiamos en algo, por poco que sea, el título de la sección …​ Nuestro enlace pasará a estar apuntando a un ID inexistente.

Por ello creo que son preferibles los IDs manuales que no cambian aunque modifiquemos el título de la sección; y por ello yo suelo desactivar la generación automática de IDs escribiendo en el preámbulo del documento

:sectids!:

AsciiDoc admite tres sintaxis distintas con las que podemos asignar un ID manual a una determinada sección:

Diferentes formas de asignar un ID manual
   [id="TextoId"]
   == Título de la sección
   [#TextoId]
   == Título de la sección
   [[TextoId]]
   == Título de la sección

4.5.3. Autoenlaces en las secciones

AsciiDoc contiene dos atributos que activan dos funcionalidades de las que no consigo averiguar la utilidad y que sólo se me ocurre designar como autoenlaces.

  • La activación del atributo sectlinks provoca que en todas las secciones del documento se cree automáticamente un enlace que apunta a ella misma.

  • La activación del atributo sectanchors hace que se añada antes del título de la sección un enlace vacío que se muestra como un carácter § a la izquierda del título de la sección, cuando el ratón se mueve por encima de él.

Mi consejo a los lectores que sientan curiosidad por estos autoenlaces es que activen dichos atributos y comprueben el resultado. Si averiguan cuál es su utilidad práctica, les agradecería que me lo hicieran saber.

Los atributos sectlinks y sectanchors son independientes entre sí. sectlinks convierte los títulos de sección en enlaces, mientras que sectanchors añade un símbolo § al pasar el ratón por encima del título. Cada uno funciona de forma independiente.

5. El texto propiamente dicho

El texto se organiza en líneas que a su vez forman párrafos. Los párrafos se separan unos de otros, en el documento fuente, mediante líneas en blanco.

Desde el punto de vista del fichero fuente:

  • Son líneas en blanco las que carecen totalmente de texto, y también aquellas en las que, aunque hay texto, éste está compuesto exclusivamente por espacios en blanco o tabuladores.

  • La primera línea de cada párrafo no debe estar indentada por el lado izquierdo, pues de estarlo AsciiDoc tratará al párrafo como un párrafo literal (véase XX).

  • Por el contrario, la indentación izquierda del resto de las líneas que componen el párrafo es absolutamente indiferente, pues AsciiDoc la elimina en el proceso de normalización del texto.

5.1. Normalización y otras sustituciones en el texto

5.1.1. Normalización del texto

Cuando AsciiDoc procesa el fichero fuente, conforme va leyéndolo, aplica las siguientes acciones a todos los párrafos de texto que no sean párrafos literales:

  • El carácter de tabulación, así como los saltos de línea en el interior del párrafo, se convierten en caracteres en blanco.

  • Dos o más espacios en blanco consecutivos, incluyendo los tabuladores y saltos de línea, se reducen a uno sólo.

Es decir: el texto del párrafo se reduce a una sola línea. Esto permite a AsciiDoc recomponer el párrafo para ajustarlo a la anchura que haya de tener en el fichero final.

5.1.2. Saltos de línea duros

Los saltos de línea normales (también llamados blandos), como acabamos de ver, se suprimen para permitir a AsciiDoc reorganizar correctamente los párrafos. Por ello, para asegurarnos de que cierto salto de línea existente en el fichero fuente, sea mantenido en el fichero de salida, hay que convertirlo en un salto de línea duro. Ello se puede hacer de varias maneras:

  • Para convertir un salto de línea individual en un salto duro, se usa el carácter «+» precedido de un espacio en blanco, al final de la línea cuyo salto se quiere preservar. Por ejemplo:

    Al olmo viejo, hendido por el rayo +
    y en su mitad podrido, +
    con las lluvias de abril y el sol de mayo +
    algunas hojas verdes le han salido.
  • Para convertir todos los saltos de línea de un párrafo en saltos duros, se establece, al principio del párrafo en cuestión, la opción hardbreaks, tal y como se muestra en el siguiente ejemplo:

    [%hardbreaks]
    Recuerde el alma dormida,
    avive el seso y despierte
    contemplando
    cómo se pasa la vida,
    cómo se viene la muerte
    tan callando;
    cuán presto se va el placer,
    cómo, después de acordado,
    da dolor;
    cómo, a nuestro parecer,
    cualquiere tiempo pasado
    fue mejor.
  • Para conseguir que a partir de cierto punto del documento, los saltos de línea se consideren todos saltos duros se puede usar el atributo de documento hardbreaks. Como en el siguiente ejemplo:

    ...
    ... Texto con saltos de línea normales, blandos
    ...
    
    :hardbreaks:
    
    A partir de aquí los saltos de línea serán todos duros.
    ...
    ...
    
    :!hardbreaks:
    
    Los saltos de línea vuelven a ser blandos.
Hemos visto que hardbreaks funciona como atributo de documento, y también como atributo de párrafo. Los atributos de documento se explicaron en la sección Los atributos de documento; los atributos de párrafo (en realidad, de bloque) se explicarán en Atributos de elementos de bloque.

El atributo de documento hardbreaks-option produce el mismo efecto que hardbreaks, pero está diseñado para incluirse en la cabecera del documento consiguiendo así que absolutamente todos los saltos de línea del mismo se interpreten como saltos de línea duros.

5.1.3. Otras sustituciones en el texto

Además de la sustitución de espacios en blanco, tabuladores y saltos de línea, en el texto normal se aplican las siguientes sustituciones adicionales:

  • Sustituciones tipográficas: Ciertas secuencias de texto en el fichero fuente se convierten en el fichero definitivo en un carácter Unicode que normalmente no se puede introducir desde el teclado:

    • (C) se convierte en ©.

    • (R) se convierte en ®.

    • (TM) SE CONVIERTE EN ™.

    • -- se convierte en — , pero sólo si delante y detrás de la secuencia hay un espacio de blanco o un carácter de salto de línea.

    • ... (tres puntos consecutivos) se convierte en …​ (el carácter unicode para los puntos suspensivos).

    • -> se convierte en →.

    • => se convierte en ⇒.

    • <- se convierte en ←.

    • <= se convierte en ⇐.

    • ' se convierte en ' (el carácter unicode para el apóstrofe tipográfico).

  • Sustitución de caracteres Unicode referenciados: Unicode es la mayor tabla de caracteres que existe. En ella están recogidas los caracteres representativos de los alfabetos de prácticamente todas las lenguas vivas, y de muchas lenguas muertas, así como numerosos símbolos de todo tipo, incluidos muchos emojis. Todos los caracteres Unicode tienen asignado un número y un nombre. El número se indica, indistintamente en base 10 (número decimal) o en base 16 (número hexadecimal). En AsciiDoc una secuencia de caracteres que empiece por «&» y termine por «;», sin espacios en blanco entre ambos extremos, se interpreta como referencia a un carácter Unicode; y en el documento final, tal referencia se sustituirá por el carácter de que se trate. Se admiten tres clases de referencias de este tipo:

    &NombreUnicode; (1)
    &#NúmDecimal; (2)
    &#xNumHexadecimal; (3)
    1 El carácter unicode se identifica por su nombre. Por ejemplo &dagger; que se sustituye por †.
    2 El carácter unicode se identifica por su número decimal. Por ejemplo &#8225; que se sustituye por ‡.
    3 El carácter unicode se identifica por su número hexadecimal. Por ejemplo &#x1f600; que se sustituye por 😀
    En Internet podemos encontrar listados más o menos completos de los caracteres Unicode en los que se indique el número del carácter y, en ocasiones, el nombre. El número, por otra parte, a veces se indica sólo en decimal o en hexadecimal; y el nombre recogido en tales listados no siempre coincide totalmente con aquel por el que dicho carácter es reconocido por AsciiDoc. Una tabla de caracteres Unicode bastante completa la podemos encontrar en la wikipedia en inglés.
  • En cuanto a las comillas, simples y dobles, por defecto AsciiDoc no las transforma en comillas curvas, sino que genera comillas rectas. Para obtener comillas curvas, hay que encerrar el texto a entrecomillar, además de entre las comillas, entre acentos graves:

    "Este texto entrecomillado" se formateará con comillas rectas. (1)
    "`Este otro texto`" tendrá comillas curvas. (2)
    '`y este tercer texto`' tendrá comillas simples, también curvas. (3)
    1 Las dobles comillas, por sí solas no sufren ninguna transformación.
    2 Los acentos graves que envuelven el texto entrecomillado indica a AsciiDoc que las comillas deben ser curvadas.
    3 En este tercer caso, las comillas también serán curvadas, pero no dobles sino simples.

5.2. Formatos de carácter

5.2.1. Marcas de formato en línea

Para aplicar cierto formato tipográfico a uno o más caracteres consecutivos del párrafo se encierra el texto a formatear entre dos marcas que indican el inicio y el fin del fragmento que debe recibir el formato. En tal caso al texto encerrado entre estas marcas de formato se le considera un elemento en línea y a este tipo de formateo se le llama formateo en línea.

AsciiDoc clasifica los elementos que componen el lenguaje en dos grandes grupos: elementos de bloque y elementos en línea. Los elementos de bloque, como los párrafos, se colocan en el documento uno sobre otro en sentido vertical; mientras que los elementos en línea se colocan uno junto a otro, en sentido horizontal.

Las marcas de formato son las siguientes:

  • Texto en negrita: Asterisco (*).

  • Texto en cursiva: Guión bajo (_).

  • Superíndice: El acento circunflejo (^).

  • Subíndice: La tilde (~).

  • Fuente de monoespaciada: Acento grave.

  • Texto literal: El símbolo matemático de la suma (+).

  • Texto resaltado: El carácter llamado almohadilla (#).

Ejemplos de formato de carácter
*Texto en negrita*
_Texto en cursiva_
^Superíndice^
~Subíndice~
`fuente monoespaciada`
+Literal+
#Resaltado#

Texto en negrita
Texto en cursiva
Superíndice
Subíndice
fuente monoespaciada
Literal
Resaltado

Marcas simples y marcas dobles

Cuando el formato de carácter se va a aplicar a palabras completas, se usan marcas simples. Pero si la secuencia a formatear incluye fragmentos de palabras incompletas, la marca de formato se debe duplicar. Por ejemplo

    Esto es un *texto en negrita* y esto otro _está en cursiva_ (1)

    Las siglas de la ONU significan **O**rganización de las
    **N**aciones **U**nidas (2)
1 Las marcas para la negrita y para la cursiva son simples porque el formato aquí se aplica a palabras completas.
2 En este caso el formato se aplica sólo a algunas letras de las palabras, por lo que las marcas tienen que ser dobles.

En los formatos de subíndice y superíndice, que no suelen usarse para palabras completas sino para la última o últimas letras de una palabra (como, por ejemplo en H2o, o en m2, no hace falta duplicar las marcas de formato.

Texto literal y texto con fuente monoespaciada

Entre las marcas de formato hay dos que aparentemente producen el mismo efecto. Las he bautizado — porque no hay, o no conozco, palabras en nuestro idioma para referirse al tipo de formato que producen — como texto con fuente monoespaciada y texto literal, el primero se activa encerrando el texto entre acentos graves, y el segundo usa como marca el signo matemático de la suma (+).

Ambas marcas formatean el texto en el tipo de letra monoespaciada que era propio de las viejas máquinas de escribir así como de las terminales informáticas, y que se suele usar en la documentación sobre sistemas informáticos para representar lo que hay que teclear, o lo que se muestra en pantalla. Es el mismo tipo de letra con el que en este documento estoy representando los fragmentos originales que hay que escribir en el fichero fuente para obtener ciertos resultados.

La diferencia entre una y otra está en que los acentos graves se limitan a activar un determinado formato de carácter y nada más. Por el contrario el que he llamado texto literal, no sólo produce que el texto se formatee de cierta manera, sino que además desactiva cualquier otra posible marca de formato en su interior. Por ello lo llamo texto literal, porque ese texto se mostrará en el documento final tal y como se haya escrito, sin aplicar dentro de él formatos o sustituciones de ningún tipo.

El siguiente ejemplo creo que es clarificador de lo que se quiere decir:

Este texto `tiene una fuente monoespaciada y este
fragmento, además, *está en negrita*`. (1)

Este otro texto +también tiene fuente monoespaciada
pero *no está en negrita*+ (2)
1 El acento grave activa la fuente monoespaciada, y el asterisco la negrita. Se aplican ambos formatos.
2 El signo de la suma activa el texto literal: dentro de él se desactiva cualquier otro formato. Por ello AsciiDoc cuando encuentra el asterisco no lo interpreta como una activación de la negrita, sino, literalmente, como un asterisco.

El anterior fragmento de texto se formatearía, por lo tanto, de la siguiente manera:

Este texto tiene una fuente monoespaciada y este fragmento, además, está en negrita.

Este otro texto también tiene fuente monoespaciada pero *no está en negrita*

El texto literal es bastante útil en documentos como este en el que hay que hacer continua frecuencia a cómo se escribe algo que AsciiDoc interpretará de otra manera.

Anidamiento de marcas de formato

Los distintos formatos de carácter pueden combinarse entre sí. No obstante, si en una misma frase conviven varias marcas de formato, que se abren cada una de ellas en palabras diferentes, el orden de cierre de las marcas debe ser coherente con el de la apertura, en el sentido de que estando activas más de una marca en un punto dado del documento, siempre hay que cerrar primero la última que se abrió, para que AsciiDoc pueda interpretar correctamente todas las marcas.

_Cursiva, *cursiva y negrita*_: Correcto (1)
_Cursiva, *cursiva y negrita_*: Incorrecto (2)
1 En la primera línea AsciiDoc puede identificar sin ninguna duda qué fragmento va en cursiva, así como que dentro del texto en cursiva hay un fragmento que va también en negrita.
2 Pero en la segunda línea AsciiDoc interpretará que el primer asterisco no es una marca de formato, sino que forma parte del texto que debe ir en cursiva.

Por otra parte, cuando en una misma palabra (o punto de la frase) se quieren activar simultáneamente varias marcas de formato, hay que aplicar también las siguientes dos reglas:

  1. El acento grave (fuente monoespaciada) debe ser siempre la marca más externa.

  2. El guión bajo (la cursiva) debe ser simpre la marca más interna.

El siguiente ejemplo creo que clarificará algo esta cuestión:

`*_Orden correcto_*`: Los distintos formatos conviven pacíficamente (1)

*_`Orden incorrecto`_*: El acento grave no se reconoce como marca de
formato. (2)
1 En este caso se respeta la regla de que el acento grave debe ser la marca exterior y el guión bajo la interior: Se aplican, por tanto, todos los formatos.
2 En esta línea AsciiDoc asume que el guión bajo es la última marca de formato, pues siempre debe ser la más interior, y, por tanto, no reconoce los acentos graves como indicadores de formato.

5.2.2. Atributos de elementos de formato en línea

Un fragmento de texto encerrado entre dos marcas de formato es, como he dicho antes, un elemento en línea. A estos elementos se les pueden aplicar ciertos atributos que afectan a su representación en el documento final. Para ello se usa el siguiente formato:

[Atributo]*Elemento en línea*

El atributo se indica, por su nombre, entre corchetes los cuales han de estar inmediatamente antes del inicio del elemento en línea, sin separarse de él por un espacio en blanco.

Por ejemplo: Si queremos aplicar el atributo underline que provoca que el texto al que se aplique se subraye, deberíamos escribir lo siguiente:

[.underline]*Texto en negrita y subrayado*

Texto en negrita y subrayado

Pueden establecerse simultáneamente varios atributos y así, por ejemplo, para establecer que un texto, simultáneamente, aparezca tachado y en color verde, escribiríamos

[.line-through.green]_Texto en cursiva, verde y tachado_

Texto en cursiva, verde y tachado

En relación con los atributos de elementos en línea, una de las marcas de formato que hemos visto en las secciones anteriores tiene especial importancia, la que introduce el que he llamado texto resaltado, para lo que se usa el carácter de la almohadilla (#).

La almohadilla, como marca de formato, tiene un doble uso:

  • Un fragmento de texto encerrado entre marcas de almohadilla, se formateará como texto resaltado, tal y como ya hemos visto.

  • Pero si delante de las almohadillas se establece algún atributo las almohadillas dejan de resaltar el texto y sólo sirven para delimitar el fragmento al que se aplicará el atributo.

Así en el siguiente ejemplo:

#Texto resaltado# + (1)
[.red]#Texto en color rojo(2)

Texto resaltado
Texto en color rojo

1 En la primera línea las almohadillas no van precedidas de ningún atributo y, por lo tanto, se interpretan como marcas de formato.
2 En la segunda línea las almohadillas van precedidas de un atributo entre corcheres y, por lo tanto, se interpretan como delimitadores del fragmento de texto al que se aplicará el formato.

5.2.3. Formatos de carácter adicionales que se especifican mediante atributos

Los atributos de elementos pueden ser de distintos tipos. Los que permiten añadir formatos de carácter adicionales a los que se introducen mediante marcas de formato son los que AsciiDoc llama role, o atributos de rol que se identifican porque al indicarlos su nombre se precede siempre de un punto, y así el atributo underline se indica como .underline.

El nombre de atributos de rol (role attributes) que usa AsciiDoc es muy poco claro respecto de la función de estos atributos. Se justifica sólo por la vinculación interna que este tipo de atributos tiene con los llamados selectores de rol de CSS. En este documento no puedo explicar estas cuestiones, pues son demasiado técnicas y exceden su finalidad. Por tanto tomemos la expresión atributos de rol sólo como un nombre que identifica a ciertos atributos que permiten establecer formatos de carácter adicionales.

La documentación de AsciiDoc no recoge de forma sistemática los atributos de rol. El siguiente listado recoge aquellos que yo he comprobado personalmente que funcionan. Los he ordenado por su finalidad:

  • Decoración del texto: underline (subrayado), overline (sobrelineado) y line-through (tachado).

  • Colores para el texto: aqua, black, blue, fuchsia, gray, green, lime, maroon, navy, olive, purple, red, silver, teal, white y yellow.

  • Colores para el fondo: Los mismos nombres que los de los colores para el texto, seguidos de -background: aqua-background, black-background, blue-background, fuchsia-background, gray-background, green-background, lime-background, maroon-background, navy-background, olive-background, purple-background, red-background, silver-background, teal-background, white-background y yellow-background.

    Ni los atributos de coloreado de texto ni los de coloreado del fondo funcionan en la conversión a PDF. Ignoro la razón.
  • Tamaños de letra: big (grande) y small (pequeña).

  • Tipografía para frases con : [.monospace]#monospace (fuente monoespaciada), strong (negrita) y emphasis (cursiva). Se usan con el marcador de resaltado: por ejemplo, [.monospace]#código# produce la palabra "código" con fuente monoespaciada.

Recuérdese que en los corchetes de indicación de los atributos, el nombre del atributo debe precederse de un punto; y que si se quiere indicar más de un atributo, no hace falta separarlos por espacios en blanco, el punto que precede al nombre es suficiente separación.

Todos los atributos de la lista anterior, salvo los relativos a los tamaños de letra, funcionan también como atributos de bloque (véase la sección Atributos de elementos de bloque).

5.3. Formatos de párrafo

5.3.1. Atributos de elementos de bloque

Los párrafos son, para AsciiDoc, elementos de bloque y, al igual que los elementos en línea, admiten atributos que afectan a cómo se formateará el párrafo. En el caso de los elementos de bloque los atributos se introducen entre corchetes en la línea inmediatamente anterior a aquella en la que empiece el párrafo (o bloque). Por ejemplo:

[.text-center]
Este párrafo se mostrará centrado.

Este párrafo se mostrará centrado.

También es posible agrupar varios párrafos de tal manera que un atributo se aplique a todos ellos. Eso se hace mediante lo que AsciiDoc denomina un bloque abierto. Los bloques abiertos son grupos de párrafos encerrados entre dos líneas idénticas que sólo constan de dos guiones. Así en el siguiente ejemplo se agrupan tres párrafos y se les aplica a los tres el atributo purple que asigna al texto el color púrpura.

[.purple]
--
Este párrafo es el primero del bloque abierto, y se formateará en
color púrpura.

Este segundo párrafo también irá en color púrpura.

[.text-right]
Y este tercer párrafo irá en color púrpura, y se alineará a la derecha.
--

Este párrafo es el primero del bloque abierto, y se formateará en color púrpura.

Este segundo párrafo también irá en color púrpura.

Y este tercer párrafo irá en color púrpura, y se alineará a la derecha.

5.3.2. Atributos para formatear los párrafos normales

Respecto de las características del párrafo, AsciiDoc resulta más limitado que en relación con los formatos de carácter. Podemos establecer la alineación, y, en parte, el tamaño de la letra del párrafo. También podemos aplicar a los párrafos todos los atributos de rol que se recogen en la sección Formatos de carácter adicionales que se especifican mediante atributos salvo los relativos al tamaño de la letra, pero hay características fundamentales de los párrafos para las que AsciiDoc carece de marca de configuración como, por ejemplo, el interlineado o los márgenes.

Aunque podemos conseguir un párrafo con los márgenes aumentados, creando una lista sin marcador de lista. Véase, más adelante, en XX.
Alineación del párrafo

La alineación general de los párrafos del documento depende del formato al que convirtamos nuestro fichero fuente: en HTML, por ejemplo, se aplica la alineación izquierda, y en PDF la justificada. Podemos no obstante establecer la alineación de algún o algunos párrafos concretos mediante los atributos .text-center, .text-left, .text-right, .text-justify que alinean el párrafo, respectivamente, al centro, a la izquierda, a la derecha o justificado.

Por ejemplo:

[.text-center]
Texto centrado.

[.text-right]
Texto alineado a la derecha.

[.text-left]
Texto alineado a la izquierda.

[.text-justify]
Texto justificado

Texto centrado.

Texto alineado a la derecha.

Texto alineado a la izquierda.

Texto justificado

Tamaño de la letra del párrafo

AsciiDoc dispone del atributo .lead para indicar que cierto párrafo debe ser destacado aumentando ligeramente el tamaño de su letra. Por ejemplo:

Este párrafo tiene la letra en tamaño normal.

[.lead]
Este segundo párrafo tiene la letra ligeramente incrementada.

Este párrafo tiene la letra en tamaño normal.

Este segundo párrafo tiene la letra ligeramente incrementada.

AsciiDoc aplica por defecto este atributo al primer párrafo del preámbulo; el cual es — como ya se dijo — el texto que puede haber entre el final de la cabecera y la primera sección del documento. Pero si deseamos que dicho párrafo tenga el mismo tamaño de letra que los demás, basta con establecer para él el atributo .normal.

5.3.3. Títulos en los párrafos y otros elementos de bloque

Todos los párrafos de AsciiDoc (en realidad todos los elementos de bloque) admiten un título, el cual se indica en la línea anterior al inicio del bloque de acuerdo con el siguiente formato:

.Título del bloque
Texto del bloque ...
...

La marca que indica a AsciiDoc que la línea contiene el título del bloque es el hecho de que dicha línea es la primera del bloque (en realidad no pertenece a él), empieza por un punto e inmediatamente detrás, sin espacio en blanco de separación, el texto del título.

Si el bloque al que se refiere el título tiene una lista de atributos entre corchetes (línea de configuración del bloque), en la mayor parte de los casos da igual que el título se incluya en la línea superior o en la línea inferior de aquella en la que se encuentra la lista de atributos. Así, por ejemplo, los siguientes dos fragmentos se formatearán exactamente igual:

.Canción del pirata (1)
[verse]
Con diez cañones por banda,
viento en popa a toda vela,
no corta el mar, sino vuela
un velero bergantín;
[verse]
.Canción del pirata (2)
Con diez cañones por banda,
viento en popa a toda vela,
no corta el mar, sino vuela
un velero bergantín;
Canción del pirata
Con diez cañones por banda,
viento en popa a toda vela,
no corta el mar, sino vuela
un velero bergantín;
1 En este primer fragmento el título se coloca por encima de la línea de configuración del párrafo.
2 En este segundo fragmento el título se coloca por debajo de la línea de configuración del párrafo; pero el resultado es el mismo.

5.4. Los párrafos especiales

5.4.1. Párrafos especiales en general

No todos los párrafos de un documento cumplen la misma función ni han de tener la misma forma. En este sentido AsciiDoc define ciertos párrafos especiales que cuando el documento es procesado para su conversión a HTML, DocBook o PDF, son formateados de una manera que se ajuste a la función que dichos párrafos representan.

Desde el punto de vista de la sintaxis de AsciiDoc, la forma o tipo de párrafo es un atributo del mismo que se indica del mismo modo que cualquier otro atributo de bloque (véase la sección Atributos de elementos de bloque): indicando el nombre del tipo de párrafo de que se trate entre corchetes en la línea inmediatamente anterior al inicio del párrafo. Si, además del tipo de párrafo, se quiere indicar algún otro atributo para el párrafo, es importante tener en cuenta que el tipo de párrafo debe ser el primer atributo que se establezca pues AsciiDoc identifica ese atributo posicionalmente.

AsciiDoc admite dos tipos de atributos: posicionales y con nombre. En los primeros no hay que indicar ningún nombre para el atributo, sino simplemente su valor: AsciiDoc determina a qué atributo asignar dicho valor, por la posición que el mismo ocupa en la lista de atributos. En el caso de los atributos con nombre hay que indicar el nombre del atributo y su valor. No obstante la sintaxis de AsciiDoc proporciona una abreviatura para el nombre de tres atributos muy corrientes: id (que se abrevia en #), options (que se abrevia en %) y role (que se abrevia en .).

Normalmente un párrafo especial, tal y como su nombre indica, ocupa exactamente un párrafo. No obstante

  • Siempre es posible agrupar varios párrafos mediante los llamados bloques abiertos (véase la sección Atributos de elementos de bloque).

  • Para algunos tipos concretos de párrafos especiales, también se admite una sintaxis que permite agrupar varios párrafos, conocida como bloques delimitados. En ella se delimita un grupo de párrafos mediante líneas idénticas compuestas con un carácter especial que permite identificar el tipo de párrafo especial de que se trata. Esto se aclarará en cada uno de los párrafos especiales que admiten esta sintaxis.

Por último, recuérdese que a todos los párrafos especiales, al igual que a cualquier otro elemento de bloque, se le puede poner un título tal y como se explica en la sección Títulos en los párrafos y otros elementos de bloque.

5.4.2. Las admoniciones

Tipos de admoniciones

Las admoniciones o advertencias son un grupo especial de párrafos que están pensados para llamar la atención del lector sobre cierto aspecto o cuestión relacionada con lo que se dice en el flujo principal del texto.

Se prevén cinco tipos distintos de admonición llamados (en inglés) NOTE, TIP, IMPORTANT, CAUTION y WARNING:

AsciiDoc sólo reconoce el nombre de las admoniciones como tipo especial de párrafo cuando es escrito con mayúsculas en todas sus letras.
  • NOTE (Nota) está pensado para aclarar o anotar algún aspecto de lo que se dice en el flujo principal del texto.

  • TIP (Truco) es un tipo especial de nota en la que se explica un truco para conseguir algún efecto o resultado concreto.

  • IMPORTANT (Importante) una advertencia de que cierto detalle, sobre el que se llama la atención en este párrafo, es importante.

  • CAUTION (precaución) avisa al lector de que algo debe ser hecho cuidadosamente.

  • WARNING (peligro) es una advertencia más intensa que las anteriores: avisa al lector de que existe cierto peligro o posible daño si algo se hace sin la precaución adecuada.

Como puede ver cualquier lector acostumbrado a leer documentación técnica de programas informáticos, este tipo de advertencias es muy corriente en tales documentos, y de hecho es de allí de donde AsciiDoc ha sacado la idea de configurar expresamente este tipo de párrafos especiales. Recuérdese que, como señalé al principio de esta guía, AsciiDoc fue diseñado para la escritura de documentación técnica de sistemas informáticos.

Sintaxis de las admoniciones

Las admoniciones admiten una doble sintaxis:

  • La sintaxis normal de todos los párrafos especiales, consistente en indicar entre corchetes, en la línea anterior al inicio del párrafo, el tipo de párrafo de que se trate. Por ejemplo:

    [NOTE]
    AsciiDoc sólo reconoce el nombre de las admoniciones como
    tipo especial de párrafo cuando es escrito con mayúsculas en
    todas sus letras.
  • También se reconoce como admonición un párrafo que empiece por el nombre de la admonición de que se trate, en mayúsculas, seguido del signo de los dos puntos, como en el siguiente ejemplo:

    IMPORTANT: Es una verdad universalmente aceptada que
    todo soltero en posesión de una gran fortuna necesita
    una esposa.

El segundo formato está recomendado para admoniciones simples que ocupan un sólo párrafo. Para admoniciones que ocupen dos o más párrafos es preferible el primer formato, combinado con la agrupación de bloques proporcionada por los llamados bloques abiertos, como en el siguiente texto:

[CAUTION]
.Cómo cuidar a tu propio gremlim
--
Aunque los Gremlims son mascotas adorables y resistentes,
para habitar con ellos es importante seguir las siguientes
reglas:

1. No toleran bien la luz brillante; y la luz directa del
sol puede llegar a matarles.

2. Nunca hay que darles agua ni permitirles que se mojen.

3. Jamás debe permitírseles comer después de la
medianoche.
--
Precaución
Cómo cuidar a tu propio gremlim

Aunque los Gremlims son mascotas adorables y resistentes, para habitar con ellos es importante seguir las siguientes reglas:

  1. No toleran bien la luz brillante; y la luz directa del sol puede llegar a matarles.

  2. Nunca hay que darles agua ni permitirles que se mojen.

  3. Jamás debe permitírseles comer después de la medianoche.

También podemos utilizar, en lugar de un bloque abierto, un bloque de ejemplo delimitado por signos de igualdad (véase la sección XX).

Formateo de las admoniciones

Por defecto las admoniciones se formatean en un formato de doble columna en el que en la columna izquierda, centrado verticalmente, se contiene un rótulo con el nombre de la admonición y en el lado derecho el texto de la misma, tal y como se puede ver en el último ejemplo del apartado anterior.

El concreto texto del rótulo de cada admonición está controlado por los atributos de documento note-caption, tip-caption, important-caption, caution-caption y warning-caption. Cambiando su valor cambiaremos el rótulo. Por defecto todos ellos tienen nombres en inglés. Para asignarles un nombre en español, consúltese la sección Españolizar nuestro documento.

También podemos pedirle a AsciiDoc que sustituya el rótulo con el nombre de la admonición por un icono representativo de la misma. Esto se hace asignando al atributo icons en la cabecera del documento, el valor fonts:

:icons: font

Los iconos que se utilizan por defecto son los siguientes:

Para las notas (NOTE).
Para los trucos (TIP).
Para el aviso de que algo es importante (IMPORTANT).
Para la advertencia de que se debe llevar cuidado (CAUTION).
Para la advertencia de peligro (WARNING).

Estos iconos pertenecen a la fuente Awesome, residen en Internet y, por lo tanto, para usarlos es imprescindible que en el momento de procesar el fichero fuente el sistema tenga acceso a Internet.

También podemos asignar, a cada una de las admoniciones, un emoji, o cualquier otro símbolo existente en la tabla UNICODE, simplemente asignándolo a la propiedad que controla el nombre de cada admonición. Así por ejemplo:

:tip-caption: 💡

asignará el carácter 💡 a la admonición de tipo TIP.

5.4.3. Bloques de ejemplo

Los ejemplos (example) son fragmentos de texto pensados para ejemplificar lo que se ha explicado en el flujo normal del texto. Se formatean para que destaquen en la página o pantalla sobre el resto del texto; y dentro de un bloque de ejemplo se puede incluir cualquier contenido, incluyendo otros tipos de bloques anidados en el bloque de ejemplo.

Sintaxis de los bloques de ejemplo

Para los bloques de ejemplo se admiten dos sintaxis distintas. La primera es la normal en todos los párrafos especiales, consistente en especificar el tipo de párrafo (example) entre corchetes en la línea inmediatamente anterior a aquella en la que empieza el párrafo.

Por ejemplo:

[example]
Un ejemplo sirve para explicar o ilustrar una afirmación
general, o para proporcionar un caso particular que hace
de modelo para el caso general.

Pero pensando sobre todo en aquellos casos en los que el ejemplo necesite más de un párrafo, se admite una sintaxis alternativa en la que el ejemplo empiece con una línea de cuatro o más signos de igualdad (====) y termine con una línea idéntica a aquella en la que el ejemplo se inició. A este tipo de construcción que enmarca cierto fragmento del fichero fuente entre dos líneas idénticas que sirven para indicar el inicio y el fin, se la denomina Bloques delimitados.

Cuando se usa esta sintaxis no es necesario indicar expresamente el tipo de bloque: el uso de los caracteres de igualdad ya informa a AsciiDoc de que se trata de un bloque de ejemplo.

Así:

 .Onomatopeyas
 ====
 La motocicleta rugió: *¡brum! ¡brum!*

 El niño rechazó la comida con un sonoro *¡puaj!*

 En el salón se oyó el *_chin chin_* de las copas al brindar.
 ====
Onomatopeyas

La motocicleta rugió: ¡brum! ¡brum!

El niño rechazó la comida con un sonoro ¡puaj!

En el salón se oyó el chin chin de las copas al brindar.

Anidamiento de ejemplos

Al describir la sintaxis de los ejemplos, he dicho que cuando el ejemplo se delimita mediante líneas compuestas con el signo de la igualdad, tales líneas deberían tener cuatro o más caracteres de longitud. Esa posibilidad de admitir líneas delimitadoras de diferentes longitudes permite anidar un ejemplo dentro de otro. La regla aquí es que la longitud de la línea de delimitación de cada ejemplo ha de aumentar conforme aumente el anidamiento. O sea: si el primer ejemplo se delimina con líneas de cuatro caracteres, el ejemplo anidado en él ha de delimitarse con líneas de cinco o más caracteres. Y si todavía queremos incluir un tercer ejemplo, dentro del segundo ejemplo, deberemos usar líneas delimitadoras de al menos seis caracteres…​ y así sucesivamente.

Por ejemplo:

 .Recursividad
 ====
 Él sabía que ella lo sabía.
 =====
 Ella sabía que él sabía que ella lo sabía.
 ======
 Él sabía que ella sabía que él sabía que ella sabía
 ======
 =====
 ====
Recursividad

Él sabía que ella lo sabía.

Ella sabía que él sabía que ella lo sabía.

Él sabía que ella sabía que él sabía que ella lo sabía.

Si lo que anidamos dentro de un bloque de ejemplo es un bloque de cualquier otro tipo, incluso aunque se trate de un tipo de bloque que admita la sintaxis de bloques delimitados, no hace falta aumentar el tamaño de la línea de delimitación del bloque anidado.

Enmascaramiento de bloques

Los bloques de ejemplo se usan, en muchas ocasiones, para embutir dentro de ellos el contenido típico de algún otro tipo de bloques; muy corrientemente de una admonición. En tal caso se dice que el bloque de ejemplo enmascara un bloque de otro tipo, y el formateo final sumará las características de ambos tipos de bloque.

Un bloque enmascarado no es lo mismo que un bloque anidado. Para anidar, dentro de un bloque de ejemplo, cualquier otro tipo de bloque, basta con insertarlo en su interior. Por el contrario para enmascarar en un bloque de ejemplo otro tipo de bloque, hay que indicar el nombre del tipo de bloque de que se trata en la línea de configuración del bloque de ejemplo, tal y como se hace en el siguiente fragmento:

[WARNING]
====
Si va a salir al descampado en noches de luna llena,
tenga cuidado con los hombres lobo. Procure rociarse
de canela, ya que es sabido que su olor les repele.
====

Esto crearía una admonición del tipo WARNING embutida o enmascarada dentro de un bloque de ejemplo.

Ejemplos desplegables
NOTA: Como la utilidad que se explica en esta sección sólo funciona cuando se elige para formato final del documento el de HTML, en la versión en PDF de esta guía no se muestra el resultado de los ejemplos que se ponen en esta sección.

Una utilidad interesante, que sólo funciona en la conversión a HTML es la de los bloques desplegables. Un bloque desplegable se muestra en la página web inicialmente como una línea de texto, pero cuando se hace click en ella se despliega el contenido del ejemplo.

Para ello hay que establecer la opción %collapsible en la lista de atributos del bloque de ejemplo.

Por ejemplo:

[%collapsible]
====
Este texto sólo se mostrará si se hace click en la línea superior.
====

mostrará, si se convierte el documento fuente a HTML:

Details

Este texto sólo se mostrará si se hace click en la línea superior.

Por defecto el texto de la línea en la que hay que hacer click para desplegar el contenido del bloque es la palabra inglesa «Details». Si queremos cambiar dicho texto por cualquier otra, basta con poner el texto pretendido como título del bloque. Así en el siguiente ejemplo:

.Haga click para mostrar el texto
[%collapsible]
====
Este texto sólo se mostrará si se hace click en la línea superior.
====

obtendremos

Haga click para mostrar el texto

Este texto sólo se mostrará si se hace click en la línea superior.

Para que, por defecto, el contenido del bloque se muestre desplegado hay que indicarlo mediante el atributo %open:

.Haga click para mostrar el texto
[%collapsible%open]
====
Este texto se ocultará cuando se haga click en la línea superior.
====

En principio la posibilidad de crear un bloque desplegable sólo está prevista para los bloques de ejemplo. Pero, como dentro de un bloque de ejemplo es posible anidar cualquier otro tipo de bloque, podemos conseguir bloques desplegables de todo tipo. Por ejemplo

  .Haga click para mostrar este aviso
 [%collapsible]
 ====
 NOTE: Esto es una nota de ejemplo.
 ====
Haga click para mostrar este aviso
Esto es una nota de ejemplo

5.4.4. Citas literales

Citas en prosa y citas en verso

AsciiDoc admite dos modalidades de citas literales: citas en prosa (quote) y citas en verso (verse). A continuación se muestran dos ejemplos, uno de cita en prosa y otro de cita en verso:

[quote]
Todas las familias felices se parecen; las desdichadas
lo son cada una a su modo.
Todas las familias felices se parecen; las desdichadas lo son cada una a su modo.
[verse]
Caminante son tus huellas
el camino, y nada más;
caminante, no hay camino:
se hace camino al andar.
Al andar se hace camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante, no hay camino,
sino estelas en la mar.
Caminante son tus huellas
el camino, y nada más;
caminante, no hay camino:
se hace camino al andar.
Al andar se hace camino,
y al volver la vista atrás
se ve la senda que nunca
se ha de volver a pisar.
Caminante, no hay camino,
sino estelas en la mar.

En estos ejemplos pueden comprobarse las diferencias en el tipo de formateo que se aplica en uno y otro caso. Tratándose de citas en prosa el texto irá en cursiva, y precedido de unas comillas enormes (que a mí no me gustan demasiado), y tratándose de citas en verso, no hay cursiva ni comillas gigantescas, pero sí cambia el tipo de letra, al tiempo que se respetan todos los saltos de línea incluidos en la cita.

Datos y título de la cita

Este tipo de párrafo admite, en la línea de configuración, dos atributos posicionales y opcionales que se separan entre sí (y del nombre del tipo de párrafo) por comas. El primero está pensado para que en él se indique el nombre del autor de la cita; y en el segundo atributo puede recogerse el título de la obra de la que procede la cita. Por ejemplo:

[quote, García Márquez, Cien años de soledad]
Muchos años después, frente al pelotón de fusilamiento,
el coronel Aureliano Buendía había de recordar aquella
tarde remota en que su padre lo llevó a conocer el hielo.
Muchos años después, frente al pelotón de fusilamiento, el coronel Aureliano Buendía había de recordar aquella tarde remota en que su padre lo llevó a conocer el hielo.
— García Márquez
Cien años de soledad

El que se trate de atributos posicionales significa que AsciiDoc los identifica por la posición que ocupan en la lista de atributos. Por lo tanto si en el ejemplo anterior hubiéramos querido indicar la obra de la que procede la cita, pero no el nombre del autor, deberíamos haber escrito:

[quote, , Cien años de soledad]

Y, asimismo, si alguno de estos atributos incluye como parte de su contenido una coma, habrá que entrecomillarlo para evitar que AsciiDoc interprete incorrectamente dicha coma.

También podemos, como en cualquier otro tipo de párrafo, añadir un título:

[verse, Rubén Darío, Poema infantil]
.Poesía modernista de principios del siglo XX
La princesa está triste... ¿Qué tendrá la princesa?
Los suspiros se escapan de su boca de fresa,
que ha perdido la risa, que ha perdido el color.
La princesa está pálida en su silla de oro,
está mudo el teclado de su clave sonoro;
y en un vaso olvidada se desmaya una flor.
Poesía modernista de principios del siglo XX
La princesa está triste…​ ¿Qué tendrá la princesa?
Los suspiros se escapan de su boca de fresa,
que ha perdido la risa, que ha perdido el color.
La princesa está pálida en su silla de oro,
está mudo el teclado de su clave sonoro;
y en un vaso olvidada se desmaya una flor.
— Rubén Darío
Poema infantil
Sobre cómo añadir un título a un bloque, véase la sección Títulos en los párrafos y otros elementos de bloque.
Sintaxis de bloques delimitados para las citas

Las citas literales también admiten la sintaxis de bloques delimitados, que se han explicado a propósito de los párrafos de ejemplo. Esta sintaxis resulta especialmente útil cuando la cita que queremos incluir en nuestro documento consta de más de un párrafo.

El carácter que se usa en las líneas de delimitación para las citas literales es el del guión bajo. La línea inicial y la línea final han de tener al menos cuatro guiones bajos, y deben tener ambas exactamente la misma longitud.

Por ejemplo:

____
Cuando Gregorio Samsa se despertó una mañana después de un sueño
intranquilo, se encontró sobre su cama convertido en un monstruoso
insecto.
____

Cuando Gregorio Samsa se despertó una mañana después de un sueño intranquilo, se encontró sobre su cama convertido en un monstruoso insecto.

En este caso, no es preciso indicar expresamente el tipo de párrafo de que se trata, pues el hecho de usar guiones bajos en las líneas de delimitación se lo aclara a AsciiDoc. No obstante deberíamos indicar expresamente el nombre del estilo si se trata de una cita en verso, o si queremos incluir en la cita los datos relativos al autor y obra de la misma:

[quote, Kafka, La metamorfosis]
____
Cuando Gregorio Samsa se despertó una mañana después de un sueño
intranquilo, se encontró sobre su cama convertido en un monstruoso
insecto.
____

Cuando Gregorio Samsa se despertó una mañana después de un sueño intranquilo, se encontró sobre su cama convertido en un monstruoso insecto.

— Kafka
La metamorfosis
Citas automáticas

AsciiDoc formatea automáticamente como cita literal todo aquel párrafo en el que se cumplan las siguientes dos condiciones:

  1. Que el párrafo entero esté entrecomillado.

  2. Que tras el párrafo propiamente dicho se haya incluido una línea que empiece por dos guiones y contenga dos fragmentos de texto separados por comas, que se asignarán, respectivamente, al nombre del autor de la cita y a la obra de la que ésta procede. Por ejemplo

"Yo, señor, no soy malo, aunque no me faltarían
motivos para serlo."
-- Camilo José Cela, La familia de Pascual Duarte
Yo, señor, no soy malo, aunque no me faltarían motivos para serlo.
— Camilo José Cela
La familia de Pascual Duarte
Anidamiento de citas

Mediante la sintaxis de bloques delimitados es posible anidar una cita dentro de otra. Para ello basta con que la línea de delimitación de la cita interior sea más larga que la de la cita exterior.

Citas al estilo de Markdown

AsciiDoc también reconoce como cita literal las que sigan las convenciones de Markdown para este tipo de párrafo, las cuales consisten básicamente en preceder la primera línea del párrafo (o todas las líneas del párrafo) con el carácter «>» seguido de un espacio en blanco. Esta forma de indicar una cita literal, propia de Markdown, es también el mecanismo más habitualmente usado en los correos electrónicos para indicar que un fragmento del mismo es una cita literal.

Cuando se usa este estilo de cita, también podemos incluir los atributos de la cita (autor y obra) en la última línea siempre y cuando la empecemos por dos guiones y separemos ambos atributos por comas.

Por ejemplo:

> Nació con el don de la risa y con la intuición
> de que el mundo estaba loco. Y ese fue todo su
> patrimonio.
> -- Rafael Sabatini, Scaramouche

Nació con el don de la risa y con la intuición de que el mundo estaba loco. Y ese fue todo su patrimonio.

— Rafael Sabatini
Scaramouche

Este ejemplo habría funcionado igual si el carácter «>» estuviera sólo en la primera línea del párrafo.

Asimismo, también se puede usar el estilo de Markdown (duplicar el caŕacter «>» al inicio de las líneas) para anidar una cita dentro de otra.

Cuando se usa el estilo de Markdown para las citas, debe tenerse en cuenta que algunos bloques especiales de AsciiDoc no pueden incluirse en las citas delimitadas mediante el estilo de Markdown, pero sí pueden usarse si la cita se delimina al estilo propio de AsciiDoc.

5.4.5. Barras laterales

El tipo de párrafo especial al que AsciiDoc denomina barra lateral (sidebar) está pensado para aquellos párrafos cuyo contenido no encaja bien en el flujo normal del documento y que, por tanto, se debe formatear, en el documento final, de tal manera que el párrafo quede destacado y diferenciado con claridad del contenido normal.

Las barras laterales admiten una doble sintaxis. La primera es la normal en todos los párrafos especiales, consistente en especificar el tipo de párrrafo (sidebar) entre corchetes en la línea inmediatamente anterior a aquella en la que empieza el párrafo. La segunda sintaxis es la de bloques delimitados, que se han explicado a propósito de los párrafos de ejemplo. Esta sintaxis resulta especialmente útil cuando el fragmento que queremos resaltar en nuestro documento consta de más de un párrafo.

El carácter que se usa en las líneas de delimitación para las barras laterales es el asterisco. La línea inicial y la línea final han de tener al menos cuatro asteriscos; y deben tener ambas exactamente la misma longitud.

Entre las dos líneas delimitadoras del contenido de las barras laterales puede incluirse cualquier construcción sintáctica de AsciiDoc; incluyendo otros tipos de párrafos especiales. Así el siguiente ejemplo:

.Título opcional
****
Las barras laterales se usan para separar visualmente
fragmentos opcionales de contenido que complementan al
texto principal.

TIP: En ellas puede incluirse cualquier tipo de contenido

.Código fuente dentro de unas barras laterales
[source,js]
-----
const { expect, expectCalledWith, heredoc } = require('../test/test-utils')
-----
****
Título opcional

Las barras laterales se usan para separar visualmente fragmentos opcionales de contenido que complementan al texto principal.

En ellas puede incluirse cualquier tipo de contenido
Códifo fuente dentro de unas barras laterales
const { expect, expectCalledWith, heredoc } = require('../test/test-utils')

5.4.6. Párrafos de contenido literal

En la jerga tipográfica habitual entre los autores de documentación informática se llama contenido literal a aquellos fragmentos de texto muy habituales en la literatura relativa a sistemas informáticos en los que se indica exactamente lo que el usuario debe teclear, o el resultado de una instrucción o comando, o, en general, lo que una terminal de ordenador puede mostrar. Estos fragmentos suelen mostrarse con un tipo de letra monoespaciado que imita al de las viejas máquinas de escribir.

Como yo no suelo escribir demasiados textos que requieran párrafos de contenido literal, y teniendo en cuenta que en realidad esta guía la he escrito para mí mismo, la información sobre este tipo de párrafos está muy reducida. Me he saltado numerosos detalles y posibilidades, localizables en la documentación oficial de AsciiDoc.
Tipos de párrafos literales

AsciiDoc, que a fin de cuentas fue diseñado para la escritura de documentos relativos a sistemas informáticos, incluye varios estilos de párrafo pensados para esta finalidad. A continuación se indica el nombre de los mismos, y sus principales características:

listing

Es, probablemente, el párrafo literal básico. Los restantes estilos de párrafo literal conocidos por AsciiDoc constituyen una especialización de éste. El contenido de este tipo de bloques se muestra en el documento final, tal y como se escribió en el fichero fuente, sin aplicar ningún tipo de sustitución, salvo para las llamadas insertas en el bloque. (véase más adelante).

literal

No estoy muy seguro de cuál es la diferencia entre este tipo de párrafo y los párrafos de tipo listing. La documentación oficial de AsciiDoc dice casi lo mismo en ambos casos.

source

Es una especialización de listing pensada para transcribir fragmentos de código fuente en algún lenguaje de programación. Admite como atributo adicional (separado por una coma del nombre del estilo) el nombre del lenguaje de programación de que se trate. La especialidad respecto de los párrafos de tipo listing está en que en el estilo source se aplica el coloreado de sintaxis en la medida — supongo — en que AsciiDoc conoce el lenguaje de programación indicado como atributo adicional.

Realmente no he hecho ninguna prueba con este estilo de párrafo.

Sintaxis alternativas para los estilos "listing" y "literal"

El estilo de párrafo listing, además de mediante la sintaxis habitual en AsciiDoc consistente en indicar entre corchetes, en la línea anterior al párrafo, el nombre del estilo de que se trata, admite dos sintaxis alternativas:

  • La indentación izquierda: Todo párrafo cuya primera línea esté indentada, será considerado un párrafo de tipo listing. Da igual que la indentación sea de más o menos caracteres.

    Cuando el estilo se introduce por este procedimiento, AsciiDoc elimina la indentación izquierda de las líneas que lo componen, siempre que todas ellas tengan exactamente la misma indentación.

  • La sintaxis de bloques delimitados que se ha explicado a propósito de los párrafos de ejemplo. Para la línea de delimitación, en estos casos, se usan:

    • Cuatro o más guiones en los bloques de estilo listing.

    • Cuatro o más puntos en los bloques de estilo literal.

Como he señalado antes, realmente no veo ninguna diferencia entre estos dos tipos de bloques.

Llamadas de aclaración al contenido de un bloque literal

Cuando en un documento relativo a una aplicación informática se muestra, por ejemplo, un fragmento de código fuente, en ocasiones el autor necesita llamar la atención sobre alguna línea de dicho fragmento. AsciiDoc ofrece, para esta finalidad, un mecanismo llamado, en inglés, callouts y que se descompone en dos elementos las llamadas y las aclaraciones a las llamadas:

  • Las llamadas se realizan dentro del bloque de contenido literal. Para cada observación que se quiera hacer sobre su contenido, hay que incluir, al final de la línea sobre la que se quiere llamar la atención, o en donde se encuentre el texto del que se desea hacer la aclaración, una o varias llamadas. La llamada se identifica por un número (el número de llamada) entre paréntesis angulares: <1>, <2>, …​

  • Una vez fuera del bloque de contenido literal, para cada llamada dentro de él debe haber la correspondiente aclaración que se identifica por una línea que empieza, en el extremo izquierdo por el número de la llamada a la que se refiere la aclaración, entre paréntesis angulares.

Por ejemplo:

----
Fernando Hortelano García <fhg@miorg.org> <1>
Fernando Hortelano_García <fhg@miorg.org> <2>
----
<1> Incorrecto: AsciiDoc considerará que el apellido es García
<2> Correcto: AsciiDoc identifica correctamente que el
apellido consta de dos palabras.

El anterior texto se formatearía de la siguiente manera:

Fernando Hortelano García <fhg@miorg.org> (1)
Fernando Hortelano_García <fhg@miorg.org> (2)
1 Incorrecto: AsciiDoc considerará que el apellido es García
2 Correcto: AsciiDoc identifica correctamente que el apellido consta de dos palabras.

6. Construcciones y elementos especiales de los documentos

La tradición tipográfica ha decantado una serie de elementos o construcciones especiales en algunos tipos de documentos tales como las notas a pie de página, las listas, los hiperenlaces, etc. En esta sección se explica cómo incluir este tipo de elementos en nuestro documento de AsciiDoc.

6.1. Listas

6.1.1. Concepto y función de las listas

Una lista consiste en una sucesión de elementos de texto en la que cada uno de ellos va precedido de un carácter o secuencia de caracteres formateados de tal manera que los distintos elementos quedan destacados y diferenciados entre sí. Dependiendo del tipo de separador se distingue entre listas ordenadas, listas desordenadas, listas de «chequeo» y descripciones.

Este tipo de construcción resulta especialmente útil para destacar visualmente el orden interno de ciertos fragmentos del documento, así como la relación entre los distintos elementos de la lista. Todo ello contribuye a dar visibilidad a la estructura interna de la información contenida en la lista.

6.1.2. Inicio y terminación de la lista

Explicar la dinámica exacta de las listas en AsciiDoc es muy difícil si no se ha comprendido bien la noción de bloque en AsciiDoc. Pero si intento explicar esta cuestión desde la perspectiva de los bloques, es muy posible que la mayor parte del público no lo entienda. Por tanto voy a explicarlo omitiendo la referencia a los bloques: así es más fácil de entender, pero hay que tener en cuenta que lo que se diga no es total y absolutamente preciso (puede haber excepciones).

AsciiDoc identifica el principio de una lista cuando un párrafo empieza por algún indicador de lista. Cuáles son los indicadores, depende del tipo de lista de que se trate: puede ser un número o una letra seguidos de un punto y un espacio en blanco, un guión o un asterisco seguidos de un espacio en blanco, etc. Más adelante, al examinar los distintos tipos de lista, se detallarán todos los indicadores de inicio de lista.

El primer elemento de la lista debe estar precedido de una línea en blanco (o encontrarse al principio de un bloque identificable como tal por AsciiDoc). Pero una vez que la lista ha empezado, los sucesivos elementos no necesitan estar separados del elemento anterior por una línea en blanco: AsciiDoc identificará que cada línea que empiece por el o los caracteres identificadores de elemento, constituye un elemento nuevo. Por ejemplo:

Los sábados por la mañana se dedican a:
  1. Hacer la compra para toda la semana. <1>

  2. Planchar. <2>

  3. Consultar el horóscopo.

  4. Telefonear a mi tía Isidora la encantadora.

1 El primer elemento de la lista va precedido de una línea en blanco que es necesaria para que AsciiDoc identifique que empieza una lista.
2 Una vez que la lista ha empezado (y hasta que termine) no es preciso que los sucesivos elementos vayan precedidos de líneas en blanco.

Se entiende que la lista termina cuando empiece un párrafo que no sea elemento de la lista; lo que normalmente ocurre cuando, tras una línea en blanco, el siguiente párrafo no empieza por un delimitador de elemento de lista.

Esta regla tiene el inconveniente de que si algún elemento de la lista ha de tener más de un párrafo, AsciiDoc identificará que el segundo párrafo (separado por una línea en blanco) no se considerará que es parte de la lista y se formateará como párrafo normal.

Para evitar este resultado, cuando un elemento de una lista consta de más de un párrafo, para separar ambos párrafos no se usa una línea en blanco, sino una línea cuyo único contenido sea el carácter '+'. Así en el siguiente ejemplo:

  * Primer elemento de la lista. Consta de un solo párrafo.
  * Segundo elemento de la lista. Consta de dos párrafos.
  + (1)
  Este es el segundo párrafo del elemento.
  * Tercer elemento de la lista
  • Primer elemento de la lista. Consta de un solo párrafo.

  • Segundo elemento de la lista. Consta de dos párrafos.

    Este es el segundo párrafo del elemento.

  • Tercer elemento de la lista

1 Los dos párrafos que componen un mismo elemento, no están separados por una línea en blanco, sino por una línea cuyo único carácter es el sígno "+", el cual indica que el próximo párrafo se suma al elemento anterior de la lista.

6.1.3. Tipos de lista

Listas ordenadas

En este tipo de listas los caracteres que separan a unos elementos de otros forman una secuencia ordenada de números, letras o números romanos. Por ejemplo:

  1. Primer elemento.

  2. Segundo elemento.

  3. Tercer elemento.

AsciiDoc identifica el principio de una lista ordenada cuando un párrafo empieza por un número --arábigo o romano-- o letra seguido de un punto y un espacio en blanco. Por ejemplo:

Precauciones a tomar con los gremlins:

1. Mantenerlos alejados de la luz del sol.
2. Mantenerlos alejados del agua.
3. Asegurarnos de que nunca coman nada pasada la medianoche.

Precauciones a tomar con los gremlins:

  1. Mantenerlos alejados de la luz del sol.

  2. Mantenerlos alejados del agua.

  3. Asegurarnos de que nunca coman nada pasada la medianoche.

AsciiDoc acepta varios formatos de numeración. Los más habituales son:

1.

Números arábigos

.

Un punto (equivale a usar números arábigos)

a.

Minúsculas

A.

Mayúsculas

i.

Romanos en minúscula

I.

Romanos en mayúscula

El tipo de secuencia ordenada que usará la lista depende del identificador del primer elemento; de modo que si el primer elemento de la lista empieza por 1. la lista se ordenará por números arábigos, pero si es una I., se usarán números romanos.

También podemos indicar expresamente el tipo de numeración que deseamos al principio de la lista, entre corchetes. Se pueden usar los siguientes atributos:

arabic

Números arábigos (1, 2, 3…​)

loweralpha

Minúsculas (a, b, c…​)

upperalpha

Mayúsculas (A, B, C…​)

lowerroman

Romanos en minúscula (i, ii, iii…​)

upperroman

Romanos en mayúscula (I, II, III…​)

Por ejemplo:

  [loweralpha] (1)
  . Primer elemento
  . Segundo elemento
  . Tercer elemento

  [upperroman] (2)
  . Primer elemento
  . Segundo elemento
  . Tercer elemento
1 Esta lista usará letras minúsculas: a, b, c…​
2 Esta lista usará números romanos en mayúsculas: I, II, III…​

Cuando se indica el tipo de numeración expresamente mediante el atributo, es indiferente el carácter que se use para introducir los elementos de la lista.

[arabic] (1)
a. Primer elemento
b. Segundo elemento
c. Tercer elemento
1 Esta lista se formateará con números arábigos, aunque los elementos se han introducido con letras.

En cuanto a la concreta numeración de cada elemento, ésta es automática e independiente de si en el fichero fuente hemos escrito o no los números en una secuencia correcta.

  1. Primer elemento.
  4. Segundo elemento.
  8. Tercer elemento.

se formateará como:

  1. Primer elemento.

  2. Segundo elemento.

  3. Tercer elemento.

Aunque al usuario novato le puede parecer desconcertante esta característica, en realidad es muy cómoda pues nos permite insertar elementos intermedios en una lista numerada, sin necesidad de tener que reajustar los números de todos los elementos posteriores.

El atributo start nos permite indicar desde qué número debe comenzar la numeración:

  [start=5]
  . Quinto elemento
  . Sexto elemento
  . Séptimo elemento
  1. Quinto elemento

  2. Sexto elemento

  3. Séptimo elemento

Y el atributo reversed invierte el orden de la numeración:

  [reversed]
  . Tercer elemento
  . Segundo elemento
  . Primer elemento
  1. Tercer elemento

  2. Segundo elemento

  3. Primer elemento

Listas desordenadas

Se llama listas desordenadas (o «con viñetas») a quellas en las que el carácter que se usa para separar los distintos elementos es idéntico en todos ellos e independiente de la posición del elemento en la lista

El carácter identificador de nuevo elemento en una lista desordenada puede ser un asterisco o un guión.

La sintaxis básica es la siguiente:

  * Primer elemento
  * Segundo elemento
  * Tercer elemento
  • Primer elemento

  • Segundo elemento

  • Tercer elemento

El carácter que se use como marcador (* o -) no afecta al resultado visual: todas las listas desordenadas se renderizan con viñetas.

Mi consejo es que usemos siempre el asterisco *. Es el más legible en el fichero fuente y el que mejor se distingue de otros elementos de formato. Además es el único que se puede replicar para formar listas anidadas.

Asciidoc por defecto formatea las listas desordenadas usando una círculo sólido para el primer nivel, un círculo blanco para el segundo nivel y un cuadrado para el tercer nivel. Pero podemos alterar este comportamiento indicando, al principio de la lista, el tipo de marcador que queremos que se use. Para ello están disponibles los siguientes atributos:

disc

Círculo sólido.

circle

Un círculo con el interior blanco

square

Un cuadrado sólido.

none

Elemento indentado pero sin identificador visual

no-bullet

Idem

unstyled

Elemento no indentado y sin identificador visual.

  • 'none' y 'no-bullet' son absolutamente equivalentes.

  • 'none' y 'unstyled' se diferencian en que aunque ninguna de ellas usa un indicador visual para los elementos, 'none' --a diferencia de 'unstyled'-- mantiene la indentación típica de las listas.

Así, en el siguiente ejemplo, se usará un cuadrado para formatear los elementos de la siguiente lista:

  [square]
  * Primer elemento.
  * Segundo elemento.
Listas de verificación

Las listas de verificación (o «listas de chequeo») permiten representar elementos con un cuadrado de verificación junto a ellos. Son útiles para representar tareas pendientes, comprobaciones, etc.

La sintaxis se basa en listas desordenadas seguido de [ ] o [x] tras del marcador *:

  * [ ] Elemento pendiente
  * [x] Elemento completado
  * [ ] Otro elemento pendiente
  • Elemento pendiente

  • Elemento completado

  • Otro elemento pendiente

El texto [ ] indica un elemento sin marcar (pendiente) y [x] indica un elemento marcado (completado). También existe se puede usar [*] que muestra un cuadrado en estado indeterminado (ni marcado ni sin marcar).

Para que las listas de verificación funcionen correctamente, debemos activar el atributo checklist en la cabecera del documento o en el momento de llamar al procesador:
----
:checklist: |
----
O bien desde la línea de ordenes:
----
$> asciidoctor -a checklist MiFichero.adoc
----
Las listas de verificación son especialmente útiles en documentos de tipo «guía de instalación» o «lista de comprobación», donde el lector debe ir marcando los pasos completados.
Listas de descripción

Las listas de descripción (también llamadas «listas de definición» o «listas etiqueta-valor») asocian un término con su descripción correspondiente. Son muy útiles para glossarios, metadatos, opciones de configuración, etc.

La sintaxis básica usa la secuencia :: para separar el término de su descripción:

  Término:: Descripción del término.
  Otro término:: Descripción del otro término.
Término

Descripción del término.

Otro término

Descripción del otro término.

Si el término tiene más de una palabra, se escribe en la línea anterior a los doble dosuntos:

  Término con
  varias palabras:: Descripción del término.

Término con varias palabras:: Descripción del término.

AsciiDoc soporta varios separadores para las listas de descripción:

::

Separador estándar (el más usado)

:::

Separador anidado (para sublistas de descripción)

;;

Separador horizontal (para disposición en tabla)

El separador ::: se utiliza cuando necesitamos anidar listas de descripción:

  Término principal::
  Subtérmino::: Descripción del subtérmino.
  Otro subtérmino::: Descripción del otro subtérmino.
  Descripción del término principal.
Término principal
Subtérmino

Descripción del subtérmino.

Otro subtérmino

Descripción del otro subtérmino. Descripción del término principal.

El separador ;; produce una disposición horizontal, donde los términos y descripciones se muestran en columnas:

  [horizontal]
  Término 1;; Descripción 1
  Término 2;; Descripción 2
Término 1

Descripción 1

Término 2

Descripción 2

El atributo label-width (sólo para separador horizontal) permite controlar el ancho de la columna de términos:

  [horizontal, label-width=30%]
  Término 1;; Descripción 1
  Término 2;; Descripción 2
Las listas de descripción con separador horizontal son especialmente útiles para tablas de opciones de configuración o para glossarios donde se quiere aprovechar el espacio horizontal.

6.1.4. Anidación de listas

AsciiDoc permite anidar listas dentro de otras listas, tanto del mismo tipo como de distinto tipo. La profundidad máxima de anidación es de seis niveles.

Para anidar una lista, basta con indentarla respecto a la lista padre. El tipo de marcador puede ser igual o diferente:

  * Elemento de lista desordenada
  ** Subelemento (nivel 2)
  *** Subsubelemento (nivel 3)
  * Elemento de nivel 1
  • Elemento de lista desordenada

    • Subelemento (nivel 2)

      • Subsubelemento (nivel 3)

  • Elemento de nivel 1

También es posible mezclar tipos de lista:

  * Elemento de lista desordenada
  .. Subelemento ordenado (nivel 2)
  .. Otro subelemento ordenado
  * Elemento de lista desordenada
  • Elemento de lista desordenada

    1. Subelemento ordenado (nivel 2)

    2. Otro subelemento ordenado

  • Elemento de lista desordenada

Para anidar una lista de descripción dentro de otro tipo de lista, se usa el marcador : como continuación:

  * Elemento de lista desordenada
  Término:: Descripción del término.
  • Elemento de lista desordenada

    Término

    Descripción del término.

Es importante que la sublista esté indentada correctamente. Si la indentación es incorrecta, AsciiDoc interpretará el contenido como parte del elemento padre en lugar de como una sublista.

6.2. Notas al pie

Aún no escrito.

6.3. Tablas

Las tablas son uno de los elementos más poderosos de AsciiDoc. Permiten presentar datos estructurados con un alto grado de personalización.

6.3.1. Sintaxis básica

Una tabla se define con el delimitador |===:

  |===
  | Cabecera 1 | Cabecera 2 | Cabecera 3

  | Celda 1
  | Celda 2
  | Celda 3
  |===
Cabecera 1 Cabecera 2 Cabecera 3

Celda 1

Celda 2

Celda 3

Cada fila se separa con un salto de línea, y cada celda se indica con el carácter | al inicio.

6.3.2. Cabecera y pie de tabla

Para definir una fila de cabecera, basta con que sea la primera fila de la tabla. Para un pie de tabla, se usa la línea |=== tres veces:

  |===
  | Nombre | Edad | Ciudad

  | Ana
  | 25
  | Madrid

  | Luis
  | 30
  | Barcelona

  | Total: 2 personas | |
  |===
Nombre Edad Ciudad

Ana

25

Madrid

Luis

30

Barcelona

Total: 2 personas

6.3.3. Atributos de tabla

Los atributos de tabla se colocan antes del delimitador |===:

cols

Define el número y estilo de las columnas.

width

Ancho total de la tabla (porcentaje o píxeles).

frame

Borde exterior: all, none, sides, topbot.

grid

Líneas de separación: all, none, cols, rows.

stripes

Filas rayadas: all, none, even, odd.

align

Alineación: left, center, right.

6.3.4. Atributos de columna

El atributo cols permite especificar el número de columnas y sus propiedades:

  [cols="1,2,1"]
  |===
  | Col 1 | Col 2 | Col 3

  | A
  | B
  | C
  |===

Cada columna puede tener atributos individuales separados por >:

1>

Ancho relativo (1 parte).

2>

Ancho relativo (2 partes).

l>

Alineación izquierda.

c>

Alineación centrada.

d>

Contenido AsciiDoc (preprocesado).

  [cols="1l>,2c>,1d>"]
  |===
  | Izoquierda | Centro | AsciiDoc

  | Texto
  | Texto
  | *Negrita* y _cursiva_
  |===

6.3.5. Unión de celdas (colspan y rowspan)

Para unir varias celdas horizontal o verticalmente, se usan los atributos colspan y rowspan:

  [cols="2,1"]
  |===
  | Celda que ocupa 2 columnas | colspan=2
  | Celda normal | Celda normal

  | Celda normal | rowspan=2
  | Celda debajo
  |===

6.3.6. Estilos de celda

AsciiDoc permite que una celda contenga contenido AsciiDoc formateado. Para ello se usa el estilo de celda:

a

Contenido AsciiDoc (el más usado).

p

Párrafo con estilo personalizado.

l

Literal (preformateado).

m

Monoespaciado.

h

Cabecera de fila.

d

Celda por defecto.

  [cols="1,2"]
  |===
  | Normal | a
  Contenido con *negrita* y _cursiva_.

  | Literal | l
  ----
  Código aquí
  ----
  |===

6.3.7. Inclusión de datos CSV

AsciiDoc puede generar tablas a partir de archivos CSV usando la macro csv:

  csv::datos.csv[cols="1,2,1", separator=;, header=true]

O directamente con el atributo csv:

  [format=csv]
  |===
  Nombre,Edad,Ciudad
  Ana,25,Madrid
  Luis,30,Barcelona
  |===
Las tablas AsciiDoc son muy potentes pero pueden ser complejas. Para tablas simples, la sintaxis básica con |=== es suficiente. Para tablas más elaboradas, consultemos la documentación oficial.

6.4. Imágenes

AsciiDoc permite incluir imágenes tanto como elementos en línea (dentro de un párrafo) como en modo bloque (occupying todo el ancho disponible).

6.4.1. Imágenes de bloque

La sintaxis para una imagen de bloque es image:: seguido de la ruta de la imagen y, opcionalmente, de atributos entre corchetes:

  image::images/foto.png[]

  .Título de la imagen
  image::images/foto.png[]
foto

Los atributos más habituales para las imágenes de bloque son:

width=NN

Ancho de la imagen en píxeles.

height=NN

Alto de la imagen en píxeles.

align=left|center|right

Alineación horizontal.

float=left|right

Flotación (el texto fluye alrededor).

link=URL

Enlace asociado a la imagen.

alt="texto"

Texto alternativo para accesibilidad.

  image::images/logo.png[width=200, align=center]

  image::images/foto.png[float=right, width=300]
  Texto que fluye alrededor de la imagen.

6.4.2. Imágenes en línea

Para insertar una imagen en línea (dentro de un párrafo), se usa image: (sin segundo colon):

  Esto es un párrafo con una imagen:image:icono.png[alt=Icono] en medio.

6.4.3. Atributos de imagen a nivel de documento

Los siguientes atributos en la cabecera afectan a todas las imágenes:

:imagesdir:

Directorio base donde se buscarán las imágenes.

:figure-caption!:

Desactiva la leyenda automática de figuras.

  :imagesdir: images
  :figure-caption!:

  image::foto.png[]

  Esto buscará la imagen en `images/foto.png`.
El atributo :imagesdir: es muy útil cuando todas las imágenes están en un directorio específico. Así no tenemos que escribir la ruta completa en cada imagen.

6.5. Comentarios

AsciiDoc permite incluir comentarios que no se procesarán ni se mostrarán en el documento final. Son útiles para notas internas, recordatorios o para desactivar temporalmente parte del contenido.

6.5.1. Comentario de línea

Un comentario de línea se crea con // al inicio de la línea:

  // Este es un comentario de una sola línea.
  Este párrafo sí se procesará.

Este párrafo sí se procesará.

6.5.2. Comentario de bloque

Para comentar varias líneas consecutivas, se usa el delimitador ////:

  ////
  Este bloque completo
  no se procesará.
  Se ignorará todo lo que haya aquí.
  ////

  Este párrafo sí se procesará.

//// Este bloque no se procesará. ////

Este párrafo sí se procesará.

6.5.3. Usos prácticos de los comentarios

Los comentarios son especialmente útiles para:

Notas internas

Recordatorios para el autor que no deben aparecer en el documento final.

Contenido desactivado

Bloques de contenido que queremos mantener en el fichero fuente pero sin incluir en la salida.

Separadores

Líneas divisories visuales en el fichero fuente (muy útiles en ficheros largos).

  // TODO: Revisar esta sección antes de publicar.
  // NOTA: Esta parte está temporalmente desactivada.
  ////////////////////////////////////////////////
  // Separador de secciones en el fichero fuente
  ////////////////////////////////////////////////
Los comentarios son una buena práctica en documentos complejos. Nos permiten dejar constancia de decisiones pendientes o de cambios futuros sin afectar al documento final.

6.6. Enlaces a hipervínculos

AsciiDoc facilita la inserción de enlaces a páginas web, archivos locales o direcciones de correo electrónico. Existen varios mecanismos para crear enlaces.

Si escribimos una URL completa (que empiece por http:// o https://), AsciiDoc la convertirá automáticamente en un enlace:

  Visita https://www.example.com para más información.

Visita https://www.example.com para más información.

Este comportamiento se puede desactivar con el atributo :hide-uri-scheme: en la cabecera del documento.

6.6.2. Macro de enlace https

Para crear un enlace con texto personalizado, se usa la macro https con el siguiente formato:

  https://www.example.com[Text del enlace]

Si el texto del enlace es la propia URL, podemos omitirlo:

  https://www.example.com[]

Podemos añadir atributos adicionales al enlace:

window=_blank

Abre el enlace en una nueva ventana o pestaña.

title="Texto"

Añade un título (tooltip) al enlace.

rel="nofollow"

Añade el atributo rel="nofollow" (para SEO).

  https://www.example.com[Ejemplo, window=_blank, title="Visitar ejemplo"]

Para enlazar a archivos locales (no web), se usa la macro link::

  link:documento.pdf[Descargar manual]
  link:images/foto.png[Ver imagen]

6.6.4. Macro mailto: para correo electrónico

Para enlaces de correo electrónico, se usa la macro mailto::

  mailto:usuario@ejemplo.com[Contactar]
  mailto:usuario@ejemplo.com[]

6.6.5. Enlaces con ID de destino

También podemos crear enlaces que apunten a un elemento concreto del mismo documento usando la sintaxis <<id>> (esto se cubre en detalle en la cross-referencias).

6.7. Referencias cruzadas

Las referencias cruzadas (o cross-references) permiten enlazar desde un punto del documento a otro punto del mismo documento o a otro documento AsciiDoc. Son fundamentales para crear documentos bien estructurados y fáciles de navegar.

6.7.1. Sintaxis básica

La forma más sencilla de crear una referencia cruzada es usando la sintaxis abreviada con el operador <<:

  [[seccion-destino]]
  == Título de la sección

  ... más adelante ...

  Ver <<seccion-destino>> para más detalles.

== Título de la sección de ejemplo

  1. más adelante …​

Ver [seccion-destino] para más detalles.

Si queremos que el enlace muestre un texto diferente al título de la sección de destino, añadimos una coma después del ID:

  Ver <<seccion-destino,este texto>> para más detalles.

Ver este texto para más detalles.

6.7.2. Macro xref:

Alternativamente, se puede usar la macro xref: que es más explícita:

  Ver xref:seccion-destino[] para más detalles.
  Ver xref:seccion-destino[este texto] para más detalles.

6.7.3. Asignar IDs a elementos

Para poder hacer referencia a un elemento específico (figura, tabla, listado, etc.), debemos asignarle un ID con la sintaxis [id] antes del elemento:

  [[fig-ejemplo]]
  .Una figura de ejemplo
  image::images/ejemplo.png[]

  Ver <<fig-ejemplo>> para ver la figura.
placeholder
Figura 1. Una figura de ejemplo

Ver Una figura de ejemplo para ver la figura.

Los IDs también se pueden asignar con la sintaxis alternativa [.id-del-elemento]:

  [.id-ejemplo]
  .Otra figura
  image::images/ejemplo2.png[]

6.7.4. Referencias a otros documentos

Para hacer referencia a otro documento AsciiDoc, se usa el ID del documento seguido del ID del elemento:

  Ver xref:otro-documento.adoc#seccion-destino[].
  Ver <<otro-documento.adoc#seccion-destino,texto del enlace>>.
Para que las referencias a otros documentos funcionen, el documento de destino debe ser incluido en la compilación con la directiva include::.

6.8. Índices

Con AsciiDoc podemos crear, automáticamente, dos tipos de índice: La tabla de contenido (conocida en la tradición tipográfica española como «Índice sistemático», o «Índice», a secas) y el índice analítico.

6.8.1. La tabla de contenido

Con AsciiDoc podemos decidir si el documento tendrá o no un índice de contenido generado automáticamente a partir de los títulos de las secciones. Y, en caso de que hayamos decidido que el índice exista, podemos personalizar su título, profundidad y ubicación en el documento final.

  • Para que AsciiDoc genere automáticamente la tabla de contenidos basta con activar, en la cabecera del documento, el atributo toc. Aunque también podemos activar dicho atributo en el momento de llamar al procesador desde la línea de comando:

    $> asciidoctor -a toc MiFichero.adoc
  • Por defecto la tabla de contenido se titula, en inglés, «Table of contents», para cambiar esa denominación por cualquier otra, se usa el atributo toc-title. Por ejemplo:

    :toc-title: Índice sumario
    Si hemos españolizado nuestro documento cargando en él el fichero attributes-es.adoc, tal y como se explica en Españolizar nuestro documento, el título del índice será «Tabla de contenido». Si queremos cambiar ese título, debemos asegurarnos de que la línea donde se cambia el valor de toc-title esta DETRÁS de la línea que carga el fichero attributes-es.adoc.
  • El atributo toclevels nos permite controlar el nivel de las secciones que se incluirán en la tabla de contenidos. Por defecto se incluyen sólo los niveles 1 y 2.

  • También podemos controlar el lugar donde se ubicará la tabla de contenido, si bien algunas de las posibles ubicaciones sólo funcionan correctamente cuando la salida final es HTML.

    La ubicación del índice depende del valor que se le asigne al atributo toc, que puede ser cualquiera de los siguientes:

    auto

    El índice se imprime inmediatamente debajo del título y datos del autor y revisión del documento. Este es el valor por defecto y el que se aplica si a toc no se le asigna explícitamente ningún otro valor.

    left, right

    El índice se mostrará en una columna en el lado izquierdo o derecho de la pantalla. Esto sólo funciona en la salida a HTML.

    preamble

    El índice se muestra tras el preámbulo del documento, antes de la primera sección.

    macro

    Cuando asignamos a toc este valor, el índice se imprimirá en aquel punto del documento en el que se haya insertado la macro toc. Esta macro es una macro de bloque y tiene el siguiente formato

    toc::[]

    Téngase en cuenta que sólo puede haber una instancia en el documento de esta macro, la cual sólo producirá efecto si el atributo toc se ha establecido en la cabecera del documento con el valor macro.

6.8.2. El índice analítico

En el índice analítico se destacan una serie de voces o nociones que son especialmente importantes en relación con la temática sobre la que versa nuestro documento, con indicación para cada una de ellas, de la página o páginas en las que son objeto de tratamiento. Por lo tanto, como un índice analítico no parece tener demasiado sentido en un formato en el que el documento no se divida en páginas, AsciiDoc sólo genera automáticamente este tipo de índices en los formatos PDF y DocBook.

La generación del índice analítico se hace en dos pasos: Primero se prepara el índice marcando en el fichero fuente los términos que queremos que sean enviados al índice, y después, en el punto del documento en el que deseamos que se genere el índice, hay que incluir la orden que lo generará.

Primer paso: preparación del índice

Antes de explicar como funciona este primer paso, lo mejor es mostrar cómo queda un índice generado por AsciiDoc:

Ejemplo de un índice analítico generado por AsciiDoc
  • I

    • Invertebrados, 2

  • V

    • Vertebrados

      • Aves, 4, 12

      • Mamíferos

        • Felinos, 6

        • Plantígrados, 8

      • Reptiles, 2

Obsérvese que el índice tiene tres niveles de profundidad. Por lo tanto, para preparar el índice tenemos que recorrer nuestro fichero fuente y en los lugares en los que se trata una noción que queremos que aparezca en el índice debemos decidir:

  • En qué nivel del índice debe aparecer.

  • Si deseamos que el término que aparecerá en el índice sea exactamente el mismo que se menciona en nuestro texto, o uno diferente.

Para enviar al primer nivel del índice un término que deseamos que figure en el índice exactamente igual a como lo hemos escrito en nuestro fichero fuente, el término en cuestión se rodea con dobles paréntesis como en el siguiente ejemplo:

Existen muchas razas de ((perros)). También hay numerosas razas de
((gatos)) aunque estas son mucho menos conocidas por el gran público.
...
((Perros)) importantes en la cultura popular son Rin-Tin-Tin,
Scooby-Doo y Lassie, entre otros.

Este ejemplo envía al índice tres términos: perros, gatos, y de nuevo Perros. Obsérvese, no obstante, que como el término «perros» se ha escrito la primera vez con minúsculas y la segunda vez con mayúsculas, AsciiDoc los considerará palabras distintas, y en el índice figurarán, como nociones diferentes; lo que no parece muy adecuado. Un índice bien hecho debería ser consistente y recoger todas sus palabras en mayúsculas o en minúsculas. Pero como en nuestro texto el que la palabra vaya en mayúsculas o en minúsculas depende de las reglas ortográficas (y no de lo que hayamos decidido respecto del índice) serán muchas la ocasiones en las que no podamos enviar al índice exactamente el término que se escribe en el fichero fuente, sino otro parecido. Lo mismo ocurrirá si, por ejemplo, unas veces el término aparece en plural y otras en singular…​ si se trata de un término o noción única, en el índice debería aparecer una sola vez.

Por ello el procedimiento de los dobles paréntesis es más limitado de lo que parece. En muchísimas ocasiones querremos enviar al índice un término, pero no exactamente igual a como lo hayamos escrito en nuestro documento fuente. Para ello se usan no dos, sino tres paréntesis. Y así el anterior ejemplo se escribiría de la siguiente forma:

Existen muchas razas de perros(((Perros))). También hay numerosas
razas de gatos(((Gatos))) aunque estas son mucho menos conocidas por
el gran público.
...
((Perros)) importantes en la cultura popular son Rin-Tin-Tin,
Scooby-Doo y Lassie, entre otros.

Véase como ahora, detrás de las palabras «perros» y «gatos» de nuestro ejemplo, hemos añadido «Perros y «Gatos» encerrados en un triple paréntesis, con lo que indicamos a AsciiDoc que deseamos enviar al índice esas palabras, pero no escribirlas así en el fichero fuente. Sin embargo, en el segundo párrafo, en el que aparece la palabra «Perros» con mayúscula, podemos usar el doble paréntesis y enviar al índice exactamente la misma palabra que se usa en el fichero fuente.

Los dobles paréntesis lo que hacen, en realidad, es activar la macro indexterm2 cuyo formato es indexterm2:[Término]; mientras que los triples paréntesis activan la macro indexterm. Por tanto, en lugar de usar la notación basada en dobles o triples paréntesis, podríamos usar directamente las macros correspondientes.

Para enviar un término del segundo o del tercer nivel, sólo podemos usar el mecanismo del triple paréntesis, que — como acabamos de ver — no imprime en el documento el término que se envía al índice, y cuyo formato es (dependiendo de que deseemos enviar al índice un término del primer, del segundo o del tercer nivel) el siguiente:

(((Primer nivel)))
(((Primer nivel, Segundo nivel)))
(((Primer nivel, Segundo nivel, Tercer nivel)))

Según queramos enviar al índice un término del primer nivel, del segundo nivel o del tercer nivel. No es posible enviar al índice un término del segundo nivel sin indicar también cuál sería el primer nivel; y, por la misma razón, para enviar un término del tercer nivel, debemos especificar cuáles serían los términos del primer y segundo nivel.

Si en lugar de la notación abreviada, basada en el triple paréntesis, queremos usar la macro indexterm, su formato para enviar al índice palabras de segundo o tercer nivel, es el siguiente:
indexterm::[Primer nivel, Segundo nivel, Tercer nivel]

Así, en el siguiente ejemplo

El galgo(((Perros, galgo))) destaca frente a otras razas por lo
estilizado de su figura y su agilidad. El pastor alemán(((Perros,
Pastores, Pastor alemán))), por su parte ...
La idea de ir generando el índice analítico conforme vamos escribiendo nuestro documento resulta muy tentadora. Pero en mi experiencia ello dificulta mucho la escritura del fichero fuente y, además, hace que los índices analíticos finales no estén bien pensados. Mi consejo es el de no decidir qué términos irán al índice hasta que el documento esté terminado, o casi terminado. De ese modo obtendremos índices más coherentes y mejor pensados.
Segundo paso: generar el índice

Una vez que hemos marcado a lo largo del documento todos los términos que deben ir al índice, estamos ya en condiciones de pedirle a AsciiDoc que lo genere automáticamente. Para ello basta con introducir la sección especial index en el punto del documento en el que queremos que el índice se inserte:

[index]
== Título del índice

Al encontrarse con esta sección, el procesador generará el índice, si el formato de salida es PDF o DocBook.

El hecho de que el índice sólo se genere en algunos formatos de salida, tiene el inconveniente de que si compilamos nuestro documento para alguno de los formatos en los que no se genera (HTML, por ejemplo), en el fichero final quedará una sección para el índice, pero en ella no se incluirá nada. Por ello este es uno de los escenarios en los que es buena idea acudir a la compilación condicional y escribir en nuestro fichero fuente, por ejemplo:

ifndef::backend-html5[]
[index]
== Índice analítico
endif::[]

Ello hará que sólo se incluyan en la compilación las líneas que generan el índice si el formato final no es HTML.

6.9. Iconos

AsciiDoc permite insertar iconos en el documento, tanto en modo fuente (de texto) como en modo imagen.

6.9.1. Modos de iconos

El atributo :icons: en la cabecera del documento determina cómo se renderizan los iconos:

text

Los iconos se muestran como texto (por ejemplo: [NOTE]).

image

Los iconos se muestran como imágenes.

font

Los iconos se muestran como fuentes (FontAwesome).

  :icons: font

El modo font es el más usado actualmente, ya que permite iconos escalables y personalizables.

6.9.2. Macro de icono

Para insertar un icono en cualquier punto del documento, se usa la macro icon::

  icon:heart[tamaño=2x]
  icon:check[color=green]
  icon:warning[color=red, tamaño=3x]

Los atributos más habituales son:

tamaño=1x|2x|3x|4x|5x

Tamaño del icono.

color=nombre|#[hex]

Color del icono.

rotate=90|180|270

Rotación del icono.

flip=horizontal|vertical

Reflejo del icono.

6.9.3. Iconos en admoniciones

Los iconos se usan automáticamente en las admoniciones (NOTA, CONSEJO, ADVERTENCIA, etc.) cuando el atributo :icons: está activado:

  :icons: font

  NOTE: Esto es una nota con icono.
  TIP: Esto es un consejo con icono.
  WARNING: Esto es una advertencia con icono.
Esto es una nota con icono. TIP: Esto es un consejo con icono. WARNING: Esto es una advertencia con icono.

6.9.4. Directorio de iconos

El atributo :iconsdir: indica dónde se encuentran las imágenes de los iconos (solo relevante para el modo image):

  :iconsdir: images/icons
En el modo font, las fuentes de iconos se cargan desde una CDN por defecto. Si necesitamos working offline, podemos descargar las fuentes y especificar la ruta con :icontdir:.

6.10. Audio y vídeo

AsciiDoc permite incrustar archivos de audio y vídeo directamente en el documento.

6.10.1. Audio

Para insertar un archivo de audio, se usa la macro audio:::

  audio::audio/cancion.mp3[]
  audio::audio/podcast.ogg[ autoplay, loop]

Los atributos disponibles son:

autoplay

Reproduce el audio automáticamente al cargar la página.

loop

Repite el audio en bucle.

nocontrols

Oculta los controles de reproducción.

6.10.2. Vídeo local

Para insertar un vídeo local, se usa la macro video:::

  video::video/presentacion.mp4[width=640]
  video::video/demo.webm[width=800, autoplay]

Los atributos más habituales son:

width=NN

Ancho del reproductor en píxeles.

height=NN

Alto del reproductor en píxeles.

autoplay

Reproduce el vídeo automáticamente.

nocontrols

Oculta los controles de reproducción.

poster=imagen.png

Imagen que se muestra antes de la reproducción.

start=NN

Segundo de inicio de la reproducción.

end=NN

Segundo de fin de la reproducción.

6.10.3. Vídeo de YouTube y Vimeo

Para insertar vídeos de plataformas en línea, se especifica la plataforma como tercer argumento:

  video::https://www.youtube.com/watch?v=ID_DEL_VIDEO[youtube]
  video::https://vimeo.com/12345678[vimeo]

Solo necesitamos la URL del vídeo. AsciiDoc extraerá automáticamente el ID del vídeo para generar el código de incrustación correcto.

Para vídeos de YouTube, la URL puede ser tanto https://www.youtube.com/watch?v=ID como https://youtu.be/ID.

6.11. Ecuaciones y fórmulas

AsciiDoc soporta la inclusión de ecuaciones matemáticas usando los lenguajes STEM y LaTeX.

6.11.1. Activación del soporte matemático

Para usar ecuaciones, debemos activar el atributo :stem: en la cabecera del documento:

  :stem: latexmath

Este atributo acepta dos valores:

latexmath

Usa la sintaxis de LaTeX para matemáticas (el más usado).

asciimath

Usa la sintaxis de AsciiMath (más simple pero menos potente).

6.11.2. Ecuaciones en línea

Para insertar una ecuación en línea (dentro de un párrafo), se usa la macro stem::

  La fórmula general es stem:[ax^2 + bx + c = 0].

  La solución es stem:[x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}].

La fórmula general es \$ax^2 + bx + c = 0\$.

La solución es \$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\$.

6.11.3. Ecuaciones en bloque

Para ecuaciones en bloque (en su propio párrafo), se usa la anotación [stem] seguida de un bloque de texto literal:

  [stem]
 ++++
  x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
  ++++
\$x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}\$

6.11.4. Numeración de ecuaciones

Para activar la numeración automática de ecuaciones, se usa el atributo :eqnums::

  :stem: latexmath
  :eqnums:

Con la numeración activa, las ecuaciones en bloque se numeran automáticamente (1), (2), (3), etc.

6.11.5. Referencias a ecuaciones

Para referenciar una ecuación numerada, se usa la notación \ref{ec1} dentro de la ecuación de destino:

  [stem]
 ++++
  \label{ec1}
  E = mc^2
  ++++

  Como se ve en la ecuación stem:[\ref{ec1}]...
Si no estamos familiarizados con LaTeX, podemos usar AsciiMath que tiene una sintaxis más intuitiva. Por ejemplo, \$x = (-b +- sqrt(b^2 - 4ac))/(2a)\$ es equivalente a la fórmula cuadrática en AsciiMath.

6.12. Macros de interfaz: teclado, botones y menús

AsciiDoc incluye macros para representar elementos de interfaz de usuario como pulsaciones de tecla, botones y menús. Estas macros son especialmente útiles en manuales de software y guías de usuario.

Para que estas macros funcionen, debemos activar el atributo :experimental: en la cabecera del documento.

6.12.1. Macro de teclado (kbd)

La macro kbd: permite representar una pulsación de tecla o combinación de teclas:

  :experimental:

  Pulse kbd:[Ctrl+C] para copiar.
  Pulse kbd:[Ctrl+V] para pegar.
  Pulse kbd:[F5] para actualizar.

Pulse Ctrl+C para copiar. Pulse Ctrl+V para pegar. Pulse F5 para actualizar.

Para combinaciones de teclas, se separan con +. Para teclas con nombre compuesto, se usa el guion bajo:

  kbd:[Ctrl+Shift+A]
  kbd:[Alt+F4]
  kbd:[Space_bar]

6.12.2. Macro de botón (btn)

La macro btn: representa un botón de interfaz:

  Haga clic en btn:[Aceptar] para continuar.
  Pulse btn:[Cancelar] para salir.

Haga clic en Aceptar para continuar. Pulse Cancelar para salir.

6.12.3. Macro de menú (menu)

La macro menu: representa una secuencia de menú:

  Seleccione menú:Archivo[Guardar] para guardar el documento.
  Vaya a menú:Edición[Buscar y reemplazar].

Seleccione menú:Archivo[Guardar] para guardar el documento. Vaya a menú:Edición[Buscar y reemplazar].

Para menús con submenús, se usan las comas:

  menú:Ver[Zoom[Aumentar]]
  menú:Formato[Fuente[Negrita]]
Estas macros son especialmente útiles en tutoriales y manuales donde el lector debe seguir una secuencia de pasos en la interfaz gráfica.

7. Aspectos avanzados

Una vez que dominemos los fundamentos de AsciiDoc, es momento de conocer algunas funcionalidades más avanzadas que nos permitirán crear documentos más sofisticados y flexibles. En esta sección veremos la compilación condicional, la directiva include, los bloques passthrough y los atributos de documento avanzados.

7.1. Compilación condicional

La compilación condicional permite incluir o excluir partes del documento en función del valor de atributos o del formato de salida final. Es una funcionalidad extremadamente útil cuando escribimos un mismo documento que se compila a varios formatos (HTML, PDF, EPUB) o cuando queremos mantener variantes del contenido sin crear múltiples ficheros fuente.

7.1.1. Directiva ifdef

La directiva ifdef incluye el contenido solo si el atributo especificado está definido. Su sintaxis es:

  ifdef::nombre-atributo[]
  Contenido que se incluirá solo si el atributo está definido.
  endif::[]

En el siguiente ejemplo, el párrafo solo se incluirá si el atributo backend-html5 está definido (lo que ocurre cuando la salida es HTML):

  ifdef::backend-html5[]
  Este texto solo aparece en la versión HTML.
  endif::[]

Este texto solo aparece en la versión HTML.

7.1.2. Directiva ifndef

La directiva ifndef es la inversa: incluye el contenido solo si el atributo NO está definido:

  ifndef::backend-html5[]
  Este texto NO aparece en la versión HTML.
  endif::[]

7.1.3. Directiva ifeval

La directiva ifeval evalúa una condición numérica o de cadena de caracteres. Su sintaxis usa corchetes con la condición:

  ifeval::["{ backend }" == "html5"]
  Contenido para HTML5.
  endif::[]

  ifeval::["{ doctype }" == "book"]
  Contenido solo para libros.
  endif::[]

Los operadores disponibles son:

==

Igualdad

!=

Desigualdad

<

Menor que

>

Mayor que

Menor o igual que

>=

Mayor o igual que

Las directivas ifdef, ifndef e ifeval se pueden combinar entre sí para crear condiciones más complejas.

7.1.4. Atributos predefinidos útiles

AsciiDoc define automáticamente varios atributos que podemos usar con la compilación condicional:

backend-html5

Se define cuando la salida es HTML5.

backend-pdf

Se define cuando la salida es PDF (usando Asciidoctor-PDF).

backend-docbook

Se define cuando la salida es DocBook.

doctype-article

Se define cuando el tipo de documento es artículo.

doctype-book

Se define cuando el tipo de documento es libro.

platform-linux

Se define en sistemas Linux.

platform-macos

Se define en macOS.

platform-windows

Se define en Windows.

attribute-behavior

Se define para AsciiDoc (no AsciiDoctor).

El uso más habitual de la compilación condicional es adaptar el contenido al formato de salida:

  ifdef::backend-pdf[]
  NOTE: Esta nota solo aparece en la versión PDF.
  endif::[]

  ifdef::backend-html5[]
  TIP: Este consejo solo aparece en la versión HTML.
  endif::[]
Las directivas de compilación condicional se procesan durante el preprocesado, antes de que se evalúe el contenido del documento. Por lo tanto, no podemos usar atributos definidos con :attr: valor en la misma línea que la directiva ifdef.

7.2. Directiva include

La directiva include:: permite incorporar el contenido de otro fichero AsciiDoc en el documento actual. Es fundamental para organizar documentos largos en varios ficheros o para reutilizar contenido común.

7.2.1. Sintaxis básica

La sintaxis más simple de la directiva include:: es:

  include::fichero-incluido.adoc[]

Esto insertará todo el contenido del fichero fichero-incluido.adoc en el punto donde se encuentra la directiva.

7.2.2. Rangos de líneas

A veces no queremos incluir todo el fichero, sino solo un fragmento. El atributo lines nos permite especificar qué líneas incluir:

  include::fichero.adoc[lines=1..5]

Esto incluirá solo las líneas 1 a 5 del fichero.

También podemos especificar múltiples rangos y líneas individuales:

  include::fichero.adoc[lines=1..3,7,9..15]

7.2.3. Etiquetas de inclusion (tags)

Las etiquetas permiten marcar fragmentos concretos del fichero para incluirlos de forma selectiva. Se marcan con comentarios especiales:

En el fichero a incluir:

  // tag::mi-etiqueta[]
  Este contenido será incluido.
  Fin del contenido incluido.
  // end::mi-etiqueta[]

En el documento principal:

  include::fichero.adoc[tags=mi-etiqueta]

Etiquetas muy útiles:

**

Incluye todas las etiquetas del fichero.

!nombre

Excluye una etiqueta concreta.

7.2.4. Nivel de sección (leveloffset)

El atributo leveloffset permite ajustar el nivel de las secciones del fichero incluido:

  include::capitulo1.adoc[leveloffset=+1]

Si el fichero incluido tiene secciones == (nivel 1), se convertirán en === (nivel 2) al insertarlas en el documento principal.

Para restaurar el nivel original tras la inclusión, usamos un valor negativo:

  include::capitulo1.adoc[leveloffset=+1]
  include::capitulo2.adoc[leveloffset=+1]

  // Volver al nivel normal
  :leveloffset!:

7.2.5. Indentación (indent)

El atributo indent permite ajustar la indentación del contenido incluido:

  include::codigo.py[indent=2]

Esto añadirá 2 espacios de indentación a todas las líneas del fichero incluido.

7.2.6. Ejemplo práctico

Un uso habitual de include:: es dividir un documento largo en múltiples ficheros:

  = Manual de usuario
  :doctype: article

  include::introduccion.adoc[]

  include::instalacion.adoc[]

  include::configuracion.adoc[]

  include::uso.adoc[]

  include::solucion-problemas.adoc[]
La directiva include:: es especialmente útil en entornos de documentación técnica donde múltiples autores contribuyen a diferentes partes del documento.
Por seguridad, AsciiDoc solo permite incluir ficheros que estén en el mismo directorio o en subdirectorios del fichero principal. Para incluir ficheros de otros directorios, debemos usar el atributo :includedir: o configurar el procesador adecuadamente.

7.3. Bloques passthrough

Los bloques passthrough permiten insertar contenido en formato bruto (sin procesar) directamente en el documento. Esto es útil cuando necesitamos incluir HTML, XML, u otro formato que AsciiDoc no procesa automáticamente.

7.3.1. Bloque passthrough

El delimitador para un bloque passthrough es :

  ++++
  Contenido sin procesar aquí.
  ++++

El contenido dentro de se inserta tal cual en la salida final, sin que AsciiDoc aplique ninguna transformación.

7.3.2. Inline pass:

Para insertar contenido passthrough en línea (dentro de un párrafo), se usa la macro pass::

  Esto es texto normal y esto es +<b>negrita HTML</b>+ passthrough.

También podemos usar con atributos para especificar el tipo de procesamiento:

  pass:[<em>énfasis HTML</em>]
  pass:none[$E = mc^2$]

7.3.3. Usos comunes de passthrough

HTML crudo

Cuando necesitamos elementos HTML no soportados por AsciiDoc (por ejemplo, <details>, <summary>).

STEM/LaTeX

Para ecuaciones matemáticas en formato LaTeX (aunque AsciiDoc tiene soporte nativo con stem:).

Contenido personalizado

Para incluir fragmentos de otros formatos como SVG, MathML, etc.

El uso de bloques pasthrough reduce la portabilidad del documento. Si cambiamos de procesador (de Asciidoctor a otro), el contenido passthrough podría no funcionar correctamente.

7.4. Atributos de documento avanzados

Además de los atributos básicos ya vistos, AsciiDoc ofrece varios atributos avanzados que permiten un mayor control sobre el documento.

7.4.1. Contadores y numeración

AsciiDoc gestiona automáticamente varios contadores que podemos personalizar:

start

Valor inicial de un contador (usado en listas y tablas).

step

Incremento entre valores consecutivos.

prefix

Prefijo antes del número (por ejemplo, Paso).

suffix

Sufijo después del número (por ejemplo, :).

Ejemplo de uso con listas:

  [start=10, step=2]
  . Decimo elemento
  . Duodecimo elemento
  . Decimocuarto elemento

7.4.2. Atributos de sustitución

Los atributos de sustitución controlan qué procesamiento se aplica al contenido:

subs

Sustituciones a aplicar a un bloque o párrafo.

verbatim

Sin procesamiento (texto literal).

specials

Solo sustituciones especiales (macros, etc.).

Para aplicar sustituciones selectivamente:

  [subs="quotes,-macros"]
  Texto con _cursiva_ pero sin procesar macros.

Las sustituciones disponibles son:

specialchars

Escapar caracteres especiales (<, >, &).

attributes

Sustitución de atributos.

quotes

Procesado de formato (negrita, cursiva, etc.).

replacements

Sustitución de caracteres especiales (-- → guion largo).

macros

Procesado de macros.

post_replacements

Sustitución de saltos de línea.

7.4.3. Atributos condicionales avanzados

Además de ifdef y ifndef, existen otros atributos útiles:

env

Entorno (dev, prod, test).

user

Usuario actual del sistema.

dir

Directorio actual.

  ifdef::env-dev[]
  [WARNING]
  ====
  Este mensaje solo aparece en entorno de desarrollo.
  ====
  endif::[]

7.4.4. Personalización de admoniciones

Las admoniciones (NOTA, CONSEJO, ADVERTENCIA, etc.) se pueden personalizar con atributos:

  :tip-caption: Consejo
  :note-caption: Nota importante
  :warning-caption: ¡Atención!

Esto cambia el texto que aparece junto al icono de cada admonición.

Los atributos avanzados son especialmente útiles en proyectos de documentación grande donde necesitamos un control fino sobre el comportamiento del procesador. No obstante, para documentos sencillos, los atributos básicos son más que suficientes.

8. Guía de referencia rápida de atributos

Este epígrafe recopila, de forma ordenada y concisa, todos los atributos de AsciiDoc conocidos por AsciiDoctor, indicando para cada uno de ellos su finalidad, los valores que admite y las particularidades de sintaxis que puedan ser relevantes. Se han agrupado por categorías funcionales y, para cada atributo, se incluye un enlace al epígrafe o subepígrafe de esta guía en el que se explica con mayor detalle.

8.1. Atributos de documento

Los atributos de documento son variables globales que afectan al comportamiento del procesador o proporcionan metadatos sobre el documento. Se declaran en la cabecera mediante la sintaxis :NombreAtributo: Valor.

A menos que se indique lo contrario, estos atributos pueden establecerse desde la API mediante la opción :attributes, desde la línea de comandos mediante -a, o en el propio documento (habitualmente en la cabecera).

8.1.1. Atributos de metadatos del documento

Recogen información sobre el documento y su entorno.

Nombre

Finalidad

Valores admitidos

Ref.

doctitle

Almacena el título del documento.

Cualquier texto

Atributos relacionados con el título del documento

title

Valor del elemento <title> en HTML o <info> en DocBook.

Cualquier texto

Atributos relacionados con el título del documento

notitle

Oculta el título del documento en el cuerpo (pero lo mantiene como metadato).

Atributo booleano (sin valor)

Atributos relacionados con el título del documento

showtitle

Muestra el título del documento en documentos incrustados.

Atributo booleano

title-separator

Carácter que separa título y subtítulo.

Cualquier texto (por defecto :)

Atributos relacionados con el título del documento

author

Nombre completo del autor.

Cualquier texto (extraído de la línea de autor)

Atributos relacionados con los autores del documento

authors

Lista de autores separados por comas.

Cualquier texto

Atributos relacionados con los autores del documento

firstname

Primer nombre del autor.

Cualquier texto

Atributos relacionados con los autores del documento

middlename

Nombre intermedio del autor.

Cualquier texto

Atributos relacionados con los autores del documento

lastname

Apellido(s) del autor.

Cualquier texto

Atributos relacionados con los autores del documento

authorinitials

Iniciales del autor.

Cualquier texto

Atributos relacionados con los autores del documento

email

Correo electrónico del autor.

Cualquier texto o macro

Atributos relacionados con los autores del documento

revnumber

Número de revisión del documento.

Cualquier texto

Atributos relacionados con los autores del documento

revdate

Fecha de la revisión.

Cualquier texto

Atributos relacionados con los autores del documento

revremark

Observaciones sobre la revisión.

Cualquier texto

Atributos relacionados con los autores del documento

version-label

Etiqueta antes del número de versión (por defecto Version).

Cualquier texto (por defecto Version)

Atributos relacionados con los autores del documento

description

Descripción del contenido del documento (metadato).

Cualquier texto

keywords

Palabras clave para clasificación (metadato).

Lista separada por comas

copyright

Información de copyright (metadato).

Cualquier texto

lang

Idioma principal del documento (ISO 639-1).

Etiqueta de idioma: es, en, fr…​

Españolizar nuestro documento

nolang

Impide que se añada lang al elemento raíz de la salida.

Atributo booleano

8.1.2. Atributos de tipo de documento y formato de salida

Controlan el tipo de documento y el formato de la salida.

Nombre

Finalidad

Valores admitidos

Ref.

doctype

Tipo de documento a generar.

article (por defecto), book, manpage, inline

Tipos de documento en AsciiDoc

backend

Formato de salida del procesador.

html5, docbook5, pdf…​

basebackend

Backend genérico del que deriva el backend actual.

html, docbook…​

outfilesuffix

Extensión del fichero de salida.

.html, .xml, .pdf…​

backend-<backend>

Atributo de conveniencia para comprobar el backend activo.

Atributo booleano

basebackend-<basebackend>

Atributo de conveniencia para comprobar el basebackend.

Atributo booleano

doctype-<doctype>

Atributo de conveniencia para comprobar el tipo de documento.

Atributo booleano

media

Tipo de medio de la salida (solo PDF).

screen (por defecto), print, prepress

8.1.3. Atributos de secciones y tabla de contenidos

Controlan el numerado de secciones, la generación automática de IDs y el índice.

Nombre

Finalidad

Valores admitidos

Ref.

sectnums

Activa la numeración automática de secciones.

Vacío (activa), all (numera también secciones especiales)

Numeración de las secciones

sectnumlevels

Controla la profundidad máxima de numeración de secciones.

05 (por defecto 3)

Numeración de las secciones

sectids

Activa la generación automática de IDs para las secciones.

Atributo booleano (activo por defecto)

IDs automáticos de las secciones

sectlinks

Convierte los títulos de sección en autoenlaces.

Atributo booleano

sectanchors

Añade un ancla § delante de los títulos de sección al pasar el ratón.

Atributo booleano

idprefix

Prefijo de los IDs auto-generados de secciones.

Cualquier texto (por defecto _)

IDs automáticos de las secciones

idseparator

Separador de palabras en IDs auto-generados de secciones.

Cualquier carácter (por defecto _)

IDs automáticos de las secciones

partnums

Activa la numeración de partes (solo book).

Atributo booleano

leveloffset

Ajusta el nivel de las secciones del contenido incluido.

[-]0` a `[-]5

toc

Activa y posiciona la tabla de contenidos.

Vacío/auto (debajo del título), left, right, preamble, macro

La tabla de contenido

toclevels

Profundidad máxima de secciones en la tabla de contenidos.

05 (por defecto 2)

La tabla de contenido

toc-title

Título de la tabla de contenidos.

Cualquier texto (por defecto Table of Contents)

La tabla de contenido

title-separator

Carácter separador entre título y subtítulo.

Cualquier texto

Atributos relacionados con el título del documento

8.1.4. Atributos de localización y numeración

Controlan etiquetas, rótulos y secuencias numéricas.

Nombre

Finalidad

Valores admitidos

Ref.

appendix-caption

Etiqueta antes del título de apéndices.

Cualquier texto (por defecto Appendix)

appendix-refsig

Significador en referencias cruzadas a apéndices.

Cualquier texto (por defecto Appendix)

caution-caption

Texto del rótulo de admoniciones CAUTION.

Cualquier texto (por defecto Caution)

Españolizar nuestro documento

chapter-refsig

Significador en referencias a capítulos (solo book).

Cualquier texto (por defecto Chapter)

chapter-signifier

Etiqueta añadida a títulos de nivel 1 (solo book).

Cualquier texto

example-caption

Texto del rótulo de bloques de ejemplo.

Cualquier texto (por defecto Example)

figure-caption

Texto del rótulo de figuras/imagenes.

Cualquier texto (por defecto Figure)

Españolizar nuestro documento

important-caption

Texto del rótulo de admoniciones IMPORTANT.

Cualquier texto (por defecto Important)

Españolizar nuestro documento

last-update-label

Texto de la etiqueta "Last updated" en el pie de página.

Cualquier texto (por defecto Last updated)

Españolizar nuestro documento

listing-caption

Texto del rótulo de bloques listing.

Cualquier texto (por defecto vacío)

manname-title

Etiqueta de la sección de nombre de programa (solo manpage).

Cualquier texto (por defecto Name)

note-caption

Texto del rótulo de admoniciones NOTE.

Cualquier texto (por defecto Note)

Españolizar nuestro documento

part-refsig

Significador en referencias a partes (solo book).

Cualquier texto (por defecto Part)

part-signifier

Etiqueta añadida a títulos de nivel 0 (solo book).

Cualquier texto

preface-title

Título para el prefacio anónimo (solo book).

Cualquier texto

section-refsig

Significador en referencias a secciones numeradas.

Cualquier texto (por defecto Section)

Españolizar nuestro documento

table-caption

Texto del rótulo de tablas.

Cualquier texto (por defecto Table)

Españolizar nuestro documento

tip-caption

Texto del rótulo de admoniciones TIP.

Cualquier texto (por defecto Tip)

Españolizar nuestro documento

untitled-label

Etiqueta para documentos sin título.

Cualquier texto (por defecto Untitled)

version-label

Etiqueta antes del número de versión.

Cualquier texto (por defecto Version)

Atributos relacionados con los autores del documento

warning-caption

Texto del rótulo de admoniciones WARNING.

Cualquier texto (por defecto Warning)

Españolizar nuestro documento

<counter>-number

Semilla de la secuencia numérica de un contador dado.

Número entero (por defecto 0)

8.1.5. Atributos de contenido y formateo general

Controlan aspectos generales del contenido y su presentación.

Nombre

Finalidad

Valores admitidos

Ref.

hardbreaks-option

Preserva los saltos de línea duros en todo el documento.

Atributo booleano

Saltos de línea duros

hide-uri-scheme

Oculta el esquema de URIs en enlaces raw.

Atributo booleano

noheader

Oculta la cabecera del documento.

Atributo booleano

nofooter

Oculta el pie de página del documento.

Atributo booleano

noheaderfooter

Oculta cabecera y pie de página.

Atributo booleano

nofootnotes

Deshabilita las notas al pie.

Atributo booleano

stem

Activa el procesamiento de ecuaciones matemáticas.

Vacío/asciimath, latexmath

eqnums

Numeración automática de ecuaciones LaTeX.

Vacío/AMS, all, none

tabsize

Número de espacios por tabulador en bloques literales.

Entero ≥ 0

data-uri

Embebe gráficos como data-uri en HTML (documento autocontenido).

Atributo booleano

cache-uri

Almacena en caché el contenido leído de URIs.

Atributo booleano

show-link-uri

Imprime la URI de un enlace tras el texto del mismo (solo PDF).

Atributo booleano

pagewidth

Ancho de página para calcular anchos absolutos de tablas (DocBook).

Entero (por defecto 425)

outfilesuffix

Extensión del fichero de salida.

Cualquier texto (por defecto .html)

relfileprefix

Prefijo de ruta para referencias cruzadas relativas.

Cualquier texto

relfilesuffix

Sufijo (extensión) para referencias cruzadas relativas.

Cualquier texto (por defecto el de outfilesuffix)

asset-uri-scheme

Protocolo para recursos alojados en CDN.

Vacío, http, https (por defecto)

fragment

Indica al parser que el documento es un fragmento.

Atributo booleano

xrefstyle

Estilo de formato del texto de referencias cruzadas.

full, short, basic

reproducible

Evita que se añada la fecha de última actualización.

Atributo booleano

skip-front-matter

Consume el front-matter YAML al inicio del documento.

Atributo booleano

compat-mode

Activa el modo de análisis heredado.

Atributo booleano

8.1.6. Atributos de imágenes e iconos

Nombre

Finalidad

Valores admitidos

Ref.

imagesdir

Directorio base donde se buscan las imágenes.

Ruta de directorio o URL

icons

Modo de representación de iconos (admoniciones y macro icon:).

Vacío/image, font

iconsdir

Directorio de iconos (modo imagen).

Ruta de directorio

icontype

Tipo de fichero de iconos (modo imagen).

jpg, png (por defecto), gif, svg

iconfont-name

Nombre de la hoja de estilos del icono.

Cualquier texto (por defecto font-awesome)

iconfont-cdn

URL del CDN para la fuente de iconos.

URL

iconfont-remote

Permite usar CDN para la fuente de iconos.

Atributo booleano (activo por defecto)

figure-caption

Texto del rótulo de figuras/imagenes.

Cualquier texto (por defecto Figure)

8.1.7. Atributos de resaltado de código fuente

Nombre

Finalidad

Valores admitidos

Ref.

source-highlighter

Resaltador de sintaxis a usar.

rouge, pygments, highlight.js, prettify, coderay

source-language

Lenguaje por defecto para bloques source.

Nombre del lenguaje

source-linenums-option

Muestra números de línea en bloques source.

Atributo booleano

source-indent

Número de espacios a eliminar de la indentación.

Entero

highlightjs-dir

Directorio del resaltador highlight.js.

Ruta o URL

highlightjs-theme

Tema de highlight.js.

Nombre del tema (por defecto github)

prettifydir

Directorio de prettify.

Ruta o URL

prettify-theme

Tema de prettify.

Nombre del tema (por defecto prettify)

pygments-css

Controla si Pygments usa clases CSS o estilos inline.

class, style

pygments-style

Estilo de Pygments.

Nombre del estilo

pygments-linenums-mode

Modo de números de línea de Pygments.

inline, table

rouge-css

Controla si Rouge usa clases CSS o estilos inline.

class, style

rouge-style

Estilo de Rouge.

Nombre del estilo

rouge-linenums-mode

Modo de números de línea de Rouge.

inline, table

coderay-css

Controla si CodeRay usa clases CSS o estilos inline.

class, style

coderay-linenums-mode

Modo de números de línea de CodeRay.

inline, table

prewrap

Ajusta automáticamente las líneas largas en bloques literales.

Atributo booleano (activo por defecto)

8.1.8. Atributos de estilo HTML

Nombre

Finalidad

Valores admitidos

Ref.

stylesheet

Hoja de estilos a usar.

Nombre del fichero CSS

stylesdir

Directorio de hojas de estilo.

Ruta de directorio

linkcss

Enlaza con la hoja de estilo en lugar de embeberla.

Atributo booleano

css-signature

Genera una firma CSS para el documento.

Atributo booleano

webfonts

Controla si se cargan fuentes web de Google Fonts.

Atributo booleano (activo por defecto)

toc-class

Clase CSS aplicada al contenedor de la tabla de contenidos.

Nombre de clase CSS

8.1.9. Atributos de docinfo

Nombre

Finalidad

Valores admitidos

Ref.

docinfo

Indica si se incluyen ficheros docinfo.

Vacío/private, shared, shared-head, private-head, shared-footer, private-footer

docinfodir

Directorio donde buscar los ficheros docinfo.

Ruta de directorio

docinfosubs

Sustituciones a aplicar al contenido de los docinfo.

Lista separada por comas de nombres de sustitución

8.1.10. Atributos de seguridad

Nombre

Finalidad

Valores admitidos

Ref.

max-include-depth

Profundidad máxima de inclusiones anidadas.

Número entero

8.1.11. Atributos intrínsecos (solo lectura)

Estos atributos son establecidos automáticamente por el procesador y proporcionan información sobre el documento y su entorno. No pueden modificarse (salvo excepciones indicadas).

Nombre

Finalidad

Modificable

docdir

Directorio completo del fichero fuente.

Si la entrada es un string

docfile

Ruta completa del fichero fuente.

Si la entrada es un string

docname

Nombre raíz del fichero fuente (sin ruta ni extensión).

Si la entrada es un string

docfilesuffix

Extensión del fichero fuente (con punto).

Si la entrada es un string

docdate

Fecha de última modificación del fichero fuente.

Si

doctime

Hora de última modificación del fichero fuente.

Si

docdatetime

Fecha y hora de última modificación.

Si

docyear

Año de última modificación.

Si

localdate

Fecha de conversión del documento.

Si

localtime

Hora de conversión del documento.

Si

localdatetime

Fecha y hora de conversión.

Si

localyear

Año de conversión.

Si

filetype

Extensión del fichero de salida.

Si la entrada es un string

filetype-<filetype>

Atributo de conveniencia para comprobar el tipo de salida.

No

outdir

Directorio de salida.

No

outfile

Ruta completa del fichero de salida.

No

outfilesuffix

Extensión del fichero de salida.

Si

user-home

Directorio home del usuario.

No

embedded

Indica si la salida es un documento incrustado.

No

safe-mode-level

Nivel numérico del modo seguro (0/1/10/20).

No

safe-mode-name

Nombre del modo seguro (UNSAFE/SAFE/SERVER/SECURE).

No

safe-mode-unsafe

Activo si el modo es UNSAFE.

No

safe-mode-safe

Activo si el modo es SAFE.

No

safe-mode-server

Activo si el modo es SERVER.

No

safe-mode-secure

Activo si el modo es SECURE.

No

htmlsyntax

Sintaxis HTML usada (html o xml).

No

front-matter

Contenido YAML extraído del front-matter.

Si skip-front-matter está activo

8.1.12. Atributos de compilación condicional (predefinidos)

Estos atributos se definen automáticamente según el backend y tipo de documento, y son útiles en directivas ifdef/ifndef/ifeval.

Nombre

Se define cuando

backend-html5

La salida es HTML5.

backend-pdf

La salida es PDF.

backend-docbook

La salida es DocBook.

doctype-article

El tipo de documento es article.

doctype-book

El tipo de documento es book.

platform-linux

El sistema es Linux.

platform-macos

El sistema es macOS.

platform-windows

El sistema es Windows.

env-dev

El entorno es de desarrollo.

env-prod

El entorno es de producción.

8.2. Atributos de elemento (bloque e inline)

Los atributos de elemento afectan a un bloque o a un elemento en línea concreto. Se indican entre corchetes […​] justo antes del elemento al que afectan.

8.2.1. Sintaxis general

Sintaxis de atributos posicionales:

[valor1, valor2, valor3]

Sintaxis de atributos con nombre:

[nombre=valor, nombre2=valor2]

Abreviaturas de atributos comunes:
  • # equivale a id= (identificador único)

  • . equivale a role= (rol CSS)

  • % equivale a options= (opciones)

Véase la sección Atributos posicionales para más detalles sobre atributos posicionales y con nombre.

8.2.2. Tipos de bloque y sus atributos posicionales

Cada tipo de bloque puede admitir atributos posicionales específicos.

Tipo de bloque

Atributos posicionales

quote / verse

autor, obra (ambas opcionales)

source / listing

lenguaje (opcional)

image (bloque)

Ruta de la imagen (posicional), alt, width, height, align, float, link

audio

Ruta del fichero de audio (posicional)

video

Ruta del fichero de vídeo (posicional), plataforma (youtube, vimeo)

toc

Ninguno

table

Definición de columnas (posicional en cols)

8.2.3. Atributos de bloque más comunes

Nombre

Finalidad

Valores

id (#)

Identificador único del elemento (para referencias cruzadas).

Cualquier texto válido como ID XML

role (.)

Rol CSS aplicado al elemento.

Cualquier texto (puede ser una clase CSS)

options (%)

Opciones específicas del tipo de bloque.

collapsible, open, hardbreaks, unstyled…​

title

Título del bloque (también se puede indicar con .Título).

Cualquier texto

subs

Sustituciones a aplicar a un bloque.

Lista de nombres de sustitución separados por comas

source-highlighter

Resaltador de sintaxis para bloques source en concreto.

Nombre del resaltador

8.2.4. Atributos de párrafo

Nombre

Finalidad

Valores

.text-center

Centra el párrafo.

Atributo booleano

.text-left

Alinea el párrafo a la izquierda.

Atributo booleano

.text-right

Alinea el párrafo a la derecha.

Atributo booleano

.text-justify

Justifica el párrafo.

Atributo booleano

.lead

Aumenta ligeramente el tamaño de letra del párrafo.

Atributo booleano

.normal

Restaura el tamaño de letra normal (sobre todo en preámbulo).

Atributo booleano

hardbreaks

Activa saltos de línea duros para el párrafo.

Atributo booleano

8.2.5. Atributos de lista

Nombre

Finalidad

Valores

plain

Lista sin marcadores visuales.

Atributo booleano

unstyled

Lista con viñetas vacías.

Atributo booleano

nobullet

Lista sin marcadores (mantiene sangría).

Atributo booleano

qanda

Lista de tipo preguntas y respuestas.

Atributo booleano

bibliography

Lista de tipo bibliografía (marcadores [1], [2]…​).

Atributo booleano

loweralpha

Numeración con letras minúsculas.

Atributo booleano

upperalpha

Numeración con letras mayúsculas.

Atributo booleano

lowerroman

Numeración con números romanos en minúscula.

Atributo booleano

upperroman

Numeración con números romanos en mayúscula.

Atributo booleano

start

Número inicial de la secuencia de numeración.

Número entero

reversed

Invierte el orden de la numeración.

Atributo booleano

horizontal

Lista de descripción en disposición horizontal.

Atributo booleano

label-width

Ancho de la columna de términos (solo horizontal).

Porcentaje (ej. 30%)

8.2.6. Atributos de tabla

Nombre

Finalidad

Valores

cols

Define el número y estilo de las columnas.

Expresión de columnas (ej. "1,2,1")

width

Ancho total de la tabla.

Porcentaje o píxeles

frame

Borde exterior de la tabla.

all, none, sides, topbot

grid

Líneas de separación internas.

all, none, cols, rows

stripes

Filas rayadas (zebra striping).

all, none, even, odd, hover

align

Alineación general de la tabla.

left, center, right

header-rows

Número de filas de cabecera.

Número entero

footer-rows

Número de filas de pie.

Número entero

cols (atributos de columna)

Ancho relativo, alineación y estilo por columna.

l> (izq.), c> (centro), d> (AsciiDoc), >

colspan

Número de columnas que ocupa una celda.

Número entero

rowspan

Número de filas que ocupa una celda.

Número entero

8.2.7. Atributos de imagen (macro image::)

Nombre

Finalidad

Valores

width

Ancho de la imagen en píxeles.

Número entero

height

Alto de la imagen en píxeles.

Número entero

alt

Texto alternativo para accesibilidad.

Cualquier texto

align

Alineación horizontal.

left, center, right

float

Flotación (el texto fluye alrededor).

left, right

link

Enlace asociado a la imagen.

URL

8.2.8. Atributos de audio

Nombre

Finalidad

autoplay

Reproduce el audio automáticamente.

loop

Repite el audio en bucle.

nocontrols

Oculta los controles de reproducción.

8.2.9. Atributos de vídeo

Nombre

Finalidad

width

Ancho del reproductor en píxeles.

height

Alto del reproductor en píxeles.

autoplay

Reproduce el vídeo automáticamente.

nocontrols

Oculta los controles de reproducción.

poster

Imagen que se muestra antes de la reproducción.

start

Segundo de inicio de la reproducción.

end

Segundo de fin de la reproducción.

8.2.10. Atributos de enlace

Nombre

Finalidad

window=_blank

Abre el enlace en una nueva ventana o pestaña.

title="Texto"

Añade un tooltip al enlace.

rel="nofollow"

Añade el atributo rel="nofollow" (para SEO).

8.2.11. Atributos de icono (macro icon:)

Nombre

Finalidad

`tamaño=1x

2x

3x

4x

5x`

Tamaño del icono.

`color=nombre

#[hex]`

Color del icono.

`rotate=90

180

270`

Rotación del icono.

`flip=horizontal

vertical`

Reflejo del icono.

8.2.12. Atributos de include

Nombre

Finalidad

lines

Rangos de líneas a incluir (ej. 1..5, 1..3,7,9..15).

tags

Etiquetas de contenido a incluir (ej. mi-etiqueta, **).

leveloffset

Desplaza el nivel de las secciones incluidas (ej. +1, -1).

indent

Añade indentación al contenido incluido.

8.3. Atributos de sustitución

Se aplican mediante el atributo subs en bloques o en la directiva :subs:. Controlan qué transformaciones se aplican al contenido.

Nombre

Finalidad

specialchars

Escapar caracteres especiales HTML (<, >, &).

attributes

Sustitución de referencias a atributos ({nombre}).

quotes

Procesado de formato (negrita, cursiva, monoespaciado…​).

replacements

Sustitución de caracteres especiales (-- → guion largo, © → ©…​).

macros

Procesado de macros (enlaces, imágenes, admoniciones…​).

post_replacements

Sustitución de saltos de línea por <br>.

Para aplicar o excluir sustituciones selectivamente en un bloque:

+

[subs="quotes,-macros"]
Texto con _cursiva_ pero sin procesar macros.

+

8.3.1. Valores de referencia para subs

Valor

Significado

none

No aplica ninguna sustitución.

verbatim

Texto literal sin procesamiento.

specials

Solo sustituciones especiales (macros, etc.).

normal

Conjunto normal de sustituciones.

@

Repite las sustituciones del bloque padre.

-<nombre>

Excluye una sustitución concreta.

+<nombre>

Añade una sustitución concreta.

8.4. Carácter de escape y prevención de sustituciones

Para evitar que AsciiDoc procese cierta sintaxis, se pueden usar varios mecanismos:

Mecanismo

Descripción

{atributo}

Precede con barra invertida para evitar la sustitución del atributo.

\*

Precede con barra invertida para evitar la interpretación como formato.

texto literal

El texto literal (+) desactiva todas las sustituciones internas.

Macro passthrough que evita el procesamiento del contenido.