İşaretleme ve birden fazla dosya dahil etme


199

Diğer dosyalara başvurmanıza izin veren bir işaretleme çatalı var mı? Özellikle, sık sık aradığım ama her zaman değil (bu B.md arayın) bağlantıları ile ayrı bir markdown dosyası oluşturmak istiyorum, sonra yazdım md dosyasında (A.md) referans ile bağlantı, ben bağlantıyı geçerli dosyanın (A.md) yerine diğer dosyadan (B.md) alması gibi.


1
Sorunuz github ile ilgili
markdown ise,

3
Markdown'un temel kuralı, 'Can Markdown ...' cevabının genellikle 'Pratik, evrensel veya kolay değil' olmasıdır.
Michael Scheper

Yanıtlar:


217

Kısa cevap hayır. Uzun cevap evet. :-)

Markdown, insanların basit bir HTML işaretlemesine kolayca dönüştürülebilen basit, okunabilir metin yazmalarına izin vermek için tasarlanmıştır. Gerçekten belge düzeni yapmaz. Örneğin, bir görüntüyü sağa veya sola hizalamanın gerçek bir yolu yoktur. Sorunuza gelince, markdown'un herhangi bir sürümünde (bildiğim kadarıyla) bir dosyadan diğerine tek bir bağlantı eklemek için bir işaretleme komutu yoktur.

Bu işleve en yakın olabileceğiniz Pandoc . Pandoc, dosyaları dönüşümün bir parçası olarak birleştirmenize izin verir, bu da birden fazla dosyayı tek bir çıktıda kolayca oluşturmanıza olanak tanır. Örneğin, bir kitap oluşturuyorsanız, bunun gibi bölümleriniz olabilir:

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

Bu komutu aynı dizinde yürüterek birleştirebilirsiniz:

pandoc *.md > markdown_book.html

Pandoc çeviri yapmadan önce tüm dosyaları birleştireceğinden, bağlantılarınızı son dosyaya şu şekilde ekleyebilirsiniz:

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

Yani bir parçanız 01_preface.mdşöyle görünebilir:

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

Ve bir kısmı 02_introduction.mdşöyle görünebilir:

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

Son dosyanız satırı içerdiği sürece:

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

... daha önce kullanılan komut, birleştirme ve dönüştürme işlemini gerçekleştirirken bu bağlantıyı baştan sona ekler. Dosyanın başında bir iki satır boş bıraktığınızdan emin olun. Pandoc belgeleri bu şekilde birleştirilir dosyaları arasında boş satır ekler söylüyor, ama bu boş satıra olmadan benim için çalış yoktu.


6
Bu benim için son derece yararlı bir yazı gibi görünüyor! Teşekkürler Aaron. / Chapters dir, bölümleri oluşturan / birleştiren bir komut dosyası ve daha sonra aşağıdaki gibi bir adım içeren bir üst düzey sarmalayıcı komut dosyasına sahip olmak yaygın bir kullanım durumu gibi görünecektir: --incit-before-body $ (include_dir) / merged_chapters .html. Örgütsel fayda elde etmek için kullanacağım yaklaşım budur.
Rob

1
Pandoc kullanmanın bir diğer avantajı, çok çeşitli çıktıları desteklemesidir: sadece HTML değil, docx'ten LaTeX'ten ePUB'a kadar her şeyi de oluşturabilirsiniz.
Chris Krycho

pandoc *.md > markdown_book.htmlsonuç pandoc: *.md: openfile: invalid argument (Invalid argument)- belirttiğiniz sözdizimini desteklemiyor gibi görünüyor.
Jason Young

Benim sistemim üzerinde çalışıyor. GitHub'da örnek bir havuz oluşturdum , böylece kullandığım tüm dosyalarla deneyebilirsiniz.
Aaron Massey

Bazı uygun CSS'leri ekleyerek görüntüleri doğru şekilde hizalayabilirsiniz, bu da muhtemelen her şeyi bir şekilde yapmalısınız.
naught101

50

Sadece catgiriş dosyaları borulamadan önce birleştirmek için komutunu kullanabilirsiniz markdown_pyhangi pandocgelen birden çok giriş dosyaları ile aynı etkiye sahiptir .

cat *.md | markdown_py > youroutputname.html

Mac'imdeki Markdown'un Python sürümü için yukarıdaki pandoc örneğiyle hemen hemen aynı şekilde çalışır .


1
@ tprk77: Aaron'un cevabı, kedi komutunun burada gereksiz olduğunu açıkça ortaya
koyuyor

1
Kullanımı, cat *.mdesnek olmayan bir dosya adlandırma kuralı anlamına gelir. Bu sözleşmenin yalnızca özyinelemeyi içermesi gerekmekle kalmaz, daha büyük dokümantasyon projeleri için karışıma yeni dosyalar eklemek acı verici olur. Çok sayma ve yeniden adlandırma yapmak zorunda kalacaksınız. Markdown projesi 2010 yılından bu yana bu amaçla bir ön
işlemciye sahip

@ninegrid MarkdownPP çok faydalı görünse de, cevabınızda belirttiğiniz kaynak repoya baktığımda bana öyle geliyor (a) MarkdownPP, John Reese'in projesi; (b) "markdown projesinin" (çeşitli tatlardan herhangi biri) bir parçası olmadığı; ve (c) MarkdownPP özellikle GFM çıktılar. Doğru? Dediğim gibi, ilginç ve yararlı görünüyor, ancak buradaki yorumunuz her Markdown uygulamasının gelmesi gereken standart bir Markdown özelliği gibi görünüyor. Ancak repoya baktığımızda durum tam tersi gibi görünüyor.
FeRD

MD tablolarını HTML tablolarına dönüştüremiyor.
james.garriss

30

Markdown Önişlemcisini ( MarkdownPP ) kullanabilirsiniz. Diğer cevaplardan gelen varsayımsal kitap örneğiyle koşarak .mdpp, bölümlerinizi temsil eden dosyalar yaratabilirsiniz . .mdppDosyalar daha sonra kullanabilirsiniz !INCLUDE "path/to/file.mdpp"yinelemeli son çıkış başvurulan dosyanın içeriğiyle direktifini yerine çalışır yönergesini.

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

Daha sonra index.mdppaşağıdakileri içeren bir şeye ihtiyacınız olacaktır :

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

Kitabınızı oluşturmak için önişlemciyi çalıştırmanız yeterlidir index.mdpp:

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

Bakmak unutma readme.mdppiçinde MarkdownPP önişlemci bir fuar daha büyük dokümantasyon projeleri için uygundur özellikleri için depo.


19

Benim çözümüm m4 kullanmak. Çoğu platformda desteklenir ve binutils paketine dahildir.

İlk olarak changequote(), alıntı karakterlerini tercih ettiğiniz şekilde değiştirmek için dosyaya bir makro ekleyin (varsayılan `` değeridir). Dosya işlendiğinde makro kaldırılır.

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

Komut satırında:

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

2
m4zar zor bilinir, ancak bu tür genel içerme ihtiyaçları söz konusu olduğunda gerçekten inanılmaz derecede güçlü bir araçtır. Belgelerin "oldukça bağımlılık" olabileceğinden bahsetmek için yeterli.
Uriel

Şimdi, bu bir çözüm! Genius
Brandt

Fikri ve hatırlatıcı için 1 m4 ! Komik olan şey, yukarıdaki uzantıları 'md' olarak gördüğümde m4 kafamda düşünüyordum . Sonra bir örnek eklemek harika. Bu sorunun tam olarak neyin peşinde olduğumu sorup sormadığından emin değilim ama yapabilir. Her iki şekilde de teşekkürler.
Ocak'ta Pryftan

15

Son zamanlarda Düğümde markdown-include adlı böyle bir şey yazdım , bu da C tarzı sözdizimi ile markdown dosyalarını dahil etmenizi sağlar:

#include "my-file.md"

Bunun, sorduğunuz soruya iyi uyduğuna inanıyorum. Bunun eski olduğunu biliyorum, ama en azından güncellemek istedim.

Bunu istediğiniz herhangi bir markdown dosyasına ekleyebilirsiniz. Bu dosya ayrıca daha fazla içerir ve markdown- dahili bir bağlantı yapar ve tüm işi sizin için yapar.

Şuradan indirebilirsiniz: npm

npm install -g markdown-include

1
Bu çok yardımcı oldu! Teşekkür ederim!
kiralar

@leas Hizmet vermekten memnunum ... Birkaç yıldır hiç çalışmadım ama her zaman bir noktada ona geri dönmek istiyorum. Umarım amaçlarınız için iyi yapar.
Sethen

9

Multimarkdown'da doğal olarak var. Buna dosya aktarımı denir :

{{some_other_file.txt}}

yeter. Garip bir isim, ama tüm kutuları keneler.


bu sözdizimini oluşturmak için herhangi bir Ücretsiz ve Açık Kaynak editör var mı? Bu soruyu daha ayrıntılı olarak burada sordum . Bana bu konuda yardımcı olabilirseniz sevinirim.
Foad

1
@Foad: Korkarım bir vim kullanıcısıyım ve bu tür editörlerden habersizim. Reddit Q'nuzda, Asciidoc'un ve çeşitli editörlerinin bunu desteklediğini gördünüz. Bunu bilmiyordum - teşekkürler.
eff

Yararlı olduğu için mutluyum. Ancak vim MultiMarkDown için canlı önizleme var mı? kurulum ve nokta dosyalarınızı daha fazla ayrıntıyla paylaşmak ister misiniz?
Foad

1
Canlı önizleme yok, ben böyle biri değilim. ;) O zaman okunabilir insan olmayı hedeflemektedir çünkü hiç fiyat indirimlerini kullanılan ana nedeni oldu değil işlenmiş diğerleri neden yaptığınızı anlıyorum ancak ben gerçekten (çok fazla önizleme hakkında sakıncası böylece). Bu durumda ilgilendiğim tek şey sözdizimi vurgulamasıdır ve varsayılan işaretleme sözdizimi vurgulaması benim için yeterince iyi çalışır. Daha fazla yardımcı olamadığım için üzgünüm.
eff

1
En azından benim (yetersiz) amaçlar için markdown / asciidoc'u seçmek için hiçbir neden görmeme rağmen ilginç olabilir.
eff

8

includes.txtTüm dosyalarımı doğru sırada ben pandoc yürütmek böyle bir dosya kullanın :

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

Tıkır tıkır çalışıyor!


1
Harika bir yaklaşım . Dosya sırasını belirtmek esastır, ancak globdosyaları numaralandırmadıkça yöntemlerle gerçekleştirilmez .
ephsmith

Adımların bir açıklamasını ekleyebilir misiniz? Çok güçlü görünüyor! .Pdf ve .tex gibi diğer dönüşümleri yapmak için bunu kırpmanın mümkün olup olmadığını bilmek istiyorum.
nilon

6

Aslında kullanabilirsiniz \input{filename}ve \include{filename}lateks komutları olan doğrudan Pandoc, çünkü neredeyse hepsini destekler htmlvelatex sözdizimini .

Ancak dikkat, dahil edilen dosya dosya olarak kabul edilecektir latex. Ama sen derlemek olabilir markdownTo latexile Pandoxkolayca.


6

Asciidoc ( http://www.methods.co.nz/asciidoc/ ) aslında steroidler üzerinde bir işarettir . Genel olarak, Asciidoc ve Markdown çok benzer görünecek ve geçiş yapmak oldukça kolay. Bir büyük markdown üzerinde Asciidoc yararı destekler diğer Asciidoc dosyaları için değil, aynı zamanda gibi herhangi bir biçimde sizin için, zaten içermesidir. Hatta, dahil edilen dosyaların içine satır numaralarına veya etiketlere dayalı olarak dosyalar da ekleyebilirsiniz.

Diğer dosyaları dahil etmek, doküman yazarken gerçekten hayat kurtarıcıdır.

Örneğin, bu tür içeriğe sahip bir asciidoc dosyanız olabilir:

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

ve içinde örnek korumak script.pl

Ve eminim ki çok merak edeceksiniz, Github asciidoc'u da destekliyor.


Burada güzel bir vaat var gibi görünüyor ama nasıl yapılır adımlarıyla tam bir cevap vermiyor. Çok dosyalı belgenin nasıl tek bir belgeye dönüştürüleceğini belirtmek mümkün müdür?
nilon

Bu, bu sayfadaki en iyi çözümdür. Bu sonuca vardım ve burada Reddit'teki sorunu ele aldım . AsciiDoc yerleşik içerir ve GitHub tarafından oluşturulur. Atom ve vscode'un her ikisi de canlı önizleme için güzel eklentilere sahiptir. AsciiDoc'un neden endüstri standardı olmadığını merak ediyorum!
Foad

4

Sanırım yeni bir dosya dahil etme sözdizimini benimsemeyi düşünüyorum (bu yüzden kod bloklarıyla uğraşmayacağım, C stili dahil etmenin tamamen yanlış olduğunu düşünüyorum) ve Perl'de küçük bir araç yazdım cat.pl, çünkü çalışıyorcat ( cat a.txt b.txt c.txtbirleştirilecek) üç dosya), ancak dosyaları genişlikle değil derinlemesine birleştirir . Nasıl kullanılır?

$ perl cat.pl <your file>

Ayrıntılı sözdizimi:

  • özyinelemeli dosyalar dahil: @include <-=path=
  • sadece bir tane ekleyin: %include <-=path=

Dosya ekleme döngülerini düzgün işleyebilir (a.txt <- b.txt, b.txt <- a.txt ise, ne bekliyorsunuz?).

Misal:

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

Https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md adresinde daha fazla örnek .

Aynı etkiye sahip bir Java sürümü de yazdım (aynı değil, yakın).


<<[include_file.md]( MacOS'ta
dvorak4tzx 25:17

Dikkat, (" ") @ile yapılan alıntılar için kullanılır . pandoc-citeproc@Darwin1859
PlazmaBinturong

4

Aslında bu sayfadaki hiç kimsenin herhangi bir HTML çözümü sunmadığına şaşırdım. Şimdiye kadar MarkDown dosyaları HTML etiketlerinin geniş bölümünü (hepsi değilse de) içerebileceğini anladım. Bu yüzden şu adımları izleyin:

  1. Gönderen burada : sizin Markdown dosyaları koymak <span style="display:block"> ... </span>emin onlar markdown olarak görüntülenecek olmak etiketleri. Ekleyebileceğiniz bir sürü başka stil özelliğiniz var. Sevdiğim biri text-align:justify.

  2. Gönderen burada : kullanarak ana dosyadaki dosyaları dahil<iframe src="/path/to/file.md" seamless></iframe>

PS1. bu çözüm tüm MarkDown motorlarında / makinelerinde çalışmaz. Örneğin, Typora dosyaları doğru şekilde oluşturdu ancak Visual Studio Code oluşturmadı. Başkalarının deneyimlerini diğer platformlarla paylaşabilmesi harika olurdu. Özellikle GitHub ve GitLab hakkında bilgi almak istiyorum ...

PS2. Daha fazla araştırmada, Typora, GitHub ve Visual Studio kodu da dahil olmak üzere birçok platformda düzgün bir şekilde oluşturulmamasına yol açan büyük uyumsuzluk sorunları var gibi görünüyor. Lütfen bunları çözene kadar kullanmayın. Sadece tartışma uğruna cevabı silmeyeceğim ve belki görüşlerinizi paylaşabilirsiniz.

PS3. Bu sorunu daha fazla araştırmak için burada StackOverflow ve burada Reddit bu soruları sordum .

PS4. Bazı çalışmalardan sonra, şu an AsciiDoc'un dokümantasyon için daha iyi bir seçenek olduğu sonucuna vardım. Dahili içerme işlevselliği ile birlikte gelir, GitHub tarafından oluşturulur ve Atom ve vscode gibi büyük kod editörlerinin canlı önizleme için uzantıları vardır. Mevcut MarkDown Kodunu küçük değişikliklerle otomatik olarak AsciiDoc'a dönüştürmek için Pandoc veya diğer araçlar kullanılabilir.

PS5. Yerleşik dahil işlevselliği ile başka bir hafif biçimlendirme dili reStructuredText. .. include:: inclusion.txt Standart olarak sözdizimi ile birlikte gelir . Orada ReText editör sıra canlı önizleme ile.


1

Bunun eski bir soru olduğunu biliyorum, ancak bu etki için herhangi bir cevap görmedim: Esasen, markanızı ve pandoc'u pdf'ye dönüştürmek için kullanıyorsanız, sayfanın üstündeki yaml verilerinize dahil edebilirsiniz. böyle bir şey:

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

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

# Section

Blah blah

## Section 

Blah blah

Pandoc tüm belgelerinizi dönüştürmek için lateks kullandığından, header-includesbölüm pdfpages paketini çağırır. Sonra \includepdf{/path/to/pdf/document.pdf}eklediğinizde o belgeye dahil olan her şeyi ekleyecektir. Ayrıca, bu şekilde birden fazla pdf dosyası ekleyebilirsiniz.

Eğlenceli bir bonus olarak, bunun nedeni, örneğin lateks dosyaları gibi markdown dışındaki dosyaları dahil etmek istiyorsanız, genellikle markdown kullanmamdır. Bu cevabı biraz değiştirdim . Bir markdown dosyanız olduğunu varsayalım markdown1.md:

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

Ve şu şekilde görünen iki ek lateks dosyası document1:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

Ve başka bir, document2.tex, şuna benzer:

\section{Section

Glah

\subsection{Section}

Balh Balh

Markdown1.md dosyasına document1.tex ve document2.tex dosyalarını dahil etmek istediğinizi varsayarsak, bunu sadece markdown1.md dosyasına yaparsınız.

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

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

Üzerinde pandoc çalıştırın, örn.

terminalde pandoc markdown1.md -o markdown1.pdf

Nihai belgeniz şöyle görünecektir:

Dolu Bir Şey Dolu

Konuşan kafa

Bölüm

Derinlik.

Bölüm

Ustura kenarı.

Bölüm

Glah

Bölüm

Balh Balh


0

Mac OS X'te Marked 2 kullanıyorum. Diğer dosyaları dahil etmek için aşağıdaki sözdizimini destekler.

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

Ne yazık ki, sözdizimini anlamadığı için bunu pandoc'a besleyemezsiniz. Ancak, bir pandoc komut satırı oluşturmak için sözdizimini çıkarmak için bir komut dosyası yazmak yeterince kolaydır.


7
senaryoyu sadece kolay olduğunu söylemek yerine alır mıydınız? :)
toobulkeh

0

Markdown-it ve jQuery kullanan başka bir HTML tabanlı, istemci tarafı çözümü . Aşağıda, ana belge olarak küçük bir HTML sarmalayıcı, işaretleme dosyalarının sınırsız içermesini destekler, ancak iç içe geçmiş içermez. Açıklama JS yorumlarında verilmiştir. Hata işleme atlandı.

<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, Giriş * .md dosyalarınızı aşağıdaki gibi birleştirerek sonucunuzu alabilirsiniz:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.