render50

render50 is a command-line tool with which you can generate syntax-highlighted PDFs of source code. In years past, CS50 generated PDFs of students’ submissions so that teaching fellows (TFs) could annotate the PDFs with typed feedback. These days, CS50 generates PDFs of lectures’ source code so that students can annotate them during lectures and so that David has a printout of each lecture’s source code in front of him during lectures!

PDFs can be annotated (for free) with:

Installation

  1. Install Python 3.6 or later, if you haven’t already.

  2. Install pip, if you haven’t already.

  3. Install render50 itself:

    pip3 install render50
    
  4. Install WeasyPrint’s dependencies.

Upgrading

pip install --upgrade render50

Usage

usage: render50 [-h] [-b] [-f] [-i INCLUDE] -o OUTPUT [-p [SIZE]] [-P] [-r] [-s [SIZE]] [-S STYLE] [-x EXCLUDE] [-y] [-V]
                [INPUT ...]

A command-line tool that renders source code as a PDF.

positional arguments:
  INPUT                 file or URL to render

options:
  -h, --help            show this help message and exit
  -b, --browser         render as a browser would
  -f, --force           overwrite existing files without prompting
  -i INCLUDE, --include INCLUDE
                        pattern to include
  -o OUTPUT, --output OUTPUT
                        file to output
  -p [SIZE], --print [SIZE]
                        size of page, formatted for print, per https://developer.mozilla.org/en-US/docs/Web/CSS/@page/size
  -P, --no-path         omit paths in headers
  -r, --recursive       recurse into directories
  -s [SIZE], --screen [SIZE]
                        size of page, formatted for screen
  -S STYLE, --style STYLE
                        style of syntax highlighting, per https://pygments.org/demo/#try
  -x EXCLUDE, --exclude EXCLUDE
                        pattern to exclude
  -y, --side-by-side    render inputs side by side
  -V, --version         show program's version number and exit

Examples

Render a single file

To generate a PDF (e.g., foo.pdf) from a source file (e.g., bar.c), execute:

render50 -o foo.pdf bar.c

Render multiple files

To generate a PDF (e.g., foo.pdf) from multiple source files (e.g., bar.c and baz.c), execute:

render50 -o foo.pdf bar.c baz.c

The source files will be rendered in the order in which they’re specified on the command line.

Include files

To generate a PDF (e.g., foo.pdf) from multiple source files, including only those that match some pattern (e.g., *.c), execute:

render50 -i "*.c" -o foo.pdf *

Take care to quote (or escape with \) any patterns with wildcards, lest your shell glob the pattern before render50 can.

Exclude files

To generate a PDF (e.g., foo.pdf) from multiple source files, excluding those that match some pattern (e.g., *.h), execute:

render50 -x "*.h" -o foo.pdf *

As before, take care to quote (or escape with \) any patterns with wildcards, lest your shell glob the pattern before render50 can.

Render two files side by side

To generate a PDF (e.g., foo.pdf) with two source files (e.g., bar.c and baz.c) side by side, execute:

render50 -o foo.pdf -y bar.c baz.c

To facilitate discussion thereof, the lefthand file’s line numbers will be prefixed with L while the righthand file’s line numbers will be prefixed with R.

Render files recursively

To recurse into directories, invoke render50 with -r.

Override syntax highlighting

By default, render50 uses Pygments’s default stylesheet to for syntax highlighting but also supports all of the styles demonstrated at https://pygments.org/demo/#try. You can specify a style with -S as follows:

render50 -o foo.pdf -S emacs foo.c

Disable color

To disable color (e.g., for a black-and-white printer), you can use Pygments’s bw style as follows:

render50 -o foo.pdf -S bw foo.c

However, that style might still boldface some keywords. You can further disable boldfacing (and color) as follows:

render50 -o foo.pdf -S "" foo.c

Rendering URLs

To generate a PDF (e.g., foo.pdf) with a source file at a URL (e.g., https://github.com/cs50/render50/blob/master/render50), execute:

render50 -o foo.pdf https://github.com/cs50/render50/blob/master/render50

Note that URLs on github.com are handled specially: URLs of the form https://github.com/*/*/blob/* are resolved to https://github.com/*/*/raw/* so that the file is downloaded from raw.githubusercontent.com. And URLs of the form https://gist.github.com/*/* (and https://gist.github.com/*/*#file-*) are resolved to https://gist.github.com/*/*/raw (and https://gist.github.com/*/*/raw/*) so that the file is downloaded from gist.githubusercontent.com.

Overriding page size

By default, render50 outputs letter-sized (8.5” × 11”) pages in landscape orientation. To override that default, invoke render50 with -p SIZE, where SIZE is as prescribed by CSS. Supported values for SIZE thus include:

  • letter landscape

  • letter portrait

  • A4 landscape

  • A4 portrait

Files’ paths will be right-aligned atop each page (to allow for staples in top-left corners).

Formatting for screen

To format output for screens (e.g., to display on a projector), invoke render50 with -s [SIZE]. Supported values for SIZE include:

  • 480p

  • 720p

  • 1080p

  • 4K

Files’ paths will be left-aligned atop each page.

If invoked without a value for SIZE, render50 -s alone will render pages at 480p (for visibility’s sake on projectors).

Source Code

https://github.com/cs50/render50