Pandoc Markdown分页符


113

最近,我开始使用Pandoc markdown,它似乎是LaTeX的一个很好的选择,因为我的文档没有太多的数学公式,而且我对LaTeX没有任何经验,加上提交截止时间少于2周,这是一个很好的解决方案。

我一直无法解决的一件事是如何迫使它将页面的其余部分留空,任何人都可以帮忙吗?


5
使用数学公式时,具有Pandoc风味的Markdown也很棒。
A. Donda

Answers:


135

看来pandoc markdown为此目的使用了标准LaTeX标签:

\newpage\pagebreak


9
两者都可以工作(谢谢!),但是两者之间有什么区别或完全相同?
卡林2014年

15
newpage结束当前页面,而pagebreak更像是一个友好的请求-可能会或可能不会发生。参见personal.ceu.hu/tex/breaking.htm
parvus 2014年

5
这是因为,如果输出了解胶乳命令,则原始胶乳命令将直接通过。
马修·皮克林

23

TL; DR:使用\newpage和下面的Lua过滤器以多种格式获取分页符。

Pandoc将所有输入解析为内部文档格式。该格式没有专用的方式来表示分页符,但是仍然可以用其他方式对信息进行编码。一种方法是使用原始LaTeX \newpage。在输出LaTeX(或通过LaTeX创建的pdf)时,此功能非常有效。但是,在针对不同格式(例如HTML或docx)时会遇到问题。

定位其他格式时,一个简单的解决方案是使用pandoc过滤器,该过滤器可以转换内部文档表示形式,从而适合我们的需求。Pandoc 2.0及更高版本甚至允许使用随附的Lua解释器执行此转换。

假设我们通过\newpage在空白行之间插入一行来指示分页符,如下所示:

lorem ipsum

\newpage

more text

\newpage将被解析为RawBlock包含原始的TeX。如果目标格式可以包含原始TeX(即LaTeX,Markdown,Org等),则该块仅包含在输出中。

定位其他格式时,我们可以使用简单的Lua过滤器进行翻译。以下适用docx的作品 LaTeXepub和轻量级标记。

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

我们发布了更新的,功能更强大的版本。可从正式的pandoc lua-filters存储库中获得


8
这可以很好地强制使用\newpagePandoc的MS Word输出格式的分页符。要使用此过滤器,请将代码保存在此答案中,例如,pagebreak.lua并使用--lua-filter=pagebreak.lua
Christian Long

3

我观察到这不适用于.doc和.odt格式。我发现的一种解决方法是-----------------使用文本编辑器(在我的情况下为ibre office)插入水平线并设置“水平线”样式的格式以破坏页面并使其不可见。


format the "horizontal line" style to break a page怎么样
尼龙

我只知道HTML输出,因此我将其打印为pdf。Chrome可以很好地实现CSS解释用于打印。在这种情况下,hr{opacity:0;page-break-after: always;}可以完成工作。如果要<hr>用于其他用途,则可以牺牲其他元素。
华金(Joaquin)

0

无法编辑LucasSeveryn答案,已告知队列已满,因此请在此处添加一些信息。

方式1:+ raw_tex

\newpage并且\pagebreak需要raw_tex扩展。

//使用pandoc 2.9.2.1,不适用于docx或html输出,--verbose说

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

方式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>
```

//也不支持gfm输入格式。
//这适用于docx输出,不适用于html输出。

扩展通知

这需要+raw_tex格式扩展。不支持pandoc中的所有markdown变体。

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.

这样-f markdown会起作用,但-f gfm不会起作用。

格式扩展

https://pandoc.org/MANUAL.html#option--来自

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

例如

-t html+raw_tex:输出启用raw_tex

-f markdown-raw_tex-raw_attribute:输入禁用raw_tex和raw_attribute

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.