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