cls-compile.py is a tool for compiling the proceedings of
the Chicago Linguistic Society.
When the individual paper PDFs and other necessary PDFs (front matter, acknowledgments, etc) are in place, this tool compiles the proceedings PDF output, automatically taking care of the following:
- figuring out the page numbers for individual papers
- generating the paper headers and adding them to the paper PDFs
- generating the table of contents
- concatenating everything to create the final proceedings PDF outputs (one for the letter size 8.5" x 11" and the other for 6" x 9"; some printers require 6" x 9")
This tool is based essentially on what was used to compile the CLS 48 volume, plus a few upgrades. It has been used to compile the CLS 50, 51, and 52 volumes.
cls-compile.py is currently available on GitHub:
https://github.com/jacksonllee/cls-proceedings
Two ways of downloading it:
-
Run this if you have
git:$ git clone https://github.com/jacksonllee/cls-proceedings.git -
Download the zipped version:
https://github.com/jacksonllee/cls-proceedings/archive/master.zip
This repository contains the following:
cls-compile.py: where all the magic happensexample: a folder as a sample "working directory" where all necessary input files are foundreadme.md: this readme file you are readingCLS51_Author_kit.zip: the CLS 51 author kit with the CLS stylesheet and templates; included here for reference
-
A Unix-like environment
cls-compile.pyis a command line tool out of the box. As of November 2016, all use cases ofcls-compile.pyhave been on Unix-like environments only (Linux and Mac OS). Windows is not actively supported. (Cygwin and the like should work in principle, but not tested.) -
Python
Python is required to run
cls-compile.py. If you are on Linux or Mac OS, Python is readily available. Either Python 2 or 3 works withcls-compile.py.Throughout this readme document, we use
pythonto generically mean the Python command for your terminal. -
The Python package PyPDF2 (https://pypi.python.org/pypi/PyPDF2)
We need this package to manipulate PDF files in Python:
$ python -m pip install PyPDF2Administrative privileges (e.g.
sudoon Ubuntu) may be required.If Python complains that
pipis unavailable, you'll need to get it first. See here. Alternatively, PyPDF2 can be installed through its source on PyPI or GitHub. -
The
pdflatexprogramThe
pdflatexcommand has to be available in your path so that we can call it to compile LaTeX documents. If you are on Linux or Mac and TeX Live is installed, then you probably havepdflatexalready.
All the PDFs needed to compile the CLS proceedings must all be in a working
directory -- let's call this directory example
(as shown in this repository).
Inside example, all PDFs must be organized in the following way in order for
cls-compile.py to work:
example/
front-matter/
front-matter.pdf
acknowledgments/
acknowledgments.pdf
papers-without-headers/
<all individual paper PDFs without headers or paper numbers>
templates/
headers.tex
table-of-contents.tex
blank.pdf
organizer.csv
Four folders are expected inside example; a fifth required item right under
example---organizer.csv---is explained in the next section.
-
front-matterOnly one PDF file is expected in this folder, e.g.,
front-matter.pdf(.textemplate also provided).cls-compile.pyignores all other non-PDF files in this folder, so you may work within this folder with LaTeX files etc to generate the required PDF file. -
acknowledgmentsOnly one PDF file is expected in this folder, e.g.,
acknowledgments.pdf(.textemplate also provided).cls-compile.pyignores all other non-PDF files in this folder, so you may work within this folder with LaTeX files etc to generate the required PDF file. -
papers-without-headersThis folder contains all PDFs of the individual papers without headers or page numbers.
-
templatesThis folder contains templates and other files needed. Do NOT change their names, though the contents of
headers.texandtable-of-contents.texcan be updated if necessary.blank.pdfis the blank PDF page inserted here and there in the final proceedings PDF so that all items start on the right-hand side in the printed volume.
An organizer CSV file (e.g., organizer.csv) is
required to provide the essential information about authors, paper titles, etc.
This CSV file must contain six columns with the following header names:
-
indexAn index number just for convenience. The first paper is 1 and so forth. Note that the order of the rows in this CSV file (regardless of what the column
indexsays) determines the order by which the papers appear in the proceedings PDF. So make sure all the papers are ordered correctly in the organizer by alphabetical order of first authors' last names or whatever the CLS members would like. -
authorsThe cell for each paper in the column
authorsshows exactly how author names appear in the table of contents. Use LaTeX formatting for non-ASCII characters (accented characters etc). -
paper title(similar to
authorsabove) -
authors in headerThe cell for each paper in the column
authors in headershows exactly how author names appear in the paper's header. Use LaTeX formatting for non-ASCII characters (accented characters etc). The cell content will be forced to be in the uppercase in the output proceedings PDF.If this cell is empty, then the cell content from
authorsfor the paper in question will be used.Note the cell content of
authors in headercannot exceed a certain character length (controlled by the optional argument--maxheaderlengthforcls-compile.py; more on runningcls-compile.pybelow) because the header naturally cannot accommodate something too long that would go over one line or cover up the page number. So for a paper with a long chain of author names, you have to put down something much shorter here (e.g., only the lastnames?). -
paper title in header(similar to
authors in headerabove) -
paper filenameThe cell for each paper in the column
paper filenameshows the paper's filename (e.g.,smith.pdf) as it appears in the folderpapers-without-headers.
If you have a working directory like example with all necessary files
properly organized by the guidelines here,
then do this at your current directory where cls-compile.py is:
$ python cls-compile.py --directory=<relative-path-to-your-working-directory>
If you don't provide --directory=<relative-path-to-your-working-directory>
(i.e., if you run python cls-compile.py without any arguments),
cls-compile.py assumes the example folder is at the current directory and
it is your working directory.
cls-compile.py allows various optional arguments for changing file/folder
names etc.
Please run python cls-compile.py -h for details.
Among the array of optional parameters, you may be interested in the following:
-
--maxheaderlengthThe maximum length (by number of characters) of the author or paper title headers in the paper PDFs (default: 55). This cap ensures that the header does not go over one line or cover up the page number in the header. To change the value to, say, 60, do something like
python cls-compile.py --maxheaderlength=60. -
--startpagenumberThe starting page number of the first paper by order in the proceedings volume (default: 1).
Multiple optional parameters are possible, in the form of
python cls-compile.py --<parametername1>=<parametervalue1> --<parametername2>=<parametervalue2>.
If you run cls-compile.py and all goes well, the final proceedings PDF outputs
should be sitting right inside your working directory (hurray!).
In addition, all intermediate files are kept for reference.
Inside the working directory, you should see the new folders
table-of-contents, headers, and papers-with-headers
(all individual paper PDFs nicely typeset with headers and page numbers here!).
Scaling -- The final PDF with the letter size of 8.5" x 11" has no scaling applied. To avoid cutting off any material, the 6" x 9" PDF output is scaled down by a factor of 0.95 based off the 8.5" x 11" PDF. (The scale factor is a command line option which you can configure.)
Note that if you are running cls-compile.py multiple times, all
already-existing contents inside
the folders table-of-contents, headers, and papers-with-headers will be
removed at each run to ensure clean output files.
Upon completion of the final PDF compilation, three log files are generated
at the working directory: master.log, pdflatex.log, and directory.log.
CLS officers are welcome to contact Jackson Lee for any questions regarding this tool. If you run into any issues and would like Jackson's help for troubleshooting, doing the following will help him to figure out how to help you:
- Tell him what error messages (if any) appear on the terminal.
- Send him the three log files
(
master.log,pdflatex.log, anddirectory.log); these should be at the same directory ascls-compile.py.
To take advantage of the GitHub infrastructure -- Code contributions through pull requests are more than welcome! Questions and bug reports? Please submit a ticket here.
The overarching strategies of cls-compile.py:
- Check if everything needed is in place before any PDF manipulation is done
- Issue an error (and exit) as soon as one is detected
Everything in the proceedings volume that comes after the table of contents is treated as "papers". This means that, for instance, if something like a prompt page to introduce the main session or parasession papers is desired, it should be treated as a "paper" and included in the organizer CSV file (but we probably don't want headers and page numbers for these -- would need some way to handle this).
Use flake8 to maintain high code quality.
To install it (assume pip is available):
$ pip install flake8
To run it (no output means everything's great!):
$ flake8 cls-compile.py
The commit history is king, but for the major milestones:
- 2017 September: Added the 6" x 9" final PDF output
- 2016 March: Allowed Python 2 and improved logging
- 2016 January: Cleaned up the code and versioned it with git
The MIT License. See LICENSE.txt.