Gestalterische Anpassungen

Für die Grundwissen-Webseite nutze ich das Sphinx-Standard-Theme mit einigen Anpassungen. Ich nutze dafür eine virtuellen Umgebung, in der einige Sphinx-Dateien geändert werden. Zum Einrichten einer solchen virtuellen Umgebung kann man folgendes eingeben:

# Im Basis-Ordner des Sphinx-Projekts: python

Diese habe ich als Super-User direkt am zentralen Installationspfad (in meinem Fall /usr/local/lib/python3.5/dist-packages/sphinx) vorgenommen, so dass sie global für alle Dokumentations-Projekte gleichermaßen gelten. Als (empfehlenswertere) Alternative hierzu kann Sphinx mittels einer lokal im Ordner des Benutzers installiert und dort auch ohne Super-User-Rechte angepasst werden. Die im folgenden Abschnitt aufgelisteten Datei-Änderungen beziehen sich dabei stets auf den jeweiligen Installationspfad.

In der Fußnotenzeile der Webseite wollte ich ein Link auf Kontakt/Impressum eingefügen. Dies kann in in der Datei themes/basic/layout.html festgelegt werden:

VORHER:

{%- if last_updated %}
  {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.
  {% endtrans %}
{%- endif %}

NACHHER:

{%- if last_updated %}
  {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.
  <a href='http://grund-wissen.de/impressum.html'>Kontakt/Impressum</a>
  {% endtrans %}
{%- endif %}

Zeilenumbruch bei langen HTML-Navigationszeilen ermöglichen

In der obersten Zeile einer jeden mit Sphinx erstellten HTML-Seite wird eine Navigations-Leiste angezeigt. Bei einer umfangreichen Dokumentation mit vielen Unterabschnitten kann es vorkommen, dass auf kleinen Bildschirmen hierbei ein Zeilenumbruch nötig ist – der letzte Listeneintrag wird also in eine neue Zeile geschrieben. In der Grundversion wird hierbei die Seitenüberschrift verschoben. Um dies zu vermeiden, muss folgender Eintrag in der Datei themes/basic/static/basic.css_t ergänzt werden:

VORHER:

div.related ul {
    margin: 0;
    padding: 0 0 0 10px;
    list-style: none;
    }


NACHHER:

div.related ul {
    margin: 0;
    padding: 0 0 0 10px;
    list-style: none;
    min-height: 2em;
    height: auto;
    overflow: hidden;
    }

Durch den Eintrag height: auto wird die Höhe der Navigations-Leiste automatisch angepasst. Der Eintrag overflow: hidden; fügt anschließend bei Bedarf automatisch eine (wieder ganz von links beginnende) neue Zeile ein.

Tabellen zentrieren

Tabellen werden von Sphinx bei Verwendung der Grundeinstellungen automatisch zentriert; Persönlich möchte ich in der HTML-Darstellung allerdings die Fußnoten, die via CSS ebenfalls als Tabellen gesetzt werden, linksbündig ausrichten. Um dies zu erreichen, habe ich in der Datei themes/basic/static/basic.css_t den Eintrag table.docutils folgendermaßen ergänzt:

table.docutils {
    border: 1px solid gray;
    border-collapse: collapse;
    margin-left: auto;
    margin-right: auto;
}

table.docutils.footnote, table.docutils.citation {
    border: 0px;
    border-collapse: collapse;
    margin-left: 0;
}

table.docutils.footnote td, table.docutils.citation td {
    border: 0px;
}

Maximalbreite der HTML-Dokumentation festlegen

In den letzten Jahren sind Computer-Monitore immer breiter geworden. Im Vergleich zu einer DinA4-Seite sind somit, sofern keine Beschränkungen festgelegt werden, auch wesentlich längere Textzeilen möglich.

Mittels einer entsprechenden CSS-Option kann erreicht werden, dass auch bei sehr breiten Monitoren ein als kleiner Absatz geschriebener Text als eine einzige Zeile erscheint – das Layout der HTML-Seite bleibt somit der Druckversion ähnlich. Dies gilt nicht nur für Text, sondern auch für Graphiken, die mit einer prozentualen Breitenangabe eingebunden werden: In LaTeX ist die Zeilenbreite des Texts als Referenzwert üblich, in HTML standardmäßig die Breite des Browserfensters; auf breiten Monitoren werden Graphiken in einem Vollbild-Browser entsprechend groß dargestellt.

Bei der Grund-Wissen-Seite wird das Theme sphinxdoc verwendet; die entsprechende CSS-Datei ist themes/sphinxdoc/static/sphinxdoc.css_t. Hier muss zur Begrenzung der HTMl-Seitenbreite folgende Änderung vorgenommen werden:

NACHHER:

body {
    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
                 'Verdana', sans-serif;
    font-size: 14px;
    letter-spacing: -0.01em;
    line-height: 150%;
    text-align: center;
    background-color: #BFD1D4;
    color: black;
    padding: 0;
    border: 1px solid #aaa;

    margin: auto;
    min-width: 740px;
    max-width: 1200px;
}

Mit den obigen Einstellungen wird die Webseite mit der angegebenen Breite zentriert dargestellt; der Rest des Browserfensters durch einen neutralen Hintergrund ausgefüllt.

Kopfzeile in der Druckversion entfernen

Normalerweise erscheint in der mittels LaTeX erzeugten PDF-Datei in der Kopfzeile jeder Seite ein Versionshinweis. Um dies zu deaktivieren, muss die Datei texinputs/sphinx.sty an zwei Stellen abgeändert werden. Zum einen muss die \fancyhead-Zeile, die den Versions-Eintrag erzeugt, mit einem %-Zeichen auskommentiert werden. Zum anderen kann der Strich zwischen Kopfzeile und erster Textzeile entfernt werden, indem ihr Wert auf 0.0 gesetzt wird:

VORHER:

\fancypagestyle{normal}{
  \fancyhf{}
  \fancyfoot[LE,RO]{{\py@HeaderFamily\thepage}}
  \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
  \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
  \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
  \renewcommand{\headrulewidth}{0.4pt}
  \renewcommand{\footrulewidth}{0.4pt}


NACHHER:

\fancypagestyle{normal}{
  \fancyhf{}
  \fancyfoot[CE,CO]{{\py@HeaderFamily\thepage}}
% \fancyfoot[LO]{{\py@HeaderFamily\nouppercase{\rightmark}}}
% \fancyfoot[RE]{{\py@HeaderFamily\nouppercase{\leftmark}}}
% \fancyhead[LE,RO]{{\py@HeaderFamily \@title, \py@release}}
  \renewcommand{\headrulewidth}{0.0pt}
  \renewcommand{\footrulewidth}{0.4pt}

Soll nicht zwischen geraden und ungeraden Seitenanzahlen (even, odd) unterschieden werden (LaTeX-Option oneside), so sollte hier anstelle CE,CO besser C gesetzt werden. Dies sollte dann auch bei den entsprechenden Einträgen für plain berücksichtigt werden, also für Seiten auf denen ein neues Kapitel beginnt.

Darstellung von Verbatim-Boxen anpassen

Um Code-Beispiele in LaTeX besser hervorzuheben, habe ich in der Datei texinputs/sphinx.sty die Farben für die Verbatim-Umgebung und ihre Umrandung etwas angepasst:

VORHER:

\definecolor{VerbatimColor}{rgb}{1,1,1}
\definecolor{VerbatimBorderColor}{rgb}{1,1,1}

NACHHER:

\definecolor{VerbatimColor}{rgb}{0.97,0.97,1}
\definecolor{VerbatimBorderColor}{rgb}{0.75,0.75,1}

Die Boxen werden so in einem schwachen Blau mit einem ebenfalls leicht blauen Rahmen gedruckt.

Titelseite gestalten

Nach persönlichem Geschmack habe ich die Titelseite etwas abgewandelt – insbesondere wollte ich dort einen Link auf die URL der Homepage einfügen. Hierbei habe ich in der Datei texinputs/sphinxmanual.cls die Funktion \maketitle folgendermaßen angepasst;

\renewcommand{\maketitle}{%
  \let\spx@tempa\relax
  \ifHy@pageanchor\def\spx@tempa{\Hy@pageanchortrue}\fi
  \hypersetup{pageanchor=false}% avoid duplicate destination warnings
  \begin{titlepage}%
    \let\footnotesize\small
    \let\footnoterule\relax
    \noindent\rule{\textwidth}{1pt}\par
      \begingroup % for PDF information dictionary
       \def\endgraf{ }\def\and{\& }%
       \pdfstringdefDisableCommands{\def\\{, }}% overwrite hyperref setup
       \hypersetup{pdfauthor={\@author}, pdftitle={\@title}}%
      \endgroup
    \begin{flushright}%
      \sphinxlogo
      \py@HeaderFamily
      {\Huge \@title \par}
      {\itshape\LARGE \py@release\releaseinfo \par}
      {\itshape Aktualisiert am \@date \par}
      \vfill
      {\LARGE
        \begin{tabular}[t]{c}
          \@author
        \end{tabular}
        \par}
      \vfill\vfill
      {\Large
      \url{http://www.grund-wissen.de} \par
       \vfill
       \py@authoraddress \par
      }%
    \end{flushright}%\par
    \@thanks
  \end{titlepage}%

  \setcounter{footnote}{0}%
  \let\thanks\relax\let\maketitle\relax
  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
  \if@openright\cleardoublepage\else\clearpage\fi
  \spx@tempa
}

Zwischen \end{titlepage} und \setcounter{footnote{0} habe ich zusätzlich folgenden Text hinzugefügt, der bei jeder meiner Dokumentationen auf der zweiten Seite des Dokuments, also unmittelbar vor dem Inhaltsverzeichnis, erscheinen soll:[1]

VORHER:

[...]

\end{titlepage}%

\setcounter{footnote}{0}%
  \let\thanks\relax\let\maketitle\relax
  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
  \if@openright\cleardoublepage\else\clearpage\fi
  \spx@tempa
}


NACHHER:

[...]

\end{titlepage}%

Dieses Buch wird unter der
\href{http://de.wikipedia.org/wiki/Creative_Commons}{Creative Commons
License (Version 3.0, by-nc-sa)} ver\"{o}ffentlicht. Alle Inhalte d\"{u}rfen
daher in jedem beliebigen Format vervielf\"{a}ltigt und/oder
weiterverarbeitet werden, sofern die Weitergabe nicht kommerziell ist, unter
einer gleichen Lizenz erfolgt, und das Original als Quelle genannt wird.
Siehe auch:

\href{https://creativecommons.org/licenses/by-nc-sa/3.0}{Erl\"{a}uterung der
    Einschr\"{a}nkung by-nc-sa} \\
\href{https://irights.info/wp-content/uploads/userfiles/CC-NC_Leitfaden_web.pdf}{Leitfaden
    zu Creative-Commons-Lizenzen}

Unabh\"{a}ngig von dieser Lizenz ist die Nutzung dieses Buchs f\"{u}r
Unterricht und Forschung \href{http://dejure.org/gesetze/UrhG/52a.html}{(\S
52a UrhG)} sowie zum privaten Gebrauch
\href{http://dejure.org/gesetze/UrhG/53.html}{(\S 53 UrhG)} ausdr\"{u}cklich
erlaubt.

Der Autor erhebt mit dem Buch weder den Anspruch auf Vollst\"{a}ndigkeit
noch auf Fehlerfreiheit; insbesondere kann f\"{u}r inhaltliche Fehler keine
Haftung \"{u}bernommen werden.

Die Quelldateien dieses Buchs wurden unter
\href{http://grund-wissen.de/linux/index.html}{Linux} mittels
\href{http://grund-wissen.de/linux/tools/vim/index.html}{Vim} und
\href{http://grund-wissen.de/linux/tools/sphinx/index.html}{Sphinx}, die
enthaltenen Graphiken mittels
\href{http://grund-wissen.de/linux/tools/inkscape.html}{Inkscape} erstellt.
Der Quellcode sowie die Original-Graphiken  k\"{o}nnen \"{u}ber die
Projektseite heruntergeladen werden:

\textbf{http://www.grund-wissen.de}
\\[3pt]

Bei Fragen, Anmerkungen und Verbesserungsvorschl\"{a}gen bittet der Autor um
eine kurze Email an folgende Adresse:

\textbf{info@grund-wissen.de}
\\[5pt]

Augsburg, den \today. \\[6pt]
\@author

\setcounter{footnote}{0}%
  \let\thanks\relax\let\maketitle\relax
  %\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
  \if@openright\cleardoublepage\else\clearpage\fi
  \spx@tempa
}

Zusätzlich habe ich in der Datei writers/latex.py beide Vorkommnisse der Bezeichnung „Release“ durch „Version“ ersetzt.

Mehrspaltige Aufzählungen (hlist) in LaTeX

Mit der hlist-Umgebung kann man mit Sphinx mehrspaltige Tabellen erstellen. Der Code dafür sieht etwa so aus:

.. hlist::
    :columns: 2

    * Item 1
    * Item 2
    * ...

Während die HTML-Ausgabe ausgezeichnet funktioniert, werden hlist-Umgebungen vom LaTeX-Übersetzer wie „normale“ Listen behandelt. Persönlich verwende ich in den allermeisten Fällen zweispaltige hlists, so dass ich mir in der Datei writers/latex.py mit folgendem Trick Abhilfe für den erstellten LaTeX-Code geschaffen habe:

VORHER:

def visit_hlist(self, node):
    self.compact_list += 1
    self.body.append('\\begin{itemize}\\setlength{\\itemsep}{0pt}'
                     '\\setlength{\\parskip}{0pt}\n')

[...]

def depart_hlist(self, node):
    self.compact_list -= 1
    self.body.append('\\end{itemize}\n')


NACHHER:

def visit_hlist(self, node):
    self.compact_list += 1
    self.body.append('\\begin{multicols}{2}')
    self.body.append('\\begin{itemize}\\setlength{\\itemsep}{0pt}'
                     '\\setlength{\\parskip}{0pt}\n')

[...]

def depart_hlist(self, node):
    self.compact_list -= 1
    self.body.append('\\end{itemize}\n')
    self.body.append('\\end{multicols}')

Damit dies funktioniert, muss in der Konfigurationsdatei conf.py des jeweiligen Projekts eine Ergänzung der LaTeX-Präambel vorgenommen werden:

latex_elements = {
    'preamble':  '''\usepagckage{multicol}'''
    # ...
    }

Mit der obigen Einstellung werden alle hlists in der Druckversion als zweispaltige Aufzählungen dargestellt.[2]

Linkcheck bei URLs mit Umlauten

In der derzeit von mir genutzten Sphinx-Version 1.7.1 bleibt der Linkcheck (make linkcheck) bei manchen Projekten hängen, wenn dieser in der Makefile mittels mittels der Option SPHINXBUILD   = python3 -msphinx aufgerufen wird. Abhilfe ist dadurch möglich, dass in der Datei builders/linckcheck.py folgende Ersetzung vorgenommen wird:

VORHER:

# handle non-ASCII URIs
try:
    req_url.encode('ascii')
except UnicodeError:
    req_url = encode_uri(req_url)

NACHHER:

# handle non-ASCII URIs
try:
    req_url.encode('utf-8')
except UnicodeError:
    req_url = encode_uri(req_url)

Damit funktioniert make linkcheck auch, wenn auf URLS verlinkt wird, die Sonderzeichen enthalten (wie es beispielsweise bei Wikipedia häufig der Fall ist).


Anmerkungen:

[1]Hierbei muss das LaTeX-Paket multicol installiert sein. Sollte dies nicht der Fall sein, kann es von der CTAN-Projektseite herunter geladen werden und gemäß dem üblichen Installations-Schema nachinstalliert werden.
[2]Diese Lösung ist nicht elegant, erfüllt aber ihren Zweck. Für Verbesserungshinweise bin ich dankbar. ;-)