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.

Site de pandoc

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.