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

Sue*_*lsh 93 restructuredtext python-sphinx

如何将reST/Sphinx页面中的交叉引用插入同一文档集中另一页的子标题或锚点?

Lou*_*uis 170

表达"reST/Sphinx"使问题的范围不清楚.它是关于reStructuredText Sphinx,还是关于Sphinx中使用的 reStructuredText (而不是一般的reStructuredText)?我将介绍两者,因为使用RST的人可能在某些时候遇到这两种情况:

狮身人面像

除了可用于链接到各种实体(如classes(: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`.
Run Code Online (Sandbox Code Playgroud)

虽然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.
Run Code Online (Sandbox Code Playgroud)

您必须链接到最终的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``.
Run Code Online (Sandbox Code Playgroud)

在这里你也需要知道id该部分的给定.但是,您链接到RST文件,因为它只在访问创建HTML的RST文件时.(在撰写本答案时,不允许直接访问HTML.)

这里有一个完整的例子.

  • 比问题所有者接受的答案要好得多.(尽管`RST,一般',令人失望的消息!) (8认同)
  • 如果你想给你的链接一个不同的名称,你可以随时使用 `:ref:\`Link title &lt;lmy-reference-label&gt;\`` (5认同)

Ada*_*ood 42

2016年新的,更好的答案!

自动切片扩展可让您轻松完成此操作.

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


Internal Headline
=================
Run Code Online (Sandbox Code Playgroud)

然后,以后......

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


A link-  :ref:`Internal Headline`
Run Code Online (Sandbox Code Playgroud)

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

extensions = [
    .
    . other
    . extensions
    . already
    . listed
    .
    'sphinx.ext.autosectionlabel',
]
Run Code Online (Sandbox Code Playgroud)

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

  • Sphinx 1.6引入了[``autosectionlabel_prefix_document``配置选项](http://www.sphinx-doc.org/en/stable/ext/autosectionlabel.html#confval-autosectionlabel_prefix_document),它可以通过前缀避免重复的标题问题每个部分标签及其来源的文件名称. (9认同)
  • 自从我写这个答案以来,我在实践中发现了这种方法的几个问题.首先,部分重命名是一个问题.其次,您经常会使用"了解更多"或"概述"等短节标题,如果您这样做,则无法使用.解决方案:在/重命名时添加节标题; 为短节标题添加节标题(如`_page-title-learn-more`).这有点烦人,但我仍然喜欢主要依靠自动切片. (4认同)
  • 这是最好的解决方案。并且可以使用 `:ref:\`Link title &lt;Internal Headline&gt;\`` 轻松修改链接标题。另外,您可以使用`:doc:\`quickstart\``直接链接到页面(例如quickstart.rst) (3认同)

Jan*_*sky 14

忽略这个答案,它不起作用:更好地使用答案 __CODE__

对于锚点,您可以定义"短"锚点名称,如下所示:

.. _ShortAnchor:

Target Header goes here
=======================

Some text.
Run Code Online (Sandbox Code Playgroud)

要引用该标题,请使用:

For more details, see ShortAnchor_.
Run Code Online (Sandbox Code Playgroud)

请注意,这甚至会将ShortAnchor扩展为标题的全名.

您也可以使用完整的标题名称,如:

See `Target Header goes here`_ chapter.
Run Code Online (Sandbox Code Playgroud)

但是这更容易修改标题文本.

所有这些都适用于多个源文件,这些文件是最终文档的一部分.

  • 当我想要引用的锚在另一个文档中时,这对我不起作用,而是我发现使用:ref:work尽管(参见:http://sphinx.pocoo.org/markup/inline.html#交叉引用-任意位置) (11认同)

Jan*_*ano 14

例子:

Hey, read the :ref:`Installation:Homebrew` section.
Run Code Online (Sandbox Code Playgroud)

在哪里Homebrew是名为Installation.rst.

这使用autosection 功能,因此需要config.py使用以下内容进行编辑:

extensions = [
    'sphinx.ext.autosectionlabel'
]
autosectionlabel_prefix_document = True
Run Code Online (Sandbox Code Playgroud)

  • 在 2.0.0b1 中,他们添加了 `autosectionlabel_maxdepth`,因此要使 autosectionlabel 正常工作,您必须将该变量设置为 &gt;=`2`。另外,如果文档生成到子目录,例如“html”,则必须在 refs 前面加上其名称:“:ref:'html/Installation:Homebrew'”。出于这个原因,您可能需要选择一些通用的目录名称,例如“ generated”,以使引用在与 HTML 以外的格式一起使用时看起来不那么奇怪。因此,您不妨使用“Homebrew &lt;Installation.html#Homebrew&gt;'__”来使用适当的休息,而不是与 Sphinx 绑定。 (2认同)

Pau*_*sak 5

在Sphinx 3.0.3中,唯一对我有用的解决方案是:any:(参见https://www.sphinx-doc.org/en/1.5/markup/inline.html#cross-referencing-anything)。假设一个文档有这样一个部分:

.. _my-section:

My Section
----------

Lorem ipsum blablabla
Run Code Online (Sandbox Code Playgroud)

然后另一个文档可以有以下片段来创建链接:

See :any:`my-section` for the details
Run Code Online (Sandbox Code Playgroud)

  • 我怀疑你必须使用 `:any:` 因为你的目标声明中有 3 个点(应该是 2 个)。如果可以引用目标,则很可能是其他原因导致了问题。我尝试在 [Sphinx 的 github 问题跟踪器](https://github.com/sphinx-doc/sphinx/issues) 上搜索有关 `:any:` 和 `:ref:` 角色的错误报告,但似乎没有是任何匹配此描述的。 (2认同)