Balises HTML dans Rmarkdown au document Word

Oct 01 2020

Existe-t-il une possibilité d'utiliser des balises HTML dans les documents Rmarkdown rendus au format Word?

Par exemple:

---
output: word_document
---

# This is rendered as heading

<h1> But this is not </h1>

Fonctionne parfaitement lors du rendu en tant que html_document, mais pas lors du rendu en tant que word_document.

Une question plus spécifique sur les balises a été posée ici, mais sans solution: Soulignez dans RMarkdown vers Microsoft Word

Réponses

2 tarleb Oct 03 2020 at 14:08

Bien sûr, nous y voilà:

---
output:
  word_document:
    md_extensions: +raw_html-markdown_in_html_blocks
    pandoc_args: ['--lua-filter', 'read_html.lua']
---

# This is rendered as heading

<h1> And this is one, too </h1>

où read_html.luadoit être un fichier dans le même répertoire avec ce contenu:

function RawBlock (raw)
  if raw.format:match 'html' and not FORMAT:match 'html' then
    return pandoc.read(raw.text, raw.format).blocks
  end
end

Décompressons ce qui précède pour voir comment cela fonctionne. La première chose que vous remarquerez sont les paramètres supplémentaires de word_document. Pour md_extensionsmodifier la façon dont pandoc analyse le texte, voyez ici pour une liste complète (ou exécutez pandoc --list-extensions=markdown) dans votre terminal. Nous permettons raw_htmlde nous assurer que pandoc ne rejette pas les balises HTML brutes, et désactivons markdown_in_html_blocksas pour nous assurer que nous obtenons la balise HTML entière en un seul bloc au format interne de pandoc.

Le paramètre suivant est pandoc_args, où nous disons à pandoc d'utiliser un filtre Lua pour modifier le document pendant la conversion. Le filtre sélectionne tous les blocs HTML, les analyse en HTML au lieu de Markdown et remplace le HTML brut par le résultat de l'analyse.

Donc, si vous utilisez du HTML brut que pandoc peut lire, tout ira bien. Si vous utilisez des instructions spéciales que pandoc ne peut pas lire, la configuration décrite ci-dessus n'aidera pas non plus. Vous devrez réécrire le balisage en OOXML, le format XML utilisé dans docx.