| ¡¡¡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.
|
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:
-
Un manual de usuario de AsciiDoc escrito por uno de los autores de AsciiDoctor
-
También se ha consultado ocasionalmente la guía del usuario escrita para la especificación original del lenguaje.
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.
-
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.
-
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.
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:
-
Mediante la opción
-ddeasciidoctoren 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
-
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:
-
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.
-
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.
-
Varias secciones con sus correspondientes subsecciones, mediante las que se estructura el contenido del documento.
-
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…
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.
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.
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:
-
Debe empezar en la primera línea del documento que no sea un comentario (ver Comentarios) o una línea en blanco.
-
No se admiten en la cabecera líneas indentadas por el lado izquierdo ni líneas en blanco.
-
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:
-
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. -
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.
-
Por largo que sea el título, debe estar en una sola línea.
-
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. |
|
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, olastname, 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 :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. |
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:
-
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.
-
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:
-
En documentos de tipo
manpageno se ha previsto ningún tipo de sección especial. -
En documentos de tipo
articlese prevén cinco tipos especiales de sección: abstract, appendix, bibliography, glossary e index. -
En documentos de tipo
bookse 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 booktambién se admite el tipo de sección especialabstract; sin embargo de acuerdo con mis pruebas el tipoabstracten un documentobookes 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
sectnumscon el valor deall::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, oabstract, 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:
.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.
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:
-
Por defecto genera automáticamente para cada sección del documento un atributo
idque 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. -
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.
-
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 |
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:
[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
sectlinksprovoca que en todas las secciones del documento se cree automáticamente un enlace que apunta a ella misma. -
La activación del atributo
sectanchorshace 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 † que se sustituye por †. 2 El carácter unicode se identifica por su número decimal. Por ejemplo ‡ que se sustituye por ‡. 3 El carácter unicode se identifica por su número hexadecimal. Por ejemplo 😀 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 (#).
*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:
-
El acento grave (fuente monoespaciada) debe ser siempre la marca más externa.
-
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, , 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, , 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;
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:
|
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. ====
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 ====== ===== ====
É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:
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
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.
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.
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.
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.
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:
-
Que el párrafo entero esté entrecomillado.
-
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.
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.
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')
-----
****
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 |
| 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 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:
-
Hacer la compra para toda la semana. <1>
-
Planchar. <2>
-
Consultar el horóscopo.
-
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:
-
Primer elemento.
-
Segundo elemento.
-
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:
-
Mantenerlos alejados de la luz del sol.
-
Mantenerlos alejados del agua.
-
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:
-
Primer elemento.
-
Segundo elemento.
-
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
-
Quinto elemento
-
Sexto elemento
-
Séptimo elemento
Y el atributo reversed invierte el orden de la numeración:
[reversed] . Tercer elemento . Segundo elemento . Primer elemento
-
Tercer elemento
-
Segundo elemento
-
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. |
|
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
-
Subelemento ordenado (nivel 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: |
grid
|
Líneas de separación: |
stripes
|
Filas rayadas: |
align
|
Alineación: |
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[]
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.
6.6.1. Autolinks
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 |
https://www.example.com[Ejemplo, window=_blank, title="Visitar ejemplo"]
6.6.3. Macro link: para archivos locales
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
-
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.
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 detoc-titleesta DETRÁS de la línea que carga el ficheroattributes-es.adoc. -
El atributo
toclevelsnos 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
tocno 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
toceste valor, el índice se imprimirá en aquel punto del documento en el que se haya insertado la macrotoc. Esta macro es una macro de bloque y tiene el siguiente formatotoc::[]
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
tocse ha establecido en la cabecera del documento con el valormacro.
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:
-
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: |
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}
++++
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, |
STEM/LaTeX
|
Para ecuaciones matemáticas en formato LaTeX (aunque
AsciiDoc tiene soporte nativo con |
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, |
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. |
|
Almacena el título del documento. |
Cualquier texto |
|
|
Valor del elemento |
Cualquier texto |
|
|
Oculta el título del documento en el cuerpo (pero lo mantiene como metadato). |
Atributo booleano (sin valor) |
|
|
Muestra el título del documento en documentos incrustados. |
Atributo booleano |
— |
|
Carácter que separa título y subtítulo. |
Cualquier texto (por defecto |
|
|
Nombre completo del autor. |
Cualquier texto (extraído de la línea de autor) |
|
|
Lista de autores separados por comas. |
Cualquier texto |
|
|
Primer nombre del autor. |
Cualquier texto |
|
|
Nombre intermedio del autor. |
Cualquier texto |
|
|
Apellido(s) del autor. |
Cualquier texto |
|
|
Iniciales del autor. |
Cualquier texto |
|
|
Correo electrónico del autor. |
Cualquier texto o macro |
|
|
Número de revisión del documento. |
Cualquier texto |
|
|
Fecha de la revisión. |
Cualquier texto |
|
|
Observaciones sobre la revisión. |
Cualquier texto |
|
|
Etiqueta antes del número de versión (por defecto |
Cualquier texto (por defecto |
|
|
Descripción del contenido del documento (metadato). |
Cualquier texto |
— |
|
Palabras clave para clasificación (metadato). |
Lista separada por comas |
— |
|
Información de copyright (metadato). |
Cualquier texto |
— |
|
Idioma principal del documento (ISO 639-1). |
Etiqueta de idioma: |
|
|
Impide que se añada |
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. |
|
Tipo de documento a generar. |
|
|
|
Formato de salida del procesador. |
|
— |
|
Backend genérico del que deriva el backend actual. |
|
— |
|
Extensión del fichero de salida. |
|
— |
|
Atributo de conveniencia para comprobar el backend activo. |
Atributo booleano |
— |
|
Atributo de conveniencia para comprobar el basebackend. |
Atributo booleano |
— |
|
Atributo de conveniencia para comprobar el tipo de documento. |
Atributo booleano |
— |
|
Tipo de medio de la salida (solo PDF). |
|
— |
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. |
|
Activa la numeración automática de secciones. |
Vacío (activa), |
|
|
Controla la profundidad máxima de numeración de secciones. |
|
|
|
Activa la generación automática de IDs para las secciones. |
Atributo booleano (activo por defecto) |
|
|
Convierte los títulos de sección en autoenlaces. |
Atributo booleano |
— |
|
Añade un ancla § delante de los títulos de sección al pasar el ratón. |
Atributo booleano |
— |
|
Prefijo de los IDs auto-generados de secciones. |
Cualquier texto (por defecto |
|
|
Separador de palabras en IDs auto-generados de secciones. |
Cualquier carácter (por defecto |
|
|
Activa la numeración de partes (solo |
Atributo booleano |
— |
|
Ajusta el nivel de las secciones del contenido incluido. |
|
— |
|
Activa y posiciona la tabla de contenidos. |
Vacío/ |
|
|
Profundidad máxima de secciones en la tabla de contenidos. |
|
|
|
Título de la tabla de contenidos. |
Cualquier texto (por defecto |
|
|
Carácter separador entre título y subtítulo. |
Cualquier texto |
8.1.4. Atributos de localización y numeración
Controlan etiquetas, rótulos y secuencias numéricas.
Nombre |
Finalidad |
Valores admitidos |
Ref. |
|
Etiqueta antes del título de apéndices. |
Cualquier texto (por defecto |
— |
|
Significador en referencias cruzadas a apéndices. |
Cualquier texto (por defecto |
— |
|
Texto del rótulo de admoniciones CAUTION. |
Cualquier texto (por defecto |
|
|
Significador en referencias a capítulos (solo |
Cualquier texto (por defecto |
— |
|
Etiqueta añadida a títulos de nivel 1 (solo |
Cualquier texto |
— |
|
Texto del rótulo de bloques de ejemplo. |
Cualquier texto (por defecto |
— |
|
Texto del rótulo de figuras/imagenes. |
Cualquier texto (por defecto |
|
|
Texto del rótulo de admoniciones IMPORTANT. |
Cualquier texto (por defecto |
|
|
Texto de la etiqueta "Last updated" en el pie de página. |
Cualquier texto (por defecto |
|
|
Texto del rótulo de bloques listing. |
Cualquier texto (por defecto vacío) |
— |
|
Etiqueta de la sección de nombre de programa (solo manpage). |
Cualquier texto (por defecto |
— |
|
Texto del rótulo de admoniciones NOTE. |
Cualquier texto (por defecto |
|
|
Significador en referencias a partes (solo |
Cualquier texto (por defecto |
— |
|
Etiqueta añadida a títulos de nivel 0 (solo |
Cualquier texto |
— |
|
Título para el prefacio anónimo (solo |
Cualquier texto |
— |
|
Significador en referencias a secciones numeradas. |
Cualquier texto (por defecto |
|
|
Texto del rótulo de tablas. |
Cualquier texto (por defecto |
|
|
Texto del rótulo de admoniciones TIP. |
Cualquier texto (por defecto |
|
|
Etiqueta para documentos sin título. |
Cualquier texto (por defecto |
— |
|
Etiqueta antes del número de versión. |
Cualquier texto (por defecto |
|
|
Texto del rótulo de admoniciones WARNING. |
Cualquier texto (por defecto |
|
|
Semilla de la secuencia numérica de un contador dado. |
Número entero (por defecto |
— |
8.1.5. Atributos de contenido y formateo general
Controlan aspectos generales del contenido y su presentación.
Nombre |
Finalidad |
Valores admitidos |
Ref. |
|
Preserva los saltos de línea duros en todo el documento. |
Atributo booleano |
|
|
Oculta el esquema de URIs en enlaces raw. |
Atributo booleano |
— |
|
Oculta la cabecera del documento. |
Atributo booleano |
— |
|
Oculta el pie de página del documento. |
Atributo booleano |
— |
|
Oculta cabecera y pie de página. |
Atributo booleano |
— |
|
Deshabilita las notas al pie. |
Atributo booleano |
— |
|
Activa el procesamiento de ecuaciones matemáticas. |
Vacío/ |
— |
|
Numeración automática de ecuaciones LaTeX. |
Vacío/ |
— |
|
Número de espacios por tabulador en bloques literales. |
Entero ≥ 0 |
— |
|
Embebe gráficos como data-uri en HTML (documento autocontenido). |
Atributo booleano |
— |
|
Almacena en caché el contenido leído de URIs. |
Atributo booleano |
— |
|
Imprime la URI de un enlace tras el texto del mismo (solo PDF). |
Atributo booleano |
— |
|
Ancho de página para calcular anchos absolutos de tablas (DocBook). |
Entero (por defecto |
— |
|
Extensión del fichero de salida. |
Cualquier texto (por defecto |
— |
|
Prefijo de ruta para referencias cruzadas relativas. |
Cualquier texto |
— |
|
Sufijo (extensión) para referencias cruzadas relativas. |
Cualquier texto (por defecto el de |
— |
|
Protocolo para recursos alojados en CDN. |
Vacío, |
— |
|
Indica al parser que el documento es un fragmento. |
Atributo booleano |
— |
|
Estilo de formato del texto de referencias cruzadas. |
|
— |
|
Evita que se añada la fecha de última actualización. |
Atributo booleano |
— |
|
Consume el front-matter YAML al inicio del documento. |
Atributo booleano |
— |
|
Activa el modo de análisis heredado. |
Atributo booleano |
— |
8.1.6. Atributos de imágenes e iconos
Nombre |
Finalidad |
Valores admitidos |
Ref. |
|
Directorio base donde se buscan las imágenes. |
Ruta de directorio o URL |
— |
|
Modo de representación de iconos (admoniciones y macro |
Vacío/ |
— |
|
Directorio de iconos (modo imagen). |
Ruta de directorio |
— |
|
Tipo de fichero de iconos (modo imagen). |
|
— |
|
Nombre de la hoja de estilos del icono. |
Cualquier texto (por defecto |
— |
|
URL del CDN para la fuente de iconos. |
URL |
— |
|
Permite usar CDN para la fuente de iconos. |
Atributo booleano (activo por defecto) |
— |
|
Texto del rótulo de figuras/imagenes. |
Cualquier texto (por defecto |
— |
8.1.7. Atributos de resaltado de código fuente
Nombre |
Finalidad |
Valores admitidos |
Ref. |
|
Resaltador de sintaxis a usar. |
|
— |
|
Lenguaje por defecto para bloques |
Nombre del lenguaje |
— |
|
Muestra números de línea en bloques source. |
Atributo booleano |
— |
|
Número de espacios a eliminar de la indentación. |
Entero |
— |
|
Directorio del resaltador highlight.js. |
Ruta o URL |
— |
|
Tema de highlight.js. |
Nombre del tema (por defecto |
— |
|
Directorio de prettify. |
Ruta o URL |
— |
|
Tema de prettify. |
Nombre del tema (por defecto |
— |
|
Controla si Pygments usa clases CSS o estilos inline. |
|
— |
|
Estilo de Pygments. |
Nombre del estilo |
— |
|
Modo de números de línea de Pygments. |
|
— |
|
Controla si Rouge usa clases CSS o estilos inline. |
|
— |
|
Estilo de Rouge. |
Nombre del estilo |
— |
|
Modo de números de línea de Rouge. |
|
— |
|
Controla si CodeRay usa clases CSS o estilos inline. |
|
— |
|
Modo de números de línea de CodeRay. |
|
— |
|
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. |
|
Hoja de estilos a usar. |
Nombre del fichero CSS |
— |
|
Directorio de hojas de estilo. |
Ruta de directorio |
— |
|
Enlaza con la hoja de estilo en lugar de embeberla. |
Atributo booleano |
— |
|
Genera una firma CSS para el documento. |
Atributo booleano |
— |
|
Controla si se cargan fuentes web de Google Fonts. |
Atributo booleano (activo por defecto) |
— |
|
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. |
|
Indica si se incluyen ficheros docinfo. |
Vacío/ |
— |
|
Directorio donde buscar los ficheros docinfo. |
Ruta de directorio |
— |
|
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. |
|
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 |
|
Directorio completo del fichero fuente. |
Si la entrada es un string |
|
Ruta completa del fichero fuente. |
Si la entrada es un string |
|
Nombre raíz del fichero fuente (sin ruta ni extensión). |
Si la entrada es un string |
|
Extensión del fichero fuente (con punto). |
Si la entrada es un string |
|
Fecha de última modificación del fichero fuente. |
Si |
|
Hora de última modificación del fichero fuente. |
Si |
|
Fecha y hora de última modificación. |
Si |
|
Año de última modificación. |
Si |
|
Fecha de conversión del documento. |
Si |
|
Hora de conversión del documento. |
Si |
|
Fecha y hora de conversión. |
Si |
|
Año de conversión. |
Si |
|
Extensión del fichero de salida. |
Si la entrada es un string |
|
Atributo de conveniencia para comprobar el tipo de salida. |
No |
|
Directorio de salida. |
No |
|
Ruta completa del fichero de salida. |
No |
|
Extensión del fichero de salida. |
Si |
|
Directorio home del usuario. |
No |
|
Indica si la salida es un documento incrustado. |
No |
|
Nivel numérico del modo seguro (0/1/10/20). |
No |
|
Nombre del modo seguro (UNSAFE/SAFE/SERVER/SECURE). |
No |
|
Activo si el modo es UNSAFE. |
No |
|
Activo si el modo es SAFE. |
No |
|
Activo si el modo es SERVER. |
No |
|
Activo si el modo es SECURE. |
No |
|
Sintaxis HTML usada ( |
No |
|
Contenido YAML extraído del front-matter. |
Si |
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 |
|
La salida es HTML5. |
|
La salida es PDF. |
|
La salida es DocBook. |
|
El tipo de documento es |
|
El tipo de documento es |
|
El sistema es Linux. |
|
El sistema es macOS. |
|
El sistema es Windows. |
|
El entorno es de desarrollo. |
|
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: |
|
| Sintaxis de atributos con nombre: |
|
| Abreviaturas de atributos comunes: |
|
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 |
|
|
|
|
|
Ruta de la imagen (posicional), |
|
Ruta del fichero de audio (posicional) |
|
Ruta del fichero de vídeo (posicional), plataforma ( |
|
Ninguno |
|
Definición de columnas (posicional en |
8.2.3. Atributos de bloque más comunes
Nombre |
Finalidad |
Valores |
|
Identificador único del elemento (para referencias cruzadas). |
Cualquier texto válido como ID XML |
|
Rol CSS aplicado al elemento. |
Cualquier texto (puede ser una clase CSS) |
|
Opciones específicas del tipo de bloque. |
|
|
Título del bloque (también se puede indicar con |
Cualquier texto |
|
Sustituciones a aplicar a un bloque. |
Lista de nombres de sustitución separados por comas |
|
Resaltador de sintaxis para bloques source en concreto. |
Nombre del resaltador |
8.2.4. Atributos de párrafo
Nombre |
Finalidad |
Valores |
|
Centra el párrafo. |
Atributo booleano |
|
Alinea el párrafo a la izquierda. |
Atributo booleano |
|
Alinea el párrafo a la derecha. |
Atributo booleano |
|
Justifica el párrafo. |
Atributo booleano |
|
Aumenta ligeramente el tamaño de letra del párrafo. |
Atributo booleano |
|
Restaura el tamaño de letra normal (sobre todo en preámbulo). |
Atributo booleano |
|
Activa saltos de línea duros para el párrafo. |
Atributo booleano |
8.2.5. Atributos de lista
Nombre |
Finalidad |
Valores |
|
Lista sin marcadores visuales. |
Atributo booleano |
|
Lista con viñetas vacías. |
Atributo booleano |
|
Lista sin marcadores (mantiene sangría). |
Atributo booleano |
|
Lista de tipo preguntas y respuestas. |
Atributo booleano |
|
Lista de tipo bibliografía (marcadores |
Atributo booleano |
|
Numeración con letras minúsculas. |
Atributo booleano |
|
Numeración con letras mayúsculas. |
Atributo booleano |
|
Numeración con números romanos en minúscula. |
Atributo booleano |
|
Numeración con números romanos en mayúscula. |
Atributo booleano |
|
Número inicial de la secuencia de numeración. |
Número entero |
|
Invierte el orden de la numeración. |
Atributo booleano |
|
Lista de descripción en disposición horizontal. |
Atributo booleano |
|
Ancho de la columna de términos (solo |
Porcentaje (ej. |
8.2.6. Atributos de tabla
Nombre |
Finalidad |
Valores |
|
Define el número y estilo de las columnas. |
Expresión de columnas (ej. |
|
Ancho total de la tabla. |
Porcentaje o píxeles |
|
Borde exterior de la tabla. |
|
|
Líneas de separación internas. |
|
|
Filas rayadas (zebra striping). |
|
|
Alineación general de la tabla. |
|
|
Número de filas de cabecera. |
Número entero |
|
Número de filas de pie. |
Número entero |
|
Ancho relativo, alineación y estilo por columna. |
|
|
Número de columnas que ocupa una celda. |
Número entero |
|
Número de filas que ocupa una celda. |
Número entero |
8.2.7. Atributos de imagen (macro image::)
Nombre |
Finalidad |
Valores |
|
Ancho de la imagen en píxeles. |
Número entero |
|
Alto de la imagen en píxeles. |
Número entero |
|
Texto alternativo para accesibilidad. |
Cualquier texto |
|
Alineación horizontal. |
|
|
Flotación (el texto fluye alrededor). |
|
|
Enlace asociado a la imagen. |
URL |
8.2.8. Atributos de audio
Nombre |
Finalidad |
|
Reproduce el audio automáticamente. |
|
Repite el audio en bucle. |
|
Oculta los controles de reproducción. |
8.2.9. Atributos de vídeo
Nombre |
Finalidad |
|
Ancho del reproductor en píxeles. |
|
Alto del reproductor en píxeles. |
|
Reproduce el vídeo automáticamente. |
|
Oculta los controles de reproducción. |
|
Imagen que se muestra antes de la reproducción. |
|
Segundo de inicio de la reproducción. |
|
Segundo de fin de la reproducción. |
8.2.10. Atributos de enlace
Nombre |
Finalidad |
|
Abre el enlace en una nueva ventana o pestaña. |
|
Añade un tooltip al enlace. |
|
Añade el atributo |
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 |
|
Rangos de líneas a incluir (ej. |
|
Etiquetas de contenido a incluir (ej. |
|
Desplaza el nivel de las secciones incluidas (ej. |
|
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 |
|
Escapar caracteres especiales HTML ( |
|
Sustitución de referencias a atributos ( |
|
Procesado de formato (negrita, cursiva, monoespaciado…). |
|
Sustitución de caracteres especiales ( |
|
Procesado de macros (enlaces, imágenes, admoniciones…). |
|
Sustitución de saltos de línea por |
| 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 |
|
No aplica ninguna sustitución. |
|
Texto literal sin procesamiento. |
|
Solo sustituciones especiales (macros, etc.). |
|
Conjunto normal de sustituciones. |
|
Repite las sustituciones del bloque padre. |
|
Excluye una sustitución concreta. |
|
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 |
|
Precede con barra invertida para evitar la sustitución del atributo. |
|
Precede con barra invertida para evitar la interpretación como formato. |
|
El texto literal ( |
Macro passthrough que evita el procesamiento del contenido. |