【问题标题】:Pandoc markdown page breakPandoc 降价分页符
【发布时间】:2013-06-02 15:53:27
【问题描述】:

最近我开始使用 Pandoc markdown,这似乎是 LaTeX 的一个很好的替代品,因为我的文档没有很多数学公式,而且我没有任何 LaTeX 经验,再加上不到 2 周的提交截止日期,这使它成为一个不错的选择解决方案。

我无法解决的一件事是如何强制它将页面的其余部分留空,有人可以帮忙吗?

【问题讨论】:

  • Pandoc 风格的 Markdown 在使用数学公式时也很棒。

标签: latex markdown pandoc


【解决方案1】:

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

\newpage\pagebreak

【讨论】:

  • 两者都有效(谢谢!),但两者之间有什么区别或者它们完全一样?
  • newpage 结束当前页面,而 pagebreak 更像是一个友好的请求——它可能会发生也可能不会发生。见personal.ceu.hu/tex/breaking.htm
  • 这是因为如果输出可以理解 Latex 命令,则可以直接传递原始 Latex 命令。
【解决方案2】:

TL;DR:将\newpage\pagebreak 与下面的Lua 过滤器(或here)一起使用以获取多种格式的分页符。 R Markdown 用户不需要做任何额外的事情,默认情况下过滤器已经是included


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

针对其他格式时,一个简单的解决方案是使用pandoc filter,它可以转换内部文档表示,使其适合我们的需求。 Pandoc 2.0 及更高版本甚至 allows 使用包含的 Lua 解释器来执行此转换。

假设我们通过将\newpage 放在像空白行一样被包围的行中来指示分页符,如下所示:

lorem ipsum

\newpage

more text

\newpage 将被解析为包含原始 TeXRawBlock。仅当目标格式可以包含原始 TeX(即 LaTeX、Markdown、Org 等)时,该块才会包含在输出中。

当针对不同的格式时,我们可以使用一个简单的 Lua 过滤器来翻译它。以下作品适用于 docxLaTeXepub 和轻量级标记。

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

我们发布了updated, more featureful version。可从官方 pandoc lua-filters repository 获得。 R Markdown 项目维护一个分叉;它附带 R 包,所以 feature can be used right away.
注意:要将latex 转换为docx,您必须将from 设置为latex+raw_tex,以便pandoc AST 将其传递给github issue

【讨论】:

  • 这可以很好地在 pandoc 的 MS Word 输出格式中使用\newpage 强制分页。要使用此过滤器,请将此答案中的代码保存到例如pagebreak.lua 并使用 --lua-filter=pagebreak.lua 调用 pandoc
【解决方案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;} 完成了这项工作。如果您想将&lt;hr&gt; 用于其他用途,您可以牺牲其他元素。
【解决方案4】:

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

方式一:+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"

方式二:+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 中的所有降价变体。

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

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

【讨论】:

    【解决方案5】:

    如果您将文件从 Markdown 转换为 epub 格式,您可以应用以下方法:

    <div style="page-break-before:always;"></div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-29
      • 2015-11-05
      • 2021-06-09
      相关资源
      最近更新 更多