【问题标题】:Managing Sphinx toctrees combined with inline sections结合内联部分管理 Sphinx 目录树
【发布时间】:2020-04-11 07:56:36
【问题描述】:

我正在尝试了解如何管理与其他内容位于同一文件中的 toctree 元素。

假设我有一个 thingamajig.rst 章节,如下所示:

Thingamajigs
============

.. toctree::
   :maxdepth: 2

   foo
   bar
   baz

Overview
++++++++

Thingamajigs are fun

当我渲染它时 --- foo/bar/baz 有自己的 .rst 文件 --- 它看起来像这样:

但是,如果我将 Overview 部分移动到 目录树之前,那么它会将目录树向下推到概览部分:

Thingamajigs
============

Overview
++++++++

Thingamajigs are fun

.. toctree::
   :maxdepth: 2

   foo
   bar
   baz

有什么方法可以让我的目录树概览部分之后,但位于 Thingamajigs 部分之下?

或者,我可以这样做吗?

Thingamajigs
============

.. toctree::
   :maxdepth: 2

   Overview          <-- refers to Overview section in same file
   foo
   bar
   baz

Overview
++++++++

Thingamajigs are fun

【问题讨论】:

    标签: python-sphinx restructuredtext toctree


    【解决方案1】:

    可以满足问题中给出的确切规范,但并非没有需要解决的重大问题。

    有什么方法可以让我的目录树在 Overview 部分之后,但位于 Thingamajigs 部分下?

    通过在Overview 部分内放置一个目录树,您将把该目录树的所有“条目”(.rst 文件)放在该部分内,因此在部分层次结构中低于该级别。

    However, a document must be consistent in its use of section titles: once a hierarchy of title styles is established, sections must use that hierarchy.

    在其假装部分之外调整目录树会影响 1)“导航”、2)“编号”和 3)“深度”。

    解决方法的第一步:

    可以使用 :hidden: 选项在您想要的位置声明一个目录树 - 在 Thingamajigs 部分内 - 从而使 1)、2) 和 3) 按预期工作。 Sphinx 将处理第一个 toctree 声明中的条目,因此之后在 Overview 中声明的 toctree 不会影响 1)、2) 和 3),因为 .rst 条目已被处理。

    结果:

    对应thingamajigs.rst

    Thingamajigs
    ============
    
    .. toctree::
        :hidden:
    
        foo
        bar
        baz
    
    Overview
    ++++++++
    
    Thingamajigs are fun
    
    .. toctree::
    
        foo
        bar
        baz
    

    以上内容完全符合问题中指定的问题。

    (Sphinx 会发出警告,因为同一个 .rst 文件包含在多个目录树中,但它们不仅仅是警告。)

    解决方法的第二步:

    然而,现在来了一个惊喜!如果您再上一层,到包含以thingamajigs.rst 作为条目的目录树的.rst,您会发现:hidden: 目录树没有呈现,而是可见目录树“就地”呈现(乱序):

    结果:

    对应level_2_toctree.rst

    ***************
    Level_2_toctree
    ***************
    
    .. toctree::
    
        fill_tree1
        fill_tree2
        fill_tree3
        fill_tree4
        thingamajigs
    

    虽然 1)、2) 和 3) 都有效(就保留其功能的目录树而言),但这给我们留下了一个问题:修复父目录树中的渲染顺序。显而易见的解决方案是在项目符号列表中“按原样”重复原始较低级别的目录树,并添加针对这些部分的引用:

    结果:

    对应level_2_toctree.rst

    ***************
    Level_2_toctree
    ***************
    
    .. toctree::
    
        fill_tree1
        fill_tree2
        fill_tree3
        fill_tree4
    
    .. toctree::
        :hidden:
    
        thingamajigs
    
    
    - :ref:`5.5. Thingamajigs <target_thingamajigs>`
    
    
        .. toctree::
    
            foo
            bar
            baz
    
        - :ref:`5.5.4. Item Overview <target>`
    
    
    .. toctree::
    
        foo2
        bar2
    

    请注意,您必须将hyperlink targets 添加到原始thingamajigs.rst

    .. _target_thingamajigs:
    
    Thingamajigs
    ============
    
    .. toctree::
        :hidden:
    
        foo
        bar
        baz
    
    .. _target:
    
    Overview
    ++++++++
    
    Thingamajigs are fun
    
    .. toctree::
    
        foo
        bar
        baz
    

    解决方法的第三步:

    但这还有一个问题,HTML 主题可能对项目符号列表和目录树有不同的 CSS 样式,两者都作为不同的 HTML 元素处理(检查源代码)。

    一种解决方案是wrap the block including the 2 delimiting references in a reST directive(一个容器),它允许自定义样式以使块与剩余的目录树“混合”。但是,您必须在提升 toctree 链的每一步传播这种定制。 这确实提供了作为“概念证明” 的通用解决方案,用于将“可移植目录树” 放置在上下文之外。两个主要缺点是必须手动重构超链接编号,以及自定义 CSS 所需的开销和专业知识。

    没有更多的解决方法:

    考虑Sphinx toctree directivereStructuredText contents directive 是非常不同的。虽然toctree 的重点是将.rst 文件链接在一起,但contents 指令的目的是提供一个很好的.rst 文件(或它所在的部分)的目录。

    通过在upper index 和其文档的相应section 之间来回单击来尝试contents 指令的有用:backlinks: 选项。

    “理想情况下”避免变通办法的最佳方法是为手头的工作使用正确的工具。

    作为上述两个补充的第三个选项是使用由hyperlink targets 组成的bullet list。它很灵活,允许混合包含项目符号列表的.rst 文件的内部和外部链接。此外,它不会干扰 toctreecontents 指令的自动化——这取决于部分。解决方法的第二步包括两个项目符号列表的基本元素。

    我正在尝试学习如何管理与其他内容位于同一文件中的目录树元素。

    查看官方 Python 文档one example 中的toctrees 或another example,您会看到"Flat, Simple, Special cases..." from the Zen of Python 的反映。我见过的最重要的文档chose simple toctree layouts

    在不更改指定表示的情况下,最有效的解决方案是使用 Overview 内的超链接目标引用的项目符号列表而不是目录树。

    【讨论】:

      【解决方案2】:

      toctreecontents已经有人评论过,我不再赘述。

      您可以使用raw 指令进行破解。

      Thingamajigs
      ============
      
      .. raw:: html
      
          <h2><span class="section-number">1.1. </span>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
      
      .. Overview
      .. ++++++++
      
      Thingamajigs are fun
      
      .. toctree::
          :maxdepth: 2
      
          foo
          bar
          baz
      

      为了获得我在raw 指令中使用的 HTML,我从“概述”及其下划线开始生成 HTML。接下来,我从生成的 HTML 中复制并粘贴,如上所示,在 raw 指令下缩进。最后,我注释掉了“概述”及其下划线。您可以根据口味调整原始 HTML。

      然而,就我个人而言,我不认为同时拥有一个标题,紧随其后的是“概述”或“简介”标题,紧随其后的是概述或介绍的内容。我会删除标题并简单地显示所需的内容。明明是什么,为什么还要标题呢?

      【讨论】:

        【解决方案3】:

        部分标题层次结构只是the order as encountered。因此,您的 ==== 下划线设置标题(“H1”),++++ 下划线设置仅此页面的副标题(“H2”)。取决于你所追求的布局......

        A.也许您想要一个“目录”部分作为“概述”部分的兄弟(都在“Thingamajigs”父级中),所以插入一个新的 H2 部分标题:

        Thingamajigs
        ============
        
        Overview
        ++++++++
        
        Thingamajigs are fun
        
        
        Table of contents
        +++++++++++++++++
        
        .. toctree::
            :maxdepth: 2
        
            foo
            bar
            baz
            
        

        B.或者您可能根本不希望在部分标题层次结构中出现“概述”,因此请通过不同的方式突出显示它:

        Thingamajigs
        ============
        
        .. admonition:: Overview
        
            Thingamajigs are fun
        
        .. toctree::
            :maxdepth: 2
        
            foo
            bar
            baz
            
        

        C.或列出此页面内的标题层次结构,与外部页面分开:

        .. contents:: In this page
            :local:
        
        .. beware, that contents directive must appear before any heading hierarchy
        
        Thingamajigs
        ============
        
        .. toctree::
            :maxdepth: 2
            :caption: In other pages
            
            foo
            bar
            baz
            
        

        D.或者完全按照上一个示例显示的那样做:将“概述”内容移出单独的 ReST 文档,并将其名称包含在 toctree 指令正文中。

        【讨论】:

        • 谢谢,我会试试这些建议,看看有没有觉得合适。
        • 理想情况下,我希望“概述”部分出现在 TOC 中,但其内容与 TOC 出现在同一页面中。我想这就是我不知道该怎么做。 (我怀疑你不能只在目录树中添加一些东西,除非它是一个单独的文件。)
        • 我怀疑你不能只在目录树中添加一些东西,除非它是一个单独的文件。那是真实的。 toctree 条目是文件的名称。
        • AFAIK contents 指令列出本地(当前文档)层次结构,toctree 指令列出外部文档,没有混合。你可以通过手动列出references to section titles 来伪造一个目录树,但这会很丑。
        • 另一种组合:将“概述”内容移出到单独的 ReST 文档中,并将其名称包含在 toctree 指令正文中,然后使用 .. include:: overview.rst directive 以便在旁边也可以看到概述目录树
        猜你喜欢
        • 2017-02-07
        • 2013-02-06
        • 2023-04-02
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        • 1970-01-01
        相关资源
        最近更新 更多