web-dev-qa-db-ja.com

パンドックマークダウン改ページ

最近、私はドキュメントに多くの数式が含まれていないため、LaTeXの優れた代替手段と思われるPandocマークダウンの使用を開始しました。

私がやってきたことができなかった1つのことは、ページの残りを空のままにする方法です、誰でも助けることができますか?

92
LucasSeveryn

この目的のために、pandoc markdownは標準のLaTeXタグを使用しているようです:

\newpageおよび\pagebreak

118
LucasSeveryn

TL; DR\newpageと以下のLuaフィルターを使用して、多くの形式で改ページを取得します。

Pandocは、すべての入力を内部ドキュメント形式に解析します。その形式には改ページを表す専用の方法はありませんが、他の方法で情報をエンコードすることはまだ可能です。 1つの方法は、生のLaTeX \newpageを使用することです。これは、LaTeX(またはLaTeXで作成されたpdf)を出力するときに完全に機能します。ただし、HTMLやdocxなどのさまざまな形式をターゲットにすると、問題が発生します。

他の形式を対象とする場合の簡単な解決策は、 pandoc filter を使用することです。これにより、内部ドキュメント表現を変換してニーズに対応できます。 Pandoc 2.0以降でも allows 含まれているLuaインタープリターを使用してこの変換を実行します。

空白行のように囲まれた行に\newpageを置くことで改ページを示しているとしましょう:

lorem ipsum

\newpage

more text

\newpageは、rawTeXを含むRawBlockとして解析されます。ターゲット形式に生のTeX(LaTeX、Markdown、Orgなど)を含めることができる場合にのみ、ブロックが出力に含まれます。

簡単なLuaフィルターを使用して、異なる形式を対象とする場合にこれを翻訳できます。次のworksfordocxLaTeXepub、および軽量マークアップ。

--- 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 repository から入手できます。

10
tarleb

これは.docおよび.odt形式では機能しないことがわかりました。私が見つけた回避策は、水平線を挿入することでした-----------------そして、テキストエディタ(私の場合はibre office)を使用して、ページを分割して非表示になるように「水平線」スタイルをフォーマットします。

1
Joaquin