Skip to content
Closed
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 64 additions & 3 deletions doc/tutorial/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ follows:
'sphinx.ext.duration',
]

After that, every time you generate your documentation, you will see a short
After that, every time you build your documentation, you will see a short
durations report at the end of the console output, like this one:

.. code-block:: console
Expand Down Expand Up @@ -437,13 +437,74 @@ And make the sentence you added in ``index.rst`` look like this:
:ref:`install <installation>` the project.

Notice a trick here: the ``install`` part specifies how the link will look like
(we want it to be a specific word, so the sentence makes sense), whereas the
``<installation>`` part refers to the actual label we want to add a
(in this case, using a specific word so the sentence makes sense), whereas the
``<installation>`` part refers to the actual label you want to add a
cross-reference to. If you do not include an explicit title, hence using
``:ref:`installation```, the section title will be used (in this case,
``Installation``). Both the ``:doc:`` and the ``:ref:`` roles will be rendered
as hyperlinks in the HTML documentation.

Referencing external projects with intersphinx
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Most likely you are depending on some open source libraries for your own
project, and there is a chance those dependencies have their documentation
written in Sphinx and available online. One of the most powerful features of
Sphinx is the ability to generate cross-references to objects from other
projects available online, using the
:doc:`intersphinx </usage/extensions/intersphinx>` extension.

To enable it, first add ``sphinx.ext.intersphinx`` to the list of extensions:

.. code-block:: python
:caption: docs/source/conf.py

extensions = [
'sphinx.ext.duration',
'sphinx.ext.intersphinx',
]

The way to know whether you can reference an external project is to check
if it has a publicly available ``objects.inv``, which can be parsed calling
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The goal of the Intersphinx extension is referring to remote objects transparently like referring to local objects. We've usually found local objects via reading source documents, I believe. So I think the way to find the remote objects is also reading source documents, first. Is searching objects.inv really better way to do that? I don't think so...

This tutorial does not describe the relationship between the std:doc and :doc: role. Where they came from? I'm worried this explanation makes beginners confused.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So I think the way to find the remote objects is also reading source documents, first. Is searching objects.inv really better way to do that? I don't think so...

This was only to explain what the file is. Perhaps it is too technical? I find myself using this quite often lately, perhaps because I'm still learning the intricacies of intersphinx. @webknjaz has https://webknjaz.github.io/intersphinx-untangled/ and I think it's quite useful too.

In any case, I can clarify that this is optional and that it works in the same way as your own docs (except for custom roles, like Sphinx own :confval:.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This tutorial does not describe the relationship between the std:doc and :doc: role. Where they came from? I'm worried this explanation makes beginners confused.

It doesn't because I need to learn it myself...!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had no luck on the Sphinx docs but I found this somewhere else:

Screenshot 2021-07-13 at 17-21-41 6 4 Sphinx — AAAAAA 0 4 0 documentation

Now I understand your point. I will think if I can clarify this earlier, otherwise rephrase this part.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd love to see this table in the official docs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We've usually found local objects via reading source documents, I believe. So I think the way to find the remote objects is also reading source documents, first. Is searching objects.inv really better way to do that? I don't think so...

I've never had to do this by reading the source — it's hard to locate such things when you don't know where they are defined and how. Besides, the source is not always linked or available.
This is why I came up with intersphinx-untangled — it helps me discover things that are actually available. I sometimes even search by URL to see what roles link there.

I think there should be some sort of a reference explorer (I mentioned this somewhere on the tracker earlier).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It highlights a good point: that we should have better tooling around intersphinx inventories, to help users and hide the implementation details.

Yep: #8211

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this case, if I understand it correctly, the std considers each document to be an entity implicitly declared, and offers :doc: to refer them. Similarly, I think when you create a label somewhere, it is really an entity declared in the std domain, which you can refer to with :ref:. @tk0miya, is this last part correct?

Yes. Some kinds of objects (including labels and documents) belong to the std domain. It behaves like a system domain. So users do not need to give the domain name on referencing objects like :std:doc or :std:ref:.
https://github.com/sphinx-doc/sphinx/blob/4.x/sphinx/domains/std.py#L562-L570

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was very surprising to me, and I think it makes more difficult to introduce the topic: it's not as easy as "write a reference as you would write it in your docs", the user also has to understand some extra rules about how intersphinx targets are generated. Am I missing something @tk0miya @ jakobandersen ?

I've never thought referencing remote document via intersphinx. So I did not know such a behavior. Indeed, it would be a bug.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've never thought referencing remote document via intersphinx. So I did not know such a behavior. Indeed, it would be a bug.

Thanks for chiming in @tk0miya ! I opened a discussion on https://groups.google.com/g/sphinx-dev/c/ZfslSpDGNUs/m/RjfzzFzUCgAJ about it, I think it's somewhat addressed by #9459

``python -m sphinx.ext.intersphinx``. For example, this is the output for
Sphinx itself:

.. code-block:: console
:emphasize-lines: 4

(.venv) $ python -msphinx.ext.intersphinx https://www.sphinx-doc.org/en/master/objects.inv | grep 'std:doc' -A5
std:doc
changes Changelog : changes.html
contents Sphinx documentation contents : contents.html
development/builders Configuring builders : development/builders.html
development/index Extending Sphinx : development/index.html
development/overview Developing extensions overview : development/overview.html

You can now introduce a cross-reference to the ``contents`` section of the
Sphinx documentation as follows, prefixing it by `sphinx:` to better identify
it is an external one:

.. code-block:: rst
:caption: docs/source/index.rst

.. note::

This documentation is built on Sphinx,
:doc:`find out more in their docs <sphinx:contents>`.

And finally, to actually link our documentation with the Sphinx one, add a
:confval:`intersphinx_mapping` dictionary to your as follows:

.. code-block:: python
:caption: docs/source/conf.py

intersphinx_mapping = {
'sphinx': ('https://www.sphinx-doc.org/en/master/', None),
}

After you build the HTML documentation with ``make html``, you will see a link
pointing to that specific section of the Sphinx documentation!

Where to go from here
---------------------

Expand Down