如何在Markdown中链接到同一文档的一部分?


538

我正在编写一个大型Markdown文档,并希望在开始时放置一个目录列表,该目录将提供指向文档中各个位置的链接。我怎样才能做到这一点?

我尝试使用

[a link](# MyTitle)

MyTitle文档中的标题在哪里,但这不起作用。


1
链接到stackoverflow.com/questions/12204257/…以获取R Markdown(Rmd)。
EtienneLow-Décarie2014年

1
您遇到的唯一问题是MyTitle不应该是标题,而应该是该文档中锚点的名称(例如<a name="MyTitle"> </a>)。然后,您将可以在文档中的任何位置使用原始链接。
userfuser 2015年

7
接受的答案实际上与大多数人无关。而是查看第二个答案:stackoverflow.com/a/16426829/398630
BrainSlugs83

Answers:


37

pandoc中,如果--toc在生成html时使用该选项,则将生成目录,其中包含指向各节的链接,并从节标题返回该目录。它与pandoc编写的其他格式类似,例如LaTeX,rtf,rst等。因此,使用命令

pandoc --toc happiness.txt -o happiness.html

降价的这一点:

% True Happiness

Introduction
------------

Many have posed the question of true happiness.  In this blog post we propose to
solve it.

First Attempts
--------------

The earliest attempts at attaining true happiness of course aimed at pleasure. 
Soon, though, the downside of pleasure was revealed.

会将其作为html的主体:

<h1 class="title">
    True Happiness
</h1>
<div id="TOC">
    <ul>
        <li>
            <a href="#introduction">Introduction</a>
        </li>
        <li>
            <a href="#first-attempts">First Attempts</a>
        </li>
    </ul>
</div>
<div id="introduction">
    <h2>
        <a href="#TOC">Introduction</a>
    </h2>
    <p>
        Many have posed the question of true happiness. In this blog post we propose to solve it.
    </p>
</div>
<div id="first-attempts">
    <h2>
        <a href="#TOC">First Attempts</a>
    </h2>
    <p>
        The earliest attempts at attaining true happiness of course aimed at pleasure. Soon, though, the downside of pleasure was revealed.
    </p>
</div>

1
谢谢,这正是我所需要的。我当时使用Textmate将Markdown转换为HTML,将切换到pandoc。
recipriversexclusion

1
您可以在Github上尝试演示Pandoc tmbundle(也有emacs pandoc-mode等)。tmbundle重用了MultiMarkdown特定的语法荧光笔,因此(很少)有很多奇怪之处。另外,很多相关的脚本都是高度定制的-例如上下文,而不是LaTeX等-但想法是用户可以根据需要更改它们,我发现这很简单。应该将它git clone-ed到最低或最外面的tmbundle目录中,~/Library/Application\ Support/TextMate/Bundles以简化集成。
适用时间:2010年

2
它会增加-1ID的第一次重复,-2第二次等等
适用的

6
我发现我必须在pandoc命令中添加--standalone选项,才能使其在输出中实际输出目录本身。如果没有该开关,它将使标头变成指向#toc命名锚的链接,但实际上不会输出命名锚和like本身的列表。
邓肯·洛克

4
这可能会回答OP的问题,但是对于我们其他想知道如何在markdown中进行操作的人来说,这是毫无用处的。-下一个答案更有用。
BrainSlugs83

931

Github会自动从标题中解析出定位标记。因此,您可以执行以下操作:

[Custom foo description](#foo)

# Foo

在上述情况下,Foo标头生成了一个锚标签,其名称为foo

注意#对于所有标题大小,只能使用一个,#并且锚名称之间不得有空格,锚标签名称必须小写,如果使用多位数 d,则用短划线分隔

[click on this link](#my-multi-word-header)

### My Multi Word Header

更新资料

开箱用pandoc了。


54
如果标题包含多个单词,例如“ like this”,请在锚点中用连字符替换空格[just](#like-this-one)
Mogsdad '16

3
这仅适用于H1标头吗?如果链接到H2标头(即## Foo),是否还需要在链接中放置两个数字符号,即[Foo](## foo)?我无法使用您的语法或我的语法(带有额外的数字符号)。
GrayedFox

7
@GrayedFox,如果您想为ab H2标头创建链接## Foo,请尝试[这是我的Foo链接](#foo)...即:单个哈希,哈希和小写字母
Abdull

4
提示:请查看显示在Github标题旁边的锚点,以获取相应的链接,即,如果其中包含特殊字符,则会自动删除它们,并在此处显示正确的链接。
亚历山大·帕恰

2
标题有数字怎么办?#3.第三点[第三点](#3.-third.point)不起作用
Aditya

118

通过实验,我找到了一个使用的解决方案,<div…/>但一个显而易见的解决方案是将您自己的定位点放置在您喜欢的页面中,因此:

<a name="abcde">

之前

</a>

您要“链接”到的行之后。然后是一个markdown链接,例如:

[link text](#abcde)

文档中的任何位置都会带您到那里。

<div…/>解决方案插入一个“虚拟”分区只是为了添加id属性,这可能会破坏页面结构,但是该<a name="abcde"/>解决方案应该是无害的。

(PS:这可能是确定把锚你想链接到行,如下所示:

## <a name="head1">Heading One</a>

但这取决于Markdown如何对待它。我注意到,例如,堆栈溢出答案格式化程序对此感到满意!)


2
如果您这样做,则应注意div会剥离其他markdown格式,例如## headers
2rs2ts 2011年

@ user691859您能详细说明吗?也许我们可以更新答案以使其更好地工作。我看到TextMate禁止突出显示,直到缩进了div,但是从浏览器查看的已处理降价没有问题。
史蒂夫·鲍威尔

在WriteMonkey中,我发现,如果在任何文本之前加上以下<div/>几行,都会受到影响。相反,我必须将链接的文本包装在完整的div标记子句中,并且必须使用真实的HTML从头开始重新指定行为。嘘
2rs2ts 2011年

6
很好,谢谢。对于任何想知道的人,这也适用于GitHub托管并显示的Markdown文件。
Alex Dean

2
为了与HTML5向前兼容,我建议您将其替换<a name="head1"/><a id="head1"/>
13年

74

这可能是过时的线程,但是要在Github中使用markdown创建内部文档链接,请使用...
(注意:小写字母#title)

    # Contents
     - [Specification](#specification) 
     - [Dependencies Title](#dependencies-title) 

    ## Specification
    Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. 

    ## Dependencies Title
    Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. Example text blah. Example text blah. 
Example text blah. Example text blah. 

提出了一个很好的问题,所以我编辑了答案。

内部链接可以到任何标题尺寸使用进行- ,#,,## 我创建了下面......一个简单的例子 https://github.com/aogilvie/markdownLinkTest#######


在您的示例中,链接标记只有一个#,但是应该链接的标头具有两个##; 他们不应该一样吗?
卡里姆·巴格加特

3
好问题。答案是不。在#(#dependencies-title)告诉Github的降价,这是一个内在联系。后面的文本可以是任何标题大小。这是我进行的示例测试... https://github.com/aogilvie/markdownLinkTest
Ally 2014年

1
这取决于降价的味道吗?似乎在markdown编辑器中工作正常,但是当我保存为html或pdf时,id不会添加到适当的标签中。我可以在其中抛锚,这很好,但是看来您的方法更加简洁,快捷。
meteorainer 2014年

21

是的,markdown可以做到这一点,但是您需要指定名称anchor <a name='xyx'>

一个完整的例子

这将创建链接
[tasks](#tasks)

在文档的后面,您将创建命名的锚(无论其名为什么)。

<a name="tasks">
   my tasks
</a>

请注意,您也可以将其包装在标题周围。

<a name="tasks">
### Agile tasks (created by developer)
</a>

13

Pandoc手册说明了如何使用标头标识符链接到标头。我没有检查其他解析器对此的支持,但是据报道它在github上不起作用

标识符可以手动指定:

## my heading text {#mht}
Some normal text here,
including a [link to the header](#mht).

或者您可以使用自动生成的标识符(在这种情况下为#my-heading-text)。两者在Pandoc手册中都有详细说明

注意在转换为HTMLLaTexConTeXtTextileAsciiDoc时有效


9

一些额外的事情要记住,如果雅曾经得到的花哨与标题中的符号是亚希望导航到...

# What this is about


------


#### Table of Contents


- [About](#what-this-is-about)

- [&#9889; Sunopsis](#9889-tldr)

- [:gear: Grinders](#it-grinds-my-gears)

- [Attribution]


------


## &#9889; TLDR


Words for those short on time or attention.


___


## It Grinds my :gear:s


Here _`:gear:`_ is not something like &#9881; or &#9965;


___


## &#9956; Attribution


Probably to much time at a keyboard



[Attribution]: #9956-attribution

...喜欢的东西#;&,和:内标题字符串通常被忽略/条纹,而不是逃出来的,一个也可以使用引用链接样式做出快速的使用更方便。

笔记

GitHub支持:word:提交,自述文件等中的语法。如果在那里感兴趣使用'em ,请参见gist(来自rxaviers)。

在现代浏览器中几乎所有其他地方都可以使用十进制或十六进制。从备忘单W3Schools的珀迪得心应手,尤其是在使用CSS ::before::after伪元素的符号是你的风格。

奖励积分?

以防万一有人想知道标题中的图像和其他链接如何解析为id...

- [Imaged](#alt-textbadge__examplehttpsexamplecom-to-somewhere)


## [![Alt Text][badge__example]](https://example.com) To Somewhere


[badge__example]:
  https://img.shields.io/badge/Left-Right-success.svg?labelColor=brown&logo=stackexchange
  "Eeak a mouse!"

注意事项

MarkDown渲染因位置而异,因此...

## methodName([options]) => <code>Promise</code>

...在GitHub上将有一个元素,id例如...

id="methodnameoptions--promise"

...其中如香草卫生将导致id的...

id="methodnameoptions-codepromisecode"

...意味着从模板写入或编译MarkDown文件要么需要针对slugifeing的一种方法,要么需要针对各种巧妙的方式(例如清除标题文本)添加配置和脚本逻辑。


9

通用解决方案

根据降价实施,这个问题似乎有不同的答案。
实际上,Markdown官方文档对此主题保持沉默。
在这种情况下,如果您需要便携式解决方案,则可以使用HTML。

在任何标题之前或在同一标题行中,使用一些HTML标记定义一个ID。
例如:<a id="Chapter1"></a>
您将在代码中看到此内容,但在呈现的文档中看不到。

完整示例:

在此处查看完整的示例(在线和可编辑)。

## Content

* [Chapter 1](#Chapter1)
* [Chapter 2](#Chapter2)

<div id="Chapter1"></div>
## Chapter 1

Some text here.  
Some text here.
Some text here.

## Chapter 2 <span id="Chapter2"><span>

Some text here.  
Some text here.
Some text here.

要测试此示例,必须在内容列表和第一章之间添加一些额外的空间,或者减小窗口高度。
另外,请勿在ID名称中使用空格。


嗯...看起来不错。试了一下,有两个问题:(1)。## Chapter 1需要在其上方有一条开放线。(2)。链接不起作用...
musicformellons

啊,在我使用的intellij markdown插件中不起作用;但确实可以在Macdown标记编辑器中使用。
musicformellons

尽管如此,仍在github上进行了测试:标头上方需要有一条开放线,但可以使用。
musicformellons

@musicformellons您可以尝试在不使用开始线的情况下尝试正确关闭span标签吗?<br><span id="Chapter1"><span>
ePi272314

是的,它有效!
musicformellons


4

Gitlab使用GitLab风味降价(GFM)

这里“所有Markdown呈现的标头都会自动获得ID”

一个可以使用鼠标进行以下操作:

  • 将鼠标移到页眉上
  • 将鼠标移到悬停选择器上,该选择器在标题的左侧变为可见
  • 使用鼠标右键单击复制并保存链接

    例如在README.md文件中,我有标题:

## series expansion formula of the Boettcher function

它给出了一个链接:

https://gitlab.com/adammajewski/parameter_external_angle/blob/master/README.md#series-expansion-formula-of-the-boettcher-function

前缀可以删除,所以这里的链接很简单

file#header

这意味着:

README.md#series-expansion-formula-of-the-boettcher-function

现在可以用作:

[series expansion formula of the Boettcher function](README.md#series-expansion-formula-of-the-boettcher-function)

一个也可以手动完成:用连字符代替空格。

现场示例在这里


1

使用kramdown似乎效果很好:

[I want this to link to foo](#foo)
....
....
{: id="foo"}
### Foo are you?

我看到有人提到

[foo][#foo]
....
#Foo

可以有效地工作,但是对于标头或带有多个单词的标头,前者可能是元素的不错选择。


1

由于在评论中提到了MultiMarkdown作为选项。

MultiMarkdown中,内部链接的语法很简单。

对于文档中的任何标题,只需提供此格式的标题名称[heading][]即可创建内部链接。

在此处阅读更多信息:MultiMarkdown-5交叉引用

交叉引用

经常需要的功能是让Markdown像处理外部链接一样容易地自动处理文档内链接。为此,我添加了将[Some Text] []解释为交叉链接的功能(如果存在名为“ Some Text”的标头)。

例如,[Metadata] []将带您到#元数据(或##元数据,###元数据,####元数据,#####元数据,######元数据中的任何一个)。

另外,您可以选择一个可选标签,以帮助消除多个标题具有相同标题的情况的歧义:

###概述[MultiMarkdownOverview] ##

这使您可以使用[MultiMarkdownOverview]专门引用本节,而不能使用另一个名为Overview的节。这适用于atx或settext样式的标头。

如果您已经使用与标头使用的相同ID定义了锚,则定义的锚优先。

除了文档中的标题外,您还可以提供图像和表格的标签,这些标签也可以用作交叉引用。


0

这个<a name="">技巧还有更多旋转:

<a id="a-link"></a> Title
------

#### <a id="a-link"></a> Title (when you wanna control the h{N} with #'s)

0

除了上述答案之外,

number_sections: true在YAML标头中设置选项时:

number_sections: TRUE

RMarkdown将自动为您的部分编号。

要引用这些自动编号的部分,只需将以下内容放入R Markdown文件中:

[My Section]

My Section本节的名称在哪里

无论段级别如何,这似乎都有效:

# My section

## My section

### My section

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.