Interruzione di pagina di markdown Pandoc


113

Recentemente ho iniziato a usare il markdown Pandoc che sembra una buona alternativa a LaTeX, poiché il mio documento non ha molte formule matematiche e non ho NESSUNA esperienza con LaTeX, che combinato con una scadenza per l'invio di meno di 2 settimane lo rende una buona soluzione.

Una cosa che non sono riuscito a capire è come costringerlo a lasciare il resto della pagina vuoto, qualcuno può aiutare?


5
Markdown al gusto di Pandoc è ottimo anche quando si usano formule matematiche.
A. Donda

Risposte:


135

Sembra che il markdown pandoc utilizzi tag LaTeX standard per questo scopo:

\newpage e \pagebreak


9
Entrambi funzionano (grazie!), Ma qual è la differenza tra i due o sono esattamente equivalenti?
Kalin

15
newpage termina la pagina corrente, mentre pagebreak è più una richiesta amichevole: può o non può accadere. Vedi personal.ceu.hu/tex/breaking.htm
parvus

5
Questo perché i comandi latex grezzi vengono passati direttamente se l'output comprende i comandi latex.
Matthew Pickering

23

TL; DR : usa \newpagee il filtro Lua sotto per ottenere interruzioni di pagina in molti formati.

Pandoc analizza tutti gli input in un formato di documento interno. Questo formato non ha un modo dedicato per rappresentare le interruzioni di pagina, ma è ancora possibile codificare le informazioni in altri modi. Un modo è usare LaTeX grezzo \newpage. Funziona perfettamente durante l'output di LaTeX (o pdf creato tramite LaTeX). Tuttavia, si verificheranno problemi quando si scelgono diversi formati come HTML o docx.

Una soluzione semplice quando ci si rivolge ad altri formati è utilizzare un filtro pandoc che può trasformare la rappresentazione del documento interno in modo che soddisfi le nostre esigenze. Pandoc 2.0 e versioni successive consentono persino di utilizzare l'interprete Lua incluso per eseguire questa trasformazione.

Supponiamo di indicare le interruzioni di pagina inserendo \newpageuna riga circondata come righe vuote, in questo modo:

lorem ipsum

\newpage

more text

Il \newpageverrà analizzato come un RawBlock contenente Raw TeX . Il blocco sarà incluso nell'output solo se il formato di destinazione può contenere TeX grezzo (cioè LaTeX, Markdown, Org, ecc.).

Possiamo usare un semplice filtro Lua per tradurlo quando miriamo a un formato diverso. Quanto segue funziona per docx , LaTeX , epub e markup leggero.

--- 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

Abbiamo pubblicato una versione aggiornata e più ricca di funzionalità . È disponibile dal repository ufficiale pandoc lua-filters .


8
Funziona magnificamente per forzare le \newpageinterruzioni di pagina con il formato di output MS Word di Pandoc. Per utilizzare questo filtro, salva il codice in questa risposta in eg pagebreak.luae invoca pandoc con--lua-filter=pagebreak.lua
Christian Long,

3

Ho notato che questo non funziona per i formati .doc e .odt. Una soluzione alternativa che ho trovato è stata quella di inserire una linea orizzontale -----------------e formattare lo stile della "linea orizzontale" per rompere una pagina ed essere invisibile, utilizzando l'editor di testo (ibre office nel mio caso)


Come faresti format the "horizontal line" style to break a page?
nilon

Conosco solo l'output HTML, che di conseguenza stampo in pdf. Chrome ha un'implementazione davvero piacevole dell'interpretazione CSS per la stampa. In questo caso, hr{opacity:0;page-break-after: always;}fa il lavoro. Puoi sacrificare un altro elemento se vuoi usarlo <hr>per qualcos'altro.
Joaquin

0

non è possibile modificare la risposta di LucasSeveryn, ha detto che la coda è piena, quindi aggiungi alcune informazioni qui.

modo 1: + raw_tex

\newpagee \pagebreaknecessitano di raw_texestensione.

// con pandoc 2.9.2.1, non funziona con l'output docx o html, dice --verbose

[INFO] Not rendering RawBlock (Format "tex") "\\pagebreak"
[INFO] Not rendering RawBlock (Format "tex") "\\newpage"

modo 2: + raw_attribute

https://pandoc.org/MANUAL.html#extension-raw_attribute

```{=openxml}
<w:p>
  <w:r>
    <w:br w:type="page"/>
  </w:r>
</w:p>
```

// inoltre non è supportato nel formato di input gfm.
// questo ha funzionato per l'output docx, non funziona con l'output html.

estensione AVVISO

questo richiede l' +raw_texestensione del formato. che non è supportato per tutte le varianti di ribasso in pandoc.

https://pandoc.org/MANUAL.html#markdown-variants

Note, however, that commonmark and gfm have limited support for extensions.  

Only those listed below (and smart, raw_tex, and hard_line_breaks) will work.  

The extensions can, however, all be individually disabled.

Also, raw_tex only affects gfm output, not input.

così -f markdownfunzionerà, ma -f gfmnon funzionerà.

estensione del formato

https://pandoc.org/MANUAL.html#option--from

Extensions can be individually enabled or disabled by appending 
+EXTENSION or -EXTENSION to the format name.

per esempio

-t html+raw_tex: abilita output raw_tex

-f markdown-raw_tex-raw_attribute: input disabilita raw_tex e raw_attribute

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.