如何在Multimarkdown中链接到命名锚点?

817

我看到了许多关于MultiMarkdown支持内部链接/命名锚点的提及,但我找不到任何一个实际操作的示例。

那么,如何表示命名锚点的语法是什么,链接到它的语法与链接到其他任何URL相同(只需使用 #foo 而不是 http://....)?


如果您正在这样做以创建目录,我建议使用doctoc来自动化此过程(需要node.js)。Doctoc会生成Markdown代码,因此它将提供如何链接整个文档中的标题的示例(如@user1789493的答案所述)。 - James Owers
8个回答

840
在标准 Markdown 中,将一个锚点 <a name="abcd"></a> 放在你想要链接的位置,然后在同一页上使用 [链接文本](#abcd) 来引用它。(这里使用的是 name= 而不是 id=,原因可以参考这个答案。)
当然,远程引用可以使用 [链接文本](http://...#abcd)
只要你对源文本和目标文本有控制权,这种方法就会像梦一样顺畅。锚点甚至可以出现在标题中,如下所示:
### <a name="head1234"></a>A Heading in this SO entry!

生成:

这篇SO条目中的标题!

我们甚至可以链接到它,像这样:

and we can even [link](#head1234) to it so:

(在SO上,链接无法使用是因为锚点被删除了。)


27
我现在知道了——使用<a id="id"></a>的形式最好。请参考这个SO问题/答案 - Steve Powell
5
FYI:Github 的 Markdown 似乎希望您使用 name= 而不是 id=。 - Dieter
4
@Dieter: "name=" 在 XHTML 中已被弃用,但是我现在发现在 HTML5 中使用 "id=" 会产生副作用,因此我将在此答案中恢复使用 "name="。" - Steve Powell
3
适用于 GitHub 风格的 Markdown(Ruby Gem 可以正常呈现)。 - Kedar Mhaswade
我所有的id="xx"的标签在https://github.com上都坏了。改用name="" - 完美运作。谢谢! - undefined
显示剩余6条评论

788

如果您在Markdown文件中有标题,您可以直接在文件中链接它们。

Markdown标题:

## The Header

这将生成一个隐式ID #the-header(用连字符替换内部空格并小写)。

要导航到此ID,您可以创建以下链接:

[Link to Header](#the-header)

这相当于:

<a href="#the-header">Link to Header</a>
请注意引用名称为小写的#header

48
BitBucket似乎会在锚点id前加上"markdown-header-"。因此,如果你的标题是"## This Header ##",那么链接应该是"跳转到这个标题"。如果不确定您标题的id是什么,请使用页面检查器查看HTML值。 - Vinney Kelly
2
在 Pandoc 扩展的 Markdown 中对我无效,可能在其他地方有效。 - Zelphir Kaltstahl
23
@SaurabhM,只有在你的Markdown转HTML转换器不遵循标准时才能使用这种方法。标准不会创建锚点标签。现在,许多人不遵守标准,但你不应该期望在任何地方都能使用这种方法。 - masukomi
13
为什么我们不得不在像Markdown这样缺乏标准化且不够完善的东西上进行“标准化”呢?期待AsciiDoc能够领先。 - hmijail
2
GitHub在标题名称前添加用户内容:[Link](user-content-the-header) - Melvin Witte
显示剩余7条评论

151

这段内容摘自Multimarkdown用户指南(感谢Twitter上的@MultiMarkdown指出)

[一些文本][]将链接到名为“一些文本”的标题
例如:

### Some Text ###

您可以选择性地添加一个标签,以帮助澄清具有相同标题的多个头文件的情况:

### Overview [MultiMarkdownOverview] ##

这允许您使用[MultiMarkdownOverview]来特定地引用此部分,而不是另一个名为“Overview”的部分。 这适用于atx或settext样式的标题。

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

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


1
就此而言,它在 Emacs 的 Markdown 模式下不能工作,截至版本号 23.4.1。 - Attila Lendvai
7
Markdown不支持脚注,因此在大多数“Markdown”模式下无法使用。但是MultiMarkdown支持一些扩展功能,让写作者更容易使用。 - masukomi
13
Github似乎不支持在标题中使用标签? - andig
1
当标题中有“:”时,这在codepen.io上无法正常工作。 - Devs love ZenUML
3
那个链接是MultiMarkdown的作者撰写的文档。不确定你在codepen.io上做什么,但我相信这些文档是准确的。请注意,是MULTIMarkdown而不是Markdown。 - masukomi

141

我测试了一段时间的Github Flavored Markdown,可以总结出四条规则:

  1. 标点符号将被删除
  2. 前导空格将被删除
  3. 大写字母将被转换为小写字母
  4. 字母之间的空格将被转换为-

例如,如果您的章节命名为此:

## 1.1 Hello World

用这种方式创建一个链接:

[Link](#11-hello-world)

如果名称中有连字符怎么办?它会转换成什么?请注意,单词和连字符之间有空格。例如:- [My - Header](#my---header) # My - Header这样做正确吗? - Spencer Pollock
请参考https://dev59.com/pmgu5IYBdhLWcg3wgXS5#17820138以了解有关此样式的术语。我更喜欢“kebab-case”。 - bishop
1
所有这些转换意味着,依赖于Markdown格式化程序对标题和标题所做的任何事情都有点靠运气。在我看来,最好使用锚点(正如最受欢迎的答案建议的那样),这样链接不会因为某人对标题进行语法/拼写更正而破坏数千个内部(和外部)链接。 - Steven the Easily Amused
@SteventheEasilyAmused确实如此——以牺牲Markdown文件的纯净性为代价。根据目标/受众不同,这可能是一个好的权衡……或者不是。对于一个简单的README.md文件,可能只需要使用非Markdown查看器进行阅读,最好不要使用任何HTML——这样更容易理解。 - Gwyneth Llewelyn

52

创建内部链接(与部分相关)最好的方法是创建列表,但不要使用链接,而是使用#section#section-title(如果标题包含空格)。

Markdown

Go to section
* [Hello](#hello)  
* [Hello World](#hello-world)
* [Another section](#new-section) <-- it's called 'Another section' in this list but refers to 'New section'


## Hello
### Hello World
## New section

列表预览

Go to section
Hello           <-- [Hello](#hello)                 -- go to `Hello` section
Hello World     <-- [Hello World](#hello world)     -- go to `Hello World` section
Another section <-- [Another section](#new-section) -- go to `New section`

HTML

<p>Go to section</p>
<ul>
    <li><a href="#hello">Hello</a></li>
    <li><a href="#hello-world">Hello World</a></li>
    <li><a href="#new-section">Another section</a> &lt;– it’s called ‘Another section’ in this list but refers to ‘New section’</li>
</ul>
<h2 id="hello">Hello</h2>
<h3 id="hello-world">Hello World</h3>
<h2 id="new-section">New section</h2>

无论是 h1, h2, h3 等标题,你总是只需使用一个单独的 # 来引用它。
所有章节列表中的参考文本都应转换为小写文本,就像上面的示例一样。 链接到章节的链接应该是小写的。 否则将不起作用。这种技术对于所有Markdown变体都非常有效,也适用于MultiMarkdown。
目前,我正在使用 Pandoc 转换文档格式。它比MultiMarkdown好得多。
在此处测试Pandoc

8
正如其他评论所指出的那样,这在任何遵循标准的Markdown转HTML转换器中都行不通。在标题中创建锚点标签只会在某些转换器中发生。此外,它们并不会全部将空格转换为破折号。这一点是不可靠的,不能依赖。 - masukomi
1
我在Atom代码编辑器中使用GitHub Markdown,它具有名为“Markdown预览”的内置包。从预览模式下,我使用上下文菜单“另存为HTML...”创建html文件。 - rflw
是的,我的观点是你不能指望你的技巧在其他地方也能奏效,而且这个问题和你的回答都不是特别关于Atom中的Markdown。这个问题甚至不是关于Markdown,而是关于MultiMarkdown。 - masukomi
我正在使用这个链接方法,但它对我不起作用。没有滑动到那个部分/标题。 - Tom Kustermans
它可以工作,但你必须使用小写字母链接[章节名称](#链接到章节) - rflw
显示剩余2条评论

8
在MDCharm中是这样的:
* [Descripción](#descripcion)
* [Funcionamiento](#funcionamiento)
* [Instalación](#instalacion)
* [Configuración](#configuracion)

### Descripción {#descripcion}
### Funcionamiento {#funcionamiento}
### Instalación {#instalacion}
### Configuración {#configuracion}

4
这里是另一个选项(通过此选项,所有链接都可以放置在文件底部):
Here is an [example label].

  [example label]: #the-anchor-name-or-id "Optional title for mouse hover"

3
这是我的解决方案(源自SaraubhM的答案):
跳至:热键和标记 / 半径 / 路线向导2.0
请注意,链接中的.已更改为-,并且链接中的&已被省略。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接