Penurunan harga dan termasuk beberapa file


197

Apakah ada garpu penurunan harga yang memungkinkan Anda untuk mereferensikan file lain, seperti file yang menyertakan? Secara khusus, saya ingin membuat file penurunan harga terpisah dengan tautan yang sering saya panggil tetapi tidak selalu (panggil B.md ini), kemudian ketika saya tautkan dengan referensi dalam file md yang saya tulis (A.md), saya akan suka untuk menarik tautan dari file lain (B.md) daripada dari akhir file saat ini (A.md).


1
Jika pertanyaan Anda terkait penurunan harga github, Anda dapat melihatnya di sini
Adi Prasetyo

3
Aturan praktis untuk Markdown adalah bahwa jawaban untuk 'Can Markdown ...' biasanya 'Tidak praktis, universal atau mudah'.
Michael Scheper

4
Ada diskusi terbuka tentang cara terbaik untuk melakukan ini dengan Pandoc di github.com/jgm/pandoc/issues/553 dan di forum commonmark
nught101

Jawaban:


217

Jawaban singkatnya adalah tidak. Jawaban panjangnya ya. :-)

Penurunan harga dirancang untuk memungkinkan orang menulis teks sederhana dan mudah dibaca yang dapat dengan mudah dikonversi ke markup HTML sederhana. Itu tidak benar-benar melakukan tata letak dokumen. Misalnya, tidak ada cara nyata untuk menyelaraskan gambar ke kanan atau kiri. Mengenai pertanyaan Anda, tidak ada perintah penurunan harga untuk memasukkan satu tautan dari satu file ke file lain dalam versi penurunan harga apa pun (sejauh yang saya tahu).

Yang paling dekat dengan fungsi ini adalah Pandoc . Pandoc memungkinkan Anda untuk menggabungkan file sebagai bagian dari transformasi, yang memungkinkan Anda untuk dengan mudah membuat beberapa file menjadi satu output. Misalnya, jika Anda membuat buku, maka Anda bisa memiliki bab seperti ini:

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

Anda dapat menggabungkan mereka dengan melakukan mengeksekusi perintah ini dalam direktori yang sama:

pandoc *.md > markdown_book.html

Karena pandoc akan menggabungkan semua file sebelum melakukan terjemahan, Anda dapat memasukkan tautan Anda ke file terakhir seperti ini:

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

Jadi bagian dari Anda 01_preface.mddapat terlihat seperti ini:

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

Dan sebagian dari Anda 02_introduction.mddapat terlihat seperti ini:

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

Selama file terakhir Anda termasuk baris:

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

... perintah yang sama yang digunakan sebelumnya akan melakukan penggabungan dan konversi sambil menyertakan tautan itu di seluruh. Pastikan Anda meninggalkan satu atau dua baris kosong di awal file itu. The dokumentasi Pandoc mengatakan bahwa hal itu menambah baris kosong antara file yang digabung dengan cara ini, tapi ini tidak bekerja untuk saya tanpa baris kosong.


6
Ini ternyata menjadi posting yang sangat berguna bagi saya! Terima kasih Aaron. Tampaknya akan menjadi kasus penggunaan umum untuk memiliki dir / bab, satu skrip yang membangun / menggabungkan bab, dan kemudian skrip pembungkus tingkat atas yang mencakup langkah-langkah seperti: - sertakan-sebelum-tubuh $ (include_dir) / merged_chapters .html. Itulah pendekatan yang akan saya ambil untuk mendapatkan manfaat organisasi.
Rob

1
Satu keuntungan lain dari menggunakan pandoc adalah mendukung beragam keluaran: Anda dapat menghasilkan tidak hanya HTML tetapi juga segala sesuatu dari docx hingga LaTeX hingga ePUB.
Chris Krycho

pandoc *.md > markdown_book.htmlhasil pandoc: *.md: openfile: invalid argument (Invalid argument)- itu tidak muncul untuk mendukung sintaks yang Anda tentukan.
Jason Young

Ini bekerja pada sistem saya. Saya membuat repositori sampel di GitHub sehingga Anda dapat mencobanya dengan semua file yang saya gunakan.
Aaron Massey

Anda dapat menyelaraskan gambar dengan memasukkan beberapa CSS yang sesuai, dan memang demikianlah seharusnya Anda melakukan sesuatu.
naught101

50

Saya hanya akan menyebutkan bahwa Anda dapat menggunakan catperintah untuk menyatukan file input sebelum mem-pipe mereka markdown_pyyang memiliki efek yang sama seperti apa yang pandocterjadi dengan beberapa file input yang masuk.

cat *.md | markdown_py > youroutputname.html

bekerja hampir sama dengan contoh pandoc di atas untuk versi Python Markdown pada Mac saya.


1
@ tprk77: kecuali bahwa jawaban Harun memperjelas bahwa perintah kucing mubazir di sini ..
naught101

1
Penggunaan cat *.mdmenyiratkan konvensi penamaan file tidak fleksibel. Konvensi ini tidak hanya akan melarang rekursif termasuk, untuk proyek dokumentasi yang lebih besar akan menyakitkan untuk menambahkan file baru ke dalam campuran. Anda harus melakukan banyak penghitungan dan penggantian nama. Proyek penurunan harga telah memiliki preprocessor untuk tujuan ini sejak tahun 2010.
ninegrid

@ninegrid Sementara MarkdownPP terlihat sangat berguna, dari melihat sumber repo yang Anda referensikan dalam jawaban Anda menurut saya (a) MarkdownPP adalah proyek John Reese, hanya; (B) itu bukan bagian dari "proyek penurunan harga" (salah satu dari berbagai rasa) sama sekali; dan (c) MarkdownPP menghasilkan GFM, khususnya. Benar? Seperti yang saya katakan, itu terlihat menarik dan bermanfaat, tetapi komentar Anda di sini membuatnya seperti fitur Markdown standar yang harus diikuti oleh setiap implementasi Markdown. Tetapi dari melihat repo itu, situasinya tampak sebaliknya.
FeRD

Gagal mengonversi tabel MD ke tabel HTML.
james.garriss

30

Anda sebenarnya dapat menggunakan Markdown Preprocessor ( MarkdownPP ). Berjalan dengan contoh buku hipotetis dari jawaban lain, Anda akan membuat .mdppfile yang mewakili bab Anda. .mdppFile - file kemudian dapat menggunakan !INCLUDE "path/to/file.mdpp"arahan, yang beroperasi secara rekursif menggantikan arahan dengan isi dari file yang direferensikan di output akhir.

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

Anda akan membutuhkan index.mdppyang berisi:

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

Untuk merender buku Anda, Anda cukup menjalankan preprosesor pada index.mdpp:

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

Jangan lupa untuk melihat di readme.mdppdalam penyimpanan MarkdownPP untuk penjelasan tentang fitur preprosesor yang cocok untuk proyek dokumentasi yang lebih besar.


19

Solusi saya adalah menggunakan m4. Ini didukung pada sebagian besar platform dan termasuk dalam paket binutils.

Pertama-tama sertakan makro changequote()dalam file untuk mengubah karakter kutipan ke apa yang Anda inginkan (standarnya adalah `'). Makro dihapus ketika file diproses.

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

Di baris perintah:

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

2
m4hampir tidak dikenal, tetapi memang alat yang sangat kuat ketika datang ke kebutuhan termasuk generik tersebut. Cukup untuk memiliki dokumentasi menyebutkan itu bisa "cukup membuat ketagihan".
Uriel

Nah, itu solusinya! Genius
Brandt

+1 untuk gagasan dan pengingat m4 ! Lucunya ketika saya melihat ekstensi di atas sebagai 'md' saya berpikir di kepala saya dari m4 . Bahwa Anda akan memasukkan contoh itu bagus. Saya tidak yakin apakah pertanyaan ini menanyakan persis apa yang saya cari tetapi mungkin berhasil. Bagaimanapun juga, terima kasih.
Pryftan

15

Baru-baru ini saya menulis sesuatu seperti ini di Node yang disebut markdown-include yang memungkinkan Anda untuk memasukkan file markdown dengan sintaks gaya C, seperti:

#include "my-file.md"

Saya percaya ini selaras dengan pertanyaan yang Anda ajukan. Saya tahu ini sudah lama, tapi setidaknya saya ingin memperbaruinya.

Anda dapat memasukkan ini dalam file penurunan harga yang Anda inginkan. File itu juga dapat memiliki lebih banyak menyertakan dan penurunan harga-termasuk akan membuat tautan internal dan melakukan semua pekerjaan untuk Anda.

Anda dapat mengunduhnya melalui npm

npm install -g markdown-include

1
Ini sudah sangat membantu! Terima kasih!
leas

@ senang Senang bisa membantu ... Saya belum bekerja di itu dalam beberapa tahun tetapi saya selalu bermaksud untuk kembali ke sana di beberapa titik. Semoga bermanfaat untuk tujuan Anda.
Sethen

9

Multimarkdown memiliki ini secara asli. Ini menyebutnya transclusion file :

{{some_other_file.txt}}

hanya itu yang dibutuhkan. Nama yang aneh, tetapi mencentang semua kotak.


apakah ada editor Gratis dan Sumber Terbuka untuk membuat sintaks ini? Saya telah menanyakan pertanyaan ini di sini dengan lebih detail. Saya akan sangat menghargai jika Anda dapat membantu saya dengan itu.
Isi

1
@ Memuat: Saya khawatir saya pengguna vim dan tidak mengetahui adanya editor semacam itu. Saya melihat pada reddit Q Anda, Anda menemukan bahwa Asciidoc, dan berbagai editor, mendukung hal ini. Saya tidak tahu ini - terima kasih.
eff

Senang itu bermanfaat. Tetapi apakah vim memiliki pratinjau langsung untuk MultiMarkDown? apakah Anda mau berbagi pengaturan dan file dot Anda dengan beberapa rincian lebih lanjut?
Isi

1
Tidak ada pratinjau langsung, saya bukan tipe pria seperti itu. ;) Alasan utama saya menggunakan markdown sama sekali adalah karena bertujuan agar dapat dibaca manusia ketika tidak diproses, jadi saya benar-benar tidak keberatan dengan pratinjau terlalu banyak (walaupun saya mengerti mengapa orang lain melakukannya). Satu-satunya hal yang saya minati, dalam hal ini, adalah penyorotan sintaksis, dan penyorotan sintaksis penurunan harga otomatis berfungsi cukup baik bagi saya. Maaf tidak bisa membantu lagi.
eff

1
Sepertinya itu bisa menarik, meskipun saya tidak melihat alasan untuk memilihnya daripada markdown / asciidoc untuk tujuan saya (sedikit), setidaknya.
eff

8

Saya menggunakan includes.txtfile dengan semua file saya dalam urutan yang benar saya menjalankan pandoc seperti ini:

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

Bekerja seperti pesona!


1
Pendekatan yang bagus . Menentukan urutan file adalah hal yang mendasar, tetapi tidak dapat dilakukan dengan globmetode kecuali Anda memberi nomor file.
ephsmith

Bisakah Anda memasukkan penjelasan langkah-langkahnya? Tampak sangat kuat! Saya ingin tahu apakah mungkin untuk memangkasnya untuk melakukan konversi lain seperti .pdf dan .tex.
nilon

6

Bahkan Anda dapat menggunakan \input{filename}dan \include{filename}yang merupakan perintah lateks, langsung masuk Pandoc, karena mendukung hampir semua htmldan latexsintaksis.

Namun berhati-hatilah, file yang disertakan akan diperlakukan sebagai latexfile. Tapi Anda bisa mengkompilasi Anda markdownuntuk latexdengan Pandoxmudah.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) sebenarnya adalah penurunan harga pada steroid. Secara keseluruhan, Asciidoc dan Markdown akan terlihat sangat mirip dan agak mudah untuk beralih. Sangat besar manfaat Asciidoc lebih penurunan harga adalah bahwa hal itu mendukung termasuk sudah, untuk file Asciidoc lain, tetapi juga untuk format apapun yang Anda suka. Anda bahkan dapat memasukkan sebagian file berdasarkan nomor baris atau tag di dalam file yang disertakan.

Menyertakan file lain benar-benar penyelamat ketika Anda menulis dokumen.

Misalnya Anda dapat memiliki file asciidoc dengan konten tersebut:

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

dan pertahankan sampel Anda di script.pl

Dan saya yakin Anda akan bertanya-tanya ya, Github juga mendukung asciidoc.


Tampaknya ada janji yang menyenangkan di sini tetapi tidak memberikan jawaban lengkap dengan langkah-langkah cara. Apakah mungkin untuk menyatakan bagaimana mengkonversi dokumen multi-file menjadi satu?
nilon

Ini adalah solusi terbaik di halaman ini sejauh ini. Saya sampai pada kesimpulan ini dan membahas masalah ini di sini di Reddit . AsciiDoc memiliki built-in include dan diberikan oleh GitHub. Atom dan vscode keduanya memiliki plugin yang bagus untuk live preview juga. Saya bertanya-tanya mengapa AsciiDoc belum menjadi standar industri!
Isi

4

Saya pikir kita lebih baik mengadopsi sintaks penyertaan file baru (jadi tidak akan mengacaukan dengan blok kode, saya pikir inklusi gaya C benar-benar salah), dan saya menulis sebuah alat kecil di Perl, penamaan cat.pl, karena berfungsi seperticat ( cat a.txt b.txt c.txtakan menggabungkan tiga file), tetapi menggabungkan file secara mendalam , tidak lebarnya . Cara Penggunaan?

$ perl cat.pl <your file>

Sintaksnya secara rinci adalah:

  • rekursif termasuk file: @include <-=path=
  • cukup sertakan satu: %include <-=path=

Itu benar dapat menangani loop inklusi file (jika a.txt <- b.txt, b.txt <- a.txt, lalu apa yang Anda harapkan?).

Contoh:

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

Contoh lainnya di https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md .

Saya juga menulis versi Java yang memiliki efek identik (tidak sama, tetapi tutup).



Dari catatan, @digunakan untuk kutipan dengan pandoc-citeproc(mis. " @Darwin1859").
PlasmaBinturong

4

Saya benar-benar terkejut bahwa tidak ada seorang pun di halaman ini yang menawarkan solusi HTML. Sejauh yang saya pahami, file MarkDown dapat menyertakan sebagian besar (jika tidak semua) tag HTML. Jadi ikuti langkah-langkah ini:

  1. Dari sini : masukkan file MarkDown Anda ke dalam <span style="display:block"> ... </span>tag untuk memastikan bahwa itu akan diberikan sebagai penurunan harga. Anda memiliki banyak properti gaya lain yang dapat Anda tambahkan. Yang saya suka adalah text-align:justify.

  2. Dari sini : Sertakan file dalam file utama Anda menggunakan<iframe src="/path/to/file.md" seamless></iframe>

PS1. solusi ini tidak bekerja pada semua mesin / render MarkDown. Misalnya Typora memang membuat file dengan benar tetapi Visual Studio Code tidak. Alangkah baiknya jika orang lain bisa berbagi pengalaman mereka dengan platform lain. Khususnya saya ingin mendengar tentang GitHub dan GitLab ...

PS2. Pada penyelidikan lebih lanjut tampaknya ada masalah ketidakcocokan utama yang menyebabkan ini tidak diterjemahkan dengan benar pada banyak platform, termasuk kode Typora, GitHub dan Visual Studio. Tolong jangan gunakan ini sampai saya menyelesaikannya. Saya tidak akan menghapus jawabannya hanya untuk kepentingan diskusi dan jika mungkin Anda bisa membagikan pendapat Anda.

PS3. Untuk menyelidiki lebih lanjut masalah ini, saya telah mengajukan pertanyaan ini di sini di StackOverflow dan di sini di Reddit .

PS4. Setelah melalui beberapa studi, saya sampai pada kesimpulan bahwa untuk saat ini AsciiDoc adalah pilihan yang lebih baik untuk dokumentasi. Muncul dengan fungsionalitas built-in termasuk, itu diberikan oleh GitHub, dan editor kode utama seperti Atom dan vscode memiliki ekstensi untuk pratinjau langsung. Seseorang dapat menggunakan Pandoc atau alat lain untuk secara otomatis mengkonversi Kode MarkDown yang ada ke AsciiDoc dengan perubahan kecil.

PS5. Bahasa markup ringan lainnya dengan fungsionalitas built-in adalah reStructuredText. Muncul dengan .. include:: inclusion.txt sintaks secara standar. Ada editor ReText dengan pratinjau langsung juga.


1

Saya tahu ini adalah pertanyaan lama, tetapi saya belum melihat jawaban untuk efek ini: Intinya, jika Anda menggunakan markdown dan pandoc untuk mengonversi file Anda ke pdf, dalam data yaml Anda di bagian atas halaman, Anda dapat memasukkan sesuatu seperti ini:

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

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

# Section

Blah blah

## Section 

Blah blah

Karena pandoc menggunakan lateks untuk mengonversi semua dokumen Anda, header-includesbagian ini memanggil paket pdfpages. Kemudian ketika Anda memasukkannya \includepdf{/path/to/pdf/document.pdf}akan memasukkan apa pun yang termasuk dalam dokumen itu. Selanjutnya, Anda dapat memasukkan beberapa file pdf dengan cara ini.

Sebagai bonus yang menyenangkan, dan ini hanya karena saya sering menggunakan penurunan harga, jika Anda ingin menyertakan file selain penurunan harga, misalnya file lateks. Saya telah memodifikasi jawaban ini . Katakanlah Anda memiliki file markdown markdown1.md:

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

Dan dua file lateks tambahan document1, yang terlihat seperti ini:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

Dan yang lain, document2.tex, yang terlihat seperti ini:

\section{Section

Glah

\subsection{Section}

Balh Balh

Dengan asumsi bahwa Anda ingin memasukkan document1.tex dan document2.tex ke markdown1.md, Anda hanya perlu melakukan ini ke markdown1.md

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

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

Jalankan pandoc di atasnya, misalnya

di terminal pandoc markdown1.md -o markdown1.pdf

Dokumen akhir Anda akan terlihat seperti ini:

Sesuatu Yang Berarti Penuh

Kepala Bicara

Bagian

Kedalaman.

Bagian

Tepi pisau cukur.

Bagian

Glah

Bagian

Balh Balh


0

Saya menggunakan Marked 2 pada Mac OS X. Mendukung sintaks berikut untuk menyertakan file lain.

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

Sayangnya, Anda tidak dapat memberi makan itu ke pandoc karena tidak mengerti sintaks. Namun, menulis skrip untuk menghapus sintaks untuk membangun baris perintah pandoc cukup mudah.


7
Apakah Anda akan memiliki skrip alih-alih hanya mengatakan itu mudah? :)
toobulkeh

0

Solusi sisi klien berbasis HTML lainnya menggunakan markdown-it dan jQuery . Di bawah ini adalah pembungkus HTML kecil sebagai dokumen master, yang mendukung file markdown yang tidak terbatas, tetapi tidak termasuk nested. Penjelasan diberikan dalam komentar JS. Penanganan kesalahan dihilangkan.

<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, Anda bisa mendapatkan hasil dengan menggabungkan input * .md file Anda seperti:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.