Ngắt trang đánh dấu Pandoc


113

Gần đây, tôi đã bắt đầu sử dụng Pandoc markdown, đây có vẻ là một giải pháp thay thế tốt cho LaTeX, vì tài liệu của tôi không có nhiều công thức toán học và tôi không có BẤT KỲ kinh nghiệm nào về LaTeX, kết hợp với thời hạn nộp bài chưa đầy 2 tuần khiến nó trở thành một giải pháp tốt.

Một điều mà tôi chưa thể làm được là làm thế nào để buộc nó để trống phần còn lại của trang, có ai có thể giúp được không?


5
Markdown có hương vị Pandoc cũng rất tuyệt khi sử dụng các công thức toán học.
A. Donda

Câu trả lời:


135

Có vẻ như pandoc markdown sử dụng các thẻ LaTeX tiêu chuẩn cho mục đích này:

\newpage\pagebreak


9
Cả hai đều hoạt động (cảm ơn!), Nhưng sự khác biệt giữa hai là gì hoặc chúng chính xác là tương đương?
Kalin

15
newpage kết thúc trang hiện tại, trong khi pagebreak là một yêu cầu thân thiện hơn - nó có thể xảy ra hoặc không. Xem Personal.ceu.hu/tex/break.htm
parvus

5
Điều này là do các lệnh latex thô được chuyển thẳng qua nếu đầu ra hiểu các lệnh latex.
Matthew Pickering

23

TL; DR : sử dụng \newpagevà bộ lọc Lua bên dưới để ngắt trang ở nhiều định dạng.

Pandoc phân tích cú pháp tất cả các đầu vào thành một định dạng tài liệu nội bộ. Định dạng đó không có cách riêng để biểu thị ngắt trang, nhưng vẫn có thể mã hóa thông tin theo những cách khác. Một cách là sử dụng LaTeX thô \newpage. Điều này hoạt động hoàn hảo khi xuất LaTeX (hoặc pdf được tạo thông qua LaTeX). Tuy nhiên, người ta sẽ gặp vấn đề khi nhắm mục tiêu các định dạng khác nhau như HTML hoặc docx.

Một giải pháp đơn giản khi nhắm mục tiêu các định dạng khác là sử dụng bộ lọc pandoc có thể biến đổi biểu diễn tài liệu nội bộ sao cho phù hợp với nhu cầu của chúng ta. Pandoc 2.0 trở lên thậm chí còn cho phép sử dụng trình thông dịch Lua đi kèm để thực hiện chuyển đổi này.

Giả sử chúng ta đang chỉ ra các ngắt trang bằng cách đặt \newpagemột dòng bao quanh như các dòng trống, như sau:

lorem ipsum

\newpage

more text

Các \newpagesẽ được phân tích như một RawBlock chứa liệu TeX . Khối sẽ chỉ được đưa vào đầu ra nếu định dạng đích có thể chứa TeX thô (tức là, LaTeX, Markdown, Org, v.v.).

Chúng tôi có thể sử dụng bộ lọc Lua đơn giản để dịch điều này khi nhắm mục tiêu một định dạng khác. Các cách sau phù hợp với docx , LaTeX , epub và đánh dấu dung lượng nhẹ.

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

Chúng tôi đã xuất bản một phiên bản cập nhật, nhiều tính năng hơn . Nó có sẵn từ kho lưu trữ bộ lọc pandoc chính thức .


8
Điều này hoạt động tuyệt vời để buộc ngắt trang với \newpageđịnh dạng đầu ra MS Word của pandoc. Để sử dụng bộ lọc này, tiết kiệm các mã trong câu trả lời này tới eg pagebreak.luavà invoke pandoc với--lua-filter=pagebreak.lua
Christian dài

3

Tôi nhận thấy rằng điều này không hoạt động đối với các định dạng .doc và .odt. Một cách giải quyết mà tôi tìm thấy là chèn một đường ngang -----------------và định dạng kiểu "đường ngang" để ngắt trang và ẩn, sử dụng trình chỉnh sửa văn bản (trong trường hợp của tôi là ibre office)


Làm thế nào bạn sẽ format the "horizontal line" style to break a page?
nilon

Tôi chỉ biết về đầu ra HTML, do đó tôi in ra pdf. Chrome có một triển khai thực sự tốt về giải thích CSS cho bản in. Trong trường hợp này, hr{opacity:0;page-break-after: always;}thực hiện công việc. Bạn có thể hy sinh yếu tố khác nếu bạn muốn sử dụng <hr>cho việc khác.
Joaquin

0

không thể chỉnh sửa câu trả lời của LucasSeveryn, đã cho hàng đợi đầy, vì vậy hãy thêm một số thông tin vào đây.

cách 1: + raw_tex

\newpage\pagebreakcần bật raw_texphần mở rộng.

// với pandoc 2.9.2.1, không hoạt động với đầu ra docx hoặc html, --verbose nói

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

cách 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>
```

// cũng không hỗ trợ ở định dạng đầu vào gfm.
// điều này hoạt động với đầu ra docx, không hoạt động với đầu ra html.

phần mở rộng THÔNG BÁO

cần +raw_texđịnh dạng mở rộng này. không hỗ trợ cho tất cả các biến thể đánh dấu trong 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.

như vậy -f markdownsẽ hoạt động, nhưng -f gfmkhông hoạt động.

phần mở rộng định dạng

https://pandoc.org/MANUAL.html#option--from

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

ví dụ

-t html+raw_tex: đầu ra cho phép raw_tex

-f markdown-raw_tex-raw_attribute: vô hiệu hóa đầu vào raw_tex và raw_attribute

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.