Jak utworzyć link do części tego samego dokumentu w Markdown?


539

Piszę duży dokument Markdown i chciałbym umieścić na początku swego rodzaju spis treści, który będzie zawierał łącza do różnych lokalizacji w dokumencie. W jaki sposób mogę to zrobić?

Próbowałem użyć

[a link](# MyTitle)

gdzie MyTitlejest tytuł w dokumencie i to nie działało.



1
Jedynym problemem, jaki miałeś, jest to, że MyTitle nie powinien być tytułem, ale nazwą kotwicy w tym dokumencie (np. <a name="MyTitle"> </a>). Wtedy możesz użyć oryginalnego linku w dowolnym miejscu w dokumencie.
userfuser

7
Przyjęta odpowiedź nie jest istotna dla większości ludzi. Zamiast tego zobacz drugą odpowiedź w dół: stackoverflow.com/a/16426829/398630
BrainSlugs83

Odpowiedzi:


37

W pandoc , jeśli użyjesz opcji --tocdo tworzenia html, spis treści zostanie utworzony z linkami do sekcji i z powrotem do spisu treści z nagłówków sekcji. Podobnie jest z innymi formatami zapisywanymi przez pandoc, takimi jak LaTeX, rtf, rst itp. Tak więc z poleceniem

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

ten kawałek zniżki:

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

da to jako treść 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
Dzięki, właśnie tego potrzebowałem. Użyłem Textmate do konwersji Markdown na HTML, przejdę na pandoc.
recipriversexclusion

1
Możesz wypróbować wersję demo Pandoc tmbundle na Githubie (jest też tryb emacs pandoc itp.) Tmbundle ponownie wykorzystuje wyróżnik składni specyficzny dla MultiMarkdown, więc jest (bardzo) kilka dziwactw. Ponadto wiele powiązanych skryptów jest wysoce spersonalizowanych - np. Kontekst, a nie LaTeX itp. - ale pomysł polega na tym, że użytkownicy będą je zmieniać, jak im się podoba, co uważam za dość proste. Prawdopodobnie powinien być git cloneumieszczony w najniższym lub najbardziej zewnętrznym katalogu tmbundle, ~/Library/Application\ Support/TextMate/Bundlesaby uprościć integrację.
aplikacyjnych

2
Dodaje -1do pierwszego powtórzenia id, -2do drugiego, itp
aplikacyjnej

6
Odkryłem, że musiałem dodać opcję --standalone do komendy pandoc, aby faktycznie wypisała sam spis treści na wyjściu. Bez tego przełącznika nagłówki stałyby się linkami z powrotem do kotwicy o nazwie #toc, ale w rzeczywistości nie generowałyby nazwanej kotwicy i listy podobnych.
Duncan Lock

4
To może odpowiedzieć na pytanie OP, ale dla reszty z nas, którzy chcą wiedzieć, jak to zrobić w obniżce , jest to dość bezużyteczne. - Następna odpowiedź jest o wiele bardziej pomocna.
BrainSlugs83

933

Github automatycznie analizuje tagi kotwicy z twoich nagłówków. Możesz więc wykonać następujące czynności:

[Custom foo description](#foo)

# Foo

W powyższym przypadku Foonagłówek wygenerował tag zakotwiczenia o nazwiefoo

Uwaga : tylko jeden #dla wszystkich rozmiarów nagłówków, bez spacji #i nazwy kotwicy, zakotwiczenia, nazwy znaczników zakotwiczenia muszą być pisane małymi literami i oddzielane myślnikami, jeśli d -multi

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

### My Multi Word Header

Aktualizacja

Działa również po wyjęciu z pudełka pandoc.


54
Jeśli nagłówek zawiera wiele słów „Tak jak ten”, zamień spacje na łączniki w kotwicy [just](#like-this-one).
Mogsdad

3
Czy to działa tylko w przypadku nagłówków H1? W przypadku linkowania do nagłówka H2 (tj. ## Foo), czy muszę również wstawić dwa znaki liczbowe w linku, tj. [Foo] (## foo)? Nie mogę zmusić twojej składni lub mojej do działania (z dodatkowym znakiem liczbowym).
GrayedFox,

7
@GrayedFox, jeśli chcesz utworzyć link do nagłówka ab H2 ## Foo, spróbuj [to mój link do Foo] (# foo) ... to znaczy: pojedynczy hash, bez spacji między hash i małymi literami-kebab-case-name- nagłówka
Abdull,

4
Wskazówka: sprawdź kotwicę wyświetlaną obok nagłówka w Github, aby uzyskać odpowiedni link, tzn. Jeśli zawiera znaki specjalne, są one automatycznie usuwane i wyświetla się tam odpowiedni link.
Alexander Pacha

2
A jeśli nagłówki mają numer? # 3. Trzeci punkt [Trzeci punkt] (# 3.-trzeci.punkt) nie działa
Aditya

118

Eksperymentując, znalazłem rozwiązanie wykorzystujące, <div…/>ale oczywistym rozwiązaniem jest umieszczenie własnego punktu kontrolnego na stronie, gdziekolwiek chcesz, w ten sposób:

<a name="abcde">

przed i

</a>

po linii, którą chcesz „połączyć”. Następnie link przeceny, taki jak:

[link text](#abcde)

zabierze Cię tam gdziekolwiek w dokumencie.

<div…/>Rozwiązanie wstawia „atrapę” podział prostu dodać idwłaściwość, a to potencjalnie uciążliwy do struktury strony, ale<a name="abcde"/> rozwiązanie powinno być zupełnie nieszkodliwe.

(PS: Umieszczenie kotwicy w linii, do której chcesz utworzyć łącze, może być w następujący sposób:

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

ale to zależy od tego, jak potraktuje to Markdown. Zaznaczam na przykład, że formater odpowiedzi przepełnienia stosu jest z tego zadowolony!)


2
Jeśli to zrobisz, powinieneś pamiętać, że div usuwa inne formatowanie przeceny, takie jak ## headers.
2rs2ts

@ user691859 Czy potrafisz opracować? Być może możemy zaktualizować odpowiedź, aby działała lepiej. Widziałem, jak TextMate pomija podświetlanie, dopóki nie wciąłem div, ale nie ma problemu z przetwarzanym przecenieniem oglądanym z przeglądarki.
Steve Powell,

W WriteMonkey odkryłem, że jeśli poprzedzę tekst z <div/>kilkoma liniami poniżej, będzie to miało wpływ. Zamiast tego muszę owinąć tekst, który łączę, w divklauzulę pełnego tagu i muszę ponownie określić zachowanie od zera za pomocą prawdziwego HTML. Gwizd.
2rs2ts

6
Działa to dobrze, dzięki. Dla każdego, kto się zastanawia, działa to również w przypadku plików Markdown hostowanych i wyświetlanych przez GitHub.
Alex Dean

2
Aby być kompatybilnym z HTML5 , chciałbym polecić zastąpienie <a name="head1"/>go <a id="head1"/>.
binki

74

Może to być nieaktualny wątek, ale do tworzenia wewnętrznych linków do dokumentów w znacznikach w Github użyj ...
(UWAGA: małe litery #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. 

Zadano dobre pytanie, więc zredagowałem swoją odpowiedź;

Można utworzyć łącze wewnętrzne do dowolnego rozmiaru tytułu, używając - # , ##, ###, #### I stworzył krótki przykład poniżej ... https://github.com/aogilvie/markdownLinkTest


W twoim przykładzie, tagi link mają tylko jeden #, ale nagłówki, które mają połączyć, aby mieć dwa ##; czy nie powinny być takie same?
Karim Bahgat

3
Dobre pytanie. Odpowiedź brzmi nie. # in (#dependencies-title)informuje Github, że jest to łącze wewnętrzne. Poniższy tekst może mieć dowolny rozmiar tytułu. Oto przykładowy test, który wykonałem ... https://github.com/aogilvie/markdownLinkTest
Ally

1
Czy to zależy od smaku przecen? Wygląda na to, że działa dobrze w edytorze Markdown, ale kiedy zapisuję do html lub pdf, identyfikatory nie są dodawane do odpowiednich tagów. Byłoby dobrze, po prostu wrzucając tam kotwicę, ale wygląda na to, że twoja metoda jest o wiele czystsza i szybsza.
meteorainer

21

tak, Markdown to robi, ale musisz podać nazwę kotwicy <a name='xyx'> .

pełny przykład

to tworzy link
[tasks](#tasks)

w dalszej części dokumentu utworzysz nazwaną kotwicę (jakkolwiek to się nazywa).

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

pamiętaj, że możesz również owinąć go wokół nagłówka.

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

13

Podręcznik pandoc wyjaśnia, jak połączyć się z nagłówkami, używając ich identyfikatora. Nie sprawdziłem obsługi tego przez inne parsery, ale zgłoszono, że nie działa na github .

Identyfikator można podać ręcznie:

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

lub możesz użyć automatycznie wygenerowanego identyfikatora (w tym przypadku #my-heading-text). Oba są szczegółowo wyjaśnione w podręczniku pandoc .

UWAGA : Działa to tylko podczas konwersji na HTML , LaTex , ConTeXt , Textile lub AsciiDoc .


9

Niektóre dodatkowe rzeczy, o których warto pamiętać, jeśli ya kiedykolwiek fantazję z symboli w pozycjach, które ya chcą, aby przejść do ...

# 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

... takie rzeczy jak #, ;, &, i :w pozycji łańcuchy są zazwyczaj są ignorowane / paski zamiast uciec, a można też użyć cytat łączy styl do szybkiego wykorzystania łatwiejsze.

Notatki

GitHub obsługuje :word:składnię w commits, plikach readme itp. Patrz gist commits (z rxaviers), jeśli użycie'em jest tam interesujące.

I prawie wszędzie indziej można używać dziesiętnych lub szesnastkowych w nowoczesnych przeglądarkach; ściągawka z w3schools jest bardzo poręczna , szczególnie jeśli używasz CSS ::beforelub ::afterpseudoelementów z symbolami, to bardziej twój styl.

Punkty bonusowe?

Na wypadek, gdyby ktoś zastanawiał się, w jaki sposób obrazy i inne linki w nagłówku są przetwarzane w 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!"

Ostrzeżenia

Renderowanie MarkDown różni się w zależności od miejsca, więc rzeczy takie jak ...

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

... na GitHub będzie miał element idtaki jak ...

id="methodnameoptions--promise"

... gdzie jako wanilia sanitarna spowodowałaby id...

id="methodnameoptions-codepromisecode"

... co oznacza, że ​​pisanie lub kompilowanie plików MarkDown z szablonów wymaga albo ukierunkowania jednego sposobu na slugifeing , albo dodania konfiguracji i logiki skryptowej dla różnych sprytnych sposobów, w które lubią czyścić tekst nagłówka.


9

Uniwersalne rozwiązania

To pytanie wydaje się mieć inną odpowiedź w zależności od realizacji obniżki.
W rzeczywistości oficjalna dokumentacja Markdown milczy na ten temat.
W takich przypadkach i jeśli potrzebujesz przenośnego rozwiązania, możesz użyć HTML.

Przed dowolnym nagłówkiem lub w tym samym wierszu nagłówka zdefiniuj identyfikator za pomocą tagu HTML.
Na przykład:<a id="Chapter1"></a>
Zobaczysz to w kodzie, ale nie w renderowanym dokumencie.

Pełny przykład:

Zobacz pełny przykład (online i edytowalny) tutaj .

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

Aby przetestować ten przykład, musisz dodać dodatkową przestrzeń między listą treści a pierwszym rozdziałem lub zmniejszyć wysokość okna.
Nie używaj również spacji w nazwie identyfikatorów.


Uh ... wydawał się miły. Próbowałem dwa problemy: (1). ## Chapter 1potrzebuje nad nim otwartej linii. (2). Link nie działa ...
musicformellons

Ach, to nie działa we wtyczce Intellij Markdown, której użyłem; ale DZIAŁA w edytorze znaczników Macdown.
musicformellons

Wciąż testowane na github: wymagana jest otwarta linia nad nagłówkiem, ale działa.
musicformellons

@musicformellons, możesz spróbować bez wiersza otwarcia, ale poprawnie zamykając znacznik zakresu? <br><span id="Chapter1"><span>
ePi272314

tak, działa!
musicformellons

7

Nie ma takiej dyrektywy w specyfikacji Markdown. Przepraszam.


O o! Czy wiesz, czy obsługuje to MultiMarkdown lub Textile? Myślałem o migracji do MD dla całej mojej dokumentacji, ale jest to przełom. Dzięki za pomoc!
recipriversexclusion

5
Co rozumiesz przez „dyrektywę”? Inne rozwiązania tego problemu zostały zamieszczone tutaj.
Zelphir Kaltstahl

4

Gitlab używa GitLab Flavored Markdown (GFM)

Tutaj „wszystkie nagłówki renderowane przez Markdown automatycznie otrzymują identyfikatory”

Można użyć myszy do:

  • przesuń mysz nad nagłówek
  • najedź myszką na selektor najechania, który staje się widoczny po lewej stronie od nagłówka
  • skopiuj i zapisz link klikając prawym przyciskiem myszy

    Na przykład w pliku README.md mam nagłówek:

## series expansion formula of the Boettcher function

który daje link:

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

Prefiks można usunąć, więc link tutaj jest prosty

file#header

co tutaj oznacza:

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

Teraz może być używany jako:

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

Można to również zrobić ręcznie: zastąp spacje znakiem łącznika.

Przykład na żywo jest tutaj


1

Przy użyciu kramdown wydaje się, że działa to dobrze:

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

Widzę, że wspomniano o tym

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

działa wydajnie, ale ta pierwsza może być dobrą alternatywą dla elementów oprócz nagłówków lub nagłówków z wieloma słowami.


1

Ponieważ MultiMarkdown został wymieniony jako opcja w komentarzach.

W MultiMarkdown składnia łącza wewnętrznego jest prosta.

W przypadku dowolnego nagłówka w dokumencie wystarczy podać nazwę nagłówka w tym formacie [heading][] aby utworzyć łącze wewnętrzne.

Przeczytaj więcej tutaj: MultiMarkdown-5 Odsyłacze .

Odsyłacze

Często żądaną funkcją była możliwość automatycznego, aby Markdown automatycznie obsługiwał łącza wewnątrz dokumentu tak łatwo, jak obsługiwał łącza zewnętrzne. W tym celu dodałem możliwość interpretacji [Some Text] [] jako linku, jeśli istnieje nagłówek o nazwie „Some Text”.

Na przykład [Metadane] [] zabierze Cię do # Metadanych (lub dowolnego z ## Metadata, ### Metadata, #### Metadata, ##### Metadata, ###### Metadata).

Możesz też dołączyć opcjonalną etykietę, aby ułatwić jednoznaczne przypadki, w których wiele nagłówków ma ten sam tytuł:

### Przegląd [MultiMarkdownOverview] ##

Pozwala to na użycie [MultiMarkdownOverview] w celu odniesienia się konkretnie do tej sekcji, a nie do innej sekcji o nazwie Przegląd. Działa to z nagłówkami w stylu atx lub settext.

Jeśli już zdefiniowałeś kotwicę przy użyciu tego samego identyfikatora, który jest używany przez nagłówek, wtedy zdefiniowana kotwica ma pierwszeństwo.

Oprócz nagłówków w dokumencie możesz także udostępnić etykiety dla obrazów i tabel, które mogą być następnie wykorzystane do odsyłaczy.


0

Więcej spinów na <a name="">lewie:

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

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

0

Oprócz powyższych odpowiedzi

Podczas ustawiania opcji number_sections: truew nagłówku YAML:

number_sections: TRUE

RMarkdown automatycznie ponumeruje twoje sekcje.

Aby odwołać się do tych automatycznie ponumerowanych sekcji, po prostu umieść w pliku R Markdown:

[My Section]

Gdzie My Section jest nazwa sekcji

Wydaje się, że działa to niezależnie od poziomu sekcji:

# My section

## My section

### My section

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.