【问题标题】:How to link to part of the same document in Markdown?如何在 Markdown 中链接到同一文档的一部分?
【发布时间】:2010-05-12 19:24:51
【问题描述】:

我正在编写一个大型 Markdown 文档,并想在开头放置一个目录,该目录将提供指向文档中各个位置的链接。我该怎么做?

我尝试使用:

[a link](# MyTitle)

其中MyTitle 是文档中的标题,但这不起作用。

【问题讨论】:

标签: markdown multimarkdown


【解决方案1】:

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

[Custom foo description](#foo)

# Foo

在上述情况下,Foo 标头生成了一个名为 foo 的锚标记

注意:所有标题大小只有一个## 和锚名称之间没有空格,锚标签名称必须小写,如果是多字,则用破折号分隔

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

### My Multi Word Header

更新

也可以与pandoc 一起使用。

【讨论】:

  • 如果您的标题包含多个单词“喜欢这个”,请将锚点中的空格替换为连字符[just](#like-this-one)
  • 这仅适用于 H1 标头吗?如果链接到 H2 标头(即## Foo),我是否还需要在链接中放置两个数字符号,即 [Foo](##foo)?我无法让您或我的语法正常工作(带有额外的数字符号)。
  • @GrayedFox,如果您想为 ab H2 标头 ## Foo 创建一个链接,请尝试 [this is my link to Foo](#foo) ... 即:single hash,hash和lowercase-kebab-case-name-of-header之间没有空格
  • 作为提示:查看显示在 Github 上标题旁边的锚点以获得相应的链接,即如果它包含特殊字符,它们会被自动删除并在那里显示正确的链接。
  • 标题有数字怎么办? # 3. 第三点[第三点](#3.-third.point) 不起作用
【解决方案2】:

这可能是过时的线程,但要在 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

【讨论】:

  • 在您的示例中,链接标签只有一个#,但它们应该链接的标题有两个##;他们不应该是一样的吗?
  • 好问题。答案是不。 (#dependencies-title) 中的 # 告诉 Github markdown 这是一个内部链接。后面的文本可以是任何标题大小。这是我做的一个示例测试...https://github.com/aogilvie/markdownLinkTest
  • 这取决于降价的风格吗?似乎它在降价编辑器中工作正常,但是当我保存到 html 或 pdf 时,id 不会被添加到适当的标签中。我只要在里面放一个锚就可以了,但你的方法似乎更干净、更快捷。
  • 这在 Github 的 markdown 实现中可能是正确的,但在普通 markdown 中不支持(由规范 daringfireball.net/projects/markdown/syntax#html 定义)。在该规范中,没有由标头自动创建的锚点,因此显式锚点是唯一可以保证在任何地方都可以使用的解决方案。
  • 在 Boostnote 中,它区分大小写。 - [规范](#Specification) - [依赖项标题](#Dependencies-Title)
【解决方案3】:

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

<a name="abcde">

之前

</a>

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

[link text](#abcde)

文档中的任何地方都会将您带到那里。

&lt;div…/&gt; 解决方案插入一个“虚拟”除法只是为了添加id 属性,这可能会破坏页面结构,但&lt;a name="abcde"/&gt; 解决方案应该是相当无害的。

(PS: 可以把锚点in放到你想链接的那一行,如下:

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

但这取决于 Markdown 是如何处理的。例如,我注意到 Stack Overflow 答案格式化程序对此很满意!)

【讨论】:

  • 如果你这样做,你应该知道 div 会去除其他 markdown 格式,例如## headers
  • @user691859 你能详细说明一下吗?也许我们可以更新答案以使其更好地工作。我看到 TextMate 禁止突出显示,直到我缩进了 div,但从浏览器查看处理后的 markdown 没有问题。
  • 在 WriteMonkey 中,我发现如果我在任何带有 &lt;div/&gt; 的文本之前出现以下几行都会受到影响。相反,我必须将要链接的文本包装在完整的 div 标签子句中,并且我必须使用真正的 HTML 从头开始​​重新指定行为。嘘。
  • 这很好用,谢谢。对于任何想知道的人,这也适用于 GitHub 托管和显示的 Markdown 文件。
  • 要成为forward-compatible with HTML5,我建议将&lt;a name="head1"/&gt; 替换为&lt;a id="head1"/&gt;
【解决方案4】:

是的,markdown 会这样做,但您需要指定名称锚点&lt;a name='xyx'&gt;

一个完整的例子,

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

在文档的其他地方,您创建命名的锚点(不管它叫什么)。

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

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

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

【讨论】:

  • 我试过了。它不起作用。 创建一个无处的链接
  • @KansaiRobot 它不创建链接;它创建一个可以作为链接目标的锚点。您必须编写一个链接才能访问它。您还必须命名锚点,以便您可以在链接中按名称引用它。
【解决方案5】:

pandoc 中,如果您在生成html 时使用选项--toc,则会生成一个目录,其中包含指向各节的链接,并从节标题返回目录。它与 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>

【讨论】:

  • 谢谢,这正是我所需要的。我正在使用 Textmate 将 Markdown 转换为 HTML,将切换到 pandoc。
  • 你可以试试 Github 上的demo Pandoc tmbundle(还有 emacs pandoc-mode 等) tmbundle 重用了 MultiMarkdown 特定的语法高亮,所以有一个(非常)几个怪事。此外,许多相关的脚本都是高度定制的——例如上下文,而不是 LaTeX 等——但想法是用户可以随意更改它们,我发现这很简单。它可能应该是 git clone -ed 到最低或最外层的 tmbundle 目录 ~/Library/Application\ Support/TextMate/Bundles 以简化集成。
  • 我想知道 pandoc 在两个标题相同的情况下会做什么?
  • 它将-1添加到id的第一个重复,-2添加到第二个,等等。
  • 我发现我必须在 pandoc 命令中添加 --standalone 选项才能使其在输出中实际输出目录本身。如果没有该开关,它会将标头转换为返回到 #toc 命名锚点的链接,但实际上不会输出命名锚点和类似列表本身。
【解决方案6】:

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

标识符可以手动指定:

## my heading text {#mht}

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

或者您可以使用自动生成的标识符(在本例中为 #my-heading-text)。两者在pandoc manual中都有详细解释。

注意:这在转换为 HTMLLaTexConTeXt 时有效>、TextileAsciiDoc

【讨论】:

    【解决方案7】:

    通用解决方案

    这个问题似乎根据markdown实现有不同的答案。
    事实上,官方的 Markdown 文档对这个话题并没有提及。
    在这种情况下,如果您想要一个可移植的解决方案,您可以使用 HTML。

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

    完整示例:

    查看完整示例(在线且可编辑)here

    ## 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)。链接失效了……
    • 啊,在我使用的 intellij markdown 插件中不起作用;但在 Macdown 标记编辑器中可以工作。
    • 仍然,在 github 上测试:需要在标题上方打开行,但它可以工作。
    • @musicformellons 你能尝试不使用开头行但正确关闭 span 标签吗?
      &lt;span id="Chapter1"&gt;&lt;span&gt;
    • 对我来说,在 GitHub 中,只有 &lt;div...## 部分之间的 空行 方法有效
    【解决方案8】:

    如果您在想要导航到的标题中使用符号花哨,请记住一些额外的事情......

    # 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
    

    ...标题字符串中的#;&amp;: 之类的内容通常被忽略/条带化而不是转义,也可以使用引用样式链接,使快速使用更容易。

    备注

    GitHub 支持在提交、自述文件等中使用 :word: 语法。如果对使用它们感兴趣,请参阅 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"
    

    ... vanilla 卫生会导致id of...

    id="methodnameoptions-codepromisecode"
    

    ... 意味着从模板编写或编译 MarkDown 文件要么需要针对一种 slugifeing 方式,要么为放置的各种 聪明 方式添加配置和脚本逻辑喜欢清理标题的文字。

    【讨论】:

      【解决方案9】:

      Markdown 规范中没有这样的指令。对不起。

      【讨论】:

      • 哦哦!你知道 MultiMarkdown 或 Textile 是否支持它?我正在考虑为我的所有文档迁移到 MD,但这会破坏交易。感谢您的帮助!
      • “指令”是什么意思?其他确切问题的解决方案已在此处发布。
      • markdown 规范明确允许 html 标签,所以这是允许的。它有效。至少我上次尝试过。
      【解决方案10】:

      Gitlab 使用GitLab Flavored Markdown (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)

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

      活生生的例子是here

      【讨论】:

      • 该文件是自动预期的,您不需要指定它。 [series expansion formula of the Boettcher function](#series-expansion-formula-of-the-boettcher-function) 应该可以解决问题。
      【解决方案11】:

      除了以上答案,

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

      number_sections: TRUE
      

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

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

      [My Section]

      My Section 是节的名称

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

      # My section

      ## My section

      ### My section

      【讨论】:

        【解决方案12】:

        使用 kramdown,看起来效果不错:

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

        我看到有人提到过

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

        工作效率高,但前者可能是除了标题或包含多个单词的标题之外的元素的不错选择。

        【讨论】:

          【解决方案13】:

          因为在 cmets 中提到了 MultiMarkdown 作为一个选项。

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

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

          在此处阅读更多信息:MultiMarkdown-5 Cross-references

          交叉引用

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

          例如,[元数据][] 将带您到#元数据(或任何##元数据、###元数据、####元数据、#####元数据、######元数据)。

          或者,您可以包含您选择的可选标签,以帮助消除多个标题具有相同标题的情况:

          ### 概述 [MultiMarkdownOverview] ##

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

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

          除了文档中的标题之外,您还可以为图像和表格提供标签,然后也可以将其用于交叉引用。

          【讨论】:

          • Multimarkdown 是这样的;显式锚方法 &lt;a&gt; 应该在任何 Markdown 文档中都可以使用。此外,您可以在文档正文中的任何位置放置锚点,而不仅仅是在标题、图像或表​​格中。
          【解决方案14】:

          &lt;a name=""&gt; 技巧的更多旋转:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 2010-09-17
            • 2013-01-01
            • 1970-01-01
            相关资源
            最近更新 更多