ChatGPT解决这个技术问题 Extra ChatGPT

How to link to part of the same document in Markdown?

I am writing a large Markdown document and would like to place a table of contents of sorts at the beginning that will provide links to various locations in the document. How can I do this?

I tried using:

[a link](# MyTitle)

where MyTitle is a title within the document but this didn't work.

Link to stackoverflow.com/questions/12204257/… for R Markdown (Rmd).
The only problem you had is that MyTitle should not be a title, but a name of an anchor in that document (like ). Then you'd be able to use your original linking, anywhere in the doc.
The accepted answer is not actually relevant for most folks. Instead see the second answer down: stackoverflow.com/a/16426829/398630

N
NearHuscarl

Github automatically parses anchor tags out of your headers. So you can do the following:

[Custom foo description](#foo)

# Foo

In the above case, the Foo header has generated an anchor tag with the name foo

Note: just one # for all heading sizes, no space between # and anchor name, anchor tag names must be lowercase, and delimited by dashes if multi-word.

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

### My Multi Word Header

Update

Works out of the box with pandoc too.


If your header contains multiple words, "Like this one", replace spaces with hyphens in the anchor [just](#like-this-one).
Does this only work for H1 headers? If linking to a H2 header (i.e. ## Foo), do I also need to put two number signs in the link, i.e. [Foo](##foo)? I cannot get your syntax or mine to work (with the extra number sign).
@GrayedFox, if you want to create a link for ab H2 header ## Foo, try [this is my link to Foo](#foo) ... that is: single hash, no space between hash and lowercase-kebab-case-name-of-header
As a tip: check out the anchor that is displayed next to your header on Github to obtain the respective link, i.e. if it contains special characters, they are automatically removed and the correct link is shown there.
What about when the headings have number ? # 3. Third point [Third point](#3.-third.point) doesn't work
J
Jaroslav Bezděk

This may be out-of-date thread but to create inner document links in markdown in Github use... (NOTE: lowercase #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. 

A good question was made so I have edited my answer;

An inner link can be made to any title size using - #, ##, ###, #### I created a quick example below... https://github.com/aogilvie/markdownLinkTest


In your example, the link tags only have one #, but the headers that they are supposed to link to have two ##; shouldn't they be the same?
Good question. The answer is no. the # in (#dependencies-title) tells Github markdown this is an inner link. The text that follows can be any title size. Here is an example test I made...https://github.com/aogilvie/markdownLinkTest
Does that depend on the flavor of markdown? It seems like it works fine in the markdown editor, but when I save to html or pdf the ids dont get added to the appropriate tags. I'd be fine just dumping an anchor in there, but it seems like your method is so much cleaner and faster.
This may be correct in Github’s markdown implementation but it is not supported in plain markdown (as defined by the specification daringfireball.net/projects/markdown/syntax#html). In that spec there is no anchor created automatically by a header so the explicit anchor is the only guaranteed solution that will work everywhere.
In Boostnote, it's case sensitive. - [Specification](#Specification) - [Dependencies Title](#Dependencies-Title)
P
Philippe Fanaro

Experimenting, I found a solution using <div…/> but an obvious solution is to place your own anchor point in the page wherever you like, thus:

<a name="abcde">

before and

</a>

after the line you want to "link" to. Then a markdown link like:

[link text](#abcde)

anywhere in the document takes you there.

The <div…/> solution inserts a "dummy" division just to add the id property, and this is potentially disruptive to the page structure, but the <a name="abcde"/> solution ought to be quite innocuous.

(PS: It might be OK to put the anchor in the line you wish to link to, as follows:

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

but this depends on how Markdown treats this. I note, for example, the Stack Overflow answer formatter is happy with this!)


If you do this you should be aware that the div strips other markdown formatting, such as ## headers.
@user691859 Can you elaborate? Perhaps we can update an answer to make it work better. I saw TextMate suppress highlighting, until I indented the div, but no problem with the processed markdown viewed from a browser.
In WriteMonkey I found that if I precede any text with the <div/> several lines below are affected. Instead I have to wrap the text I am linking in a full div tag clause and I have to RE-SPECIFY the behavior from scratch using real HTML. Boo.
This works well, thanks. For anyone wondering, this also works with GitHub-hosted-and-displayed Markdown files.
To be forward-compatible with HTML5, I would like to recommend replacing <a name="head1"/> with <a id="head1"/>.
S
Steve Powell

yes, markdown does do this but you need to specify the name anchor <a name='xyx'>.

a full example,

this creates the link
[tasks](#tasks)

elsewhere in the document, you create the named anchor (whatever it is called).

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

note that you could also wrap it around the header too.

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

M
Mario Petrovic

In pandoc, if you use the option --toc in producing html, a table of contents will be produced with links to the sections, and back to the table of contents from the section headings. It is similar with the other formats pandoc writes, like LaTeX, rtf, rst, etc. So with the command

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

this bit of markdown:

% 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.

will yield this as the body of the 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>

Thanks, this was exactly what I needed. I was using Textmate to convert Markdown to HTML, will switch to pandoc.
You might give the demo Pandoc tmbundle up on Github a try (there's also emacs pandoc-mode, etc.) The tmbundle re-uses the MultiMarkdown-specific syntax highlighter, so there are a (very) few oddities. Also, a lot of the associated scripts are highly customized -- e.g. Context, not LaTeX etc. -- but the idea is that the users will alter them as they please, which I found pretty simple. It should probably be git clone -ed into the lowest or outermost tmbundle directory, ~/Library/Application\ Support/TextMate/Bundles to simplify integration.
I wonder what pandoc does in the case of two headings with the same name?
It adds -1 to the first repetition of the id, -2 to the second, etc.
I found that I had to add the --standalone option to the pandoc command to get it to actually output the table of contents itself in the output. Without that switch, it would make the headers into links back to the #toc named anchor, but not actually output the named anchor and list of like itself.
h
hoijui

The pandoc manual explains how to link to your headers, using their identifier. I did not check support of this by other parsers, but it was reported that it does not work on github.

The identifier can be specified manually:

## my heading text {#mht}

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

or you can use the auto-generated identifier (in this case #my-heading-text). Both are explained in detail in the pandoc manual.

NOTE: This only works when converting to HTML, LaTex, ConTeXt, Textile or AsciiDoc.


e
ePi272314

Universal solutions

This question seems to have a different answer according to the markdown implementation. In fact, the official Markdown documentation is silent on this topic. In such cases, and if you want a portable solution, you could use HTML.

Before any header, or in the same header line, define an ID using some HTML tag.
For example: <a id="Chapter1"></a>
You will see this in your code but not in the rendered document.

Full example:

See a full example (online and editable) 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.

To test this example, you must add some extra space between the content list and the first chapter or reduce the window height. Also, do not use spaces in the name of the ids.


Uh..., seemed nice. Tried it, two problems: (1). ## Chapter 1 needs an open line above it. (2). The link does not work...
Ah, it doesn't work in intellij markdown plugin I used; but DOES work in Macdown markup editor.
Still, tested on github: open line above the header is required, but it works.
@musicformellons can you please try without the opening line but properly closing the span tag?<br> <span id="Chapter1"><span>
For me in GitHub works only the approach with the empty line between <div... and the section ##
S
S0AndS0

Some additional things to keep in mind if ya ever get fancy with symbols within headings that ya want to navigate to...

# 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

... things like #, ;, &, and : within heading strings are generally are ignored/striped instead of escaped, and one can also use citation style links to make quick use easier.

Notes GitHub supports the :word: syntax in commits, readme files, etc. see gist(from rxaviers) if using'em is of interest there. And for just about everywhere else decimal or hexadecimal can be used for modern browsers; the cheat-sheet from w3schools is purdy handy, especially if using CSS ::before or ::after pseudo-elements with symbols is more your style.

Bonus Points?

Just in case someone was wondering how images and other links within a heading is parsed into an 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!"

Caveats

MarkDown rendering differs from place to place, so things like...

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

... on GitHub will have an element with id such as...

id="methodnameoptions--promise"

... where as vanilla sanitation would result in an id of...

id="methodnameoptions-codepromisecode"

... meaning that writing or compiling MarkDown files from templates either requires targeting one way of slugifeing, or adding configurations and scripted logic for the various clever ways that places like to clean the heading's text.


N
Nick Gerakines

There is no such directive in the Markdown spec. Sorry.


Uh oh! Do you know if MultiMarkdown or Textile support it? I was thinking of migrating to MD for all my documentation but this a deal breaker. Thanks for the help!
What do you mean by "directive"? Other solutions to exactly the problem have been posted here.
The markdown spec explicitly allows html tags, so this is allowed. And it works. At least last time I tried it.
A
Adam

Gitlab uses GitLab Flavored Markdown (GFM)

Here "all Markdown-rendered headers automatically get IDs"

One can use mouse to :

move mouse over header

move mouse over hover selector which becoms visible to the left from header

copy and save link using right mouse click For example in README.md file I have header:

## series expansion formula of the Boettcher function

which gives a link :

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

Prefix can be removed so the link here is simply

file#header

which here means:

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

Now it can be used as :

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

One can also do it manually: replace spaces with hyphen sign.

Live example is here


The file is anticipated automatically, you don't need to specify it. [series expansion formula of the Boettcher function](#series-expansion-formula-of-the-boettcher-function) should do the trick.
o
orrymr

In addition to the above answers,

When setting the option number_sections: true in the YAML header:

number_sections: TRUE

RMarkdown will autonumber your sections.

To reference those autonumbered sections simply put the following in your R Markdown file:

[My Section]

Where My Section is the name of the section

This seems to work regardless of the section level:

# My section

## My section

### My section


D
Dmitry Shvedov

Using kramdown, it seems like this works well:

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

I see it's been mentioned that

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

works efficiently, but the former might be a good alternative for elements besides headers or else headers with multiple words.


j
jwpfox

Since MultiMarkdown was mentioned as an option in comments.

In MultiMarkdown the syntax for an internal link is simple.

For any heading in the document simply give the heading name in this format [heading][] to create an internal link.

Read more here: MultiMarkdown-5 Cross-references.

Cross-References An oft-requested feature was the ability to have Markdown automatically handle within-document links as easily as it handled external links. To this aim, I added the ability to interpret [Some Text][] as a cross-link, if a header named “Some Text” exists. As an example, [Metadata][] will take you to # Metadata (or any of ## Metadata, ### Metadata, #### Metadata, ##### Metadata, ###### Metadata). Alternatively, you can include an optional label of your choosing to help disambiguate cases where multiple headers have the same title: ### Overview [MultiMarkdownOverview] ## This allows you to use [MultiMarkdownOverview] to refer to this section specifically, and not another section named Overview. This works with atx- or settext-style headers. If you have already defined an anchor using the same id that is used by a header, then the defined anchor takes precedence. In addition to headers within the document, you can provide labels for images and tables which can then be used for cross-references as well.


This is true for Multimarkdown; the explicit anchor method <a> should work in any Markdown document. Furthermore you can put an anchor anywhere in the document body, not just in headings, images or tables.
l
laggingreflex

Some more spins on the <a name=""> trick:

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

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

f
fedorqui

Just follow the [text](#link) syntax and follow these guidelines:

write the letters and numbers as they are

replace spaces with dashes -

remove the rest of the characters

So for example if you have these sections:

# 1. Python

# 2. c++

# 3. c++11

# 4. asp.net-core

You can add a reference by using:

[1. Python](#1-python)
[2. c++](#2-c)
[3. c++11](#3-c11)
[4. asp.net-core](#4-aspnet-core)

Note how asp.net-core becomes aspnet-core, 1. python becomes 1-python, etc.