降价并包含多个文件


197

是否有任何markdown分支可以让您引用其他文件,例如包含文件?具体来说,我想创建一个单独的markdown文件,该文件包含我经常但并非总是调用的链接(称为B.md),然后在我正在编写的md文件中引用引用链接(A.md)时,可以从其他文件(B.md)而不是从当前文件(A.md)的末尾提取链接。


1
如果您的问题是与github相关的markdown,您可以在这里
Adi Prasetyo

3
Markdown的经验法则是,“ Can Markdown ...”的答案通常是“实际上,普遍或不容易”。
Michael Scheper's

4
github.com/jgm/pandoc/issues/553talk.commonmark.org/t/上的commonmark论坛上,有一个关于如何最好地与Pandoc进行公开讨论的话题
naught101 '18

Answers:


217

最简洁的答案是不。长答案是肯定的。:-)

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文档说,它补充说,合并这样的文件之间的空行,但这并没有对我的工作没有空行。


6
事实证明这对我来说是非常有用的帖子!谢谢亚伦。拥有/ chapters目录,一个构建/合并章节的脚本,然后包含以下步骤的顶级包装脚本似乎是一种常见用例:--include-before-body $(include_dir)/ merged_chapters .html。我将采用这种方法来获得一些组织上的利益。
罗布

1
使用pandoc的另一个优势是它支持多种输出:不仅可以生成HTML,还可以生成从docx到LaTeX到ePUB的所有内容。
克里斯·克里乔

pandoc *.md > markdown_book.html结果pandoc: *.md: openfile: invalid argument (Invalid argument)-它似乎不支持您指定的语法。
杰森·杨

它正在我的系统上运行。我在GitHub上创建了一个示例存储库,因此您可以对我使用的所有文件进行尝试。
亚伦·梅西2014年

您可以通过添加一些适当的CSS来正确对齐图像,无论如何这应该是您应该做的事情。
naught101

50

我只想提一下,您可以使用cat命令在将输入文件进行管道连接之前将其串联起来,markdown_py其效果pandoc与传入多个输入文件的效果相同。

cat *.md | markdown_py > youroutputname.html

与Mac上的Markdown的Python版本的pandoc示例几乎相同。


1
@ tprk77:除了亚伦的回答清楚表明了cat命令在这里是多余的
。–

1
使用cat *.md隐含不灵活的文件命名约定。此约定不仅会禁止递归包含,对于较大的文档项目,将新文件添加到组合中将很痛苦。您将不得不做很多计数和重命名。自2010
。– ninegrid 2014年

@ninegrid虽然MarkdownPP看起来非常有用,但从查看您在答案中引用的源回购来看,在我看来(a)MarkdownPP仅是John Reese的项目;(b)它根本不是“降价计划”(各种口味中的任何一种)的一部分;(c)MarkdownPP具体输出GFM。正确?就像我说的那样,它看起来很有趣并且很有帮助,但是您在这里的评论听起来像是每个Markdown实现都应该附带的标准Markdown功能。但是从回购来看,情况似乎完全相反。
FeRD

无法将MD表转换为HTML表。
james.garriss

30

您实际上可以使用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.mdppMarkdownPP库的预处理器的功能博览会适合于较大的文件的项目。


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鲜为人知,但在涉及此类通用包含需求时,它确实是一个功能强大的工具。没有足够的文档提及它可能“相当容易上瘾”。
Uriel's

现在,是一个解决方案!天才
布兰特

M4的想法和提醒+1 !有趣的是,当我看到上面的扩展名为“ md”时,我正在思考m4的想法。然后,您将包括一个示例,这很棒。我不确定这个问题是否会问我到底在追问什么,但它可能会问。无论哪种方式都谢谢你。
Pryftan

15

最近,我在Node中写了类似这样的东西markdown-include,它允许您使用C样式语法包括markdown文件,如下所示:

#include "my-file.md"

我相信这与您要提出的问题很吻合。我知道这是一个旧的,但我至少要对其进行更新。

您可以将其包含在任何所需的markdown文件中。该文件还可以具有更多包含,并且markdown-include将建立内部链接并为您完成所有工作。

您可以通过下载 npm

npm install -g markdown-include

1
这非常有帮助!谢谢!
执法机关

@leas很高兴能为您服务...我已经有好几年没有工作了,但是我一直想在某个时候恢复它。希望它能为您的目的做好。
Sethen

9

Multimarkdown本身具有此功能。它称其为文件包含

{{some_other_file.txt}}

就是全部。奇怪的名字,但在所有方框中打勾。


是否有任何免费和开放源代码编辑器来呈现此语法?我在这里已经详细询问了这个问题。如果您能帮助我,我将不胜感激。
FOAD

1
@Foad:恐怕我是vim用户,并且不知道任何此类编辑器。我在您的reddit Q上看到您发现Asciidoc及其各种编辑器都支持此功能。我不知道-谢谢。
eff

很高兴这很有用。但是vim是否具有MultiMarkDown的实时预览?您是否愿意与其他人共享设置和点文件?
FOAD

1
没有实时预览,我不是那种人。;)我完全使用markdown的主要原因是因为它的目的是在未经处理的情况下易于阅读,因此我真的不太介意预览(尽管我了解其他人为什么这样做)。在这种情况下,我唯一感兴趣的是语法突出显示,默认的markdown语法突出显示对我来说足够好了。抱歉没有更多帮助。
eff

1
看起来这可能很有趣,尽管至少出于我的(微薄)目的,我没有理由在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除非对文件编号,否则使用这些方法无法完成。
伊夫史密斯

您能否说明这些步骤?似乎是如此强大!我想知道是否有可能将其缩小以进行其他转换,例如.pdf和.tex。
nilon

6

实际上,您可以直接在中使用\input{filename}\include{filename}乳胶命令Pandoc,因为它几乎支持全部htmllatex语法。

但是请注意,包含的文件将被视为latex文件。但是您可以轻松地markdownlatex其编译为Pandox


6

Asciidoc(http://www.methods.co.nz/asciidoc/)实际上是类固醇的降价促销。总体而言,Asciidoc和Markdown看起来非常相似,并且切换起来也很容易。Asciidoc相对于markdown的一个巨大好处是它已经支持包括,其他Asciidoc文件以及您喜欢的任何格式的文件。您甚至可以部分地将基于行号或标签的文件包含在包含的文件中。

编写文档时,包含其他文件确实可以节省生命。

例如,您可以拥有一个包含以下内容的asciidoc文件:

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

并保持您的样本在 script.pl

而且我敢肯定,您会感到奇怪,是的,Github也支持asciidoc。


这里似乎有一个很好的承诺,但是没有给出完整的答案。是否可以说明如何将多文件文档转换为一个文档?
nilon

到目前为止,这是此页面上的最佳解决方案。我得出了这个结论,并在Reddit上解决了这个问题。AsciiDoc内置了include,由GitHub呈现。Atom和vscode都有不错的实时预览插件。我不知道为什么AsciiDoc还不是行业标准!
FOAD

4

我认为我们最好采用新的文件包含语法(这样就不会弄乱代码块,我认为C样式包含是完全错误的),并且我在Perl中编写了一个小工具,命名为cat.pl,因为它的工作方式类似于catcat a.txt b.txt c.txt将合并三个文件),但它会合并文件的深度,而不是宽度。如何使用?

$ perl cat.pl <your file>

详细的语法为:

  • 递归包含文件: @include <-=path=
  • 只包括一个: %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>标签中,以确保将其呈现为markdown。您可以添加很多其他样式属性。我喜欢的是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。具有内置include功能的另一种轻量级标记语言是reStructuredText。它带有.. include:: inclusion.txt 标准语法。还有带有实时预览的ReText编辑器


1

我知道这是一个老问题,但是我没有看到任何有关此效果的答案:本质上,如果您正在使用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。我已经对该答案做了一些修改。假设您有一个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

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

有意义的东西

会说话的头

部分

深度。

部分

剃刀刀刃。

部分

h

部分

巴尔巴尔


0

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

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

可悲的是,您无法将其提供给pandoc,因为它不了解语法。但是,编写脚本以剥离语法以构建pandoc命令行非常容易。


7
您是否会碰巧拥有该脚本,而不仅仅是说这很简单?:)
toobulkeh

0

另一个使用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>

-5

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

$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.