web-dev-qa-db-fra.com

Saut de page Pandoc markdown

Récemment, j'ai commencé à utiliser le démarquage Pandoc, qui semble être une bonne alternative à LaTeX, car mon document ne contient pas beaucoup de formules mathématiques et je n'ai aucune expérience de LaTeX, qui, combiné à un délai de soumission inférieur à deux semaines, en fait une bonne solution.

Une chose que je n'ai pas pu comprendre, c'est comment le forcer à laisser le reste de la page vide, quelqu'un peut-il aider?

92
LucasSeveryn

Pandoc markdown utilise les balises LaTeX standard à cet effet:

\newpage et \pagebreak

118
LucasSeveryn

TL; DR : utilisez \newpage et le filtre Lua ci-dessous pour obtenir les sauts de page dans de nombreux formats.

Pandoc analyse toutes les entrées dans un format de document interne. Ce format n'a pas de moyen spécifique pour représenter les sauts de page, mais il est toujours possible de coder les informations de différentes manières. Une solution consiste à utiliser du brut LaTeX \newpage. Cela fonctionne parfaitement lors de la sortie de LaTeX (ou du pdf créé avec LaTeX). Cependant, on rencontrera des problèmes pour cibler différents formats tels que HTML ou docx.

Une solution simple lorsque vous ciblez d'autres formats consiste à utiliser un filtre pandoc qui peut transformer la représentation interne du document de telle sorte qu'il réponde à nos besoins. Pandoc 2.0 et supérieur même permet d'utiliser l'interpréteur Lua inclus pour effectuer cette transformation.

Supposons que nous indiquons des sauts de page en mettant \newpage dans une ligne entourée comme des lignes vides, ainsi:

lorem ipsum

\newpage

more text

Le \newpage sera analysé comme RawBlock contenant raw TeX. Le bloc ne sera inclus dans la sortie que si le format cible peut contenir du texte TeX brut (c'est-à-dire, LaTeX, Markdown, Org, etc.).

Nous pouvons utiliser un simple filtre Lua pour traduire cela lorsque vous ciblez un format différent. Ce qui suit fonctionne pour docx , LaTeX , epub et un balisage léger.

--- Return a block element causing a page break in the given format.
local function newpage(format)
  if format == 'docx' then
    local pagebreak = '<w:p><w:r><w:br w:type="page"/></w:r></w:p>'
    return pandoc.RawBlock('openxml', pagebreak)
  elseif format:match 'html.*' then
    return pandoc.RawBlock('html', '<div style=""></div>')
  elseif format:match 'tex$' then
    return pandoc.RawBlock('tex', '\\newpage{}')
  elseif format:match 'epub' then
    local pagebreak = '<p style="page-break-after: always;"> </p>'
    return pandoc.RawBlock('html', pagebreak)
  else
    -- fall back to insert a form feed character
    return pandoc.Para{pandoc.Str '\f'}
  end
end

-- Filter function called on each RawBlock element.
function RawBlock (el)
  -- check that the block is TeX or LaTeX and contains only \newpage or
  -- \pagebreak.
  if el.text:match '\\newpage' then
    -- use format-specific pagebreak marker. FORMAT is set by pandoc to
    -- the targeted output format.
    return newpage(FORMAT)
  end
  -- otherwise, leave the block unchanged
  return nil
end

Nous avons publié un version mise à jour, plus fonctionnelle . Il est disponible sur le site officiel de pandoc référentiel lua-filters .

10
tarleb

J'ai observé que cela ne fonctionne pas pour les formats .doc et .odt. Une solution de contournement que j'ai trouvée consistait à insérer une ligne horizontale ----------------- et formatez le style "ligne horizontale" pour casser une page et être invisible, à l'aide de l'éditeur de texte (ibre office dans mon cas)

1
Joaquin