マークダウンと複数のファイルの取り込み


197

インクルードファイルなど、他のファイルを参照できるマークダウンフォークはありますか?具体的には、頻繁に呼び出されるが常にではない(このB.mdを呼び出す)リンクを含む個別のマークダウンファイルを作成し、次に、書いているmdファイル(A.md)で参照によってリンクすると、現在のファイルの末尾(A.md)からではなく、他のファイル(B.md)からリンクをプルするのが好きです。


1
質問がgithub関連の
マークダウン

3
マークダウンの経験則では、「マークダウン可能」への答えは通常「実際的、普遍的、または簡単ではない」です。
Michael Scheper

4
github.com/jgm/pandoc/issues/553のパンドックでこれを行うための最善の方法に関するオープンディスカッションと、talk.commonmark.org / t
…のコモンマーク

回答:


217

短い答えはノーです。長い答えはイエスです。:-)

Markdownは、シンプルなHTMLマークアップに簡単に変換できるシンプルで読みやすいテキストを作成できるように設計されています。ドキュメントのレイアウトは実際には行いません。たとえば、画像を右または左に配置する実際の方法はありません。あなたの質問については、(私が知る限り)どのバージョンのマークダウンにも、あるファイルから別のファイルへの単一のリンクを含めるためのマークダウンコマンドはありません。

この機能に最も近いのはPandocです。Pandocでは、ファイルを変換の一部としてマージできるため、複数のファイルを単一の出力に簡単にレンダリングできます。たとえば、本を作成している場合、次のような章を持つことができます。

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

同じディレクトリ内で次のコマンドを実行することにより、それらをマージできます。

pandoc *.md > markdown_book.html

pandocは翻訳を行う前にすべてのファイルをマージするため、次のように最後のファイルにリンクを含めることができます。

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

したがって、あなたの一部は次の01_preface.mdようになります:

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

そして、あなたの一部は次の02_introduction.mdようになります:

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

最後のファイルに次の行が含まれている限り:

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

...以前に使用したのと同じコマンドが、そのリンク全体を含めてマージと変換を実行します。そのファイルの先頭に1行または2行の空白を残すようにしてください。pandocのドキュメントでは、それがこのようにマージされたファイルの間に空白行を追加することを言いますが、これは空白行せずに私のために動作しませんでした。


6
これは私にとって非常に便利な投稿です。アーロン、ありがとう。/ chapters dir、チャプターをビルド/マージする1つのスクリプト、次に次のようなステップを含むトップレベルのラッパースクリプトを使用するのは一般的な使用例のようです:--include-before-body $(include_dir)/ merged_chapters .html。これが、組織の利益を得るために私が採用するアプローチです。
Rob

1
pandocを使用するもう1つの利点は、それが非常に多様な出力をサポートすることです。HTMLだけでなく、docxからLaTeX、ePUBまですべてを生成できます。
Chris Krycho 2013年

pandoc *.md > markdown_book.html結果はpandoc: *.md: openfile: invalid argument (Invalid argument)-指定した構文をサポートしていないようです。
Jason Young

私のシステムで動作しています。私がGitHubにサンプルリポジトリを作成したので、私が使用したすべてのファイルでそれを試すことができます。
アーロンマッセイ2014年

適切なCSSを含めることで画像を正しく配置できます。これはおそらく、とにかくすべきことです。
naught101

50

catコマンドを使用して入力ファイルを連結する前に連結して、複数の入力ファイルが入ってくる場合とmarkdown_py同じ効果があることを述べておきpandocます。

cat *.md | markdown_py > youroutputname.html

Mac上のMarkdownのPythonバージョンの上記のpandocの例とほとんど同じように機能します。


1
@ tprk77:アーロンの答えが行うことを除いては、catコマンドはここに..冗長であることが明らかに
naught101

1
の使用はcat *.md、柔軟性のないファイル命名規則を意味します。この規則は、必ずしも再帰的なインクルードを禁止するだけでなく、大規模なドキュメントプロジェクトの場合、新しいファイルをミックスに追加するのは面倒です。多くのカウントと名前の変更を行う必要があります。値下げプロジェクトは、2010年まで以来、この非常に目的のためのプリプロセッサを持っていた
ninegrid

@ninegrid MarkdownPPは非常に便利に見えますが、回答で参照したソースリポジトリを見ると、私には(a)MarkdownPPはJohn Reeseのプロジェクトにすぎません。(b)「マークダウンプロジェクト」(さまざまなフレーバーのいずれか)の一部ではありません。(c)MarkdownPPは、具体的にはGFMを出力します。正しい?すでに述べたように、それは面白くて役立つように見えますが、ここでのコメントは、すべてのMarkdown実装に付属している標準のMarkdown機能のように聞こえます。しかし、レポを見ると、状況はまったく逆のように見えます。
FeRD 2018

MDテーブルをHTMLテーブルに変換できません。
james.garriss

30

実際にMarkdown Preprocessor(MarkdownPP)を使用できます。他の回答からの架空の本の例を実行すると、.mdpp章を表すファイルが作成されます。.mdppファイルは、使用することができます!INCLUDE "path/to/file.mdpp"再帰的に最終的な出力で参照されたファイルの内容で指示を置き換える動作指令を、。

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

次にindex.mdpp、以下を含むが必要になります。

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

本をレンダリングするには、プリプロセッサをindex.mdpp次のように実行します。

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

大規模なドキュメントプロジェクトに適したプリプロセッサ機能の説明についてreadme.mdppは、MarkdownPPリポジトリのを参照することを忘れないでください。


19

私の解決策は、m4を使用することです。ほとんどのプラットフォームでサポートされており、binutilsパッケージに含まれています。

まずchangequote()、ファイルにマクロを含めて、引用文字を希望するものに変更します(デフォルトは `'です)。マクロは、ファイルが処理されるときに削除されます。

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

コマンドラインで:

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

2
m4はほとんど知られていませんが、そのような一般的なインクルードのニーズに関しては、確かに非常に強力なツールです。ドキュメントで言及するのに十分なほど、それは「かなり中毒性がある」可能性があります。
ウリエル

さて、それは解決です!Genius
Brandt、

m4のアイデアとリマインダーの+1 !面白いのは、上記の拡張機能を「md」と見なしたとき、私はm4の頭の中で考えていたということです。その後、例を含めることは素晴らしいことです。この質問が私が求めていることを正確に尋ねているかどうかはわかりませんが、そうなるかもしれません。いずれにせよありがとうございます。
プリフタン

15

最近、私はこのようなマークダウン-インクルードと呼ばれるノードでこのようなものを書きました。これにより、Cスタイルの構文でマークダウンファイルを含めることができます。

#include "my-file.md"

これはあなたの質問とうまく一致していると思います。これは古いものですが、少なくとも更新したかったのです。

これを任意のマークダウンファイルに含めることができます。そのファイルには、より多くのインクルードとmarkdown-includeも含めることができますことができ、は内部リンクを作成し、すべての作業を行います。

からダウンロードできます npm

npm install -g markdown-include

1
これはとても役に立ちました!ありがとうございました!
19

@leasよろしくお願いします...私はかなりの数年はそれに取り組んでいませんが、いつかはいつでもそれに戻るつもりです。うまくいけば、それはあなたの目的のためにうまくいきます。
Sethen

9

Multimarkdownはこれをネイティブに持っています。それをファイル転置と呼びます

{{some_other_file.txt}}

それが取るすべてです。奇妙な名前ですが、すべてのボックスをチェックします。


この構文をレンダリングするフリーおよびオープンソースのエディターはありますか?私はこの質問をここでより詳細に尋ねました。お手伝いいただければ幸いです。
Foad

1
@Foad:恐らく私はvimユーザーであり、そのような編集者を知りません。あなたのreddit Qで、Ascidocとそのさまざまな編集者がこれをサポートしていることがわかりました。私はこれを知りませんでした-ありがとう。
2019年

お役に立てて嬉しいです。しかし、vimにはMultiMarkDownのライブプレビューがありますか?セットアップとドットファイルをさらに詳細に共有していただけませんか?
Foad

1
ライブプレビューはありません。私はそのような人ではありません。;)マークダウンを使用した主な理由は、処理されないときに人間が読めるようにすることを目的としているためです。プレビューはあまり気にしません(ただし、他の人が行う理由は理解しています)。この場合、私が唯一関心があるのは構文の強調表示です。デフォルトのマークダウン構文の強調表示は、私にとっては十分に機能します。助けにならないでごめんなさい。
2019年

1
それは興味深いかもしれないようですが、少なくとも私の(meagre)の目的のためにmarkdown / asciidocよりも選択する理由はないと思います。
eff

8

私が使用してincludes.txt私はこのようなpandocを実行し、正しい順序ですべての私のファイルを使用してファイルを:

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

魅力的な作品!


1
素晴らしいアプローチ。ファイルの順序を指定することは基本ですが、globファイルに番号を付けない限り、メソッドを使用して実行することはできません。
エフスミス2018

手順の説明を含めることができますか?とても強力なようです!.pdfや.texなどの他の変換を行うために、それを削減できるかどうか知りたいのですが。
nilon、

6

実際、で直接使用できる\input{filename}\include{filename}は、latexコマンドです。Pandocほぼすべてhtmlをサポートしているため、latex構文。

ただし、インクルードされたファイルはlatexファイルとして扱われます。しかし、あなたはあなたのコンパイルできるmarkdownにしlatexPandox簡単に。


6

Asciidoc(http://www.methods.co.nz/asciidoc/)は、実際にはステロイドの値下げです。全体として、AscidocとMarkdownは非常によく似ており、切り替えるのはかなり簡単です。巨大なマークダウンに対するAsciidoc利点は、他のAsciidocファイルだけでなく、任意の形式でもインクルードがサポートされていることです。含まれるファイル内の行番号またはタグに基づいてファイルを部分的に含めることもできます。

他のファイルをインクルードすることは、ドキュメントを書くときに本当に救命です。

たとえば、次のような内容のasciidocファイルを作成できます。

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

サンプルを維持します script.pl

Githubはasciidocもサポートしています。


ここには良い約束があるようですが、ハウツーステップで完全な答えを提供していません。マルチファイルドキュメントを単一のドキュメントに変換する方法を述べることは可能ですか?
nilon

これは、このページでこれまでのところ最高のソリューションです。私はこの結論に達し、ここRedditで問題に対処しました。AsciiDocには組み込みのインクルードがあり、GitHubによってレンダリングされます。Atomとvscodeの両方には、ライブプレビュー用の優れたプラグインもあります。AsciiDocがまだ業界標準ではないのはなぜでしょうか。
Foad

4

私たちはより良いと思う新しいファイルのインクルードの構文を採用(そのコードブロックではない台無しに、私はCスタイルのインクルージョンが完全に間違っていると思いますが)、そして私が命名、Perlで小さなツールを書いたcat.plことがあるため、同じように動作しcatcat a.txt b.txt c.txtマージします3つのファイル)ですが、幅ではなく深さでファイルマージします。使い方?

$ perl cat.pl <your file>

構文の詳細は次のとおりです。

  • 再帰的なインクルードファイル: @include <-=path=
  • 1つだけ含める: %include <-=path=

ファイルインクルードループを適切に処理できます(a.txt <-b.txt、b.txt <-a.txtの場合、何を期待していますか?)。

例:

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にあるその他の例。

また、同じ効果を持つJavaバージョンも作成しました(同じではありませんが、近いです)。


<<[include_file.md](macOSでマーク2):gist.github.com/district10/d46a0e207d888d0526aef94fb8d8998c
dvorak4tzx

注目すべきは、 @pandoc-citeproc( " @Darwin1859"など)の引用に使用されることです。
PlasmaBinturong

4

このページの誰もHTMLソリューションを提供していないことに私は実際に驚いています。MarkDownファイルには、HTMLタグの広い部分(すべてではないにしても)を含めることができることを理解しました。したがって、次の手順に従います。

  1. ここから:MarkDownファイルを<span style="display:block"> ... </span>タグに配置して、確実にマークダウンとしてレンダリングされるようにします。追加できる他の多くのスタイルプロパティがあります。私が好きなのはtext-align:justifyです。

  2. ここから:を使用してメインファイルにファイルを含めます<iframe src="/path/to/file.md" seamless></iframe>

PS1。このソリューションは、すべてのMarkDownエンジン/レンダリングで機能するわけではありません。たとえば、Typoraはファイルを正しくレンダリングしましたが、Visual Studio Codeはレンダリングしませんでした。他のプラットフォームで他のプラットフォームと自分の経験を共有できればすばらしいと思います。特にGitHubとGitLabについて知りたいのですが...

PS2。さらなる調査により、Typora、GitHub、Visual Studioコードを含む多くのプラットフォームでこれが適切にレンダリングされないことにつながる、主要な非互換性の問題があるようです。解決するまで使用しないでください。話し合いのため、また、ご意見をお聞かせいただければ、回答は削除いたしません。

PS3。この問題をさらに調査するために、StackOverflowRedditでこの質問をしました

PS4。いくつかの検討を重ねた結果、現時点ではAsciiDocがドキュメンテーションのより良いオプションであるという結論に達しました。組み込みのインクルード機能が付属し、GitHubによってレンダリングされます。Atomやvscodeなどの主要なコードエディターには、ライブプレビュー用の拡張機能があります。Pandocまたは他のツールを使用して、マイナーな変更を加えて既存のMarkDownコードをAsciiDocに自動的に変換できます。

PS5。組み込み機能を備えたもう1つの軽量マークアップ言語はreStructuredTextです。.. include:: inclusion.txt 標準で構文が付属しています。ありReTextエディタだけでなく、ライブプレビューでは。


1

私はこれが古い質問であることを知っていますが、この影響に対する回答は見ていません:基本的に、マークダウンとパンドックを使用してファイルをPDFに変換している場合、ページの上部にあるyamlデータに、このようなもの:

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

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

# Section

Blah blah

## Section 

Blah blah

pandocはlatexを使用してすべてのドキュメントを変換するため、このheader-includesセクションではpdfpagesパッケージを呼び出します。次に、インクルード\includepdf{/path/to/pdf/document.pdf}すると、そのドキュメントにインクルードされているものは何でも挿入されます。さらに、この方法で複数のPDFファイルを含めることができます。

おもしろいボーナスとして、これは、ラテックスファイルなど、マークダウン以外のファイルを含める場合に、マークダウンをよく使用するためです。私はこの答えを多少変更しました。マークダウンファイルmarkdown1.mdがあるとします。

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

そして、次のような2つの追加のラテックスファイルdocument1があります。

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.

そして別のdocument2.texは次のようになります。

\section{Section

Glah

\subsection{Section}

Balh Balh

document1.texとdocument2.texをmarkdown1.mdに含めたいと仮定すると、これをmarkdown1.mdに行うだけです。

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

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

たとえば、パンドックを実行します

ターミナルで pandoc markdown1.md -o markdown1.pdf

最終的なドキュメントは次のようになります。

完全な意味

トーキングヘッド

セクション

豊富さ。

セクション

剃刀の刃。

セクション

グラ

セクション

バルバル


0

私はMac OS XでMarked 2を使用しています。他のファイルを含めるために次の構文をサポートしています。

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

残念ながら、構文を理解していないため、これをpandocにフィードすることはできません。ただし、スクリプトを記述して構文を削除し、pandocコマンドラインを作成するのは簡単です。


7
簡単だと言っているだけでなく、スクリプトを作成することができますか?:)
toobulkeh 2015

0

markdown-itjQueryを使用した、別のHTMLベースのクライアント側ソリューション。以下は、マスタードキュメントとしての小さなHTMLラッパーです。これは、マークダウンファイルの無制限のインクルードをサポートしますが、ネストされたインクルードはサポートしません。JSコメントに説明があります。エラー処理は省略されます。

<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

私見、次のような入力* .mdファイルを連結することで結果を得ることができます。

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.