LaTeX
Par ces salops de Kuro et FanfanlaTulipe
Alors là, on va aborder une belle saloperie.
Pandoc
pandoc
est une bibliothèque Haskell et un convertisseur pour transformer un format de document en un autre (voir le site ci-dessous pour voir les formats supportés).
Nous aborderons ici la converstion d'un mélange de markdown, LaTeX et HTML en pdf.
Nous allons faire un makefile pour transformer notre document source (ici saloperie.md) en LaTeX compilé en pdf. PENSEZ A REMPLACER LES ESPACES PAR DES TABULATIONS POUR QUE LE MAKEFILE SOIT VALIDE
makefile
:
# A perfect makefile to compile notion.so exported markdown
CC=pandoc
C_ARGS=-f markdown-implicit_figures
# Definition des differents pdfs pouvant être compilés
# saloperie.pdf: header.md_ saloperie_de_markdown.md_
# saloperie.pdf est le nom du pdf généré
# header.md_ saloperie_de_markdown.md_ est la liste des md devant être mis dans le pdf
# dans l'ordre avec un _ en fin de nom
saloperie.pdf: header.md_ saloperie.md_
saloperie2.pdf: header.md_ saloperie2.md_
# Merge les dépendences en un fichier et le compile
%.pdf:
cat $^ > $@.tmpdf.md
$(CC) $(C_ARGS) -o $@ $@.tmpdf.md
# Génère les markdown pratiques pour êtres compilés en Latex
%.md_: %.md
@# Copie le fichier markdown dans un nouveau fichier avec _ en début et sans le .md
cp $< $@
@# Remplace les lignes ne contenant que `\\` par des `\newpage`
sed -i 's/^\\\\$$/\\newpage/' $@
@# Retire les commentaires `Untitled` des images (quand export depuis Notion)
sed -i 's/!\[Untitled\]/![]/' $@
@# remplace les %20 dans le fichier par des underscores (pour retirer les espaces des noms de fichiers qui cassent pandoc)
sed -i 's/%20/_/g' $@
@# centre les images
sed -i 's/^\!\[.*\]\(.*\)$$/\\centering\n\n&\n\n\\raggedright/g' $@
# Création du fichier header en modifiant les occurences de `$title` et `$authors` par les contenus des fichiers correspondants
header.md_: header.md title authors
@# Copie le fichier header.md dans un fichier _header
cp $< $@
@# Remplace `$title` par le contenu du fichier title
sed -i 's/$$title/'"$$(cat title)"'/' $@
@# Remplace `$authors` par le contenu du fichier title
sed -i 's/$$authors/'"$$(cat authors)"'/' $@
# Crée un fichier de titre basique si il n'existe pas
title:
cat << "EOF" > $@
Saloperie de pdf
EOF
sed -i 's/\\/\\\\/g' $@
# Crée un fichier authors basique si il n'existe pas
authors:
cat << "EOF" > $@
Un salaud d'anonyme\\Saloperie de Wiki
EOF
sed -i 's/\\/\\\\/g' $@
# Retire les espaces des noms de fichiers
# A lancer lors de l'export avant la première compilation
remove_space_in_files_names:
# Retire les espaces des dossiers
@find . -depth -type d -name "* *" -print -exec bash -c 'mv "$$0" "$${0// /_}"' {} \;
# Retire les espaces des fichiers
@find . -depth -type f -name "* *" -print -exec bash -c 'mv "$$0" "$${0// /_}"' {} \;
clean:
${RM} *.tmpdf.md
${RM} *.md_
${RM} *.pdf
.PHONY: all clean remove_space_in_files_names
.ONESHELL:
header.md
:
---
numbersections: true
geometry: margin=3cm
header-includes:
- \usepackage{graphicx}
- \usepackage[ddmmyyyy]{datetime}
- \usepackage{fvextra}
- \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
---
<!--
graphicx : Permet de faire une image en latex sans forcement avoir une image en markdown ensuite
datetime : Permet de changer le format de date utilisé
fvextra et DefineVerbatimEnvironment : Permet un retour a la ligne automatique avec un `\` a la fin des lignes de code sortant de la page
-->
\begin{titlepage}
\centering
\vspace*{0.05cm}
\rule{\linewidth}{0.1 mm} \\[0.4 cm]
{ \huge \bfseries $title}\\
\rule{\linewidth}{0.1 mm} \\[1 cm]
\begin{minipage}{0.7\textwidth}
\begin{center} \large
\textbf{$authors}
\end{center}
\end{minipage}~
\begin{minipage}{0.7\textwidth}
\end{minipage}\\[3 cm]
\begin{figure}[h]
\centering
\includegraphics[width=5cm]{logo-saloperie.png}%
\end{figure}
\begin{center}
\today
\end{center}
\end{titlepage}
\newpage
\renewcommand{\contentsname}{Sommaire}
\tableofcontents
\newpage
Ce header nécessite d'avoir une image logo-saloperie.png
à coté du Makefile
Pour compiler le fichier :
make
# ou
make saloperie.pdf
make clean # supprimer les fichiers générés et les fichiers temporaires
Pour encore un peu plus d'automatisation, vous pouvez placer ce Makefile
, le fichier header.md
et l'image logo-saloperie.png
dans un dossier précis (ici ce sera ~/Desktop/pdf) et ajouter la fonction suivante dans votre .bashrc
(ou tout autre fichier de configuration de shell que vous utilisez)
function pdf_makefile() {
cp ~/Desktop/pdf/Makefile ~/Desktop/pdf/logo.png ~/Desktop/pdf/header.md .
echo -n "$1: _header" >> Makefile
shift
for i in $@; do
echo -n " _$(echo $i | awk -F '.md$' '{ print $1 }')" >> Makefile
done
echo "" >> Makefile
}
Ainsi, lorsque vous souhaitez compiler un nouveau markdown, vous pouvez faire pdf_makefile pdf.pdf premier_markdown.md deuxieme_markdown.md
et vous obtiendrez le makefile adapté avec la règle pour créer le pdf pdf.pdf
en utilisant header.md
comme header et avec premier_markdown.md
et deuxieme_markdown.md
comme contenu.