Cuaderno de GNUtas

Convertir de Markdown a docx y a LaTeX con Pandoc

Como está claro que no vivimos en el mejor de los mundos, habrá ocasiones en que tengamos que entregar nuestros escritos en el formato docx de Microchofs. Si nuestro original está, por ejemplo, en Markdown, podremos convertirlo fácil y rápidamente con Pandoc. Ejecutando la orden

pandoc documento.md -o documento.docx

el resultado que devuelve Pandoc por defecto es bastante aceptable. Luego podremos modificar los estilos a nuestro gusto, tras abrir el documento en Libre Office. Pero aún podemos afinar un poco más y ahorrarnos este último paso, de forma que nuestro documento resultante esté en perfecto estado de revista. Pandoc incluye la extensión Fenced-Divs, que permite analizar una serie de bloques de texto con atributos determinados y limitados por la secuencia :::. Si la conversión es a docx, entonces esos atributos pueden traducirse por estilos personalizados, gracias a la funcionalidad custom-style. Para ello, en nuestro Markdown original encerraríamos el bloque de texto de esta forma:

::: {custom-style="miestilo"}

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque rhoncus porttitor enim, vel consequat nulla varius
sit amet. Nunc a congue odio, ac dictum ipsum. Suspendisse laoreet nibh quis volutpat commodo. Integer eget congue
velit. Aliquam cursus dapibus lorem, vitae fermentum elit vehicula et. Suspendisse hendrerit felis at tempus ornare.

:::

Nuestro documento.docx resultante tendrá un estilo nuevo, llamado «miestilo», para ese párrafo. Naturalmente, será un estilo vacío. Para aplicarle las propiedades que deseemos podemos cargar una plantilla ya definida con el nombre de éste y otros estilos personalizados. Pero todavía podemos hilar más fino y ahorrarnos tener que aplicar la plantilla si, de alguna forma, la cargamos en la conversión de Pandoc. Primero de todo crearemos un *.docx (ojo, no una plantilla, sino un documento normal y corriente) que contenga todos los estilos personalizados, y lo nombramos, por ejemplo, mis_estilos.docx. A continuación lanzamos Pandoc con la opción --reference-doc=, de esta forma:

pandoc documento.md --reference-doc=<RUTA-HACIA>mis_estilos.docx  -o documento.docx

Y obtenemos nuestro documento tal cual queríamos.

¿Y qué hay de LaTeX?

Pues si queremos una salida a LaTeX, aún podemos beneficiarnos de la extensión Fenced-Divs para que los bloques con atributos de nuestro Markdown se conviertan en entornos LaTeX personalizados. Eso sí, necesitaremos crear antes un pequeño filtro en Lua, si queremos que un atributo miestilo se traduzca por el entorno del mismo nombre. Escribimos esto en nuestro filtro1:

function Div(el)

  if el.classes:includes("miestilo") then
    return { pandoc.RawBlock("latex", "\\begin{miestilo}"),
             el,
             pandoc.RawBlock("latex", "\\end{miestilo}") }
  end

end

Por su parte, en nuestro documento Markdown, encerraremos el bloque afectado, esta vez así:

::: miestilo

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque rhoncus porttitor enim, vel consequat nulla varius
sit amet. Nunc a congue odio, ac dictum ipsum. Suspendisse laoreet nibh quis volutpat commodo. Integer eget congue
velit. Aliquam cursus dapibus lorem, vitae fermentum elit vehicula et. Suspendisse hendrerit felis at tempus ornare.

:::

Y lanzaremos Pandoc llamando a nuestro filtro Lua con la opción --lua-filter=:

pandoc documento.md --lua-filter=<RUTA-HACIA>mi_filtro.lua -o docuemento.tex

De esta forma, nuestro *.tex resultante contendrá el entorno:

\begin{miestilo}

  Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque rhoncus porttitor enim, vel consequat nulla varius
  sit amet. Nunc a congue odio, ac dictum ipsum. Suspendisse laoreet nibh quis volutpat commodo. Integer eget congue
  velit. Aliquam cursus dapibus lorem, vitae fermentum elit vehicula et. Suspendisse hendrerit felis at tempus ornare.

\end{miestilo}

Por supuesto, el estilo lo podremos haber definido previamente en una plantilla LaTeX para Pandoc.

¿Y para docx y LaTeX a la vez?

Ya se ha visto que la pega de este procedimiento está en que, en uno u otro caso, los atributos de los bloques los tenemos que nombrar con una sintaxis distinta. Si queremos una salida para docx y otra para LaTeX no quedará otra que poner ::: {custom-style="miestilo"} o ::: miestilo, respectivamente, según sea lo que queramos obtener. Pero aquí se me ha ocurrido volver a tirar de un filtro Lua, manteniendo en nuestro documento original tan sólo el primer formato de atributo: ::: {custom-style="miestilo"}. Para convertirlo a docx se seguirá el procedimiento antes descrito. Y para LaTeX, cargaremos un filtro en Lua que contenga, esta vez, lo siguiente:

function Div(el)
  attrs = pandoc.Attr("", {}, {["custom-style"]="miestilo"})
  return { pandoc.RawBlock("latex", "\\begin{miestilo}"),
             el,
             pandoc.RawBlock("latex", "\\end{miestilo}") }
end

Y obtendremos, nuevamente, el entorno miestilo.

Publicado: 19/08/2018

Última actualización: 19/08/2018


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

Notas al pie de página:

1

Basado en este otro filtro que sugiere John MacFarlane en un hilo de GitHub

© Juan Manuel Macías
Creado con esmero en
GNU Emacs