ตัวแบ่งหน้ามาร์กดาวน์ Pandoc


113

เมื่อเร็ว ๆ นี้ฉันเริ่มใช้ Pandoc markdown ซึ่งดูเหมือนจะเป็นทางเลือกที่ดีสำหรับ LaTeX เนื่องจากเอกสารของฉันไม่มีสูตรทางคณิตศาสตร์มากมายและฉันไม่มีประสบการณ์ใด ๆ กับ LaTeX ซึ่งรวมกับกำหนดส่งน้อยกว่า 2 สัปดาห์ทำให้เป็นทางออกที่ดี

สิ่งหนึ่งที่ฉันไม่สามารถเข้าใจได้คือการบังคับให้ปล่อยให้ส่วนที่เหลือว่างเปล่ามีใครช่วยได้บ้าง


5
Markdown รส Pandoc นั้นยอดเยี่ยมเมื่อใช้สูตรทางคณิตศาสตร์
อ. ดอนดา

คำตอบ:


135

ดูเหมือนว่า pandoc markdown จะใช้แท็ก LaTeX มาตรฐานเพื่อจุดประสงค์นี้:

\newpage และ \pagebreak


9
ทั้งสองทำงาน (ขอบคุณ!) แต่อะไรคือความแตกต่างระหว่างทั้งสองหรือเทียบเท่ากัน?
Kalin

15
newpage จะสิ้นสุดหน้าปัจจุบันในขณะที่ pagebreak เป็นคำขอที่เป็นมิตรมากกว่าซึ่งอาจเกิดขึ้นหรือไม่ก็ได้ ดูpersonal.ceu.hu/tex/breaking.htm
parvus

5
เนื่องจากคำสั่งน้ำยางดิบจะถูกส่งผ่านโดยตรงหากเอาต์พุตเข้าใจคำสั่งลาเท็กซ์
Matthew Pickering

23

TL; DR : ใช้\newpageและตัวกรอง Lua ด้านล่างเพื่อรับตัวแบ่งหน้าในหลายรูปแบบ

Pandoc แยกวิเคราะห์อินพุตทั้งหมดเป็นรูปแบบเอกสารภายใน รูปแบบดังกล่าวไม่มีวิธีเฉพาะในการแสดงตัวแบ่งหน้า แต่ยังสามารถเข้ารหัสข้อมูลด้วยวิธีอื่นได้ \newpageวิธีหนึ่งคือการใช้น้ำยางดิบ สิ่งนี้ทำงานได้อย่างสมบูรณ์เมื่อส่งออก LaTeX (หรือ pdf ที่สร้างผ่าน LaTeX) อย่างไรก็ตามปัญหาหนึ่งจะประสบปัญหาเมื่อกำหนดเป้าหมายรูปแบบต่างๆเช่น HTML หรือ docx

วิธีแก้ปัญหาง่ายๆเมื่อกำหนดเป้าหมายรูปแบบอื่นคือใช้ตัวกรอง pandocซึ่งสามารถเปลี่ยนการแสดงเอกสารภายในให้เหมาะสมกับความต้องการของเรา Pandoc 2.0 และใหม่กว่ายังอนุญาตใช้ล่าม Lua ที่รวมอยู่ในการแปลงร่างนี้

สมมติว่าเรากำลังระบุตัวแบ่งหน้าโดยวาง\newpageในบรรทัดล้อมรอบเหมือนบรรทัดว่างเช่น:

lorem ipsum

\newpage

more text

\newpageจะถูกแยกเป็น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

เราตีพิมพ์การปรับปรุงรุ่น featureful เพิ่มเติม มันมีอยู่จาก pandoc อย่างเป็นทางการที่เก็บหลัวกรอง


8
วิธีนี้ใช้งานได้อย่างสวยงามในการบังคับให้มีการแบ่งหน้าด้วย\newpageรูปแบบเอาต์พุต MS Word ของ pandoc หากต้องการใช้ตัวกรองนี้ให้บันทึกรหัสในคำตอบนี้เป็นเช่นpagebreak.luaและเรียกใช้ pandoc ด้วย--lua-filter=pagebreak.lua
Christian Long

3

ฉันสังเกตว่าสิ่งนี้ใช้ไม่ได้กับรูปแบบ. doc และ. odt วิธีแก้ปัญหาที่ฉันพบคือการแทรกเส้นแนวนอน-----------------และจัดรูปแบบลักษณะ "เส้นแนวนอน" เพื่อแบ่งหน้าและมองไม่เห็นโดยใช้โปรแกรมแก้ไขข้อความ (สำนักงาน ibre ในกรณีของฉัน)


คุณจะเป็นformat the "horizontal line" style to break a pageอย่างไร?
nilon

ฉันรู้เฉพาะเกี่ยวกับเอาต์พุต 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ขยายรูปแบบ ซึ่งไม่รองรับตัวแปร markdown ทั้งหมดใน 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: input ปิดใช้งาน raw_tex และ raw_attribute

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.