我在交叉引用由自定义指令生成的部分时遇到麻烦。
这是指令:
from docutils import nodes
from docutils.parsers import rst
class TestDirective(rst.Directive):
has_content = False
required_arguments = 1
option_spec = {}
def run(self):
my_arg = self.arguments[0]
target_node = nodes.target('', '', refid=nodes.make_id(my_arg))
section = nodes.section(
'',
nodes.title(text=my_arg),
ids=[nodes.make_id(my_arg)],
names=[nodes.fully_normalize_name(my_arg)])
return [target_node, section]
def setup(app):
app.add_directive('mytest', TestDirective)
这是它的用法:
=============
Test document
=============
.. mytest:: section1
Section 1 content.
.. _section2:
section2
========
Section 2 content.
现在,以下仅适用于
section2
:Here are links to :ref:`section1` and :ref:`section2`.
该链接仅针对
section2
正确生成,并且出现以下错误:test.rst:19: WARNING: undefined label: section1 (if the link has no caption the
label must precede a section header)
我该如何进行这项工作?
最佳答案
您似乎混淆了引用标签和指令的功能。
为了使术语更清楚,请在您的标记中:
.. _section2:
”)正前方有一个section title(section2
)。这提供了可以通过interpreted text role(:ref:`section2`
)链接到的目标。那是常规的Sphinx样板。 .. mytest::
)和其单个必需参数(section1
),并且没有内容块(该指令后没有缩进文本)。 Section 1 content.
”是一个独立的段落。 也许您想要一个自定义的解释文本角色来提供特殊功能,或者是
roles.XRefRole
子类,或者是autosectionlabel extension?编辑
:ref:
角色用于任意位置(“labels”,无论什么意思)但您也可以通过
:any:
once it is registered交叉引用自定义对象:def setup(app):
app.add_directive('mytest', TestDirective)
app.add_object_type(
directivename='mytest',
rolename='banana',
)
然后是ReST内容:See :any:`section1` which is a TestDirective.
Or also works via the rolename :banana:`section1`.
Many would agree表明所有这些功能的文献不多。关于python - 狮身人面像: how to cross-reference a target generated by a custom directive,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61369600/