Sphinx-Quickstart¶
Um ein neues Sphinx-Projekt zu starten, kann man entweder einen bestehenden
Projekt-Ordner kopieren und modifizieren, oder ein neues Verzeichnis anlegen und
in diesem mittels der Shell-Anweisung sphinx-quickstart
ein neues
Grundgerüst erstellen:
# Projekt-Verzeichnis anlegen
mkdir projektordner
cd projektordner
# Neues Sphinx-Projekt starten:
sphinx-quickstart
Sphinx erstellt daraufhin einige notwendige Hilfsdateien, beispielsweise eine
Makefile und eine Konfigurationsdatei namens conf.py
,
in der auch zu einem späteren Zeitpunkt Einstellungen für das jeweilige Projekt
festgelegt werden können.
Beim Aufruf von sphinx-quickstart
erscheinen zunächst einige
Benutzer-Abfragen, mit denen der Name des Projekts sowie andere grundlegende
Einstellungen vorgenommen werden können:
- Bei der ersten Abfrage soll der Nutzer angeben, in welchem Pfad das Projekt
initiiert werden soll. Üblicherweise startet man
sphinx-quickstart
bereits im Projekt-Verzeichnis, so dass kein expliziter Pfad angegeben werden muss, sondern die Vorgabe[.]
durch Drücken derEnter
-Taste bestätigt werden kann:
Welcome to the Sphinx 1.6.2 quickstart utility.
Please enter values for the following settings (just press Enter to
accept a default value, if one is given in brackets).
Enter the root path for documentation.
> Root path for the documentation [.]:
Bei den beiden nächsten Abfragen geht es darum, ob für die Quelldateien ein eigener Ordner angelegt werden soll und wie besondere Ordner, die beispielsweise Logos oder Templates beinhalten, gekennzeichnet werden sollen. Bei beiden Fragen sind meiner Meinung nach die Standard-Vorgaben empfehlenswert, es genügt somit jeweils eine Bestätigung mit der
Enter
-Taste.Die Quelltexte der Webseite werden bei diesen Standard-Einstellungen im Projektverzeichnis beziehungsweise in Unterverzeichnissen abgelegt; der von Sphinx erzeugte HTML- beziehungsweise LaTeX-Code wird hingegen in die separaten Unterverzeichnisse
_build/html
beziehungsweise_build/latex
geschrieben.Bei den nächsten Abfragen muss der Projekt- sowie der Autorname der Dokumentation angegeben werden; die Angabe einer Versionsnummer ist optional und kann auch zu einem späteren Zeitpunkt in der Konfigurationsdatei
conf.py
vorgenommen werden.Als Sprache kann wahlweise
en
für Englisch,de
für Deutsch, oder ein anderes Sprach- beziehungsweise Länderkürzel gesetzt werden (eine Übersicht über die unterstützten Sprachen gibt es hier).Bei den beiden nächsten Abfragen wird eine Datei-Endung für die Quelltext-Dateien sowie der Name der grundlegenden Index-Datei festgelegt. Auch hier ist es empfehlenswert die jeweiligen Vorgaben mit der
Enter
-Taste zu bestätigen.Die Datei
index.rst
im Projekt-Verzeichnis beinhaltet im Wesentlichen ein Inhaltsverzeichnis („toctree“), welcher die Einhänge-Punkte der übrigen Quelltext-Dateien festlegt.Bei der nächsten Abfrage wird festgelegt, ob ein Epub-Builder gewünscht ist oder nicht. Gewöhnlich kann hier die Vorgabe
[n]
mit derEnter
-Taste bestätigt werden.Bei der nächsten Abfrage kann man festlegen, welche Sphinx-Module für das Dokumentations-Projekt genutzt werden sollen; die Auswahl kann ebenfalls später in der Konfigurationsdatei
conf.py
überarbeitet werden.Bei mir persönlich würde die Modul-Abfrage folgendermaßen ausfallen:
- > autodoc:
y
Dieses Modul ist für die Dokumentation von Python-Programmen gedacht – hierbei kann eine Dokumentation automatisch anhand der Docstrings der jeweiligen Funktionen beziehungsweise Module erstellt werden.
- > doctest:
n
Python ermöglicht es, in die Docstrings von Funktionen Tests einzubauen. Ich persönlich verwende lieber Unittests und nutze dieses Feature daher nicht.
- > intersphinx:
y
Intersphinx-Mappings ermöglichen es, von einer Sphinx-Dokumentation aus auf andere Sphinx-Dokumentationen zu verweisen.
Hierbei wird in der Konfigurationsdatei
conf.py
unter dem Begriffintersphinx_mapping
festgelegt, welche externen Projekte mit welchem Kürzel genutzt werden sollen. Ein solcher Eintrag könnte beispielsweise wie folgt aussehen:intersphinx_mapping = { 'sphinx': ('http://www.sphinx-doc.org/en/stable', None), 'gwm': ('http://grund-wissen.de/mathematik', None), 'gwp': ('http://grund-wissen.de/physik', None), }
Innerhalb der Dokumentation kann dann beispielsweise mittels
:ref:`Mechanik <gwp:Mechanik>
auf den Mechanik-Teil der Physik-Dokumentation im Grund-Wissen-Projekt verwiesen werden.[1]- > todo:
n
Dieses Modul ermöglicht es, Todo-Notizen in die Dokumentation aufzunehmen eine Übersichtsliste daraus zu erstellen. Persönlich vermerke ich mir Todos allerdings lieber als Kommentare, die dann im fertigen Dokument nicht erscheinen.
- > coverage:
n
Dieses Modul ist ebenfalls für die Dokumentation von Python-Programmen gedacht, und ermöglicht eine Anzeige, wie viele der definierten Funktionen bereits über eine Dokumentation (einen Docstring) verfügen.
- > imgmath:
y
Bei Verwendung dieses Moduls werden mathematische Formeln für die HTML-Version als
png
-Dateien gerendert; diese werden dann an den jeweiligen Stellen automatisch eingefügt.Diese Option hat als Nachteil, dass bei technischen Dokumentationen unter Umständen viele (sogar tausende)
png
-Dateien erstellt werden, was ein Hochladen des Projekts auf den Webserver verlangsamt. Der Vorteil ist hingegen, dass die Anzeige im Webbrowser auch ohne zusätzliche Javascript einwandfrei funktioniert.- > mathjax:
n
Bei Verwendung dieses Moduls werden mathematische Formeln in der HTML-Version so ausgegeben, dass sie erst im Browser des Lesers mittels Javascript gerendert werden.
Je nach Vorlieben sollte man sich entweder für die
imgmath
- oder für diemathjax
-Option entscheiden.- > ifconfig:
n
Dieses Modul ermöglicht es, bestimmte Inhalte nur dann in der Dokumentation zu berücksichtigen, wenn entsprechende Konfigurationen in der Datei
conf.py
vorliegen. Persönlich habe ich dieses Feature bislang nicht benötigt.- > viewcode:
y
Dieses Modul ermöglicht es, die Dokumentation von (Python-)Quellcode mit den jeweiligen Stellen des Quellcodes selbst zu verknüpfen; dies ist für die Dokumentation von Open-Source-Programmen durchaus nützlich.
- > todo:
- > autodoc:
Bei der letzten Abfrage gibt man an, ob eine Makefile (für Linux-Systeme) oder eine
Commandfile
(für Windows-Systeme) angelegt werden soll; diese Entscheidung muss je nach eingesetztem Betriebsystem individuell getroffen werden.
Anschließend wird das Projekt von Sphinx fertig angelegt und kann beliebig gestaltet beziehungsweise mit Inhalten gefüllt werden.
Regulärer Aufruf von Sphinx¶
Ein bestehendes Projekt (beispielsweise ein selbst erstelltes oder ein von Github geclontes) kann auf einfache Weise als Webseite oder PDF-Datei ausgegeben werden. Hierzu wechselt man in einer Shell in das Projekt-Verzeichnis und gibt folgendes ein:
# HTML-Dateien erzeugen:
make html
# LaTeX-Code erzeugen:
make latex
# LaTeX-Code erzeugen und daraus eine PDF-Datei erstellen:
make latexpdf
Treten aufgrund einer fehlerhaften RST-Syntax während des Übersetzens Fehler auf, so werden diese mit einer kurzen Erläuterung und der Angabe der den Fehler verursachenden Stelle auf dem Bildschirm ausgegeben.
Die neu erstellten Dateien werden vons sphinx
bei Verwendung der oben
genannten Konfiguration im _build
-Verzeichnis innerhalb des Projektpfads
abgelegt. Je nach Ausgabe-Variante können die erstellten folgendermaßen
aufgerufen werden:
# Erstellte HTML-Seiten mit Webbroswer "firefox" öffnen:
firefox _build/html/index.html
# Erstellte PDF-Datei mit PDF-Betrachter "evince" öffnen:
evince _build/latex/projekttitel.pdf
Der Name des PDF-Dokuments wird in der Konfigurationsdatei conf.py
unter der Rubrik latex_documents
festgelegt.
Um den bestehenden Build eines Projekts zu entfernen, beispielsweise nach einem Umbenennen mehrerer Quelldateien oder einer neuen Ordnerstruktur, kann Folgendes eingegeben werden:
make clean
Anschließend können mittels make html
, make latex
oder make latexpdf
neue Builds erstellt werden.
Projekt auf nicht funktionierende Links prüfen
Auf folgende Weise kann ein bestehendes Projekt hinsichtlich nicht funktionierender Web-Links überprüft werden:
make linkcheck
Dieser Aufruf gibt auf dem Bildschirm alle Links zu nicht mehr existierenden
oder permanent umgeleiteten Seiten aus. Dieses Feature sollte in regelmäßigen
Abständen genutzt werden, um den Besuchern der Seite unnötige 404: Seite nicht
gefunden
-Fehlermeldungen zu ersparen; auch Suchmaschinen werten einen
möglichst hohen Anteil an funktionierenden Links als Kriterium für die
Aktualität einer Seite.
Intersphinx-Mappings aktualisieren
Bei der Verwendung von Sphinx ist es möglich, Links auf Begriffe aus anderen
Sphinx-Dokumentationen zu setzen; dies wird als Intersphinx-Mapping
bezeichnet.
Mit den normalen Einstellungen werden die Index-Kataloge der angegebenen
Projekte nur beim erstmaligen Erstellen eines Projekts geladen. Kommen bei den
externen Projekten weitere Begriffe hinzu, so kann also nur dann mittels eines
Intersphinx-Mappings darauf verwiesen werden, wenn explizit geprüft wird, ob
sich Änderungen in den angegebenen Projekten ergeben haben. Dies kann durch
folgende Änderung in der Makefile
des Projekts erreicht werden:
# Original
# SPHINXOPTS =
# Intersphinx-Seiten auf Änderungen prüfen:
SPHINXOPTS = -E
Durch die ergänzende Angabe der Option -E
werden beim Aufruf von make
html
, make latex
oder make latexpdf
alle externen Index-Kataloge neu
eingelesen. Dies kann den Übersetzungs-Prozess erheblich verlangsamen und sollte
daher nur bei Bedarf temporär geändert werden.
Sphinx-Autobuild¶
Mit dem Paket Sphinx-Autobuild kann erreicht werden, dass die
HTML-Ausgabe einer Dokumentation automatisch aktualisiert wird, sobald eine
.rst
-Quelltext-Datei innerhalb des Projekt-Ordners angelegt/verändert wird.
Das Paket kann folgendermaßen installiert werden:
# Installation:
pip3 install sphinx-autobuild
Der Aufruf erfolgt dann beispielsweise wie folgt:
# Sphinx-Autobuild aufrufen:
sphinx-autobuild . _build/
Im obigen Fall würde das aktuelle Verzeichnis (.
) als Quell- und das
Verzeichnis _build
als Zielverzeichnis für die HTML-Ausgabe verwendet.
Zusätzlich zu den Optionen von sphinx-build
, die ebenfalls mit
sphinx-autobuild
genutzt werden können, gibt es allgemein folgende
zusätzlichen Optionen:
-H
: Host-Adresse des Webservers (Standard:127.0.0.1
)-p
: Port angeben, auf dem der Webserver erreichbar ist (Standard:8000
)-B
: Automatisch den Standard-Webbrowser mit der Projekt-URL öffnen-i
: | Dateien (auch Wildcards) angeben, deren Änderungen ignoriert werden sollen.
Sphinx-Autobuild bleibt als laufender Prozess im Shell-Fenster geöffnet, achtet auf Änderungen
Nach
einem fertigen Build wird automatisch ein Webserver gestartet, der über die
Hostadresse 0.0.0.0
und den Port 8888
erreichbar ist. Mittels der Option
-B
wird die Index-Seite des Projekts automatisch im Standard-Webbrowser
geöffnet.
# Beispiel-Aufruf: sphinx-autobuild -B . _build/
Einzelne Dateien mit rst2latex
konvertieren¶
Hat man unter Linux das Paket python3-docutils
installiert, so stehen neben
Sphinx auch die Konverter rst2html
und rst2latex
zur Verfügung, die
jeweils eine einzelne Quelldatei in ein HTML- beziehungsweise LaTeX-Dokument
übersetzen.
Für die Verwendung von rst2latex
habe ich mir eine Makefile mit folgendem Inhalt gebastelt:
# Datei: rstmakefile
%: %.rst
rst2latex $< > $*.tex
pdflatex $*.tex
rm $*.aux $*.log $*.out
In einer Shell kann man dann im Projektordner folgendermaßen aus einer
.rst
-Datei eine gleichnamige .tex
-Datei sowie das
zugehörige .pdf
-Dokument erzeugen:
# RST-Datei dateiname.rst konvertieren:
# (Dateiendung dabei weglassen!)
make -f pfad-zur-rstmakefile dateiname
# Ergebnis: dateiname.tex, dateiname.pdf
Diese Methode hat zwei sehr schöne Nebeneffekte: Erstens wird, anders als bei
Verwendung von Sphinx, ein „klassischer“ LaTeX-Code ohne Extra-Konfigurationen
und besonderen Stil-Elementen generiert. Zweitens können über die
Konfigurationsdatei ~/.docutils
optional zusätzliche Pakete in die
LaTeX-Präambel geladen werden, um
beispielsweise das Seitenlayout anzupassen. Meine Konfigurationsdatei hat
beispielsweise folgenden Inhalt:
[latex2e writer]
latex_preamble: \usepackage{units,amsmath,amsfonts,amssymb,textcomp,gensymb,marvosym,wasysym}
\usepackage[left=2cm,right=2cm,top=1cm,bottom=1.5cm]{geometry}
\setlength{\parskip}{\baselineskip} % Extra line between paragraphs
\setlength{\parindent}{0pt} % No indent at the start of paragraphs
\pagestyle{empty}
Durch diese Einstellungen werden einerseits Zusatz-Pakete für mathematischen
Formelsatz eingebunden, zum anderen werden durch das geometry
-Paket die
Seitenränder auf ein Minimum reduziert, so dass beim Drucken einzelner
Notiz-Seiten kein Platz verschwendet wird.
Anmerkung:
[1] | Die Angaben können zu jedem späteren Zeitpunkt in der
Konfigurationsdatei Durch die Vergabe von Versionsnummern kann beispielsweise bei der Dokumentation von Software-Quellcode sichergestellt werden, dass eine Anleitung auch zur jeweiligen Software-Version passt. Auch bei allgemeinen Dokumentationsprojekten ist eine Versionsnummer sinnvoll, um den jeweiligen Entwicklungsstand aufzuzeigen; mit einem Versions-Upgrade können außerdem eine Rundmail über einen Verteiler, ein neuer Commit eines Versionsverwaltungs-Programms, ein Weblog-Eintrag o.ä. verbunden werden. |
[2] | Im Abschnitt Sprungmarken und Referenzen. ist dies näher beschrieben. |