Printing Code
Let’s assume you have a C++ project which has C++ source and header files, and you want to print all the contents of these files with optimal (readability)/(number of pages).
Collecting all the code
Here are the contents of a shell script, collect_code.sh
. It collects the
filenames into arrays, then outputs all the contents into collected_code.cpp
while removing empty lines. It also prints a nice stamp which has the filename
before the contents of that file.
#!/bin/sh
srcfiles=($(find "src" -name '*.cpp'))
includefiles=($(find "include" -name '*.h'))
result=collected_code.cpp
if [ -f $result ]; then
rm $result
touch $result
else
touch $result
fi
for i in "${includefiles[@]}" "${srcfiles[@]}"; do
echo >> $result
echo "/******************************************************" >> $result
echo "* *" >> $result
echo "* "$i >> $result
echo "* *" >> $result
echo "******************************************************/" >> $result
echo >> $result
cat $i | sed '/^$/d' >> $result # remove the sed part if you want to keep empty lines
done
Converting to PDF
We will need text2pdf
, a small utility for creating PDFs out of text files. In
Arch Linux, you can install the package text2pdf
from the AUR using yaourt:
$ yaourt -S text2pdf
text2pdf is a filter program. To see the help
$ text2pdf -h
text2pdf [options] [filename]
text2pdf makes a 7-bit clean PDF file (version 1.1) from any input file.
It reads from standard input or a named file, and writes the PDF file
to standard output.
There are various options as follows:
-h show this message
-f<font> use PostScript <font> (must be in standard 14, default: Courier)
-I use ISOLatin1Encoding
-s<size> use font at given pointsize (default 10)
-v<dist> use given line spacing (default 12 points)
-l<lines> lines per page (default 60, determined automatically
if unspecified)
-c<chars> maximum characters per line (default 80)
-t<spaces> spaces per tab character (default 8)
-F ignore formfeed characters (^L)
-A4 use A4 paper (default Letter)
-A3 use A3 paper (default Letter)
-x<width> independent paper width in points
-y<height> independent paper height in points
-2 format in 2 columns
-L landscape mode
Note that where one variable is implied by two options, the second option
takes precedence for that variable. (e.g. -A4 -y500)
In landscape mode, page width and height are simply swapped over before
formatting, no matter how or when they were defined.
text2pdf v1.1 (c) Phil Smith, 1996
The page configuration that suited me most was with double column and smaller fonts on A4 paper:
$ text2pdf -2 -A4 -s6 -v6 -c73 collected_code.cpp > collected_code.pdf
Modify the scripts to make them suit to your project. In my case, I had to print multiple files; this tutorial can be useful for printing any code.