Assembling different pieces to a book¶
Many smaller writings in the DocOnce format can be assembled into a single, large document such as a book or thesis. The recipe for doing this appears below.
Organization of a chapter¶
Suppose one chapter of the book has the nickname ch2
and may hold
all text or just include text in other DocOnce files, e.g.,
part1.do.txt
, part2.do.txt
, and part3.do.txt
. In this latter
case, ch2.do.txt
has the simple content
# #include "part1.do.txt"
# #include "part2.do.txt"
# #include "part3.do.txt"
Note that the ch2.do.txt
file contains just plain text without
any TITLE
, AUTHOR
, or DATE
lines and without any
table of contents (TOC
) and bibliography (BIBITEM
).
This property makes ch2.do.txt
suitable for being included in other documents like a book.
However, to compile ch2.do.txt
to a stand-alone document,
we normally want a title, an author,
a date, and perhaps a table of contents.
We also want a bibliography if any of the included files have
cite
tags. To this end, we create a wrapper file, say
main_ch2.do.txt
[1],
with the content
TITLE: Some chapter title
AUTHOR: A. Name Email:somename@someplace.net at Institute One
AUTHOR: A. Two at Institute One & Institute Two
DATE: today
TOC: on
# Externaldocuments: ../ch3/main_ch3, ../ch4/main_ch4
# #include "ch2.do.txt"
======= References =======
BIBFILE: ../papers.pub
[1] | The prefix main_ is inspired by the main program
in computer program: those statements make a program run, like
main_ch2.do.txt defines the surroundings of the “library text”
ch2.do.txt . We strip off main_ when publishing the files in
doc/pub . |
Recall that DocOnce relies on the Publish software for handling
bibliographies. It is easy to import from BibTeX to Publish and
create a database of references (papers.pub
) to get started (but
we recommend to continue working with the
Publish database directly and collect new items in the papers.pub
file
as Publish is more flexible than BibTeX).
Figures and source code¶
As described in the section Directory structure, we recommend to put
figures and source codes (to be included in the document) in separate
directories. Although such directories could have natural names like
fig
and src
, it will cause trouble if we do not use unique names
for these directories, like fig-ch2
and src-ch2
. Otherwise, we
would need to copy all figures in all pieces into a common fig
directory for the book and all source code files into a src
directory. With unique names, figures and source code files can always
reside in their original locations, and we can easily reach them
through links. This will be described next.
Assembly of chapters to a book¶
All the files associated with the ch2
document and chapter reside
in the ch2
directory. A fundamental principle of DocOnce is to
have just one copy of the files (“document once!”).
To include the ch2
text in a larger document like a book, we just
need to include the ch2.do.txt
file and a chapter heading.
Here is an example of a document book.do.txt
for a complete book:
TITLE: This is a book title
AUTHOR: A. Name Email:somename@someplace.net at Institute One
AUTHOR: A. Two at Institute One & Institute Two
DATE: today
TOC: on
========= Preface =========
label{ch:preface}
# #include "../chapters/preface/preface.do.txt"
========= Heading of a chapter =========
label{ch:ch2}
# #include "../chapters/ch2/ch2.do.txt"
# Similar inclusion of other chapters
========= Appendix: Heading of an appendix =========
label{ch:somename}
# #include "../chapters/nickname/nickname.do.txt"
======= References =======
BIBFILE: ../papers.pub
When running doconce format
on book.do.txt
, the entire document
is contained in one big file [2] (!).
To see exactly what has been included,
you can examine the result of running the first preprocessor, preprocess
,
on book.do.txt
. All the includes are handled by this preprocessor.
The result is contained in the file
tmp_preprocess__book.do.txt
, which then contains the entire
DocOnce source code of the book. The second preprocessor, mako
, is thereafter
run (if DocOnce detects that it is necessary).
The result of that step is available in
tmp_mako__book.do.txt
. It is important to examine this file if there
are problems with Mako variables or functions.
The tmp_mako__book.do.txt
file is thereafter translated to
the desired output format.
[2] | A single DocOnce file and consequently a single
.tex file works out well on today’s laptops.
A book with 900 pages [Ref1] has been tested! |
Say we want to produce a LaTeX document:
Terminal> doconce format pdflatex book [options]
If the DocOnce source contains copying of source code from files in
@@@CODE
constructs, it is important that doconce
finds the files.
For example,
@@@CODE src-ch2/myprog.py fromto: def test1@def test2
will try to open the file src-ch2/myprog.py
. Since this file is
actually located in ../ch2/src-ch2/myprog.py
, pdflatex
will
report an error message. A local link to
that directory resolves the problem:
Terminal> ln -s ../chapters/ch2/src-ch2 src-ch2
Similarly,
the LaTeX code in book.tex
for inclusion of a figure may
contain
\includegraphics[width=0.9\linewith]{fig-ch2/fig1.pdf}
For this command to work, it is paramount that there is a link fig-ch2
in the
present book
directory where the pdflatex
command is run to
the directory ../chapters/ch2/fig-ch2
where the figure file fig1.pdf
is
located.
It is recommended to use the function make_links
in scripts.py
to
automatically set up all convenient links from the book
directory
to the individual chapter directories. Provided the list of chapter nicknames
at the top of scripts.py
is correct, you can just run
>>> import scripts
>>> scripts.make_links()
to automatically
set up all links to all src-*
, fig-*
, and mov-*
directories.
You need to rerun this make_links
function after inclusion of a new chapter
in the chapters
tree.
Identify LaTeX errors in the original chapter files
When you run pdflatex book
and get LaTeX errors, you need
to see where they are in book.tex
and use this information to
find the appropriate DocOnce source file in some chapter.
Usually, there are few errors at the “book level” if each individual
chapter has been compiled. To this end, you can use scripts.py
to
automatically compile each chapter separately. The process is stopped
as soon as a DocOnce or LaTeX error is encountered.
>>> import scripts
>>> scripts.compile_chapters()
With heavy use of Mako one can get quite strange error messages.
Some ask you to rerun the doconce format
command with
--mako_strict_undefined
to see undefined Mako variables.
Make sure you run the make.sh
script by bash -x
if the script
does not feature the set -x
command in the top of the file
(for displaying a command prior to running it). Copy the complete
doconce format
with the mouse and add the --mako_strict_undefined
option.
Other error messages point to specific lines
that Mako struggles with. Go to the file tmp_mako__book.do.txt
to investigate the line.