Markdown并包含多个文件

Dav*_*ina 170 markdown

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

Aar*_*sey 195

最简洁的答案是不.答案很长,是的.:-)

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
Run Code Online (Sandbox Code Playgroud)

您可以通过在同一目录中执行此命令来合并它们:

pandoc *.md > markdown_book.html
Run Code Online (Sandbox Code Playgroud)

由于pandoc将在执行翻译之前合并所有文件,因此您可以将链接包含在最后一个文件中,如下所示:

01_preface.md
02_introduction.md
03_why_markdown_is_useful.md
04_limitations_of_markdown.md
05_conclusions.md
06_links.md
Run Code Online (Sandbox Code Playgroud)

所以你的一部分01_preface.md看起来像这样:

I always wanted to write a book with [markdown][mkdnlink].
Run Code Online (Sandbox Code Playgroud)

部分你02_introduction.md可能看起来像这样:

Let's start digging into [the best text-based syntax][mkdnlink] available.
Run Code Online (Sandbox Code Playgroud)

只要您的上一个文件包含该行:

[mkdnlink]: http://daringfireball.net/projects/markdown
Run Code Online (Sandbox Code Playgroud)

...之前使用的相同命令将执行合并和转换,同时包括该链接.只需确保在该文件的开头留下一行或两行.该pandoc文档说,它补充说,合并这样的文件之间的空行,但是这并没有为我没有空行工作.

  • 这对我来说是一个非常有用的帖子!谢谢亚伦.看起来这是一个常见的用例,有一个/章节目录,一个脚本构建/合并章节,然后是一个顶级包装脚本,其中包括如下步骤: - include-before-body $(include_dir)/ merged_chapters html的.这是我将采取的方法来获得一些组织上的好处. (5认同)
  • 使用 pandoc 的另一个优点是它支持种类繁多的输出:您不仅可以生成 HTML,还可以生成从 docx 到 LaTeX 到 ePUB 的所有内容。 (2认同)
  • `pandoc *.md > markdown_book.html` 导致 `pandoc: *.md: openfile: invalid argument (Invalid argument)` - 它似乎不支持您指定的语法。 (2认同)
  • 我还在 Windows 上使用 pandocc 2.2.1 时收到“无效参数”错误。我必须明确列出这些文件:`pandoc.exe 01_preface.md 02_introduction.md 03_why_markdown_is_useful.md 04_limitations_of_markdown.md 05_conclusions.md -s -o mybook.html` (2认同)

小智 48

我只想提一下,您可以使用该cat命令连接输入文件,然后将其输入到与多个输入文件进入的markdown_py效果相同的pandoc输入文件.

cat *.md | markdown_py > youroutputname.html
Run Code Online (Sandbox Code Playgroud)

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

  • `cat *.md` 的使用意味着不灵活的文件命名约定。这个约定不仅必然禁止递归包含,对于较大的文档项目,将新文件添加到混合中也会很痛苦。您将不得不进行大量计数和重命名。自 2010 年以来,markdown 项目就为此目的提供了一个预处理器。 (2认同)

nin*_*rid 24

您实际上可以使用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
Run Code Online (Sandbox Code Playgroud)

然后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"
Run Code Online (Sandbox Code Playgroud)

要渲染您的书,您只需运行预处理器index.mdpp:

$ markdown-pp.py index.mdpp mybook.md
Run Code Online (Sandbox Code Playgroud)

不要忘记readme.mdppMarkdownPP存储库中查看适用于大型文档项目的预处理器功能的说明.

  • 回购协议中引用的“该项目不再被积极维护” (4认同)

Ben*_*ler 16

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

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

changequote(`{{', `}}')
include({{other_file}})
Run Code Online (Sandbox Code Playgroud)

在命令行上:

m4 -I./dir_containing_other_file/ input.md > _tmp.md
pandoc -o output.html _tmp.md
Run Code Online (Sandbox Code Playgroud)

  • m4鲜为人知,但是当涉及到这种通用包含需求时,它确实是一个非常强大的工具。没有足够的文档提及它可能“相当容易上瘾”。 (2认同)

Set*_*hen 14

就在最近,我在Node中写了类似这样的东西,叫做markdown-include,它允许你包含带有C风格语法的markdown文件,如下所示:

#include "my-file.md"
Run Code Online (Sandbox Code Playgroud)

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

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

你可以通过它下载 npm

npm install -g markdown-include
Run Code Online (Sandbox Code Playgroud)


小智 9

Asciidoc实际上是对类固醇的降价。总的来说,Asciidoc 和 Markdown 看起来非常相似,而且很容易切换。Asciidoc 相对于 Markdown 的一个巨大好处是它已经支持包含,对于其他 Asciidoc 文件以及您喜欢的任何格式。您甚至可以根据包含文件中的行号或标签部分包含文件。

当您编写文档时,包含其他文件确实可以挽救生命。

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

// [source,perl]
// ----
// include::script.pl[]
// ----
Run Code Online (Sandbox Code Playgroud)

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

我相信你会想知道,是的,Github 也支持 asciidoc。

  • 到目前为止,这是此页面上的最佳解决方案。我得出了这个结论并解决了这个问题[在 Reddit 上](https://www.reddit.com/r/writing/comments/b0ywcw/free_markdown_editors_with_live_preview_for/)。AsciiDoc 有内置的包含,它由 GitHub 渲染。Atom 和 vscode 都有很好的实时预览插件。我想知道为什么 AsciiDoc 还不是行业标准! (2认同)

com*_*eye 8

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

这是我在使用 vscode-markdown-preview-enhanced 处理的文档中如何使用它的示例:


[[Epigenetics]]
@import "epigenetics.md"

Run Code Online (Sandbox Code Playgroud)


eff*_*eff 7

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

{{some_other_file.txt}}
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*rer 6

includes.txt以正确的顺序使用所有文件,然后执行pandoc,如下所示:

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

奇迹般有效!

  • **好方法**。指定文件顺序是基本的,但除非你给文件编号,否则它不能用 `glob` 方法完成。 (3认同)

Foa*_*oad 6

事实上,令我感到惊讶的是,此页面中没有人提供任何 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 code。在我解决这些问题之前,请不要使用它。我不会为了讨论而删除答案,如果你可以分享你的意见。

PS3。为了进一步调查这个问题,我在 StackOverflowReddit 上提出了这个问题。

PS4。经过一番研究后,我得出的结论是,目前 AsciiDoc 是更好的文档选择。它具有内置的包含功能,由 GitHub 呈现,并且 Atom 和 vscode 等主要代码编辑器具有实时预览扩展。可以使用 Pandoc 或其他工具自动将现有 MarkDown 代码转换为 AsciiDoc,只需稍作修改。

PS5。另一种具有内置包含功能的轻量级标记语言是reStructuredText. 它带有.. include:: inclusion.txt 标准语法。还有带有实时预览功能的ReText 编辑器


red*_*c35 6

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

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

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

# Section

Blah blah

## Section 

Blah blah

Run Code Online (Sandbox Code Playgroud)

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

作为一个有趣的奖励,这只是因为我经常使用 Markdown,如果您想包含 Markdown 以外的文件,例如乳胶文件。我对这个答案做了一些修改。假设你有一个 markdown 文件 markdown1.md:

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

Run Code Online (Sandbox Code Playgroud)

还有两个附加的乳胶文件 document1,如下所示:

\section{Section}

Profundity.

\subsection{Section}

Razor's edge.
Run Code Online (Sandbox Code Playgroud)

另一个,document2.tex,看起来像这样:

\section{Section

Glah

\subsection{Section}

Balh Balh
Run Code Online (Sandbox Code Playgroud)

假设您想将 document1.tex 和 document2.tex 包含到 markdown1.md 中,则只需对 markdown1.md 执行此操作

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

\input{/path/to/document1}
\input{/path/to/document2}
Run Code Online (Sandbox Code Playgroud)

对其运行 pandoc,例如

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

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

充满意义的东西

会说话的头

部分

深刻性。

部分

剃刀刀刃。

部分

格拉

部分

巴尔赫巴尔赫


Wun*_*ugh 5

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

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


dvo*_*tzx 5

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

\n\n
$ perl cat.pl <your file>\n
Run Code Online (Sandbox Code Playgroud)\n\n

详细语法为:

\n\n
    \n
  • 递归包含文件:@include <-=path=
  • \n
  • 只需包括一个:%include <-=path=
  • \n
\n\n

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

\n\n

例子:

\n\n

a.txt:

\n\n
a.txt\n\n    a <- b\n\n    @include <-=b.txt=\n\na.end\n
Run Code Online (Sandbox Code Playgroud)\n\n

b.txt:

\n\n
b.txt\n\n    b <- a\n\n    @include <-=a.txt=\n\nb.end\n
Run Code Online (Sandbox Code Playgroud)\n\n

perl cat.pl a.txt > c.txt,c.txt:

\n\n
a.txt\n\n    a <- b\n\n    b.txt\n\n        b <- a\n\n        a.txt\n\n            a <- b\n\n            @include <-=b.txt= (note\xef\xbc\x9awon\'t include, because it will lead to infinite loop.)\n\n        a.end\n\n    b.end\n\na.end\n
Run Code Online (Sandbox Code Playgroud)\n\n

更多示例请参见https://github.com/district10/cat/blob/master/tutorial_cat.pl_.md

\n\n

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

\n