xref: /petsc/doc/developers/documentation.md (revision 4bcd95a3096906c174cd1a87ff30988eadf5695d)
1*4bcd95a3SBarry Smith# Developing PETSc Documentation
2*4bcd95a3SBarry Smith
3*4bcd95a3SBarry Smith```{toctree}
4*4bcd95a3SBarry Smith:maxdepth: 2
5*4bcd95a3SBarry Smith```
6*4bcd95a3SBarry Smith
7*4bcd95a3SBarry Smith## General Guidelines
8*4bcd95a3SBarry Smith
9*4bcd95a3SBarry Smith- Good documentation should be like a bonsai tree: alive, on display, frequently tended, and as small as possible (adapted from [these best practices](https://github.com/google/styleguide/blob/gh-pages/docguide/best_practices.md)).
10*4bcd95a3SBarry Smith- Wrong, irrelevant, or confusing documentation is worse than no documentation.
11*4bcd95a3SBarry Smith
12*4bcd95a3SBarry Smith(sphinx_documentation)=
13*4bcd95a3SBarry Smith
14*4bcd95a3SBarry Smith## Documentation with Sphinx
15*4bcd95a3SBarry Smith
16*4bcd95a3SBarry SmithWe use [Sphinx](https://www.sphinx-doc.org/en/master/) to build our web pages and documentation. Most content is written using [reStructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html), a simple markup language.
17*4bcd95a3SBarry Smith
18*4bcd95a3SBarry Smith[These slides](https://gitlab.com/psanan/petsc-sphinx-slides) contain an overview of Sphinx and how we use(d) it, as of October 2020.
19*4bcd95a3SBarry Smith
20*4bcd95a3SBarry Smith(sec_local_html_docs)=
21*4bcd95a3SBarry Smith
22*4bcd95a3SBarry Smith### Building the HTML docs locally
23*4bcd95a3SBarry Smith
24*4bcd95a3SBarry SmithWe use a [Python 3 virtual environment](https://docs.python.org/3/tutorial/venv.html) to build the documentation since not all developers can trivially install the needed Python modules directly.
25*4bcd95a3SBarry Smith
26*4bcd95a3SBarry Smith```console
27*4bcd95a3SBarry Smith$ cd $PETSC_DIR
28*4bcd95a3SBarry Smith$ make docs
29*4bcd95a3SBarry Smith$ open doc/_build/html/index.html  # in a browser
30*4bcd95a3SBarry Smith```
31*4bcd95a3SBarry Smith
32*4bcd95a3SBarry Smithor
33*4bcd95a3SBarry Smith
34*4bcd95a3SBarry Smith```console
35*4bcd95a3SBarry Smith$ cd $PETSC_DIR/doc
36*4bcd95a3SBarry Smith$ make sphinxhtml
37*4bcd95a3SBarry Smith$ open _build/html/index.html
38*4bcd95a3SBarry Smith```
39*4bcd95a3SBarry Smith
40*4bcd95a3SBarry Smith(sec_local_docs_latex)=
41*4bcd95a3SBarry Smith
42*4bcd95a3SBarry Smith### Building the manual locally as a PDF via LaTeX
43*4bcd95a3SBarry Smith
44*4bcd95a3SBarry Smith:::{admonition} Note
45*4bcd95a3SBarry SmithBefore following these instructions, you need to have a working
46*4bcd95a3SBarry Smithlocal LaTeX installation and the ability to install additional packages,
47*4bcd95a3SBarry Smithif need be, to resolve LaTeX errors.
48*4bcd95a3SBarry Smith:::
49*4bcd95a3SBarry Smith
50*4bcd95a3SBarry SmithSet up your local Python environment (e.g., ref:`as above <sec_local_html_docs>`), then
51*4bcd95a3SBarry Smith
52*4bcd95a3SBarry Smith```console
53*4bcd95a3SBarry Smith$ cd doc
54*4bcd95a3SBarry Smith$ make sphinxpdf
55*4bcd95a3SBarry Smith$ open _build/latex/manual.pdf  # in PDF viewer
56*4bcd95a3SBarry Smith```
57*4bcd95a3SBarry Smith
58*4bcd95a3SBarry Smith(sphinx_guidelines)=
59*4bcd95a3SBarry Smith
60*4bcd95a3SBarry Smith### Sphinx Documentation Guidelines
61*4bcd95a3SBarry Smith
62*4bcd95a3SBarry SmithRefer to Sphinx's [own documentation](https://https://www.sphinx-doc.org) for general information on how to use Sphinx, and note the following additional guidelines.
63*4bcd95a3SBarry Smith
64*4bcd95a3SBarry Smith- Use the [literalinclude directive](https://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html#directive-literalinclude) to directly include pieces of source code. Use a path beginning with `/`, relative to the root for the Sphinx docs (where `conf.py` is found).
65*4bcd95a3SBarry Smith
66*4bcd95a3SBarry Smith  ```rst
67*4bcd95a3SBarry Smith  .. literalinclude:: /../src/sys/error/err.c
68*4bcd95a3SBarry Smith     :start-at: PetscErrorCode PetscError(
69*4bcd95a3SBarry Smith     :end-at: PetscFunctionReturn(PETSC_SUCCESS)
70*4bcd95a3SBarry Smith     :append: }
71*4bcd95a3SBarry Smith  ```
72*4bcd95a3SBarry Smith
73*4bcd95a3SBarry Smith  For robustness to changes in the source files, Use `:start-at:` and related options when possible, noting that you can also use (positive) values of `:lines:` relative to this. Use the `:language:` option to appropriately highlight languages other than C.
74*4bcd95a3SBarry Smith
75*4bcd95a3SBarry Smith- Any invocable command line statements longer than a few words should be in
76*4bcd95a3SBarry Smith  `.. code-block::` sections. Double backticks must enclose any such statements not in code-block statements"\`\`". For example `make all` is acceptable but
77*4bcd95a3SBarry Smith
78*4bcd95a3SBarry Smith  ```console
79*4bcd95a3SBarry Smith  $ make PETSC_DIR=/my/path/to/petsc PETSC_ARCH=my-petsc-arch all
80*4bcd95a3SBarry Smith  ```
81*4bcd95a3SBarry Smith
82*4bcd95a3SBarry Smith  should be in a `.. code-block::`.
83*4bcd95a3SBarry Smith
84*4bcd95a3SBarry Smith- All code blocks showing command line invocation must use the "console" block
85*4bcd95a3SBarry Smith  directive. E.g.
86*4bcd95a3SBarry Smith
87*4bcd95a3SBarry Smith  ```rst
88*4bcd95a3SBarry Smith  .. code-block:: console
89*4bcd95a3SBarry Smith
90*4bcd95a3SBarry Smith     $ cd $PETSC_DIR/src/snes/interface
91*4bcd95a3SBarry Smith     $ ./someprog
92*4bcd95a3SBarry Smith     output1
93*4bcd95a3SBarry Smith     output2
94*4bcd95a3SBarry Smith  ```
95*4bcd95a3SBarry Smith
96*4bcd95a3SBarry Smith  The only exception to this is when displaying raw output, i.e., with no preceding
97*4bcd95a3SBarry Smith  commands. Then one may use just the "::" directive to improve visibility, e.g.,
98*4bcd95a3SBarry Smith
99*4bcd95a3SBarry Smith  ```rst
100*4bcd95a3SBarry Smith  ::
101*4bcd95a3SBarry Smith
102*4bcd95a3SBarry Smith     output1
103*4bcd95a3SBarry Smith     output2
104*4bcd95a3SBarry Smith  ```
105*4bcd95a3SBarry Smith
106*4bcd95a3SBarry Smith- Any code blocks that show command line invocations must be preceded by `$`, e.g.
107*4bcd95a3SBarry Smith
108*4bcd95a3SBarry Smith  ```rst
109*4bcd95a3SBarry Smith  .. code-block:: console
110*4bcd95a3SBarry Smith
111*4bcd95a3SBarry Smith     $ ./configure --some-args
112*4bcd95a3SBarry Smith     $ make libs
113*4bcd95a3SBarry Smith     $ make ./ex1
114*4bcd95a3SBarry Smith     $ ./ex1 --some-args
115*4bcd95a3SBarry Smith  ```
116*4bcd95a3SBarry Smith
117*4bcd95a3SBarry Smith- Environment variables such as `$PETSC_DIR` or `$PATH` must be preceded by
118*4bcd95a3SBarry Smith  `$` and be enclosed in double backticks, e.g.
119*4bcd95a3SBarry Smith
120*4bcd95a3SBarry Smith  ```rst
121*4bcd95a3SBarry Smith  Set ``$PETSC_DIR`` and ``$PETSC_ARCH``
122*4bcd95a3SBarry Smith  ```
123*4bcd95a3SBarry Smith
124*4bcd95a3SBarry Smith- For internal links, use explicit labels, e.g
125*4bcd95a3SBarry Smith
126*4bcd95a3SBarry Smith  ```rst
127*4bcd95a3SBarry Smith  .. _sec_short_name:
128*4bcd95a3SBarry Smith
129*4bcd95a3SBarry Smith  Section name
130*4bcd95a3SBarry Smith  ============
131*4bcd95a3SBarry Smith  ```
132*4bcd95a3SBarry Smith
133*4bcd95a3SBarry Smith  and elsewhere (in any document),
134*4bcd95a3SBarry Smith
135*4bcd95a3SBarry Smith  ```rst
136*4bcd95a3SBarry Smith  See :ref:`link text <sec_short_name>`
137*4bcd95a3SBarry Smith  ```
138*4bcd95a3SBarry Smith
139*4bcd95a3SBarry Smith- For internal links in the manual with targets outside the manual, always provide alt text
140*4bcd95a3SBarry Smith  so that the text will be properly formatted in the {ref}`standalone PDF manual <sec_local_docs_latex>`, e.g.
141*4bcd95a3SBarry Smith
142*4bcd95a3SBarry Smith  > ```rst
143*4bcd95a3SBarry Smith  > PETSc has :doc:`mailing lists </community/mailing>`.
144*4bcd95a3SBarry Smith  > ```
145*4bcd95a3SBarry Smith
146*4bcd95a3SBarry Smith- We use the [sphinxcontrib-bibtex extension](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/)
147*4bcd95a3SBarry Smith  to include citations from BibTeX files.
148*4bcd95a3SBarry Smith  You must include `.. bibliography::` blocks at the bottom of a page, including citations ([example](https://gitlab.com/petsc/petsc/-/raw/main/doc/manual/ksp.rst)).
149*4bcd95a3SBarry Smith  To cite the same reference on more than one page, use [this workaround](https://sphinxcontrib-bibtex.readthedocs.io/en/latest/usage.html#key-prefixing) on one of them ([example](https://gitlab.com/petsc/petsc/-/raw/main/doc/developers/articles.rst)) [^bibtex-footnote].
150*4bcd95a3SBarry Smith
151*4bcd95a3SBarry Smith- See special instructions on {any}`docs_images`.
152*4bcd95a3SBarry Smith
153*4bcd95a3SBarry Smith- Prefer formatting styles that are easy to modify and maintain. In particular, the use of [list-table](https://docutils.sourceforge.io/docs/ref/rst/directives.html#list-table) is recommended.
154*4bcd95a3SBarry Smith
155*4bcd95a3SBarry Smith- When using external links with inline URLs, prefer to use [anonymous hyperlink references](https://docutils.sourceforge.io/docs/ref/rst/restructuredtext.html#anonymous-hyperlinks) with two trailing underscores, e.g.
156*4bcd95a3SBarry Smith
157*4bcd95a3SBarry Smith  ```rst
158*4bcd95a3SBarry Smith  `link text <https://external.org>`__
159*4bcd95a3SBarry Smith  ```
160*4bcd95a3SBarry Smith
161*4bcd95a3SBarry Smith- To pluralize something with inline markup, e.g. `DM`s, escape the trailing character to avoid `WARNING: Inline literal start-string without end-string`.
162*4bcd95a3SBarry Smith
163*4bcd95a3SBarry Smith  ```rst
164*4bcd95a3SBarry Smith  ``DM``\s
165*4bcd95a3SBarry Smith  ```
166*4bcd95a3SBarry Smith
167*4bcd95a3SBarry Smith- Use restraint in adding new Sphinx extensions, in particular, those which aren't
168*4bcd95a3SBarry Smith  widely used and well-supported, or those with hidden system dependencies.
169*4bcd95a3SBarry Smith
170*4bcd95a3SBarry Smith(petsc_repositories)=
171*4bcd95a3SBarry Smith
172*4bcd95a3SBarry Smith## Other PETSc repositories
173*4bcd95a3SBarry Smith
174*4bcd95a3SBarry SmithIn addition to the [PETSc repository](https://gitlab.com/petsc/petsc), there are three other PETSc repositories which contain large data files that are unnecessary for most PETSc usages and thus
175*4bcd95a3SBarry Smithare not stored in the main repository. [Images](https://gitlab.com/petsc/images) contains images that are used in the PETSc documentation or have other uses. [Annual-Meetings](https://gitlab.com/petsc/annual-meetings) contains the slides etc. from the {any}`meetings`. [Datafiles](https://gitlab.com/petsc/datafiles) contains large matrices, meshes, and various other data files that are used in the {any}`PETSc CI<test_harness>`. Other repositories containing software PETSc uses are located at [GitLab](https://gitlab.com/petsc/) and [BitBucket](https://bitbucket.org/petsc/workspace/repositories). The BitBucket location is used for historical reasons, there are many links on the web to these locations thus the repositories have not be migrated to GitLab.
176*4bcd95a3SBarry Smith
177*4bcd95a3SBarry Smith(docs_images)=
178*4bcd95a3SBarry Smith
179*4bcd95a3SBarry Smith## Images
180*4bcd95a3SBarry Smith
181*4bcd95a3SBarry SmithPETSc's documentation is tightly coupled to the source code and tests and
182*4bcd95a3SBarry Smithis tracked in the primary PETSc Git repository. However, image files are
183*4bcd95a3SBarry Smithtoo large to track directly this way (especially because they persist in the integration branches' histories).
184*4bcd95a3SBarry Smith
185*4bcd95a3SBarry SmithTherefore, we store image files in a separate Git repository, [Images](https://gitlab.com/petsc/petsc). This repository is automatically cloned if
186*4bcd95a3SBarry Smithnot already available when building the documentation. It can also be cloned by running
187*4bcd95a3SBarry Smith`make images` in the `doc/` directory.
188*4bcd95a3SBarry SmithAny new images required must be added to the currently-used branch of this repository.
189*4bcd95a3SBarry Smith
190*4bcd95a3SBarry Smith### Image Guidelines
191*4bcd95a3SBarry Smith
192*4bcd95a3SBarry Smith- Whenever possible, use SVG files. SVG is a web-friendly vector format and will be automatically converted to PDF using `rsvg-convert` [^svg-footnote]
193*4bcd95a3SBarry Smith- Avoid large files and large numbers of images.
194*4bcd95a3SBarry Smith- Do not add movies or other non-image files.
195*4bcd95a3SBarry Smith
196*4bcd95a3SBarry Smith### Adding new images
197*4bcd95a3SBarry Smith
198*4bcd95a3SBarry Smith- Decide where in `doc/images` a new image should go. Use the structure of the `doc/` tree as a guide.
199*4bcd95a3SBarry Smith- Create a Merge Request to the currently-used branch of the upstream images repository, adding this image [^maintainer-fast-image-footnote].
200*4bcd95a3SBarry Smith- Once this Merge Request is merged, you may make a MR relying on the new image(s).
201*4bcd95a3SBarry Smith
202*4bcd95a3SBarry SmithIt may be helpful to place working copies of the new image(s) in your local `doc/images`
203*4bcd95a3SBarry Smithwhile iterating on documentation; don't forget to update the upstream images repository.
204*4bcd95a3SBarry Smith
205*4bcd95a3SBarry Smith### Removing, renaming, moving, or updating images
206*4bcd95a3SBarry Smith
207*4bcd95a3SBarry SmithDo not directly move, rename, or update images in the images repository.
208*4bcd95a3SBarry SmithSimply add a logically-numbered new version of the image.
209*4bcd95a3SBarry Smith
210*4bcd95a3SBarry SmithIf an image is not used in *any* {any}`integration branch <sec_integration_branches>` (`main` or `release`),
211*4bcd95a3SBarry Smithadd it to the top-level list of files to delete in the images repository.
212*4bcd95a3SBarry Smith
213*4bcd95a3SBarry Smith(docs_images_cleanup)=
214*4bcd95a3SBarry Smith
215*4bcd95a3SBarry Smith### Cleaning up the images repository (maintainers only)
216*4bcd95a3SBarry Smith
217*4bcd95a3SBarry SmithIf the size of the image repository grows too large,
218*4bcd95a3SBarry Smith
219*4bcd95a3SBarry Smith- Create a new branch `main-X`, where `X` increments the current value
220*4bcd95a3SBarry Smith- Create a new commit deleting all files in the to-delete list and clearing the list
221*4bcd95a3SBarry Smith- Reset the new `main-X` to a single commit with this new, cleaned-up state
222*4bcd95a3SBarry Smith- Set `main-X` as the "default" branch on GitLab.
223*4bcd95a3SBarry Smith- Update both `release` and `main` in the primary PETSc repository to clone this new branch
224*4bcd95a3SBarry Smith
225*4bcd95a3SBarry Smith(manpages_c2html_build)=
226*4bcd95a3SBarry Smith
227*4bcd95a3SBarry Smith## Building Manual Pages and C2HTML Files
228*4bcd95a3SBarry Smith
229*4bcd95a3SBarry SmithThe manual pages and C2HTML-generated file as built in a process described below using the documentation tools listed below, which are
230*4bcd95a3SBarry Smithautomatically downloaded and installed if needed while building the PETSc documentation./
231*4bcd95a3SBarry Smith
232*4bcd95a3SBarry Smith- [Sowing](https://bitbucket.org/petsc/pkg-sowing): Developed by Bill Gropp, this produces the PETSc manual pages; see the [Sowing documentation](http://wgropp.cs.illinois.edu/projects/software/sowing/doctext/doctext.htm) and {ref}`manual_page_format`.
233*4bcd95a3SBarry Smith- [C2html](https://gitlab.com/petsc/pkg-c2html): This generates the HTML versions of all the source code.
234*4bcd95a3SBarry Smith
235*4bcd95a3SBarry SmithSowing and C2html are build tools that do not use the compilers specified to PETSc's `configure`, as they
236*4bcd95a3SBarry Smithneed to work in cross-compilation environments. Thus, they default to using `gcc`, `g++`, and `flex` from
237*4bcd95a3SBarry Smiththe user's environment (or `configure` options like `--download-sowing-cxx`). Microsoft Windows users must install `gcc`
238*4bcd95a3SBarry Smithetc., from Cygwin in order to be able to build the documentation.
239*4bcd95a3SBarry Smith
240*4bcd95a3SBarry Smith```{rubric} Footnotes
241*4bcd95a3SBarry Smith```
242*4bcd95a3SBarry Smith
243*4bcd95a3SBarry Smith[^bibtex-footnote]: The extensions's [development branch](https://github.com/mcmtroffaes/sphinxcontrib-bibtex) [supports our use case better](https://github.com/mcmtroffaes/sphinxcontrib-bibtex/pull/185) (`:footcite:`), which can be investigated if a release is ever made. This stuff is now in the main repository but does not work as advertised from .md files.
244*4bcd95a3SBarry Smith
245*4bcd95a3SBarry Smith[^svg-footnote]: `rsvg-convert` is installable with your package manager, e.g., `librsvg2-bin` on Debian/Ubuntu systems).
246*4bcd95a3SBarry Smith
247*4bcd95a3SBarry Smith[^maintainer-fast-image-footnote]: Maintainers may directly push commits.
248