最近我开始使用 Pandoc markdown,这似乎是 LaTeX 的一个很好的替代品,因为我的文档没有很多数学公式,而且我对 LaTeX 没有任何经验,再加上不到 2 周的提交截止日期,这使它成为一个很好的解决方案。
我无法解决的一件事是如何强制它将页面的其余部分留空,有人可以帮忙吗?
看起来 pandoc markdown 为此目的使用了标准的 LaTeX 标签:
\newpage
和\pagebreak
TL;DR:使用\newpage
or\pagebreak
与下面(或此处)的 Lua 过滤器一起使用以获取多种格式的分页符。R Markdown用户不需要做任何额外的事情,默认情况下已经包含了过滤器。
Pandoc 将所有输入解析为内部文档格式。内部格式没有专门的方式来表示分页符,但仍然可以用其他方式对信息进行编码。一种方法是使用原始 LaTeX \newpage
。这在输出 LaTeX(或通过 LaTeX 创建的 PDF)时非常有效。但是,在针对 HTML 或 docx 等不同格式时会遇到问题。
针对其他格式时,一个简单的解决方案是使用pandoc 过滤器,它可以转换内部文档表示,使其适合我们的需求。Pandoc 2.0 及更高版本甚至允许使用包含的 Lua 解释器来执行此转换。
假设我们通过放置\newpage
一个像空白行一样的行来指示分页符,如下所示:
lorem ipsum
\newpage
more text
将\newpage
被解析为包含原始TeX的RawBlock。仅当目标格式可以包含原始 TeX(即 LaTeX、Markdown、Org 等)时,该块才会包含在输出中。
当针对不同的格式时,我们可以使用一个简单的 Lua 过滤器来转换它。以下适用于docx、LaTeX、epub和轻量级标记。
--- 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 存储库中获得。R Markdown项目维护一个分叉;它附带 R 包,因此可以立即使用该功能。
注意:要转换latex
为docx
您必须latex+raw_tex
为 pandoc AST 设置 from to 以将其传递给github 问题
我观察到这不适用于 .doc 和 .odt 格式。我发现的一种解决方法是使用文本编辑器(在我的情况下为 ibre office)插入一条水平线-----------------
并格式化“水平线”样式以打破页面并使其不可见
无法编辑 LucasSeveryn 的答案,告诉队列已满,因此请在此处添加一些信息。
\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"
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--来自
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
如果要将文件从 Markdown 转换为 epub 格式,则可以应用以下方法:
<div style="page-break-before:always;"></div>