是否有任何markdown分支可以让您引用其他文件,例如包含文件?具体来说,我想创建一个单独的markdown文件,该文件包含我经常但并非总是调用的链接(称为B.md),然后在我正在编写的md文件中引用引用链接(A.md)时,可以从其他文件(B.md)而不是从当前文件(A.md)的末尾提取链接。
是否有任何markdown分支可以让您引用其他文件,例如包含文件?具体来说,我想创建一个单独的markdown文件,该文件包含我经常但并非总是调用的链接(称为B.md),然后在我正在编写的md文件中引用引用链接(A.md)时,可以从其他文件(B.md)而不是从当前文件(A.md)的末尾提取链接。
Answers:
最简洁的答案是不。长答案是肯定的。:-)
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文档说,它补充说,合并这样的文件之间的空行,但这并没有对我的工作没有空行。
pandoc *.md > markdown_book.html
结果pandoc: *.md: openfile: invalid argument (Invalid argument)
-它似乎不支持您指定的语法。
我只想提一下,您可以使用cat
命令在将输入文件进行管道连接之前将其串联起来,markdown_py
其效果pandoc
与传入多个输入文件的效果相同。
cat *.md | markdown_py > youroutputname.html
与Mac上的Markdown的Python版本的pandoc示例几乎相同。
cat *.md
隐含不灵活的文件命名约定。此约定不仅会禁止递归包含,对于较大的文档项目,将新文件添加到组合中将很痛苦。您将不得不做很多计数和重命名。自2010
您实际上可以使用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库的预处理器的功能博览会适合于较大的文件的项目。
我的解决方案是使用m4。大多数平台都支持它,并且包含在binutils软件包中。
首先changequote()
在文件中包含一个宏,以将引号字符更改为您喜欢的字符(默认为'')。处理文件后,宏将被删除。
changequote(`{{', `}}')
include({{other_file}})
在命令行上:
m4 -I./dir_containing_other_file/ input.md > _tmp.md
pandoc -o output.html _tmp.md
m4
鲜为人知,但在涉及此类通用包含需求时,它确实是一个功能强大的工具。没有足够的文档提及它可能“相当容易上瘾”。
最近,我在Node中写了类似这样的东西markdown-include,它允许您使用C样式语法包括markdown文件,如下所示:
#include "my-file.md"
我相信这与您要提出的问题很吻合。我知道这是一个旧的,但我至少要对其进行更新。
您可以将其包含在任何所需的markdown文件中。该文件还可以具有更多包含,并且markdown-include将建立内部链接并为您完成所有工作。
您可以通过下载 npm
npm install -g markdown-include
Asciidoc(http://www.methods.co.nz/asciidoc/)实际上是类固醇的降价促销。总体而言,Asciidoc和Markdown看起来非常相似,并且切换起来也很容易。Asciidoc相对于markdown的一个巨大好处是它已经支持包括,其他Asciidoc文件以及您喜欢的任何格式的文件。您甚至可以部分地将基于行号或标签的文件包含在包含的文件中。
编写文档时,包含其他文件确实可以节省生命。
例如,您可以拥有一个包含以下内容的asciidoc文件:
// [source,perl]
// ----
// include::script.pl[]
// ----
并保持您的样本在 script.pl
而且我敢肯定,您会感到奇怪,是的,Github也支持asciidoc。
我认为我们最好采用新的文件包含语法(这样就不会弄乱代码块,我认为C样式包含是完全错误的),并且我在Perl中编写了一个小工具,命名为cat.pl
,因为它的工作方式类似于cat
(cat 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
@
是,用于引用pandoc-citeproc
(例如“ @Darwin1859
”)。
实际上,令我惊讶的是,该页面中没有人提供任何HTML解决方案。据我了解,MarkDown文件可以包含大部分(如果不是全部)HTML标签。因此,请按照下列步骤操作:
从这里开始:将MarkDown文件放入<span style="display:block"> ... </span>
标签中,以确保将其呈现为markdown。您可以添加很多其他样式属性。我喜欢的是text-align:justify
。
从这里开始:使用<iframe src="/path/to/file.md" seamless></iframe>
PS1。此解决方案不适用于所有MarkDown引擎/渲染器。例如,Typora确实正确渲染了文件,但Visual Studio Code却没有。如果其他人可以与其他平台分享他们的经验,那就太好了。我特别想听听有关GitHub和GitLab的信息...
PS2。在进一步调查中,似乎存在主要的不兼容问题,导致此问题无法在许多平台上正确呈现,包括Typora,GitHub和Visual Studio代码。在解决问题之前,请勿使用此功能。我不会仅仅为了讨论而删除答案,也许您可以分享您的意见。
PS3。为了进一步研究此问题,我在StackOverflow和Reddit 上提出了这个问题。
PS4。经过研究后,我得出的结论是,目前AsciiDoc是更好的文档选择。它具有内置的包含功能,由GitHub呈现,主要的代码编辑器(如Atom和vscode)具有实时预览的扩展。可以使用Pandoc或其他工具将现有的MarkDown代码自动进行较小的更改即可转换为AsciiDoc。
PS5。具有内置include功能的另一种轻量级标记语言是reStructuredText
。它带有.. include:: inclusion.txt
标准语法。还有带有实时预览的ReText编辑器。
我知道这是一个老问题,但是我没有看到任何有关此效果的答案:本质上,如果您正在使用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
巴尔巴尔
另一个使用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>