向另一个页面中的子标题或锚点添加交叉引用


Answers:


207

表达式“ reST / Sphinx”使问题的范围不清楚。它与一般 Sphinx中的reStructuredText有关,还是 Sphinx中所使用的 reStructuredText有关(而与一般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链接到文件中名为“ Section”的部分,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文件,因为仅在访问RST文件时才创建HTML。(在编写此答案时,不允许直接访问HTML。)

这里有一个完整的例子。


9
比问题所有者接受的答案好得多。(尽管事实RST, in General令人
震惊

1
Sphinx .. _my-reference-label:方法的缺点是在链接my-reference-label后的URL #中显示。因此,必须使用漂亮的标签名称。另外,TOC始终创建到的#-link Section to cross-reference,因此最终以#指向同一节的两个不同的-links 结尾。
st12 2007年

3
如果您想给链接使用其他名称,则可以始终使用:ref:`Link title <lmy-reference-label>`
HyperActive

52

新的,更好的答案2016!

autosection扩展可以让你轻松做到这一点。

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


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

然后,以后...

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


A link-  :ref:`Internal Headline`

此扩展是内置的,因此您只需编辑 conf.py

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

您唯一需要注意的是,现在您无法在整个文档集合中重复内部标题。(值得。)


5
自从我写了这个答案以来,我在实践中发现了这种方法的几个问题。首先,部分重命名是一个问题。其次,您经常会使用一些简短的标题,例如“了解更多”或“概述”,如果这样做,您将无法使用。解决方案:如果/如果您重命名,请添加章节标题;为简短的标题(如_page-title-learn-more)添加一个标题。有点烦人,但我仍然喜欢大部分依靠自动切开功能。
亚当·迈克尔·伍德

12
Sphinx 1.6引入了autosectionlabel_prefix_documentconfig选项,该选项通过在每个节标签前添加其来源文档的名称来避免重复的标题问题。
pmos

2
这是最好的解决方案。链接标题可以使用轻松修改:ref:`Link title <Internal Headline>`。另外,您可以使用:doc:`quickstart`
HyperActive '19

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。另外,如果将文档生成到subdir(如)html,则必须在refs之前添加名称::ref:'html/Installation:Homebrew'。因此,您可能需要选择一些通用的目录名称,例如generated,以使ref在与HTML以外的格式一起使用时看起来不那么奇怪。因此,您不妨'Homebrew <Installation.html#Homebrew>'__使用适当的reST,而不必与Sphinx捆绑在一起。
Pugsley

我不需要html/前缀
Chris
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.