Lean Religion Rumblings of a software engneer & Home Maker

30Nov/10Off

Professional Book like structure with Sphinx

Initially, Sphinx was designed to generate Python documentation. But, it can also be used for many things. I am currently using it to write my own book @eclipsebook.in. The advantage for me is that I can write my book in reStructuredText and can generate different formats with ease.

Here is an insight how I am tweaking/using sphinx.

Separate Master Doc

Appendix is handled differently in HTML & PDF. For HTML edition, it is just another chapter/part. For PDF, it is a separate directive. More importantly, the Appendix entries get promoted to extra one level. For that I have toc.rst for HTML and latex-contents.rst as the Master Doc

Also, there is a separate Appendix file for HTML and PDF. HTML gets default :toctree: for Appendix, latex get's it with a little tweak.

Here is appendix file for Latex:

%%%%%%%%%%
 Appendix
%%%%%%%%%%

.. include:: acronyms.rst
.. include:: credits.rst
.. include:: testimonials.rst
.. include:: trademark-attribution.rst
.. include:: ../contact.rst
Custom Prolog and Epilog

This is what the conf.py contains:

rst_prolog = "\n.. include:: /%s/include-pre.txt\n\n"%(os.path.abspath('..'),)

rst_epilog = "\n.. include:: /%s/include-post.txt\n\n.. include:: /%s/include-post-conf.txt\n\n"%(os.path.abspath('..'),os.path.abspath('.'))

Interestingly, there are two epilogs, one configuration directory specific, and other configuration specific. Why separate? Figure out yourself.

this is HTML post include:

.. |IDE|                replace:: :abbr:`IDE (Integrated Development Environment)`
.. |JVM|                replace:: :abbr:`JVM (Java Virtual Machine)`

this is latex post include:

.. |IDE|                replace:: :abbr:`IDE`
.. |JVM|                replace:: :abbr:`JVM`

The tag :abbr: is good for HTML. The expansion is shown on Hover. But, in PDF it seems to gets expanded at every instance.

PDF Tweaks

In Sphinx PDF, everything gets a chapter number. That does not seem to be convention, at least with normal printed Books. To make sure that the generated pdf is more-or-less like printed book, I have done following tweaks

The first page of my book is copyrights.rst. (See http://eclipsebook.in/toc/ ) to know the order of pages.

This is how my copyrights.rst looks like

.. raw:: latex

   %%% MEERA-TODO-PDF-PATCH
   %%% From above comment out \tableofcontents

   \setcounter{secnumdepth}{-1}

   %%% MEERA-TODO-PDF-PATCH
   %%% From below comment out \part{Copyrights}

Copyrights
==========

|copy| MMIX-MMX Meera P. Ghumalia.  All rights reserved.

<Some More Contents>
<Some More Contents>
<Some More Contents>

.. raw:: latex

   \tableofcontents

   \renewcommand{\chaptermark}[1]%
   {}{}
   \renewcommand{\sectionmark}[1]%
   {}{}
   \renewcommand{\headrulewidth}{0.5pt}
   \renewcommand{\footrulewidth}{0pt}
   \fancyhf{}
   \fancyfoot[C]{\thepage}
   \fancyhead[RO]{}
   \fancyhead[LE]{}

   %%% MEERA-TODO-PDF-PATCH
   %%% From below comment out \part{preface}
   %%% and \chapter{Dedication}

Diff / Patch Script

I create a "patch (diff)" file, and for every build, PATCH the generated tex file with a modifiled makefile:

latex: $(PREREQUISITES)
        $(SPHINXBUILD) -b latex $(LATEXSPHINXOPTS) $(BUILDDIR)/latex
        -@rm $(BUILDDIR)/latex/*.orig
        @echo ===== Patching Start =====
        patch -p0 $(BUILDDIR)/latex/c-cpp-eclipse.tex < book/conf/latex/c-cpp-eclipse.tex.diff
        @echo ===== Patching End =======
        @echo .
        @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
        @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
              "run these through (pdf)latex."

Now, I create a Patch file. It's quite simple. Idea is to create the virgin .tex file, and then follow the comments already embodied in the generated file. These are the steps:

make clean
sphinx-build -b latex -d build/latexdoctrees -c book/conf/latex -D latex_paper_size=a4  book build/latex
cp build/latex/c-cpp-eclipse.tex .

# Edit generated "LayTech" file and follow the Comments.
emacs build/latex/c-cpp-eclipse.tex

diff -U4 c-cpp-eclipse.tex build/latex/c-cpp-eclipse.tex > book/conf/latex/c-cpp-eclipse.tex.diff
rm c-cpp-eclipse.tex

Rarely, after upgrading Sphinx, my build starts breaking. So, I create the patch file again.

Drop in your comments if you find my steps complicated, or if you have some further question.