Introducción
Este artículo pretende ser una guía para transformar documentos con Pandoc.
Instalar Eisvogel en Windows
La herramienta que se usa para transformar documentos es Pandoc con la plantilla Eisvogel.
Puedes seguir los pasos del README de https://github.com/Wandmalfarbe/pandoc-latex-template?tab=readme-ov-file.
Si ya tienes docker lo único que tienes que hacer es descargar el contenedor:
1
docker pull pandoc/extra
Una vez instalado el contenedor podemos ejecutar el comando para ejecutar el comando que transforme nuestro .md
a .pdf
. En mi caso he instalado Docker en Windows 11 por lo que la estructura del comando que he usado es el siguiente:
1
docker run --rm --volume "<carpeta donde están los .md>:/data" pandoc/extra <entrada>.md -o <salida>.pdf --template eisvogel --listings
Ejemplo:
1
docker run pandoc/extra
De Markdown para Jekyll a PDF
Con el siguiente comando y los siguientes ficheros de configuración me genero este PDF a mi gusto:
Para PC fijo, creamos el contenedor de Docker:
1
2
3
4
$docker run -d -it --volume "D:\GitHub\marcosruiz.github.io:/data" `
--volume "C:\Users\marco\MEGA\CURSO 23 24\Plantillas\Eisvogel:/root/.pandoc/templates" `
--name mruizg `
--restart=no --runtime=runc pandoc/extra
Para portátil, creamos el contenedor de Docker:
1
2
3
4
$docker run -d -it --volume "C:\Users\marco\Documents\GitHub\marcosruiz.github.io:/data" `
--volume "C:\Users\marco\Documents\MEGA\CURSO 23 24\Plantillas\Eisvogel:/root/.pandoc/templates" `
--name mruizg `
--restart=no --runtime=runc pandoc/extra
Entramos en el contenedor de Docker:
1
$docker exec -it b9c2ae80ad7723523c71d532a0e3901f26dd0c67bba7273e65965b6ef8cc3194 sh
Dentro del contenedor de docker ejecutamos:
1
2
#tlmgr install svg
#tlmgr install adjustbox
El siguiente comando no es necesario:
1
#apk update && apk add texlive-full
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# Script de powershell para generar documentos PDF
# Este fichero debe ejecutarse en la raiz del proyecto ya que usa rutas relativas en las variables:
# $githubProjectFolder = "."
#
# Función para quitar todo lo que tenga que ver con mi web y de problemas a la hora de generar los PDFs.
#
function generarTemporal {
param(
[string]$fileRoute,
[string]$tempFileRoute
)
# Leer el contenido del archivo
$contenido = Get-Content -Path $fileRoute
# Definir los patrones de sustitución
$patrones = @{'^\{\s*:\s*\.section\s*\}$' = ''
'^\{\s*:\s*\.subsection\s*\}$' = ''
'^\{\s*:\s*\.subsubsection\s*\}$' = ''
'^\{\s*:\s*\.activity\s*\}$' = ''
'^\{\s*:\s*\.prompt-.*\s*\}$' = ''
'^\{\s*:\s*\.question\s*\}' = '**Pregunta:** '
'(<summary class="card-header question">)' = '$1**Pregunta:** '
'\{\s*:\s*\.filepath\s*\}' = ''
'🥳' = ''
'📸' = ''
'📷' = ''
"👏" = ''
'😮' = ''
'🔥' = ''
'🔝' = ''
'🙌' = ''
"👌" = ''
"🧠" = ''
"👀" = ''
"💳" = ''
"💸" = ''
"👱" = ''
'得' = ':imagínate un caracter chino aquí:'
'取' = ':imagínate un caracter chino aquí:'
'𐐝' = ':imagínate un caracter raro aquí:'
'д' = ':imagínate un caracter cirílico aquí:'
'Ж' = ':imagínate un caracter cirílico aquí:'
'\{\s*:\s*file="([^"]+)"\s*\}$' = '_Fichero: `$1`_'
'<iframe [^>]* src="([^"]*)[^>]* title="YouTube video player"' = 'Vídeo: $1'
'^_.*_$' = ''
'(\{\s*):(\s*width=.*\})' = '$1$2'
}
# Iterar sobre el contenido y modificar las líneas que coincidan con los patrones
foreach ($patron in $patrones.Keys) {
$contenido = $contenido -replace $patron, $patrones[$patron]
}
# Escribir el contenido filtrado de vuelta a un archivo temporal
$contenido | Set-Content -Path $tempFileRoute
}
# Aquí empieza el script
$githubProjectFolder = "."
# TODO: debemos definir la variable $routes con el nombre de las rutas que queremos convertir
# Temas LMSGI
# $routes = "css", "dtd", "espacios-de-nombres-xml", "html", "introduccion-lenguajes-marcas", "markdown", "practica-css-codepip", "practica-css-freecodecamp", "representacion-informacion", "sindicacion-contenidos", "sistemas-gestion-empresarial", "xml", "xpath", "xquery", "xsl", "xslfo", "xslt"
# Temas NC
# $routes = "legislacion-proteccion-datos", "normativa-nacional-internacional", "esquema-nacional-seguridad", "directiva-nis", "cumplimiento-normativo", "sistemas-gestion-cumplimiento", "tipos-normas-clasificacion", "legislacion-cumplimiento-penal", "conceptos-basicos-seguridad-informatica"
# Temas SAA
# $routes = "redes-neuronales-deep-learning", "casos-practicos-sobre-aprendizaje-automatico", "introduccion-aprendizaje-automatico", "algoritmos-aprendizaje-automatico", "aprendizaje-supervisado", "aprendizaje-no-supervisado"
# Iterar sobre cada patron de archivo
foreach ($route in $routes) {
$pattern = "[0-9\-]{11}" + $route + "\.md"
# Obtener el archivo correspondiente al patron
$files = Get-ChildItem "$githubProjectFolder\_posts" | Where-Object { $_.Name -match $pattern }
$file = $files[0]
$fileRoute = "$($githubProjectFolder)\_posts\$($file.Name)"
$tempFileRoute = "$($githubProjectFolder)\tmp\$($file.Name)"
generarTemporal -fileRoute $fileRoute -tempFileRoute $tempFileRoute
$resourcePath = "/data/assets/img/" + $route
# Recuerda cambiar el ID del contentedor por el que corresponda
docker exec aaa230b91f7592b6f2e74372eccfc2038caf5c5ebc16865aea3d9ab11ef8923d pandoc "/data/tmp/$($file.Name)" `
-o "/data/pdf/$($route).pdf" `
--metadata-file /data/pandoc/metadata.yaml `
--defaults /data/pandoc/defaults.yaml `
--resource-path $resourcePath `
--from markdown
}
También necesitamos los siguientes ficheros de configuración para simplificar el comando de pandoc:
1
2
3
4
listings: true
shift-heading-level-by: -1
number-sections: true
template: "eisvogel"
1
2
3
4
5
author: [Marcos Ruiz García]
titlepage: true
toc-own-page: true
toc: true
lang: es-ES
De Markdown para Notion a PDF
Con Markdown sería mucho más sencillo de generar:
1
2
3
4
5
6
7
8
9
# Ejecutar en la raíz del proyecto
$githubProjectFolder = "./"
$templatesFolder = "./pandoc/templates/"
docker run --rm --volume "$githubProjectFolder:/data" `
--volume "%templatesFolder:/root/.pandoc/templates" `
pandoc/extra /data/_posts/2024-03-01-tarea-xsl.md -o /data/pdf/2024-03-01-tarea-xsl.pdf `
--metadata-file /data/pandoc/metadata.yaml `
--defaults /data/pandoc/defaults.yaml
Parámetros de la instrucción pandoc
en un documento separado:
1
2
3
listings: true
number-sections: true
template: "eisvogel"
Fichero de metadatos en un documento separado:
1
2
3
4
5
author: [Marcos Ruiz García]
titlepage: true
toc-own-page: true
toc: true
lang: es-ES
De Markdown a PDF
Plantilla para tareas:
1
2
3
4
5
6
7
8
9
docker run --rm --volume ".:/data" `
pandoc/extra `
<nombreDelFicheroDeEntrada>.md `
-o <nombreDelFicheroDeSalida>.pdf `
-f markdown `
--template "https://raw.githubusercontent.com/Wandmalfarbe/pandoc-latex-template/v2.4.0/eisvogel.tex" `
--listings `
--shift-heading-level-by "-1" `
--number-sections false
En documento de markdown de entrada tiene los siguientes metadatos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---
title: "Nombre de la tarea"
subtitle: "Nombre de la asignatura\n\nNombre del ciclo formativo"
author: [Marcos Ruiz García]
date: "16/04/2024"
keywords: [Bla, blabla]
toc-own-page: true
titlepage: true
toc-own-page: true
toc: true
lang: es-ES
caption-justification: centering
...
## Bla bla bla
Bla bla bla
De Docx a Markdown
Una de las ventajas que tiene Markdown sobre DOCX es que se puede leer desde cualquier dispositivo cómodamente.
1
2
3
4
docker run --rm --volume "<carpeta donde esta el Docx>\:/data" `
pandoc/extra --extract-media='./' `
"/data/<nombre del docx>.docx" `
-o "/data/<nombre del md de salida>.md"
Ejemplo de uso:
1
2
3
4
5
6
7
docker run --rm --volume ".:/data" `
pandoc/extra --extract-media='./' `
"/data/01-mruizg-Representación y comunicación de la información.docx" `
--wrap=none `
--to=markdown `
--from=docx `
--output "/data/01-mruizg-Representación y comunicación de la información.md"
Ejemplo de uso:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
$temasPropiosFolder = "C:\Users\marco\MEGA\OPOS\SAI\SAI Temas\00 SAI Temas propios\"
$creator = "mruizg"
$numbers = @("01", "02", "03", "04", "05", "06", "07", "08", "10", "52", "53", "54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", "65")
$titles = @(
"Representación y comunicación de la información",
"Elementos funcionales de un ordenador digital",
"Componentes, estructura y funcionamiento de la Unidad Central de Proceso",
"Memoria interna. Tipos. Direccionamiento. Características y funciones",
"Microprocesadores. Estructura. Tipos. Comunicación con el exterior",
"Sistemas de almacenamiento externo. Tipos. Características y funcionamiento",
"Dispositivos periféricos de entradasalida. Características y funcionamiento",
"Hardware comercial de un ordenador. Placa base. Tarjetas controladoras de dispositivos y de entradasalida",
"Representación interna de los datos",
"Sistemas en red. Tipos. Componentes y topologías",
"Transmisión de datos. Medios. Tipos. Técnicas. Perturbaciones",
"Arquitectura de sistemas de comunicación. Niveles. Funciones. Servicios",
"Conexión de ordenadores en red. Elementos hardware necesarios. Tipos y características",
"Software de sistemas en red. Componentes. Funciones y estructura",
"Redes de área local. Hardware. Software. Recursos compartidos",
"Redes de área extensa. Interconexión redes locales",
"Análisis e implantación de un sistema en red",
"Instalación y configuración de sistemas en red local",
"Integración de sistemas. Medios de interconexión estándares",
"Evaluación y mejora del rendimiento de sistemas en red",
"Seguridad de los sistemas en red",
"Explotación y administración de sistemas en red",
"Análisis comparativo entre un sistema operativo multiusuario y un sistema en red"
)
for ($i = 0; $i -lt $titles.Count; $i++) {
$number = $numbers[$i]
$title = $titles[$i]
$folder = "$number-$title"
$file = "$number-$creator-$title"
$volumePath = $temasPropiosFolder + $folder
$dockerVolume = '"' + $volumePath + ':/data"'
docker run --rm --volume $dockerVolume `
pandoc/extra --extract-media='./' `
"/data/$file.docx" `
--wrap=none `
--to=markdown `
--from=docx `
--table-of-contents=false `
--output "/data/$file.md"
}
Si copias este texto en un fichero
.ps1
y te da problemas prueba la codificación Windows 1252.
De HTML a PDF
Ejemplo:
1
2
3
4
5
6
7
docker run --rm --volume "C:\Users\marco\MEGA\CURSO 23 24\LMSGI\Contenidos\TeoriaHTML:/data" `
--volume "C:\Users\marco\MEGA\CURSO 23 24\Plantillas\Eisvogel:/root/.pandoc/templates" `
--name pruebaHTML `
pandoc/extra "LMSGI01 - DAM - Lenguajes de marcas y sistemas de gestión de información - UT1.- Reconocimiento de las características de lenguajes de marcas..html" `
-o "pruebaHtml.pdf" --template eisvogel --listings `
--metadata-file /data/metadata.yaml `
--defaults /data/defaults.yaml
De PDF a Markdown
No se puede.
Alternativas a Jekyll
Actualmente estoy usando para esta web Jekyll con el tema Chirpy pero existen alternativas: