Quebra de página de markdown de Pandoc

113

Recentemente comecei a usar o markdown do Pandoc, o que parece uma boa alternativa ao LaTeX, já que meu documento não tem muitas fórmulas matemáticas e não tenho NENHUMA experiência com o LaTeX, o que combinado com um prazo de envio de menos de 2 semanas o torna uma boa solução.

Uma coisa que não consegui resolver é como forçá-lo a deixar o resto da página em branco. Alguém pode ajudar?

LucasSeveryn
fonte
5
O Markdown com sabor de Pandoc também é ótimo ao usar fórmulas matemáticas.
A. Donda

Respostas:

135

Parece que a marcação pandoc usa tags LaTeX padrão para esta finalidade:

\newpage e \pagebreak

LucasSeveryn
fonte
9
Ambos funcionam (obrigado!), Mas qual é a diferença entre os dois ou são exatamente equivalentes?
Kalin de
15
newpage termina a página atual, enquanto a quebra de página é mais um pedido amigável - pode ou não acontecer. Veja personal.ceu.hu/tex/breaking.htm
parvus
5
Isso ocorre porque os comandos de látex bruto são passados ​​diretamente se a saída compreender os comandos de látex.
Matthew Pickering,
23

TL; DR : use \newpagee o filtro Lua abaixo para obter quebras de página em muitos formatos.

O Pandoc analisa todas as entradas em um formato de documento interno. Esse formato não tem forma dedicada de representar quebras de página, mas ainda é possível codificar as informações de outras maneiras. Uma maneira é usar LaTeX bruto \newpage. Isso funciona perfeitamente ao enviar LaTeX (ou pdf criado através do LaTeX). No entanto, haverá problemas ao selecionar formatos diferentes como HTML ou docx.

Uma solução simples para outros formatos é usar um filtro pandoc que pode transformar a representação interna do documento de forma que se adapte às nossas necessidades. O Pandoc 2.0 e posterior permite até mesmo usar o interpretador Lua incluído para realizar essa transformação.

Vamos supor que estejamos indicando quebras de página colocando \newpageuma linha cercada como linhas em branco, assim:

lorem ipsum

\newpage

more text

O \newpageserá analisado como um RawBlock contendo TeX bruto . O bloco só será incluído na saída se o formato de destino puder conter TeX bruto (ou seja, LaTeX, Markdown, Org, etc.).

Podemos usar um filtro Lua simples para traduzir isso quando almejamos um formato diferente. O seguinte funciona para docx , LaTeX , epub e marcação leve.

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

Publicamos uma versão atualizada e com mais recursos . Ele está disponível no repositório oficial do pandoc lua-filters .

Tarleb
fonte
8
Isso funciona lindamente para forçar quebras de página \newpageno formato de saída do MS Word do pandoc. Para usar este filtro, salve o código nesta resposta para eg pagebreak.luae invoque pandoc com--lua-filter=pagebreak.lua
Christian Long
3

Observei que isso não funciona para os formatos .doc e .odt. Uma solução que descobri foi inserir uma linha horizontal -----------------e formatar o estilo "linha horizontal" para quebrar uma página e ficar invisível, usando o editor de texto (ibre office no meu caso)

Joaquin
fonte
Como você ficaria format the "horizontal line" style to break a page?
nilon
Eu só sei sobre a saída HTML, que consequentemente imprimo em pdf. O Chrome tem uma implementação muito boa de interpretação CSS para impressão. Nesse caso, hr{opacity:0;page-break-after: always;}faz o trabalho. Você pode sacrificar outro elemento se quiser usar <hr>para outra coisa.
Joaquin de
0

não consigo editar a resposta de LucasSeveryn, disse a fila cheia, então adicione algumas informações aqui.

maneira 1: + raw_tex

\newpagee \pagebreakprecisa de raw_texextensão.

// com pandoc 2.9.2.1, não funciona com saída docx ou html, --verbose diz

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

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

// também não é compatível com o formato de entrada gfm.
// isso funcionou para a saída docx, não funciona com a saída html.

extensão AVISO

isso precisa de +raw_texextensão de formato. que não é compatível com todas as variantes de redução no 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.

então -f markdownfuncionará, mas -f gfmnão funcionará.

extensão de formato

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

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

por exemplo

-t html+raw_tex: output enable raw_tex

-f markdown-raw_tex-raw_attribute: entrada desativa raw_tex e raw_attribute

Yurenchen
fonte