We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Update testing guide to reflect that repeat runs of tox are only a few seconds slower than pytest
The testing guide currently states that running tests with tox is slower because it needs to recreate an environment. More recent versions of tox are doing a better job at caching environments, so I'm finding now that running tests locally with tox is only about 3 seconds longer than running tests with pytest, except for the first tox run when it needs to recreate the environment.  Running tox also makes sure that the tests are done in a consistent environment, so I think we should recommend tox as the recommended way to run tests nowadays.  

(Incidentally, we might be able to use a tox-uv plugin which would speed up the creation of environments, but that's a separate issue.)

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `docs/_global_substitutions.py`
Content:
```
1 """
2 Global substitutions that can be used throughout PlasmaPy's
3 reStructuredText documentation, using the sphinxcontrib-globalsubs
4 extension to Sphinx.
5 
6 The substitutions are defined in ``global_substitutions``, which is then
7 imported in :file:`docs/conf.py` so that sphinxcontrib-globalsubs can
8 use it to define substitutions.
9 
10 The key to the dictionary is the name of the substitution. For example,
11 if the key is ``"particle-like"``, then it can be used as
12 ``|particle-like|`` throughout the documentation.
13 """
14 
15 plasmapy_subs: dict[str, str] = {
16     "atomic_number": ":func:`~plasmapy.particles.atomic.atomic_number`",
17     "atomic_symbol": ":func:`~plasmapy.particles.symbols.atomic_symbol`",
18     "charge_number": ":func:`~plasmapy.particles.atomic.charge_number`",
19     "ChargeError": ":class:`~plasmapy.particles.exceptions.ChargeError`",
20     "ClassicalTransport": ":class:`~plasmapy.formulary.braginskii.ClassicalTransport`",
21     "common_isotopes": ":func:`~plasmapy.particles.atomic.common_isotopes`",
22     "CustomParticle": ":class:`~plasmapy.particles.particle_class.CustomParticle`",
23     "DimensionlessParticle": ":class:`~plasmapy.particles.particle_class.DimensionlessParticle`",
24     "electric_charge": ":func:`~plasmapy.particles.atomic.electric_charge`",
25     "element_name": ":func:`~plasmapy.particles.symbols.element_name`",
26     "half_life": ":func:`~plasmapy.particles.atomic.half_life`",
27     "InvalidElementError": ":class:`~plasmapy.particles.exceptions.InvalidElementError`",
28     "InvalidIonError": ":class:`~plasmapy.particles.exceptions.InvalidIonError`",
29     "InvalidIsotopeError": ":class:`~plasmapy.particles.exceptions.InvalidIsotopeError`",
30     "InvalidParticleError": ":class:`~plasmapy.particles.exceptions.InvalidParticleError`",
31     "ionic_symbol": ":func:`~plasmapy.particles.symbols.ionic_symbol`",
32     "IonicLevel": ":class:`~plasmapy.particles.ionization_state.IonicLevel`",
33     "IonizationState": ":class:`~plasmapy.particles.ionization_state.IonizationState`",
34     "IonizationStateCollection": ":class:`~plasmapy.particles.ionization_state_collection.IonizationStateCollection`",
35     "is_stable": ":func:`~plasmapy.particles.atomic.is_stable`",
36     "isotope_symbol": ":func:`~plasmapy.particles.symbols.isotope_symbol`",
37     "isotopic_abundance": ":func:`~plasmapy.particles.atomic.isotopic_abundance`",
38     "known_isotopes": ":func:`~plasmapy.particles.atomic.known_isotopes`",
39     "Layer": "`~plasmapy.diagnostics.charged_particle_radiography.detector_stacks.Layer`",
40     "mass_number": ":func:`~plasmapy.particles.atomic.mass_number`",
41     "MissingParticleDataError": ":class:`~plasmapy.particles.exceptions.MissingParticleDataError`",
42     "MissingParticleDataWarning": ":class:`~plasmapy.particles.exceptions.MissingParticleDataWarning`",
43     "Particle": ":class:`~plasmapy.particles.particle_class.Particle`",
44     "particle_input": ":func:`~plasmapy.particles.decorators.particle_input`",
45     "particle_mass": ":func:`~plasmapy.particles.atomic.particle_mass`",
46     "particle_symbol": ":func:`~plasmapy.particles.symbols.particle_symbol`",
47     "ParticleError": ":class:`~plasmapy.particles.exceptions.ParticleError`",
48     "ParticleLike": ":obj:`~plasmapy.particles.particle_class.ParticleLike`",
49     "ParticleList": ":class:`~plasmapy.particles.particle_collections.ParticleList`",
50     "ParticleListLike": ":obj:`~plasmapy.particles.particle_collections.ParticleListLike`",
51     "ParticleTracker": ":class:`~plasmapy.simulation.particle_tracker.ParticleTracker`",
52     "ParticleWarning": ":class:`~plasmapy.particles.exceptions.ParticleWarning`",
53     "reduced_mass": ":func:`~plasmapy.particles.atomic.reduced_mass`",
54     "RelativisticBody": ":class:`~plasmapy.formulary.relativity.RelativisticBody`",
55     "SingleParticleCollisionFrequencies": ":class:`~plasmapy.formulary.collisions.frequencies.SingleParticleCollisionFrequencies`",
56     "stable_isotopes": ":func:`~plasmapy.particles.atomic.stable_isotopes`",
57     "standard_atomic_weight": ":func:`~plasmapy.particles.atomic.standard_atomic_weight`",
58     "UnexpectedParticleError": ":class:`~plasmapy.particles.exceptions.UnexpectedParticleError`",
59     "validate_quantities": ":func:`~plasmapy.utils.decorators.validators.validate_quantities`",
60 }
61 
62 # The backslash is needed for the substitution to work correctly when
63 # used just before a period.
64 
65 doc_subs: dict[str, str] = {
66     "annotated": r":term:`annotated <annotation>`\ ",
67     "annotation": r":term:`annotation`\ ",
68     "argument": r":term:`argument`\ ",
69     "arguments": r":term:`arguments <argument>`\ ",
70     "atom-like": r":term:`atom-like`\ ",
71     "bibliography": r":ref:`bibliography`\ ",
72     "changelog guide": r":ref:`changelog guide`\ ",
73     "charge number": r":term:`charge number`\ ",
74     "code contribution workflow": r":ref:`code contribution workflow <workflow>`\ ",
75     "coding guide": r":ref:`coding guide`\ ",
76     "contributor guide": r":ref:`contributor guide`\ ",
77     "decorated": r":term:`decorated <decorator>`\ ",
78     "decorator": r":term:`decorator`\ ",
79     "documentation guide": r":ref:`documentation guide`\ ",
80     "expect-api-changes": "This functionality is under development. Backward incompatible changes might occur in future releases.",
81     "getting ready to contribute": r":ref:`getting ready to contribute`\ ",
82     "glossary": r":ref:`glossary`\ ",
83     "keyword-only": r":term:`keyword-only`\ ",
84     "lite-function": r":term:`lite-function`\ ",
85     "lite-functions": r":term:`lite-functions`\ ",
86     "maxpython": "3.12",
87     "minpython": "3.10",
88     "Open a terminal": r":ref:`Open a terminal <opening-a-terminal>`\ ",
89     "parameter": r":term:`parameter`\ ",
90     "parameters": r":term:`parameters <parameter>`\ ",
91     "particle-like": r":term:`particle-like`\ ",
92     "particle-list-like": r":term:`particle-list-like`\ ",
93     "plasma-calculator": r":ref:`plasmapy-calculator`\ ",
94     "release guide": r":ref:`release guide`\ ",
95     "src/plasmapy/": r":file:`src/plasmapy/`\ ",
96     "testing guide": r":ref:`testing guide`\ ",
97     "tests/": r":file:`tests/`\ ",
98 }
99 
100 numpy_subs: dict[str, str] = {
101     "array_like": ":term:`numpy:array_like`",
102     "DTypeLike": "`~numpy.typing.DTypeLike`",
103     "inf": "`~numpy.inf`",
104     "nan": "`~numpy.nan`",
105     "ndarray": ":class:`~numpy.ndarray`",
106 }
107 
108 astropy_subs: dict[str, str] = {
109     "Quantity": ":class:`~astropy.units.Quantity`",
110 }
111 
112 # Because sphinxcontrib-globalsubs does not work for regular reStructuredText
113 # links, we first define the links and then process them afterwards into
114 # the form of a reStructuredText external link.
115 
116 links_to_become_subs: dict[str, str] = {
117     "Astropy": "https://docs.astropy.org",
118     "black": "https://black.readthedocs.io",
119     "Citation File Format": "https://citation-file-format.github.io/",
120     "DOI": "https://www.doi.org",
121     "editable installation": "https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs",
122     "git": "https://git-scm.com",
123     "GitHub Actions": "https://docs.github.com/en/actions",
124     "GitHub": "https://github.com",
125     "h5py": "https://www.h5py.org",
126     "intersphinx": "https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html",
127     "isort": "https://pycqa.github.io/isort",
128     "Jupyter": "https://jupyter.org",
129     "lmfit": "https://lmfit.github.io/lmfit-py/",
130     "matplotlib": "https://matplotlib.org",
131     "Matrix chat room": "https://app.element.io/#/room/#plasmapy:openastronomy.org",
132     "mpmath": "https://mpmath.org/doc/current",
133     "mypy": "https://mypy.readthedocs.io",
134     "nbsphinx": "https://nbsphinx.readthedocs.io",
135     "nox": "https://nox.thea.codes",
136     "Numba": "https://numba.readthedocs.io",
137     "NumPy": "https://numpy.org",
138     "office hours": "https://www.plasmapy.org/meetings/office_hours/",
139     "pandas": "https://pandas.pydata.org",
140     "pip": "https://pip.pypa.io",
141     "Plasma Hack Week": "https://hack.plasmapy.org",
142     "PlasmaPy": "https://www.plasmapy.org",
143     "PlasmaPy's data repository": "https://github.com/PlasmaPy/PlasmaPy-data",
144     "PlasmaPy's documentation": "https://docs.plasmapy.org/en/stable",
145     "PlasmaPy's GitHub repository": "https://github.com/PlasmaPy/plasmapy",
146     "PlasmaPy's Matrix chat room": "https://app.element.io/#/room/#plasmapy:openastronomy.org",
147     "PlasmaPy's website": "https://www.plasmapy.org",
148     "pre-commit": "https://pre-commit.com",
149     "pygments": "https://pygments.org",
150     "PyPI": "https://pypi.org",
151     "pytest": "https://docs.pytest.org",
152     "Python": "https://www.python.org",
153     "Python's documentation": "https://docs.python.org/3",
154     "Read the Docs": "https://about.readthedocs.com/",
155     "reStructuredText": "https://docutils.sourceforge.io/rst.html",
156     "ruff": "https://docs.astral.sh/ruff",
157     "SciPy": "https://scipy.org",
158     "Sphinx": "https://www.sphinx-doc.org",
159     "static type checking": "https://realpython.com/lessons/python-type-checking-overview",
160     "towncrier": "https://github.com/twisted/towncrier",
161     "tox": "https://tox.wiki/en/latest",
162     "type hint annotations": "https://peps.python.org/pep-0484",
163     "xarray": "https://docs.xarray.dev",
164     "Zenodo": "https://zenodo.org",
165     "uv": "https://github.com/astral-sh/uv",
166 }
167 
168 link_subs = {key: f"`{key} <{value}>`_" for key, value in links_to_become_subs.items()}
169 
170 global_substitutions = plasmapy_subs | doc_subs | numpy_subs | astropy_subs | link_subs
171
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/docs/_global_substitutions.py b/docs/_global_substitutions.py
--- a/docs/_global_substitutions.py
+++ b/docs/_global_substitutions.py
@@ -85,6 +85,7 @@
     "lite-functions": r":term:`lite-functions`\ ",
     "maxpython": "3.12",
     "minpython": "3.10",
+    "open a terminal": r":ref:`open a terminal <opening-a-terminal>`\ ",
     "Open a terminal": r":ref:`Open a terminal <opening-a-terminal>`\ ",
     "parameter": r":term:`parameter`\ ",
     "parameters": r":term:`parameters <parameter>`\ ",

{"golden_diff": "diff --git a/docs/_global_substitutions.py b/docs/_global_substitutions.py\n--- a/docs/_global_substitutions.py\n+++ b/docs/_global_substitutions.py\n@@ -85,6 +85,7 @@\n     \"lite-functions\": r\":term:`lite-functions`\\ \",\n     \"maxpython\": \"3.12\",\n     \"minpython\": \"3.10\",\n+    \"open a terminal\": r\":ref:`open a terminal <opening-a-terminal>`\\ \",\n     \"Open a terminal\": r\":ref:`Open a terminal <opening-a-terminal>`\\ \",\n     \"parameter\": r\":term:`parameter`\\ \",\n     \"parameters\": r\":term:`parameters <parameter>`\\ \",\n", "issue": "Update testing guide to reflect that repeat runs of tox are only a few seconds slower than pytest\nThe testing guide currently states that running tests with tox is slower because it needs to recreate an environment. More recent versions of tox are doing a better job at caching environments, so I'm finding now that running tests locally with tox is only about 3 seconds longer than running tests with pytest, except for the first tox run when it needs to recreate the environment.  Running tox also makes sure that the tests are done in a consistent environment, so I think we should recommend tox as the recommended way to run tests nowadays.  \r\n\r\n(Incidentally, we might be able to use a tox-uv plugin which would speed up the creation of environments, but that's a separate issue.)\n", "before_files": [{"content": "\"\"\"\nGlobal substitutions that can be used throughout PlasmaPy's\nreStructuredText documentation, using the sphinxcontrib-globalsubs\nextension to Sphinx.\n\nThe substitutions are defined in ``global_substitutions``, which is then\nimported in :file:`docs/conf.py` so that sphinxcontrib-globalsubs can\nuse it to define substitutions.\n\nThe key to the dictionary is the name of the substitution. For example,\nif the key is ``\"particle-like\"``, then it can be used as\n``|particle-like|`` throughout the documentation.\n\"\"\"\n\nplasmapy_subs: dict[str, str] = {\n    \"atomic_number\": \":func:`~plasmapy.particles.atomic.atomic_number`\",\n    \"atomic_symbol\": \":func:`~plasmapy.particles.symbols.atomic_symbol`\",\n    \"charge_number\": \":func:`~plasmapy.particles.atomic.charge_number`\",\n    \"ChargeError\": \":class:`~plasmapy.particles.exceptions.ChargeError`\",\n    \"ClassicalTransport\": \":class:`~plasmapy.formulary.braginskii.ClassicalTransport`\",\n    \"common_isotopes\": \":func:`~plasmapy.particles.atomic.common_isotopes`\",\n    \"CustomParticle\": \":class:`~plasmapy.particles.particle_class.CustomParticle`\",\n    \"DimensionlessParticle\": \":class:`~plasmapy.particles.particle_class.DimensionlessParticle`\",\n    \"electric_charge\": \":func:`~plasmapy.particles.atomic.electric_charge`\",\n    \"element_name\": \":func:`~plasmapy.particles.symbols.element_name`\",\n    \"half_life\": \":func:`~plasmapy.particles.atomic.half_life`\",\n    \"InvalidElementError\": \":class:`~plasmapy.particles.exceptions.InvalidElementError`\",\n    \"InvalidIonError\": \":class:`~plasmapy.particles.exceptions.InvalidIonError`\",\n    \"InvalidIsotopeError\": \":class:`~plasmapy.particles.exceptions.InvalidIsotopeError`\",\n    \"InvalidParticleError\": \":class:`~plasmapy.particles.exceptions.InvalidParticleError`\",\n    \"ionic_symbol\": \":func:`~plasmapy.particles.symbols.ionic_symbol`\",\n    \"IonicLevel\": \":class:`~plasmapy.particles.ionization_state.IonicLevel`\",\n    \"IonizationState\": \":class:`~plasmapy.particles.ionization_state.IonizationState`\",\n    \"IonizationStateCollection\": \":class:`~plasmapy.particles.ionization_state_collection.IonizationStateCollection`\",\n    \"is_stable\": \":func:`~plasmapy.particles.atomic.is_stable`\",\n    \"isotope_symbol\": \":func:`~plasmapy.particles.symbols.isotope_symbol`\",\n    \"isotopic_abundance\": \":func:`~plasmapy.particles.atomic.isotopic_abundance`\",\n    \"known_isotopes\": \":func:`~plasmapy.particles.atomic.known_isotopes`\",\n    \"Layer\": \"`~plasmapy.diagnostics.charged_particle_radiography.detector_stacks.Layer`\",\n    \"mass_number\": \":func:`~plasmapy.particles.atomic.mass_number`\",\n    \"MissingParticleDataError\": \":class:`~plasmapy.particles.exceptions.MissingParticleDataError`\",\n    \"MissingParticleDataWarning\": \":class:`~plasmapy.particles.exceptions.MissingParticleDataWarning`\",\n    \"Particle\": \":class:`~plasmapy.particles.particle_class.Particle`\",\n    \"particle_input\": \":func:`~plasmapy.particles.decorators.particle_input`\",\n    \"particle_mass\": \":func:`~plasmapy.particles.atomic.particle_mass`\",\n    \"particle_symbol\": \":func:`~plasmapy.particles.symbols.particle_symbol`\",\n    \"ParticleError\": \":class:`~plasmapy.particles.exceptions.ParticleError`\",\n    \"ParticleLike\": \":obj:`~plasmapy.particles.particle_class.ParticleLike`\",\n    \"ParticleList\": \":class:`~plasmapy.particles.particle_collections.ParticleList`\",\n    \"ParticleListLike\": \":obj:`~plasmapy.particles.particle_collections.ParticleListLike`\",\n    \"ParticleTracker\": \":class:`~plasmapy.simulation.particle_tracker.ParticleTracker`\",\n    \"ParticleWarning\": \":class:`~plasmapy.particles.exceptions.ParticleWarning`\",\n    \"reduced_mass\": \":func:`~plasmapy.particles.atomic.reduced_mass`\",\n    \"RelativisticBody\": \":class:`~plasmapy.formulary.relativity.RelativisticBody`\",\n    \"SingleParticleCollisionFrequencies\": \":class:`~plasmapy.formulary.collisions.frequencies.SingleParticleCollisionFrequencies`\",\n    \"stable_isotopes\": \":func:`~plasmapy.particles.atomic.stable_isotopes`\",\n    \"standard_atomic_weight\": \":func:`~plasmapy.particles.atomic.standard_atomic_weight`\",\n    \"UnexpectedParticleError\": \":class:`~plasmapy.particles.exceptions.UnexpectedParticleError`\",\n    \"validate_quantities\": \":func:`~plasmapy.utils.decorators.validators.validate_quantities`\",\n}\n\n# The backslash is needed for the substitution to work correctly when\n# used just before a period.\n\ndoc_subs: dict[str, str] = {\n    \"annotated\": r\":term:`annotated <annotation>`\\ \",\n    \"annotation\": r\":term:`annotation`\\ \",\n    \"argument\": r\":term:`argument`\\ \",\n    \"arguments\": r\":term:`arguments <argument>`\\ \",\n    \"atom-like\": r\":term:`atom-like`\\ \",\n    \"bibliography\": r\":ref:`bibliography`\\ \",\n    \"changelog guide\": r\":ref:`changelog guide`\\ \",\n    \"charge number\": r\":term:`charge number`\\ \",\n    \"code contribution workflow\": r\":ref:`code contribution workflow <workflow>`\\ \",\n    \"coding guide\": r\":ref:`coding guide`\\ \",\n    \"contributor guide\": r\":ref:`contributor guide`\\ \",\n    \"decorated\": r\":term:`decorated <decorator>`\\ \",\n    \"decorator\": r\":term:`decorator`\\ \",\n    \"documentation guide\": r\":ref:`documentation guide`\\ \",\n    \"expect-api-changes\": \"This functionality is under development. Backward incompatible changes might occur in future releases.\",\n    \"getting ready to contribute\": r\":ref:`getting ready to contribute`\\ \",\n    \"glossary\": r\":ref:`glossary`\\ \",\n    \"keyword-only\": r\":term:`keyword-only`\\ \",\n    \"lite-function\": r\":term:`lite-function`\\ \",\n    \"lite-functions\": r\":term:`lite-functions`\\ \",\n    \"maxpython\": \"3.12\",\n    \"minpython\": \"3.10\",\n    \"Open a terminal\": r\":ref:`Open a terminal <opening-a-terminal>`\\ \",\n    \"parameter\": r\":term:`parameter`\\ \",\n    \"parameters\": r\":term:`parameters <parameter>`\\ \",\n    \"particle-like\": r\":term:`particle-like`\\ \",\n    \"particle-list-like\": r\":term:`particle-list-like`\\ \",\n    \"plasma-calculator\": r\":ref:`plasmapy-calculator`\\ \",\n    \"release guide\": r\":ref:`release guide`\\ \",\n    \"src/plasmapy/\": r\":file:`src/plasmapy/`\\ \",\n    \"testing guide\": r\":ref:`testing guide`\\ \",\n    \"tests/\": r\":file:`tests/`\\ \",\n}\n\nnumpy_subs: dict[str, str] = {\n    \"array_like\": \":term:`numpy:array_like`\",\n    \"DTypeLike\": \"`~numpy.typing.DTypeLike`\",\n    \"inf\": \"`~numpy.inf`\",\n    \"nan\": \"`~numpy.nan`\",\n    \"ndarray\": \":class:`~numpy.ndarray`\",\n}\n\nastropy_subs: dict[str, str] = {\n    \"Quantity\": \":class:`~astropy.units.Quantity`\",\n}\n\n# Because sphinxcontrib-globalsubs does not work for regular reStructuredText\n# links, we first define the links and then process them afterwards into\n# the form of a reStructuredText external link.\n\nlinks_to_become_subs: dict[str, str] = {\n    \"Astropy\": \"https://docs.astropy.org\",\n    \"black\": \"https://black.readthedocs.io\",\n    \"Citation File Format\": \"https://citation-file-format.github.io/\",\n    \"DOI\": \"https://www.doi.org\",\n    \"editable installation\": \"https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs\",\n    \"git\": \"https://git-scm.com\",\n    \"GitHub Actions\": \"https://docs.github.com/en/actions\",\n    \"GitHub\": \"https://github.com\",\n    \"h5py\": \"https://www.h5py.org\",\n    \"intersphinx\": \"https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html\",\n    \"isort\": \"https://pycqa.github.io/isort\",\n    \"Jupyter\": \"https://jupyter.org\",\n    \"lmfit\": \"https://lmfit.github.io/lmfit-py/\",\n    \"matplotlib\": \"https://matplotlib.org\",\n    \"Matrix chat room\": \"https://app.element.io/#/room/#plasmapy:openastronomy.org\",\n    \"mpmath\": \"https://mpmath.org/doc/current\",\n    \"mypy\": \"https://mypy.readthedocs.io\",\n    \"nbsphinx\": \"https://nbsphinx.readthedocs.io\",\n    \"nox\": \"https://nox.thea.codes\",\n    \"Numba\": \"https://numba.readthedocs.io\",\n    \"NumPy\": \"https://numpy.org\",\n    \"office hours\": \"https://www.plasmapy.org/meetings/office_hours/\",\n    \"pandas\": \"https://pandas.pydata.org\",\n    \"pip\": \"https://pip.pypa.io\",\n    \"Plasma Hack Week\": \"https://hack.plasmapy.org\",\n    \"PlasmaPy\": \"https://www.plasmapy.org\",\n    \"PlasmaPy's data repository\": \"https://github.com/PlasmaPy/PlasmaPy-data\",\n    \"PlasmaPy's documentation\": \"https://docs.plasmapy.org/en/stable\",\n    \"PlasmaPy's GitHub repository\": \"https://github.com/PlasmaPy/plasmapy\",\n    \"PlasmaPy's Matrix chat room\": \"https://app.element.io/#/room/#plasmapy:openastronomy.org\",\n    \"PlasmaPy's website\": \"https://www.plasmapy.org\",\n    \"pre-commit\": \"https://pre-commit.com\",\n    \"pygments\": \"https://pygments.org\",\n    \"PyPI\": \"https://pypi.org\",\n    \"pytest\": \"https://docs.pytest.org\",\n    \"Python\": \"https://www.python.org\",\n    \"Python's documentation\": \"https://docs.python.org/3\",\n    \"Read the Docs\": \"https://about.readthedocs.com/\",\n    \"reStructuredText\": \"https://docutils.sourceforge.io/rst.html\",\n    \"ruff\": \"https://docs.astral.sh/ruff\",\n    \"SciPy\": \"https://scipy.org\",\n    \"Sphinx\": \"https://www.sphinx-doc.org\",\n    \"static type checking\": \"https://realpython.com/lessons/python-type-checking-overview\",\n    \"towncrier\": \"https://github.com/twisted/towncrier\",\n    \"tox\": \"https://tox.wiki/en/latest\",\n    \"type hint annotations\": \"https://peps.python.org/pep-0484\",\n    \"xarray\": \"https://docs.xarray.dev\",\n    \"Zenodo\": \"https://zenodo.org\",\n    \"uv\": \"https://github.com/astral-sh/uv\",\n}\n\nlink_subs = {key: f\"`{key} <{value}>`_\" for key, value in links_to_become_subs.items()}\n\nglobal_substitutions = plasmapy_subs | doc_subs | numpy_subs | astropy_subs | link_subs\n", "path": "docs/_global_substitutions.py"}], "after_files": [{"content": "\"\"\"\nGlobal substitutions that can be used throughout PlasmaPy's\nreStructuredText documentation, using the sphinxcontrib-globalsubs\nextension to Sphinx.\n\nThe substitutions are defined in ``global_substitutions``, which is then\nimported in :file:`docs/conf.py` so that sphinxcontrib-globalsubs can\nuse it to define substitutions.\n\nThe key to the dictionary is the name of the substitution. For example,\nif the key is ``\"particle-like\"``, then it can be used as\n``|particle-like|`` throughout the documentation.\n\"\"\"\n\nplasmapy_subs: dict[str, str] = {\n    \"atomic_number\": \":func:`~plasmapy.particles.atomic.atomic_number`\",\n    \"atomic_symbol\": \":func:`~plasmapy.particles.symbols.atomic_symbol`\",\n    \"charge_number\": \":func:`~plasmapy.particles.atomic.charge_number`\",\n    \"ChargeError\": \":class:`~plasmapy.particles.exceptions.ChargeError`\",\n    \"ClassicalTransport\": \":class:`~plasmapy.formulary.braginskii.ClassicalTransport`\",\n    \"common_isotopes\": \":func:`~plasmapy.particles.atomic.common_isotopes`\",\n    \"CustomParticle\": \":class:`~plasmapy.particles.particle_class.CustomParticle`\",\n    \"DimensionlessParticle\": \":class:`~plasmapy.particles.particle_class.DimensionlessParticle`\",\n    \"electric_charge\": \":func:`~plasmapy.particles.atomic.electric_charge`\",\n    \"element_name\": \":func:`~plasmapy.particles.symbols.element_name`\",\n    \"half_life\": \":func:`~plasmapy.particles.atomic.half_life`\",\n    \"InvalidElementError\": \":class:`~plasmapy.particles.exceptions.InvalidElementError`\",\n    \"InvalidIonError\": \":class:`~plasmapy.particles.exceptions.InvalidIonError`\",\n    \"InvalidIsotopeError\": \":class:`~plasmapy.particles.exceptions.InvalidIsotopeError`\",\n    \"InvalidParticleError\": \":class:`~plasmapy.particles.exceptions.InvalidParticleError`\",\n    \"ionic_symbol\": \":func:`~plasmapy.particles.symbols.ionic_symbol`\",\n    \"IonicLevel\": \":class:`~plasmapy.particles.ionization_state.IonicLevel`\",\n    \"IonizationState\": \":class:`~plasmapy.particles.ionization_state.IonizationState`\",\n    \"IonizationStateCollection\": \":class:`~plasmapy.particles.ionization_state_collection.IonizationStateCollection`\",\n    \"is_stable\": \":func:`~plasmapy.particles.atomic.is_stable`\",\n    \"isotope_symbol\": \":func:`~plasmapy.particles.symbols.isotope_symbol`\",\n    \"isotopic_abundance\": \":func:`~plasmapy.particles.atomic.isotopic_abundance`\",\n    \"known_isotopes\": \":func:`~plasmapy.particles.atomic.known_isotopes`\",\n    \"Layer\": \"`~plasmapy.diagnostics.charged_particle_radiography.detector_stacks.Layer`\",\n    \"mass_number\": \":func:`~plasmapy.particles.atomic.mass_number`\",\n    \"MissingParticleDataError\": \":class:`~plasmapy.particles.exceptions.MissingParticleDataError`\",\n    \"MissingParticleDataWarning\": \":class:`~plasmapy.particles.exceptions.MissingParticleDataWarning`\",\n    \"Particle\": \":class:`~plasmapy.particles.particle_class.Particle`\",\n    \"particle_input\": \":func:`~plasmapy.particles.decorators.particle_input`\",\n    \"particle_mass\": \":func:`~plasmapy.particles.atomic.particle_mass`\",\n    \"particle_symbol\": \":func:`~plasmapy.particles.symbols.particle_symbol`\",\n    \"ParticleError\": \":class:`~plasmapy.particles.exceptions.ParticleError`\",\n    \"ParticleLike\": \":obj:`~plasmapy.particles.particle_class.ParticleLike`\",\n    \"ParticleList\": \":class:`~plasmapy.particles.particle_collections.ParticleList`\",\n    \"ParticleListLike\": \":obj:`~plasmapy.particles.particle_collections.ParticleListLike`\",\n    \"ParticleTracker\": \":class:`~plasmapy.simulation.particle_tracker.ParticleTracker`\",\n    \"ParticleWarning\": \":class:`~plasmapy.particles.exceptions.ParticleWarning`\",\n    \"reduced_mass\": \":func:`~plasmapy.particles.atomic.reduced_mass`\",\n    \"RelativisticBody\": \":class:`~plasmapy.formulary.relativity.RelativisticBody`\",\n    \"SingleParticleCollisionFrequencies\": \":class:`~plasmapy.formulary.collisions.frequencies.SingleParticleCollisionFrequencies`\",\n    \"stable_isotopes\": \":func:`~plasmapy.particles.atomic.stable_isotopes`\",\n    \"standard_atomic_weight\": \":func:`~plasmapy.particles.atomic.standard_atomic_weight`\",\n    \"UnexpectedParticleError\": \":class:`~plasmapy.particles.exceptions.UnexpectedParticleError`\",\n    \"validate_quantities\": \":func:`~plasmapy.utils.decorators.validators.validate_quantities`\",\n}\n\n# The backslash is needed for the substitution to work correctly when\n# used just before a period.\n\ndoc_subs: dict[str, str] = {\n    \"annotated\": r\":term:`annotated <annotation>`\\ \",\n    \"annotation\": r\":term:`annotation`\\ \",\n    \"argument\": r\":term:`argument`\\ \",\n    \"arguments\": r\":term:`arguments <argument>`\\ \",\n    \"atom-like\": r\":term:`atom-like`\\ \",\n    \"bibliography\": r\":ref:`bibliography`\\ \",\n    \"changelog guide\": r\":ref:`changelog guide`\\ \",\n    \"charge number\": r\":term:`charge number`\\ \",\n    \"code contribution workflow\": r\":ref:`code contribution workflow <workflow>`\\ \",\n    \"coding guide\": r\":ref:`coding guide`\\ \",\n    \"contributor guide\": r\":ref:`contributor guide`\\ \",\n    \"decorated\": r\":term:`decorated <decorator>`\\ \",\n    \"decorator\": r\":term:`decorator`\\ \",\n    \"documentation guide\": r\":ref:`documentation guide`\\ \",\n    \"expect-api-changes\": \"This functionality is under development. Backward incompatible changes might occur in future releases.\",\n    \"getting ready to contribute\": r\":ref:`getting ready to contribute`\\ \",\n    \"glossary\": r\":ref:`glossary`\\ \",\n    \"keyword-only\": r\":term:`keyword-only`\\ \",\n    \"lite-function\": r\":term:`lite-function`\\ \",\n    \"lite-functions\": r\":term:`lite-functions`\\ \",\n    \"maxpython\": \"3.12\",\n    \"minpython\": \"3.10\",\n    \"open a terminal\": r\":ref:`open a terminal <opening-a-terminal>`\\ \",\n    \"Open a terminal\": r\":ref:`Open a terminal <opening-a-terminal>`\\ \",\n    \"parameter\": r\":term:`parameter`\\ \",\n    \"parameters\": r\":term:`parameters <parameter>`\\ \",\n    \"particle-like\": r\":term:`particle-like`\\ \",\n    \"particle-list-like\": r\":term:`particle-list-like`\\ \",\n    \"plasma-calculator\": r\":ref:`plasmapy-calculator`\\ \",\n    \"release guide\": r\":ref:`release guide`\\ \",\n    \"src/plasmapy/\": r\":file:`src/plasmapy/`\\ \",\n    \"testing guide\": r\":ref:`testing guide`\\ \",\n    \"tests/\": r\":file:`tests/`\\ \",\n}\n\nnumpy_subs: dict[str, str] = {\n    \"array_like\": \":term:`numpy:array_like`\",\n    \"DTypeLike\": \"`~numpy.typing.DTypeLike`\",\n    \"inf\": \"`~numpy.inf`\",\n    \"nan\": \"`~numpy.nan`\",\n    \"ndarray\": \":class:`~numpy.ndarray`\",\n}\n\nastropy_subs: dict[str, str] = {\n    \"Quantity\": \":class:`~astropy.units.Quantity`\",\n}\n\n# Because sphinxcontrib-globalsubs does not work for regular reStructuredText\n# links, we first define the links and then process them afterwards into\n# the form of a reStructuredText external link.\n\nlinks_to_become_subs: dict[str, str] = {\n    \"Astropy\": \"https://docs.astropy.org\",\n    \"black\": \"https://black.readthedocs.io\",\n    \"Citation File Format\": \"https://citation-file-format.github.io/\",\n    \"DOI\": \"https://www.doi.org\",\n    \"editable installation\": \"https://pip.pypa.io/en/stable/topics/local-project-installs/#editable-installs\",\n    \"git\": \"https://git-scm.com\",\n    \"GitHub Actions\": \"https://docs.github.com/en/actions\",\n    \"GitHub\": \"https://github.com\",\n    \"h5py\": \"https://www.h5py.org\",\n    \"intersphinx\": \"https://www.sphinx-doc.org/en/master/usage/extensions/intersphinx.html\",\n    \"isort\": \"https://pycqa.github.io/isort\",\n    \"Jupyter\": \"https://jupyter.org\",\n    \"lmfit\": \"https://lmfit.github.io/lmfit-py/\",\n    \"matplotlib\": \"https://matplotlib.org\",\n    \"Matrix chat room\": \"https://app.element.io/#/room/#plasmapy:openastronomy.org\",\n    \"mpmath\": \"https://mpmath.org/doc/current\",\n    \"mypy\": \"https://mypy.readthedocs.io\",\n    \"nbsphinx\": \"https://nbsphinx.readthedocs.io\",\n    \"nox\": \"https://nox.thea.codes\",\n    \"Numba\": \"https://numba.readthedocs.io\",\n    \"NumPy\": \"https://numpy.org\",\n    \"office hours\": \"https://www.plasmapy.org/meetings/office_hours/\",\n    \"pandas\": \"https://pandas.pydata.org\",\n    \"pip\": \"https://pip.pypa.io\",\n    \"Plasma Hack Week\": \"https://hack.plasmapy.org\",\n    \"PlasmaPy\": \"https://www.plasmapy.org\",\n    \"PlasmaPy's data repository\": \"https://github.com/PlasmaPy/PlasmaPy-data\",\n    \"PlasmaPy's documentation\": \"https://docs.plasmapy.org/en/stable\",\n    \"PlasmaPy's GitHub repository\": \"https://github.com/PlasmaPy/plasmapy\",\n    \"PlasmaPy's Matrix chat room\": \"https://app.element.io/#/room/#plasmapy:openastronomy.org\",\n    \"PlasmaPy's website\": \"https://www.plasmapy.org\",\n    \"pre-commit\": \"https://pre-commit.com\",\n    \"pygments\": \"https://pygments.org\",\n    \"PyPI\": \"https://pypi.org\",\n    \"pytest\": \"https://docs.pytest.org\",\n    \"Python\": \"https://www.python.org\",\n    \"Python's documentation\": \"https://docs.python.org/3\",\n    \"Read the Docs\": \"https://about.readthedocs.com/\",\n    \"reStructuredText\": \"https://docutils.sourceforge.io/rst.html\",\n    \"ruff\": \"https://docs.astral.sh/ruff\",\n    \"SciPy\": \"https://scipy.org\",\n    \"Sphinx\": \"https://www.sphinx-doc.org\",\n    \"static type checking\": \"https://realpython.com/lessons/python-type-checking-overview\",\n    \"towncrier\": \"https://github.com/twisted/towncrier\",\n    \"tox\": \"https://tox.wiki/en/latest\",\n    \"type hint annotations\": \"https://peps.python.org/pep-0484\",\n    \"xarray\": \"https://docs.xarray.dev\",\n    \"Zenodo\": \"https://zenodo.org\",\n    \"uv\": \"https://github.com/astral-sh/uv\",\n}\n\nlink_subs = {key: f\"`{key} <{value}>`_\" for key, value in links_to_become_subs.items()}\n\nglobal_substitutions = plasmapy_subs | doc_subs | numpy_subs | astropy_subs | link_subs\n", "path": "docs/_global_substitutions.py"}]}