是否有任何markdown fork允许您引用其他文件,例如包含文件?具体来说,我想创建一个单独的markdown文件,其链接我经常调用但不总是(调用此B.md),然后当我在md文件中通过引用链接我正在写(A.md)时,我想喜欢它从其他文件(B.md)而不是从当前文件(A.md)的末尾拉取链接。
答案 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)
答案 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标签。因此,请按照以下步骤操作:
来自here:将MarkDown文件放在<span style="display:block"> ... </span>
标记中,以确保将它们标记为markdown。您可以添加很多其他样式属性。我喜欢的是text-align:justify
。
来自here:使用<iframe src="/path/to/file.md" seamless></iframe>
P.S.1。。此解决方案不适用于所有MarkDown引擎/渲染器。例如,Typora确实正确渲染了文件,但Visual Studio Code却没有。如果其他人可以与其他平台分享他们的经验,那就太好了。我特别想听听有关GitHub和GitLab的信息...
P.S.2。在进一步调查中,似乎存在主要的不兼容问题,导致此问题未能在许多类型的平台上正确呈现,包括Typora,GitHub和Visual Studio代码。在解决问题之前,请勿使用此功能。我不会为了讨论而删除答案,也许您可以分享您的意见。
P.S.3。为了进一步调查此问题,我问了以下问题here on StackOverflow和here 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-it和jQuery的另一种基于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构建的工具
答案 14 :(得分:-3)
恕我直言,您可以通过连接输入* .md文件来获得结果,例如:
$ pandoc -s -o outputDoc.pdf inputDoc1.md inputDoc2.md outputDoc3.md