Đánh dấu và bao gồm nhiều tệp


197

Có bất kỳ ngã ba markdown nào cho phép bạn tham chiếu các tệp khác, giống như một tệp bao gồm không? Cụ thể, tôi muốn tạo một tệp đánh dấu riêng với các liên kết mà tôi gọi thường xuyên nhưng không phải lúc nào cũng được (gọi đây là B.md), sau đó khi tôi liên kết bằng cách tham chiếu trong tệp md tôi đang viết (A.md), tôi sẽ muốn nó kéo liên kết từ tệp khác (B.md) chứ không phải từ cuối tệp hiện tại (A.md).


1
Nếu câu hỏi của bạn là đánh dấu liên quan đến github, bạn có thể xem tại đây
Adi Prasetyo

3
Nguyên tắc chung cho Markdown là câu trả lời cho 'Có thể Markdown ...' thường là 'Không thực tế, phổ biến hoặc dễ dàng'.
Michael Scheper

4
Có một cuộc thảo luận mở về cách tốt nhất để làm điều này với Pandoc tại github.com/jgm/pandoc/issues/553 và trên diễn đàn chung tại talk.commonmark.org/t/iêu
naught101

Câu trả lời:


217

Câu trả lời ngắn gọn là không. Câu trả lời dài là có. :-)

Markdown được thiết kế để cho phép mọi người viết văn bản đơn giản, dễ đọc, có thể dễ dàng chuyển đổi thành đánh dấu HTML đơn giản. Nó không thực sự làm bố cục tài liệu. Ví dụ, không có cách thực sự nào để căn chỉnh hình ảnh sang phải hoặc trái. Đối với câu hỏi của bạn, không có lệnh markdown để bao gồm một liên kết duy nhất từ ​​tệp này sang tệp khác trong bất kỳ phiên bản đánh dấu nào (theo như tôi biết).

Gần nhất bạn có thể đến với chức năng này là Pandoc . Pandoc cho phép bạn hợp nhất các tệp như một phần của phép chuyển đổi, cho phép bạn dễ dàng kết xuất nhiều tệp thành một đầu ra. Ví dụ: nếu bạn đang tạo một cuốn sách, thì bạn có thể có các chương như thế này:

01_preface.md
02_introduction.md
03_why_markdown_is_useful.md
04_limitations_of_markdown.md
05_conclusions.md

Bạn có thể hợp nhất chúng bằng cách thực hiện lệnh này trong cùng một thư mục:

pandoc *.md > markdown_book.html

Vì pandoc sẽ hợp nhất tất cả các tệp trước khi thực hiện bản dịch, bạn có thể bao gồm các liên kết của mình trong tệp cuối cùng như thế này:

01_preface.md
02_introduction.md
03_why_markdown_is_useful.md
04_limitations_of_markdown.md
05_conclusions.md
06_links.md

Vì vậy, một phần của bạn 01_preface.mdcó thể trông như thế này:

I always wanted to write a book with [markdown][mkdnlink].

Và một phần của bạn 02_introduction.mdcó thể trông như thế này:

Let's start digging into [the best text-based syntax][mkdnlink] available.

Miễn là tập tin cuối cùng của bạn bao gồm dòng:

[mkdnlink]: http://daringfireball.net/projects/markdown

... cùng một lệnh được sử dụng trước đó sẽ thực hiện hợp nhất và chuyển đổi trong khi bao gồm liên kết đó xuyên suốt. Chỉ cần đảm bảo rằng bạn để lại một hoặc hai dòng trống ở đầu tập tin đó. Các tài liệu pandoc nói rằng nó sẽ thêm một dòng trống giữa các tập tin được sáp nhập theo cách này, nhưng điều này không làm việc cho tôi mà không có dòng trống.


6
Đây hóa ra là một bài viết cực kỳ hữu ích cho tôi! Cảm ơn Aaron. Có vẻ như đây là trường hợp sử dụng phổ biến để có một / chương dir, một tập lệnh xây dựng / hợp nhất các chương và sau đó là tập lệnh trình bao bọc cấp cao nhất bao gồm một bước như: --include-before-body $ (include_dir) / merged_ch chương .html. Đó là cách tiếp cận tôi sẽ thực hiện để có được một số lợi ích tổ chức.
Cướp

1
Một lợi thế khác của việc sử dụng pandoc là nó hỗ trợ rất nhiều kết quả đầu ra: bạn có thể tạo không chỉ HTML mà còn mọi thứ từ docx đến LaTeX đến ePUB.
Chris Krycho

pandoc *.md > markdown_book.htmlkết quả là pandoc: *.md: openfile: invalid argument (Invalid argument)- nó không xuất hiện để hỗ trợ cú pháp bạn đã chỉ định.
Jason Young

Nó đang làm việc trên hệ thống của tôi. Tôi đã tạo một kho lưu trữ mẫu trên GitHub để bạn có thể thử nó với tất cả các tệp mà tôi đã sử dụng.
Aaron Massey

Bạn có thể căn chỉnh hình ảnh ngay bằng cách đưa vào một số CSS thích hợp, đó là cách bạn có thể nên làm mọi thứ.
ness101

50

Tôi chỉ đề cập rằng bạn có thể sử dụng catlệnh để ghép các tệp đầu vào trước khi đặt chúng vào markdown_pyđó có tác dụng tương tự như pandocvới nhiều tệp đầu vào.

cat *.md | markdown_py > youroutputname.html

hoạt động khá giống với ví dụ pandoc ở trên cho phiên bản Python của Markdown trên máy Mac của tôi.


1
@ tprk77: ngoại trừ câu trả lời của Aaron cho thấy rõ rằng lệnh mèo là dư thừa ở đây ..
naught101

1
Việc sử dụng cat *.mdngụ ý một quy ước đặt tên tệp không linh hoạt. Quy ước này không nhất thiết phải cấm đệ quy bao gồm, đối với các dự án tài liệu lớn hơn, sẽ rất khó để thêm các tệp mới vào hỗn hợp. Bạn sẽ phải làm rất nhiều việc đếm và đổi tên. Dự án markdown đã có một bộ tiền xử lý cho mục đích này kể từ năm 2010
chíngrid

@ninegrid Mặc dù MarkdownPP có vẻ rất hữu ích, nhưng chỉ nhìn vào repo nguồn mà bạn đã tham chiếu trong câu trả lời của mình, dường như đối với tôi (a) MarkdownPP chỉ là dự án của John Reese; (b) nó không phải là một phần của "dự án đánh dấu" (bất kỳ hương vị nào khác nhau); và (c) MarkdownPP xuất ra GFM, cụ thể. Chính xác? Như tôi đã nói, nó có vẻ thú vị và hữu ích, nhưng nhận xét của bạn ở đây làm cho nó có vẻ như đó là một tính năng Markdown tiêu chuẩn mà mọi triển khai Markdown nên đi kèm. Nhưng từ việc nhìn vào repo, tình hình có vẻ hoàn toàn ngược lại.
FeRD

Không thể chuyển đổi bảng MD thành bảng HTML.
james.garriss

30

Bạn thực sự có thể sử dụng Bộ xử lý trước Markdown ( MarkdownPP ). Chạy với ví dụ cuốn sách giả thuyết từ các câu trả lời khác, bạn sẽ tạo .mdppcác tệp đại diện cho các chương của bạn. Các .mdpptệp sau đó có thể sử dụng lệnh !INCLUDE "path/to/file.mdpp", hoạt động đệ quy thay thế lệnh bằng nội dung của tệp được tham chiếu trong đầu ra cuối cùng.

chapters/preface.mdpp
chapters/introduction.mdpp
chapters/why_markdown_is_useful.mdpp
chapters/limitations_of_markdown.mdpp
chapters/conclusions.mdpp

Sau đó, bạn sẽ cần một index.mdppcái có chứa như sau:

!INCLUDE "chapters/preface.mdpp"
!INCLUDE "chapters/introduction.mdpp"
!INCLUDE "chapters/why_markdown_is_useful.mdpp"
!INCLUDE "chapters/limitations_of_markdown.mdpp"
!INCLUDE "chapters/conclusions.mdpp"

Để hiển thị sách của bạn, bạn chỉ cần chạy bộ tiền xử lý trên index.mdpp:

$ markdown-pp.py index.mdpp mybook.md

Đừng quên xem readme.mdpptrong kho lưu trữ MarkdownPP để biết các tính năng tiền xử lý phù hợp với các dự án tài liệu lớn hơn.


19

Giải pháp của tôi là sử dụng m4. Nó được hỗ trợ trên hầu hết các nền tảng và được bao gồm trong gói binutils.

Đầu tiên bao gồm một macro changequote()trong tệp để thay đổi các ký tự trích dẫn thành những gì bạn thích (mặc định là `'). Macro được loại bỏ khi tập tin được xử lý.

changequote(`{{', `}}')
include({{other_file}})

Trên dòng lệnh:

m4 -I./dir_containing_other_file/ input.md > _tmp.md
pandoc -o output.html _tmp.md

2
m4hầu như không được biết đến, nhưng thực sự là một công cụ vô cùng mạnh mẽ khi nói đến những nhu cầu chung như vậy. Đủ để có tài liệu đề cập đến nó có thể "khá gây nghiện".
Uriel

Bây giờ, đó là một giải pháp! Thiên tài
Brandt

+1 cho ý tưởng và lời nhắc của m4 ! Điều thú vị là khi tôi thấy các phần mở rộng ở trên là 'md', tôi đã nghĩ trong đầu m4 . Rằng bạn sẽ bao gồm một ví dụ là tuyệt vời. Tôi không chắc câu hỏi này có hỏi chính xác tôi sẽ làm gì không nhưng nó có thể làm được. Cảm ơn bạn một trong hai cách.
Pryftan

15

Gần đây tôi đã viết một cái gì đó như thế này trong Node gọi là markdown - bao gồm cho phép bạn bao gồm các tệp markdown với cú pháp kiểu C, như vậy:

#include "my-file.md"

Tôi tin rằng điều này phù hợp độc đáo với câu hỏi bạn đang hỏi. Tôi biết cái này cũ, nhưng tôi muốn cập nhật nó ít nhất.

Bạn có thể bao gồm điều này trong bất kỳ tập tin đánh dấu nào bạn muốn. Tập tin đó cũng có thể có nhiều bao gồm hơn và bao gồm đánh dấu sẽ tạo một liên kết nội bộ và thực hiện tất cả công việc cho bạn.

Bạn có thể tải nó qua npm

npm install -g markdown-include

1
Điều này có thể trở nên rất hữu ích! Cảm ơn bạn!
đậu

@leas Rất vui khi được phục vụ ... Tôi đã không làm việc với nó trong một vài năm nhưng tôi luôn có ý định quay lại với nó vào một lúc nào đó. Hy vọng nó làm tốt cho mục đích của bạn.
Sethen

9

Multimarkdown có điều này tự nhiên. Nó gọi nó là loại trừ tập tin :

{{some_other_file.txt}}

là tất cả những gì nó cần Tên lạ, nhưng đánh dấu vào tất cả các hộp.


Có bất kỳ trình soạn thảo Nguồn mở và Miễn phí nào để hiển thị cú pháp này không? Tôi đã hỏi câu hỏi này ở đây với nhiều chi tiết hơn. Tôi sẽ đánh giá cao nếu bạn có thể giúp tôi với nó.
Foad

1
@Foad: Tôi sợ tôi là người dùng vim và không biết về bất kỳ biên tập viên nào như vậy. Tôi thấy trên reddit Q của bạn, bạn thấy rằng Asciidoc, và các biên tập viên khác nhau, hỗ trợ điều này. Tôi không biết điều này - cảm ơn.
eff

Hạnh phúc vì nó hữu ích. Nhưng vim có xem trước trực tiếp cho MultiMarkDown không? bạn có thể chia sẻ các thiết lập và chấm tập tin của bạn với một số chi tiết không?
Foad

1
Không có bản xem trước trực tiếp, tôi không phải là loại người đó. ;) Lý do chính khiến tôi sử dụng markdown hoàn toàn là vì nó nhằm mục đích dễ đọc của con người khi không được xử lý, vì vậy tôi thực sự không bận tâm về việc xem trước quá nhiều (mặc dù tôi hiểu tại sao người khác làm vậy). Điều duy nhất tôi quan tâm, trong trường hợp này là tô sáng cú pháp và tô sáng cú pháp đánh dấu mặc định hoạt động đủ tốt cho tôi. Xin lỗi để không được giúp đỡ nhiều hơn.
eff

1
Có vẻ như nó có thể thú vị, mặc dù tôi thấy không có lý do gì để chọn nó trên markdown / asciidoc cho mục đích (ít ỏi) của tôi, ít nhất.
eff

8

Tôi sử dụng một includes.txttệp với tất cả các tệp của mình theo đúng thứ tự tôi thực hiện pandoc như thế này:

pandoc -s $(cat includes.txt) --quiet -f markdown -t html5 --css pandoc.css -o index.html

Hoạt động như một lá bùa!


1
Cách tiếp cận tuyệt vời . Chỉ định thứ tự tệp là cơ bản, nhưng nó không được thực hiện bằng các globphương thức trừ khi bạn đánh số tệp.
ephsmith

Bạn có thể bao gồm một lời giải thích về các bước? Có vẻ rất mạnh mẽ! Tôi muốn biết liệu có thể cắt bớt nó để thực hiện các chuyển đổi khác như .pdf và .tex không.
nilon

6

Trong thực tế, bạn có thể sử dụng \input{filename}\include{filename}đó là các lệnh latex, trực tiếp Pandoc, bởi vì nó hỗ trợ gần như tất cả htmllatexcú pháp.

Nhưng hãy cẩn thận, tập tin bao gồm sẽ được coi là latextập tin. Nhưng bạn có thể biên dịch của bạn markdownđể latexPandoxmột cách dễ dàng.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) thực sự là một sự đánh dấu trên steroid. Nhìn chung, Asciidoc và Markdown sẽ trông rất giống nhau và khá dễ dàng để chuyển đổi. Một lợi ích to lớn của Asciidoc so với markdown là nó đã hỗ trợ bao gồm, cho các tệp Asciidoc khác mà còn cho bất kỳ định dạng nào bạn thích. Bạn thậm chí có thể bao gồm một phần các tệp dựa trên số dòng hoặc thẻ bên trong các tệp được bao gồm của bạn.

Bao gồm các tệp khác thực sự là một trình bảo vệ cuộc sống khi bạn viết tài liệu.

Ví dụ, bạn có thể có tệp asciidoc với nội dung như vậy:

// [source,perl]
// ----
// include::script.pl[]
// ----

và duy trì mẫu của bạn trong script.pl

Và tôi chắc chắn bạn sẽ tự hỏi nên có, Github cũng hỗ trợ asciidoc.


Dường như có một lời hứa tốt đẹp ở đây nhưng không đưa ra câu trả lời đầy đủ với các bước hướng dẫn. Có thể nói làm thế nào để chuyển đổi tài liệu nhiều tập tin thành một tài liệu duy nhất?
nilon

Đây là giải pháp tốt nhất trên trang này cho đến nay. Tôi đã đi đến kết luận này và giải quyết vấn đề ở đây trên Reddit . AsciiDoc đã tích hợp sẵn và nó được kết xuất bởi GitHub. Cả Atom và vscode đều có các plugin đẹp để xem trước trực tiếp. Tôi tự hỏi tại sao AsciiDoc không phải là tiêu chuẩn công nghiệp!
Foad

4

Tôi nghĩ rằng chúng ta nên áp dụng một cú pháp bao gồm tệp mới (vì vậy sẽ không gây rối với các khối mã, tôi nghĩ rằng việc bao gồm kiểu C là hoàn toàn sai) và tôi đã viết một công cụ nhỏ trong Perl, đặt tên cat.pl, vì nó hoạt động như thếcat ( cat a.txt b.txt c.txtsẽ hợp nhất ba tệp), nhưng nó hợp nhất các tệp theo chiều sâu , không theo chiều rộng . Sử dụng như thế nào?

$ perl cat.pl <your file>

Cú pháp chi tiết là:

  • đệ quy bao gồm các tệp: @include <-=path=
  • chỉ bao gồm một: %include <-=path=

Nó có thể xử lý đúng các vòng lặp bao gồm tệp (nếu a.txt <- b.txt, b.txt <- a.txt, thì bạn mong đợi điều gì?).

Thí dụ:

a.txt:

a.txt

    a <- b

    @include <-=b.txt=

a.end

b.txt:

b.txt

    b <- a

    @include <-=a.txt=

b.end

perl cat.pl a.txt > c.txt, c.txt:

a.txt

    a <- b

    b.txt

        b <- a

        a.txt

            a <- b

            @include <-=b.txt= (note:won't include, because it will lead to infinite loop.)

        a.end

    b.end

a.end

Thêm ví dụ tại https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Tôi cũng đã viết một phiên bản Java có hiệu ứng giống hệt nhau (không giống nhau, nhưng gần gũi).


<<[include_file.md](Đã đánh dấu 2 trên macOS): gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx

Lưu ý, @được sử dụng cho các trích dẫn với pandoc-citeproc(ví dụ " @Darwin1859").
PlasmaBinturong

4

Tôi thực sự ngạc nhiên khi không ai trong trang này đưa ra bất kỳ giải pháp HTML nào. Theo tôi đã hiểu các tệp MarkDown có thể bao gồm phần rộng (nếu không phải tất cả) của các thẻ HTML. Vì vậy, hãy làm theo các bước sau:

  1. Từ đây : đặt các tệp MarkDown của bạn vào <span style="display:block"> ... </span>các thẻ để đảm bảo chúng sẽ được hiển thị dưới dạng đánh dấu. Bạn có rất nhiều thuộc tính phong cách khác mà bạn có thể thêm. Một trong tôi như là text-align:justify.

  2. Từ đây : Bao gồm các tệp trong tệp chính của bạn bằng cách sử dụng<iframe src="/path/to/file.md" seamless></iframe>

PS1. giải pháp này không hoạt động trên tất cả các công cụ / kết xuất MarkDown. Ví dụ Typora đã kết xuất các tệp một cách chính xác nhưng Visual Studio Code thì không. Sẽ thật tuyệt nếu những người khác có thể chia sẻ kinh nghiệm của họ với các nền tảng khác. Đặc biệt tôi muốn nghe về GitHub và GitLab ...

PS2. Khi điều tra sâu hơn, dường như có các vấn đề không tương thích lớn dẫn đến việc này không được hiển thị đúng trên nhiều nền tảng, bao gồm mã Typora, GitHub và Visual Studio. Xin vui lòng không sử dụng điều này cho đến khi tôi giải quyết chúng. Tôi sẽ không xóa câu trả lời chỉ vì mục đích thảo luận và nếu có thể bạn có thể chia sẻ ý kiến ​​của mình.

PS3. Để điều tra thêm về vấn đề này, tôi đã hỏi câu hỏi này ở đây trên StackOverflowở đây trên Reddit .

PS4. Sau một số nghiên cứu, tôi đã đi đến kết luận rằng hiện tại, AsciiDoc là một lựa chọn tốt hơn cho tài liệu. Nó đi kèm với chức năng bao gồm tích hợp, nó được GitHub kết xuất và các trình soạn thảo mã lớn như Atom và vscode có phần mở rộng để xem trước trực tiếp. Người ta có thể sử dụng Pandoc hoặc các công cụ khác để tự động chuyển đổi Mã MarkDown hiện tại sang AsciiDoc với những thay đổi nhỏ.

PS5. Một ngôn ngữ đánh dấu nhẹ khác với chức năng bao gồm tích hợp là reStructuredText. Nó đi kèm với .. include:: inclusion.txt cú pháp theo tiêu chuẩn. Có trình soạn thảo ReText với xem trước trực tiếp là tốt.


1

Tôi biết rằng đây là một câu hỏi cũ, nhưng tôi chưa thấy câu trả lời nào cho hiệu ứng này: Về cơ bản, nếu bạn đang sử dụng markdown và pandoc để chuyển đổi tệp của mình sang pdf, trong dữ liệu yaml của bạn ở đầu trang, bạn có thể đưa vào đại loại như thế này:

---
header-includes:
- \usepackage{pdfpages}
output: pdf_document
---

\includepdf{/path/to/pdf/document.pdf}

# Section

Blah blah

## Section 

Blah blah

Vì pandoc sử dụng latex để chuyển đổi tất cả các tài liệu của bạn, header-includesphần này gọi gói pdfpages. Sau đó, khi bạn đưa vào, \includepdf{/path/to/pdf/document.pdf}nó sẽ chèn bất cứ thứ gì có trong tài liệu đó. Hơn nữa, bạn có thể bao gồm nhiều tệp pdf theo cách này.

Như một phần thưởng thú vị, và điều này chỉ bởi vì tôi thường sử dụng markdown, nếu bạn muốn bao gồm các tệp khác ngoài markdown, ví dụ như các tệp latex. Tôi đã sửa đổi câu trả lời này một chút. Giả sử bạn có tệp markdown markdown1.md:

---
title: Something meaning full
author: Talking head
---

Và hai tập tin latex nghiện tài liệu1, trông như thế này:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

Và một cái khác, document2.tex, trông như thế này:

\section{Section

Glah

\subsection{Section}

Balh Balh

Giả sử rằng bạn muốn bao gồm document1.tex và document2.tex vào markdown1.md, bạn sẽ chỉ làm điều này với markdown1.md

---
title: Something meaning full
author: Talking head
---

\input{/path/to/document1}
\input{/path/to/document2}

Chạy pandoc qua nó, ví dụ

trong thiết bị đầu cuối pandoc markdown1.md -o markdown1.pdf

Tài liệu cuối cùng của bạn sẽ trông giống như thế này:

Một cái gì đó có nghĩa đầy đủ

Đầu nói chuyện

Phần

Sự thành thạo.

Phần

Dao cạo cạnh.

Phần

Glah

Phần

Balh Balh


0

Tôi sử dụng Marked 2 trên Mac OS X. Nó hỗ trợ cú pháp sau để bao gồm các tệp khác.

<<[chapters/chapter1.md]
<<[chapters/chapter2.md]
<<[chapters/chapter3.md]
<<[chapters/chapter4.md]

Đáng buồn thay, bạn không thể cung cấp cho pandoc vì nó không hiểu cú pháp. Tuy nhiên, viết một kịch bản để loại bỏ cú pháp để xây dựng một dòng lệnh pandoc là đủ dễ dàng.


7
bạn sẽ có kịch bản thay vì chỉ nói nó dễ chứ? :)
toobulkeh

0

Một giải pháp phía máy khách, dựa trên HTML khác sử dụng markdown-itjQuery . Dưới đây là một trình bao bọc HTML nhỏ dưới dạng tài liệu chính, hỗ trợ không giới hạn bao gồm các tệp đánh dấu, nhưng không bao gồm lồng nhau. Giải thích được cung cấp trong các ý kiến ​​JS. Xử lý lỗi được bỏ qua.

<script src="/markdown-it.min.js"></script>
<script src="/jquery-3.5.1.min.js"></script>

<script> 
  $(function() {
    var mdit = window.markdownit();
    mdit.options.html=true;
    // Process all div elements of class include.  Follow up with custom callback
    $('div.include').each( function() {
      var inc = $(this);
      // Use contents between div tag as the file to be included from server
      var filename = inc.html();
      // Unable to intercept load() contents.  post-process markdown rendering with callback
      inc.load(filename, function () {
        inc.html( mdit.render(this.innerHTML) );
      });
  });
})
</script>
</head>

<body>
<h1>Master Document </h1>

<h1>Section 1</h1>
<div class="include">sec_1.md</div>
<hr/>
<h1>Section 2</h1>
<div class="include">sec_2.md</div>

-5

IMHO, Bạn có thể nhận được kết quả của mình bằng cách ghép các tệp * .md đầu vào của bạn như:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
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.