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
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.
Notas al pie de página:
Basado en este otro filtro que sugiere John MacFarlane en un hilo de GitHub