如何链接到 Multimarkdown 中的命名锚点?
Posted
技术标签:
【中文标题】如何链接到 Multimarkdown 中的命名锚点?【英文标题】:How to link to a named anchor in Multimarkdown? 【发布时间】:2011-10-05 10:39:07 【问题描述】:我曾多次提到 MultiMarkdown 对内部链接/命名锚点的支持,但我无法找到如何实际执行此操作的单个示例。
那么,表示命名锚的语法是什么,链接到它的语法与链接到任何其他 URL 的语法是什么(仅使用 #foo 而不是 http://....
)?
【问题讨论】:
如果您这样做是为了创建目录,我建议您使用 doctoc 自动执行此操作(需要 node.js)。 Doctoc 生成降价代码,因此它将提供一个示例,说明如何链接到整个文档的标题(如@user1789493 的回答中所述)。 Cross-reference (named anchor) in markdown的可能重复 【参考方案1】:在标准 Markdown 中,将锚点 <a name="abcd"></a>
放置在您要链接的位置,并通过 [link text](#abcd)
在同一页面上引用它。
(这里使用name=
而不是id=
,原因在this answer中解释。)
远程引用当然可以使用[link text](http://...#abcd)
。
只要您可以控制源文本和目标文本,这就像做梦一样。锚点甚至可以出现在标题中,因此:
### <a name="head1234"></a>A Heading in this SO entry!
产生:
此 SO 条目中的标题!
我们甚至可以这样链接到它:
and we can even [link](#head1234) to it so:
(在 SO 上,链接不起作用,因为锚点已被剥离。)
【讨论】:
@jj1bdx 我现在这样做 --<a id="id"></a>
形式是最好的。见this SO question/answer。
很好的补充史蒂夫。除了关于 MultiMarkdown 的问题外,我会将其标记为答案。显然,人们的投票表明这是一个有用的补充。所以,谢谢。
仅供参考:Github markdown 似乎希望您使用 name= 而不是 id。
@Dieter: name=
在 Xhtml 中已弃用,但现在我发现 id=
在 HTML5 中有副作用,因此我在此答案中恢复为 name=
。
在 github-flavored-markdown 上工作(ruby gem 按预期呈现)【参考方案2】:
如果markdown文件中有header,可以直接在文件中链接。
Markdown 标头:
## The Header
这将生成一个隐式 id #the-header
(将内部空格替换为连字符并变为小写)。
要导航到此 ID,您可以创建如下链接:
[Link to Header](#the-header)
这相当于:
<a href="#the-header">Link to Header</a>
请注意引用的名称是小写的#header
。
【讨论】:
BitBucket 似乎在锚点 ID 前加上“markdown-header-”。所以如果你的标题是## This Header ##
,那么链接就是[To This Header](#markdown-header-this-header)
。如果您不确定标题的 id 是什么,请使用页面检查器查看 HTML 值。
在 Pandoc 扩展降价中对我不起作用,可能在其他地方起作用。
@SaurabhM 这仅在您的降价到 html 转换器不符合标准时才有效。该标准不创建锚标签。现在,许多人不遵守,但你不应该期望这在任何地方都可以工作。
为什么哦,为什么我们必须标准化 像 standard-less 和半生不熟的 Markdown。等不及 AsciiDoc 带头了。
GitHub 在标头名称前添加用户内容:[Link](user-content-the-header)
【参考方案3】:
取自Multimarkdown Users Guide(感谢 Twitter 上的@MultiMarkdown 指出)
[Some Text][]
将链接到名为“Some Text”的标题
例如
### Some Text ###
您选择的可选标签有助于消除多个标题具有相同标题的情况:
### Overview [MultiMarkdownOverview] ##
这允许您使用 [MultiMarkdownOverview] 来专门引用此部分,而不是另一个名为 Overview 的部分。这适用于 atx 或 settext 样式的标题。
如果您已经使用与标头相同的 id 定义了锚点,则定义的锚点优先。
除了文档中的标题之外,您还可以为图像和表格提供标签,然后它们也可以用于交叉引用。
【讨论】:
FWIW,自 23.4.1 起,它不适用于 emacs 的降价模式。 Markdown 不支持脚注。因此,它不适用于大多数“降价”模式。然而,MultiMarkdown 支持许多扩展,使作家的生活更轻松。 Github 似乎不支持标题中的标签? 当标头中有 ':' 时,这不起作用(至少在 codepen.io 上)。 该链接是编写 MultiMarkdown 的人的文档。不确定您在 codepen.io 中做什么,但我相信文档是准确的。请记住 MULTIMarkdown 不是 Markdown。【参考方案4】:我测试了Github Flavored Markdown一段时间,可以总结出四个规则:
-
标点符号将被删除
前导空格将被删除
大写将转换为小写
字母之间的空格将被转换为
-
例如,如果您的部分命名为:
## 1.1 Hello World
以这种方式创建指向它的链接:
[Link](#11-hello-world)
【讨论】:
如果名称中有连字符怎么办?它转换成什么?请注意,单词和连字符之间有空格。例如:``` - [My - Header](#my---header) # My - Header ``` 这样对吗? ***.com/a/17820138/2908724 了解这种风格的术语。我更喜欢“烤肉串”。 所有这些转换意味着依赖 Markdown 格式化程序对标题和标题所做的任何事情都是一个废话。更好的是,恕我直言,使用锚点(正如最受欢迎的答案所建议的那样),这样链接就不会中断,因为有人对标题进行语法/拼写更正并破坏了数以千计的内部(和外部)链接。 @SteventheEasilyAmused 确实——以使用 HTML 污染 Markdown 文件为代价。根据目标/受众,这可能是一个很好的权衡……或者不是。对于一个简单的README.md
,可以用非 Markdown 查看器简单地阅读,最好关闭所有 HTML —— 这样更容易理解。【参考方案5】:
创建内部链接(与部分相关)的最佳方法是创建列表,但如果标题包含空格,请使用 #section
或 #section-title
代替链接。
降价
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> <– 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 好多了。Test Pandoc here
【讨论】:
如此处其他 cmets 所述。这在任何真正遵循标准的 markdown -> html 转换器中都不起作用。在标题中创建锚标记只发生在某些转换器中。此外,他们不会将所有空格都转换为破折号。这不能指望。 我在 Atom 代码编辑器中使用 GitHub Markdown,它有一个名为“Markdown Preview”的内置包。在预览模式下,我使用上下文菜单“另存为 HTML ...”创建了一个 html 文件。 是的,我的观点是,您不能指望您的技术在其他任何地方都能发挥作用,而且无论是问题还是您的答案都不是专门针对 Atom 中的降价的。这个问题甚至不是关于 Markdown,而是关于 MultiMarkdown。 我正在使用这种链接方法,但它对我不起作用。不滑动到该部分/该标题。 请注意区分大小写。如果您定义## Hello
,则应将其称为 [Whatever you want](#Hello)
【参考方案6】:
在 mdcharm 中是这样的:
* [Descripción](#descripcion)
* [Funcionamiento](#funcionamiento)
* [Instalación](#instalacion)
* [Configuración](#configuracion)
### Descripción #descripcion
### Funcionamiento #funcionamiento
### Instalación #instalacion
### Configuración #configuracion
【讨论】:
【参考方案7】:这是我的解决方案(来自SaraubhM
的回答)
**Jump To**: [Hotkeys & Markers](#hotkeys-markers) / [Radii](#radii) / [Route Wizard 2.0](#route-wizard-2-0)
这给了你:
跳转到:热键和标记/半径/路线向导 2.0
请注意从 和
.
到-
的更改以及链接中&
的丢失。
【讨论】:
【参考方案8】:另一种选择(您可以将所有链接放在文件底部):
Here is an [example label].
[example label]: #the-anchor-name-or-id "Optional title for mouse hover"
【讨论】:
以上是关于如何链接到 Multimarkdown 中的命名锚点?的主要内容,如果未能解决你的问题,请参考以下文章