summaryrefslogtreecommitdiff
path: root/src/posts/2024-02-15-ekdosis-et-stylo.md
diff options
context:
space:
mode:
Diffstat (limited to 'src/posts/2024-02-15-ekdosis-et-stylo.md')
-rw-r--r--src/posts/2024-02-15-ekdosis-et-stylo.md202
1 files changed, 199 insertions, 3 deletions
diff --git a/src/posts/2024-02-15-ekdosis-et-stylo.md b/src/posts/2024-02-15-ekdosis-et-stylo.md
index 0f1e7e6..86fbefa 100644
--- a/src/posts/2024-02-15-ekdosis-et-stylo.md
+++ b/src/posts/2024-02-15-ekdosis-et-stylo.md
@@ -1,5 +1,5 @@
---
-title: '`ekdosis` et Stylo'
+title: 'Créer un nouvel export dans Stylo compatible avec `ekdosis`'
date: 2024-02-15
---
@@ -75,5 +75,201 @@ redévelopper tout ce que fait `ekdosis` dans Stylo pour obtenir un comportement
similaire.
### Deuxième option
-_Work in progress_ (je reviendrai sur cette section lorsque nous aurons avancé
-sur son cahier des charges !)
+
+*Mise à jour effectuée le 09 mai 2024.*
+
+#### Fonctionnement
+
+Pour réaliser un export vers pdf et xml-tei [ekdosis](http://www.ekdosis.org/),
+la méthode la plus élégante consiste à intégrer ekdosis à Stylo.
+
+Nous avons déjà presque toutes les technologies à disposition (puisque Pandoc
+utilise TeXlive pour compiler les pdf).
+
+Pandoc interprète les balises LaTeX lorsqu'elle se trouvent dans des documents
+en Markdown.
+
+Pour observer cette interprétation, il faut aller regarder ce qu'il se passe
+dans l'AST du document, auquel on accède par la commande suivant :
+
+`pandoc -f markdown -t native sample.md --lua-filter=style-tex.lua -s -i`
+
+On y trouve la chose suivante (voir sample.md plus bas) : `RawInline (Format
+"tex") "\\emph{emphase}"`.
+
+Au milieu d'un paragraphe (`Para`), Pandoc parse correctement le latex et le
+reconnait sous sa forme brute dans un élément _inline_.
+
+Lors d'une transformation en PDF, l'emphase déclarée en latex dans le markdown
+sera bien interprétée.
+
+Pour ce qui concerne l'intégration d'ekdosis dans du Markdown nous avons besoin
+d'un élément supplémentaire.
+Par précaution, il vaut mieux indiquer le package utilisé que l'on déclare
+normalement dans le préambule d'un document LaTeX.
+
+Pandoc accepte cette information si elle est indexée dans une en-tête YAML du
+document Markdown sous la clef `header-includes`.
+
+Cette information est déclarée par exemple dans un fichier sample.md :
+
+```md
+---
+title: "Test 1"
+header-includes: |
+ \usepackage[teiexport]{ekdosis}
+---
+
+## Test de LaTeX inline
+
+Ceci est un paragraphe en Markdown.
+
+Ceci est un paragraphe md avec une \emph{emphase} en latex.
+
+## Test de blocs
+
+::: variant
+I met my friend \app{
+ \lem{Peter}
+ \rdg{John}
+ } at the station yesterday.
+:::
+
+::: variant
+I met my friend \app{
+ \lem{Robert}
+ \rdg{Roch}
+ } at the station yesterday.
+:::
+
+```
+
+L'en-tête est bien traduite dans l'AST dans le bloc des métadonnées par : 
+
+```
+Meta
+ { unMeta =
+ fromList
+ [ ( "header-includes"
+ , MetaBlocks
+ [ RawBlock (Format "tex") "\\usepackage{ekdosis}" ]
+ )
+ , ( "title" , MetaInlines [ Str "Test" , Space , Str "1" ] )
+ ]
+ }
+```
+
+Avec ceci nous sommes presque prêt à utiliser ekdosis dans Stylo (en préservant
+la
+syntaxe ekdosis et le traitement par le compilateur LuaLaTeX tels qu'ils ont été
+pensés par R. Alessi).
+
+Pour fonctionner il manque un élément, la balise indiquant l'emploie d'ekdosis
+dans le document `\begin{ekdosis}` et `\end{ekdosis}`.
+
+Les ajouter manuellement dans le Markdown perdrait l'intérêt de l'utilisation du
+Markdown (autant tout faire en LaTeX sinon).
+L'idée est de rendre ces balises discrètes en utilisant un
+filtre LUA où une division en Markdown (inline ou en block) associée à la classe
+`variant` ajoute les balises autour du paragraphe où ekdosis est employé.
+
+C'est ce que l'on peut obtenir avec le filtre suivant:
+
+```lua
+function Div (element)
+ if element.classes[1] == 'variant' then
+ return {
+ pandoc.RawInline('tex', '\\begin{ekdosis}'),
+ element,
+ pandoc.RawInline('tex', '\\end{ekdosis}'),
+ }
+ end
+end
+```
+
+#### Commandes
+
+Pour produire le pdf, utiliser les commandes suivantes : 
+
+```sh
+pandoc sample.md -o sample.pdf -s -i --pdf-engine=lualatex
+--lua-filter=style-tex.lua
+
+## La commande ci-dessus ne fonctionne pas, voir explication
+
+## Faire les commandes suivantes:
+
+pandoc sample.md -o sample.tex -s --lua-filter=style-tex.lua
+
+lualatex sample.tex
+
+lualatex sample.tex
+
+lualatex sample.tex
+```
+Compiler le Markdown avec Pandoc (et le compilateur lualatex) fonctionne pour
+produire un PDF mais ne fonctionne pas avec ekdosis.
+
+La raison est assez simple : ekdosis a besoin de compiler le fichier tex 3 fois
+pour produire le pdf. La première fois il génère l'appareil critique dans un
+fichier temporaire `sample.ekd`, la deuxième fois il opère des calculs pour
+numéroter les lignes et la troisième fois il génère le document PDF
+correctement.
+
+Le problème rencontré avec Pandoc est que ce dernier ne prend pas en charge de
+fichier extérieur, excepté les filtres et les templates. Du coup, même si on
+recompile 3x depuis Pandoc, l'appareil critique présent dans `sample.ekd` ne
+sera pas pris en compte.
+
+Le plus simple est alors de produire le fichier tex avec Pandoc puis de compiler
+le tex en PDF en appelant lualatex 3 fois.
+
+#### Dépendances
+
+Attention, la version de TeXlive installée sur stylo export est une version
+allégée.
+Un certain nombre de dépendances sont nécessaires pour faire fonctionner ekdosis
+et devront être ajoutées.
+
+Voici la liste des dépendances d'ekdosis : 
+
+```
+ekdosis-dependencies/ekdosis-dependencies.tex
+tex/lualatex/ekdosis/ekdosis.sty
+texlive/2024/texmf-dist/tex/generic/etexcmds/etexcmds.sty
+texlive/2024/texmf-dist/tex/generic/expkv-bundle/expkv-def.tex
+texlive/2024/texmf-dist/tex/generic/expkv-bundle/expkv-pop.tex
+texlive/2024/texmf-dist/tex/generic/expkv-bundle/expkv.tex
+texlive/2024/texmf-dist/tex/generic/iftex/ifluatex.sty
+texlive/2024/texmf-dist/tex/generic/iftex/iftex.sty
+texlive/2024/texmf-dist/tex/generic/infwarerr/infwarerr.sty
+texlive/2024/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
+texlive/2024/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
+texlive/2024/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
+texlive/2024/texmf-dist/tex/latex/auxhook/auxhook.sty
+texlive/2024/texmf-dist/tex/latex/base/article.cls
+texlive/2024/texmf-dist/tex/latex/base/size10.clo
+texlive/2024/texmf-dist/tex/latex/base/ts1cmr.fd
+texlive/2024/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+texlive/2024/texmf-dist/tex/latex/expkv-bundle/expkv-def.sty
+texlive/2024/texmf-dist/tex/latex/expkv-bundle/expkv-opt.sty
+texlive/2024/texmf-dist/tex/latex/expkv-bundle/expkv-pop.sty
+texlive/2024/texmf-dist/tex/latex/expkv-bundle/expkv.sty
+texlive/2024/texmf-dist/tex/latex/float/float.sty
+texlive/2024/texmf-dist/tex/latex/graphics/keyval.sty
+texlive/2024/texmf-dist/tex/latex/ifoddpage/ifoddpage.sty
+texlive/2024/texmf-dist/tex/latex/kvoptions/kvoptions.sty
+texlive/2024/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty
+texlive/2024/texmf-dist/tex/latex/l3backend/l3backend-luatex.def
+texlive/2024/texmf-dist/tex/latex/lineno/lineno.sty
+texlive/2024/texmf-dist/tex/latex/paracol/paracol.sty
+texlive/2024/texmf-dist/tex/latex/refcount/refcount.sty
+texlive/2024/texmf-dist/tex/latex/snapshot/snapshot.sty
+texlive/2024/texmf-dist/tex/latex/trivfloat/trivfloat.sty
+texlive/2024/texmf-dist/tex/latex/zref/zref-abspage.sty
+texlive/2024/texmf-dist/tex/latex/zref/zref-base.sty
+texlive/2024/texmf-dist/tex/latex/zref/zref-user.sty
+texlive/2024/texmf-dist/tex/lualatex/luacode/luacode.sty
+texlive/2024/texmf-dist/tex/luatex/ctablestack/ctablestack.sty
+texlive/2024/texmf-dist/tex/luatex/luatexbase/luatexbase.sty
+```