Markdown并包含多个文件

时间:2011-01-24 07:25:22

标签: markdown

是否有任何markdown fork允许您引用其他文件,例如包含文件?具体来说,我想创建一个单独的markdown文件,其链接我经常调用但不总是(调用此B.md),然后当我在md文件中通过引用链接我正在写(A.md)时,我想喜欢它从其他文件(B.md)而不是从当前文件(A.md)的末尾拉取链接。

15 个答案:

答案 0 :(得分:181)

简短的回答是否定的。答案很长,是的。 : - )

Markdown旨在让人们编写简单易读的文本,这些文本可以轻松转换为简单的HTML标记。它并没有真正做文档布局。例如,没有真正的方法将图像对齐到右侧或左侧。至于你的问题,没有markdown命令在任何版本的markdown中包含从一个文件到另一个文件的单个链接(据我所知)。

您最接近此功能的是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

...之前使用的相同命令将执行合并和转换,同时包括整个链接。只需确保在该文件的开头留下一行或两行。 pandoc documentation表示它在以这种方式合并的文件之间添加了一个空行,但如果没有空行,这对我来说不起作用。

答案 1 :(得分:48)

我只想提一下,您可以使用cat命令连接输入文件,然后将它们传递给markdown_py,这与pandoc对多个输入文件的效果相同进来。

cat *.md | markdown_py > youroutputname.html

与我上Mac版Markdown的Python版本的 pandoc 示例非常相似。

答案 2 :(得分:22)

您实际上可以使用Markdown预处理器(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,以了解适用于大型文档项目的预处理器功能。

答案 3 :(得分:14)

我的解决方案是使用m4。它在大多数平台上都受支持,并包含在binutils包中。

首先在文件中包含一个宏changequote(),将引号字符更改为您喜欢的字符(默认为'')。处理文件时将删除宏。

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

在命令行上:

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

答案 4 :(得分:13)

就在最近,我在名为markdown-include的Node中编写了类似的内容,允许您使用C样式语法包含markdown文件,如下所示:

#include "my-file.md"

我相信这与你提出的问题很吻合。我知道这是一个旧的,但我想至少更新它。

您可以将此包含在您希望的任何降价文件中。该文件还可以包含更多内容, markdown-include 将构成内部链接并为您完成所有工作。

您可以通过npm

下载
npm install -g markdown-include

答案 5 :(得分:6)

Multimarkdown本身有这个。它称之为file transclusion

{{some_other_file.txt}}

只需要。奇怪的名字,但勾选所有方框。

答案 6 :(得分:4)

我使用includes.txt文件以正确的顺序包含我的所有文件 我执行像这样的pandoc:

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

像魅力一样!

答案 7 :(得分:3)

我认为我们更好采用新的文件包含语法(所以不会搞砸 代码块,我认为C风格包含是完全错误的),我在Perl中编写了一个小工具,命名为cat.pl, 因为的作用类似cat a.txt b.txt c.txt $ perl cat.pl <your file> 会合并三个 文件),但它合并文件深度,而不是宽度。怎么用?

@include <-=path=

详细语法如下:

  • 递归包含文件:%include <-=path=
  • 只需加一个:a.txt a <- b @include <-=b.txt= a.end

它可以正确处理文件包含循环(如果a.txt&lt; - b.txt,b.txt&lt; - a.txt,那么你期望什么?)。

示例:

A.TXT:

b.txt

    b <- a

    @include <-=a.txt=

b.end

b.txt:

perl cat.pl a.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 ,c.txt:

{{1}}

https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md的更多示例。

我还写了一个具有相同效果的Java版本(不一样,但很接近)。

答案 8 :(得分:3)

Asciidoc(http://www.methods.co.nz/asciidoc/)实际上是对类固醇的降价。总的来说,Asciidoc和Markdown看起来非常相似,而且很容易切换。 Asciidoc优于markdown的巨大优势在于它支持已包含的其他Asciidoc文件,但也适用于您喜欢的任何格式。您甚至可以根据所包含文件中的行号或标签部分包含文件。

当你编写文档时,包含其他文件真的可以节省生命。

例如,您可以拥有包含此类内容的asciidoc文件:

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

并将您的样本保存在script.pl

我相信你会好奇,是的,Github也支持asciidoc。

答案 9 :(得分:2)

我真的很惊讶,该页面中没有人提供任何HTML解决方案。据我了解,MarkDown文件可以包含大部分(如果不是全部)HTML标签。因此,请按照以下步骤操作:

  1. 来自here:将MarkDown文件放在<span style="display:block"> ... </span>标记中,以确保将它们标记为markdown。您可以添加很多其他样式属性。我喜欢的是text-align:justify

  2. 来自here:使用<iframe src="/path/to/file.md" seamless></iframe>

  3. 将文件包含在主文件中

P.S.1。。此解决方案不适用于所有MarkDown引擎/渲染器。例如,Typora确实正确渲染了文件,但Visual Studio Code却没有。如果其他人可以与其他平台分享他们的经验,那就太好了。我特别想听听有关GitHub和GitLab的信息...

P.S.2。在进一步调查中,似乎存在主要的不兼容问题,导致此问题未能在许多类型的平台上正确呈现,包括Typora,GitHub和Visual Studio代码。在解决问题之前,请勿使用此功能。我不会为了讨论而删除答案,也许您可​​以分享您的意见。

P.S.3。为了进一步调查此问题,我问了以下问题here on StackOverflowhere on Reddit

P.S.4。。经过研究,我得出的结论是,目前,AsciiDoc是更好的文档选择。它具有内置的包含功能,由GitHub呈现,主要的代码编辑器(如Atom和vscode)具有实时预览的扩展。可以使用Pandoc或其他工具将现有的MarkDown代码自动进行较小的更改即可转换为AsciiDoc。

P.S.5。。另一种具有内置include功能的轻量级标记语言是reStructuredText。按照标准,它带有.. include:: inclusion.txt 语法。还有ReText editor个具有实时预览功能。

答案 10 :(得分:2)

我知道这是一个老问题,但是我没有看到任何有关此效果的答案:本质上,如果您使用markdown和pandoc将文件转换为pdf,则在页面顶部的yaml数据中,您可以包含以下内容:

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

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

# Section

Blah blah

## Section 

Blah blah

由于pandoc使用乳胶转换所有文档,因此header-includes部分将调用pdfpages包。然后,当您包含\includepdf{/path/to/pdf/document.pdf}时,它将插入该文档中包含的所有内容。此外,您可以通过这种方式包含多个pdf文件。

作为一项有趣的奖励,这仅仅是因为如果您想包括markdown以外的文件(例如乳胶文件),我经常会使用markdown。我已经对此answer进行了一些修改。假设您有一个markdown文件markdown1.md:

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

还有两个附加的乳胶文件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,例如

在终端pandoc markdown1.md -o markdown1.pdf

您的最终文档将如下所示:

含义全满的

谈话头

部分

深度。

部分

剃刀的边缘。

部分

欢呼

部分

Balh Balh

答案 11 :(得分:1)

使用markdown-itjQuery的另一种基于HTML的客户端解决方案。下面是一个小的HTML包装程序作为主文档,它支持markdown文件的无限包含,但不嵌套包含。 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>

答案 12 :(得分:0)

我在Mac OS X上使用Marked 2.它支持以下语法来包含其他文件。

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

可悲的是,你不能将它提供给pandoc,因为它不懂语法。但是,编写脚本以去除语法以构造pandoc命令行很容易。

答案 13 :(得分:0)

vscode-markdown-preview-enhanced中支持@import语法

https://github.com/shd101wyy/vscode-markdown-preview-enhanced

这可能意味着它是基础工具Mume的一部分

https://github.com/shd101wyy/mume

和其他基于Mume构建的工具

https://github.com/gabyx/TechnicalMarkdown

答案 14 :(得分:-3)

恕我直言,您可以通过连接输入* .md文件来获得结果,例如:

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md