Додавання перехресного посилання на підзаголовку або якоря на іншій сторінці


110

Як вставити перехресне посилання на сторінку reST / Sphinx до підзаголовка або прив’язки до іншої сторінки в тому ж наборі документації?


Відповіді:


207

Вираз "reST / Sphinx" робить обсяг питання неясним. Це про reStructuredText взагалі та Sphinx, чи лише про reStructuredText, як він використовується у Sphinx (а не reStructuredText взагалі)? Я збираюсь висвітлити і те, і інше, оскільки люди, які використовують RST, в якийсь момент можуть зіткнутися з обома випадками:

Сфінкс

Окрім доменних директив, які можна використовувати для посилання на різні об'єкти, такі як класи ( :class:), тут є загальна :ref:директива, задокументована тут . Вони наводять такий приклад:

    .. _my-reference-label:

    Section to cross-reference
    --------------------------

    This is the text of the section.

    It refers to the section itself, see :ref:`my-reference-label`.

Хоча загальний механізм гіперпосилання, запропонований RST, працює у Sphinx, документація рекомендує не використовувати його під час використання Sphinx:

Використовувати ref рекомендується для стандартних посилань на reStructuredText до розділів (наприклад, Section title_), оскільки він працює у файлах, коли змінюються заголовки розділів, і для всіх будівельників, які підтримують перехресні посилання.

RST, загалом

Інструменти, які перетворюють файли RST в HTML, не обов'язково мають поняття колекції . Це, наприклад, якщо ви покладаєтесь на github для перетворення файлів RST в HTML або якщо ви використовуєте інструмент командного рядка, як rst2html. На жаль, різні способи використання бажаного результату залежать від того, який інструмент ви використовуєте. Наприклад, якщо ви використовуєте, rst2htmlі ви хочете, щоб файл A.rstпосилався на розділ, який називається у розділі "Розділ", other.rstі ви хочете, щоб остаточний HTML-код працював у браузері, він A.rstмістив би:

`This <other.html#section>`__ is a reference to a section in another
file, which works with ``rst2html``. Unfortunately, it does not work
when the HTML is generated through github.

Ви маєте посилання на кінцевий HTML-файл, і ви повинні знати, що буде idдано до розділу. Якщо ви хочете зробити те ж саме для файлу, який подається через github:

`This <other.rst#section>`__ is a reference to a section in another
file, which works on github. Unfortunately, it does not work when you
use ``rst2html``.

Тут теж потрібно знати idдане до розділу. Однак ви посилаєтесь на файл RST, оскільки HTML-файл створюється лише після доступу до файлу RST. (На момент написання цієї відповіді доступ до HTML безпосередньо не дозволений.)

Повний приклад доступний тут .


9
Набагато краща відповідь, ніж та, яку прийняв власник питання. (Незважаючи на те, що RST, in Generalневтішна новина!)
dlm

1
Недоліком .. _my-reference-label:підходу Сфінкса є те, що my-reference-labelвідображається в URL-адресі після #у посиланні. Отже, треба використовувати гарні назви міток. Також TOC завжди створює #-посилання до Section to cross-reference, і, таким чином, один закінчується двома різними #-посиланнями на один і той же розділ.
st12

3
І якщо ви хочете , щоб дати своє посилання інше ім'я , ви завжди можете використовувати:ref:`Link title <lmy-reference-label>`
гіперактив

52

Нова, краща відповідь на 2016 рік!

Розширення автосекції дозволяє вам це зробити легко.

=============
Some Document
=============


Internal Headline
=================

потім, пізніше ...

===============
Some Other Doc
===============


A link-  :ref:`Internal Headline`

Це розширення є вбудованим, тому все, що вам потрібно - це редагувати conf.py

extensions = [
    .
    . other
    . extensions
    . already
    . listed
    .
    'sphinx.ext.autosectionlabel',
]

Єдине, на що потрібно бути обережним - це те, що тепер ви не можете копіювати внутрішні заголовки в колекції doc. (Варто.)


5
Оскільки я написав цю відповідь, я виявив на практиці пару проблем із таким підходом. По-перше, проблема перейменування розділів є проблемою. По-друге, у вас часто є короткі заголовки розділів, наприклад, "Дізнайтеся більше" або "Огляд", які ви хочете використовувати, які ви не можете, якщо це робите. Рішення: додайте назву розділу, коли / якщо ви перейменовуєте; додати заголовок розділу до заголовків коротких розділів (як _page-title-learn-more). Це трохи дратує, але мені все одно подобається в основному покладатися на автосекцію.
Адам Майкл Вуд

12
Sphinx 1.6 представляє параметр autosectionlabel_prefix_documentconfig, який дозволяє уникнути виникнення дублікатів заголовка за допомогою префіксації кожної мітки розділу з назвою документа, з якого він походить.
пмос

2
Це найкраще рішення. І заголовок посилання можна легко змінити :ref:`Link title <Internal Headline>`. Крім того , ви можете пов'язати безпосередньо на сторінку (quickstart.rst, наприклад) з:doc:`quickstart`
гіперактивний

5

Приклад:

Hey, read the :ref:`Installation:Homebrew` section.

де Homebrewзнаходиться розділ всередині іншого документа, названого Installation.rst.

Для цього використовується функція автоматичного вибору , тому її потрібно буде відредагувати config.pyтаким чином:

extensions = [
    'sphinx.ext.autosectionlabel'
]
autosectionlabel_prefix_document = True

У 2.0.0b1 вони додали autosectionlabel_maxdepth, тож для роботи autosectionlabel потрібно встановити цю змінну на> = 2. Крім того , якщо документи формуються в підпапку, як html, ви повинні префікс рефов з його ім'ям: :ref:'html/Installation:Homebrew'. З цієї причини ви можете вибрати якесь загальне ім’я режисера, наприклад generated, щоб зробити рефлекси менш дивними на вигляд при використанні інших форматів, ніж HTML. Через це ви також 'Homebrew <Installation.html#Homebrew>'__можете скористатися належним відпочинком і не бути прив’язаним до Сфінкса.
Пугслі

Мені не потрібна була html/приставка
Кріс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.