27

I'd like to have a link to the automatically generated index in the sidebar when using sphinx-rtd-theme. I've tried adding it to the toctree:

.. toctree::

    first
    second
    Index <:ref:`genindex`>

but this resulted in

WARNING: toctree contains reference to nonexisting document u':ref:`geinindex`'

from Sphinx and no other effect.

I think I could simply hardcode the index in the theme layout.html file, but perhaps there is some better way, not involving modifying the standard theme?

TIA for any hints!

3 Answers 3

27

It's easy if you understand how Sphinx and Jinja work. Unfortunately the Sphinx docs on templating don't give you enough info if you don't. In short, you'll have to override the template:

  • Make sure you have a _templates folder under your sphinx docs folder.
  • Make sure it is listed in your conf.py, e.g. templates_path = ['_templates']
  • Create a file inside the folder called layout.html.
  • Put this snippet inside and save. The exclamation point/mark forces jinja to use the parent template. Don't forget it, or you'll get a recursion error. You only need to override the menu block.

    {% extends "!layout.html" %}
    
      {% block menu %}
        {{ super() }}
        <a href="genindex.html">Index</a>
      {% endblock %}
    
Sign up to request clarification or add additional context in comments.

6 Comments

This works, but this doesn't add the index link on the home page toctree, only on the sidebar toctree.
Yes, that's what the question asked for. Combine with Steven's answer if you need it on the same page as the toctree. Often it is there by default.
Thanks, this is indeed much better than hacking the themes layout.html as I ended up by doing back in 2014, I've now switched to this solution (better late than never -- and the same goes for accepting this as the answer :-)
Works like charm. I did not have the layout.html file (using a ready made template) so added an empty one and then added the code given and all worked well. thanks
The above solution works only for flat html directory structures (no subdirectories). I recommend to use <a href= "{{pathto('genindex.html', 1)}}">Index</a> instead. Then it also works for nested directory structures
|
4

How about:

.. toctree::

    first
    second

* :ref:`genindex`

1 Comment

This works but add a blank line between the toc and the index link.
1

@Gringo's code got me close. Here is how to match the formatting. @brad also has this in the comments but hard to read wo line spacing. Note, read @Gringo's instructions on where to put this code.

{% extends "!layout.html" %}

{% block menu %}
   {{ super() }}
   <p class="caption">
     <span class="caption-text">Indices</span>
   </p>
   <ul>
        <li class="toctree-l1"><a href= "{{pathto('genindex.html', 1)}}">Everything</a></li>
        <li class="toctree-l1"><a href= "{{pathto('py-modindex.html', 1)}}">Module Index</a></li>
   </ul>
    
{% endblock %}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.