Making your own page-a-day calendar

Anomalously, today's post is about a DIY physical artifact.

A while back, I made a custom page-a-day calendar as a gift for my girlfriend. Each page tears off and has a picture on it. (Unfortunately, I don't have any photos of the finished product.)

With just a little effort, you can make one of these things and have it look quite professional. You can fill the pages with whatever photos, comics, etc. you want. And, I can virtually guarantee you, your recipient has never had a page-a-day calendar typeset in Computer Modern.

Here are skeletal instructions for making your own. You'll need a printer, ink or toner, most of a ream of paper, some padding compound, a paper cutting device/facility, cardboard, LaTeX, and time.

1. Get source images

Acquire 365 images from Flickr, your photo collection, your favorite CC-licensed webcomic, or whatever strikes your fancy. This post on curl may come in handy. Some notes: (1) Layout is much easier if the images are the same aspect ratio. (2) Consider upsampling the images if needed, e.g. with imagemagick, so you can print at a respectable DPI. Henceforth I'll assume you've named the images imgs/001.jpg, imgs/002.jpg, etc. If this is not the case, simply adjust the code in Steps 2 and 3 accordingly.

2. Use this LaTeX skeleton

Make a new TeX file and fill it with this:

\documentclass[17pt,oneside,final,showtrims]{memoir}
\usepackage{marvosym}

\setstocksize{11in}{8.5in}

\settrims{0in}{0in}

\settrimmedsize{4in}{6in}{*}
\settypeblocksize{3.5in}{1.75in}{*}
\setlrmargins{0.25in}{*}{*}
\setulmargins{0.05in}{*}{*}
\setheadfoot{0.01in}{0.1in}
\setheaderspaces{*}{*}{*}
\setmarginnotes{0.25in}{3.5in}{0in}

\checkandfixthelayout

\pagestyle{empty}

\usepackage[final]{graphicx}

\pagestyle{empty}

\newcommand{\daypage}[6] {
  \marginpar{\includegraphics[height=3.4in]{imgs/#1.jpg}}
  \begin{center}
    \Large{#2} \\
    \HUGE{\textbf{#3}} \\
    \large{#4}

    \vspace{0.4in}
    \small{#5}

    \vspace{0.2in}
    \scriptsize{\textit{#6}}
  \end{center}
  \newpage
}

\begin{document}
  % Cover page
  \marginpar{\includegraphics[height=3.4in]{imgs/cover.png}}
  \newpage

  \include{tex-days}
\end{document}

Salient points:

  • The \daypage command generates a new page. You supply arguments specifying the parameters for each page: the filename of the image to include, the day and date, a line indicating whatever holiday it might be, etc. Play around with the layout, especially if you're using images of different aspect ratios than I did or if you have a calendar stand of a particular size.
  • If you want a cover page, supply a cover.png; otherwise, remove the corresponding lines from the template.

3. Generate the pages

The template above includes tex-days.tex, which might look something like this:

[...]
  \daypage{182}{Sunday}{03}{Jul 2005}{~}{~}
  \daypage{183}{Monday}{04}{Jul 2005}{Independence Day}{~}
  \daypage{184}{Tuesday}{05}{Jul 2005}{~}{~}
  \daypage{185}{Wednesday}{06}{Jul 2005}{~}{~}
  \daypage{186}{Thursday}{07}{Jul 2005}{~}{~}
[...]

You can generate a skeletal version of this, sans holidays, with a quick Python program. I've provided a sample tex-days.tex file for the year 2010.

The first argument on each line indicates the filename, e.g. 182 indicates that 182.jpg should be included. Make sure these match the filenames you are using. The sample file assumes your images are named 1.jpg, 2.jpg, etc. If this is not the case, either create your own version or rename your files.

If you're interested in embellishing the output, the 5th and 6th arguments on each line provide supplementary text to go on each page (#6 is printed in smaller type than #5). You can fill in, by hand or programmatically, whatever notations you want here, e.g., holidays, birthdays, anniversaries, or a countdown to whatever.

Arguments 2, 3, and 4 give the day of week, date, and month/year respectively that are displayed, in case that wasn't clear.

4. Produce and print

Run the file through pdflatex and print it! Make sure the alignment is consistent across pages.

The showtrims argument in the template file makes LaTeX print trim marks on each page. However, you really only need trim marks on the first page. If you're obsessive-compulsive, you could print the first page with trim marks and the rest without to guarantee the marks won't show on the finished product.

5. Trim it

I took the stack of paper, with pieces of thin cardboard above and below it, to my local Kinko's (now Fedex Kinko's, I guess). I asked them to cut the stack along the trim marks (2 cuts, since 2 of the edges already run up again against the page edges). They did this for a fee of just $1/cut.

6. Bind it

Get some padding compound, e.g. Sparco padding compound. (I bought a quart, so I can probably make gift calendars/notepads for years.) Align the cut pages, leaving one piece of cardboard on the bottom, and put the stack in a vise. (In a jam, "under a pile of hardcover books" will do.) Using a paintbrush, paint the top edge of the stack with padding compound. Wait for it to dry. Paint another coat.

If you have random loose paper, padding compound is also handy for recycling it into notepads.

7. Mount it

This is not really needed, but is a nice touch. Find an old stand for a page-a-day calendar. Glue the cardboard backing in.

I hereby place the LaTeX template and LaTeX snippets in this post into the public domain.

14 comments:

  1. i had never heard of padding compound. that is awesome. thanks phil!

    ReplyDelete
  2. Hello,

    Just wanted to Thank YOu!
    for posting this. Been looking for something for a couple of years.

    I have not done it yet, but look forward to see
    how well it works.

    Any suggestion on how to do texts instead of pictures?

    Thanks again!

    ReplyDelete
  3. spicer23: my LaTeX is a little rusty, but you should be able to generate some kind of box in the template and then add one or more additional args in tex-days.tex to specify the text you want to put on each page.

    ReplyDelete
  4. This is awesome! Awesome! I'm going to have to try this.

    ReplyDelete
  5. I admittedly don't know much about Latex yet.. but I'm wondering if there is any way (to avoid a lot of paper waste) to get more than one date on a page?

    Any ideas? Trying to follow the code but it really escapes me

    ReplyDelete
  6. @Len: a few ideas--

    1. Do something with boxes in LaTeX to lay out multiple day-pages per printed page. I'm not exactly sure how to go about this.

    2. Use a larger day-page size in your original and then use psnup/pdfnup to get multiple pages on each physical page.

    3. If you think a 50% paper savings is good enough... print the first half, rotate the pages 180 degrees, print the second half, get them cut, and then stack them.

    ReplyDelete
  7. Hi Phil!

    Thanks a lot for the post! I am trying to use it. But I have a few questions:

    1. Your demo picture above has a nice border around it. When I am inserting pictures, I do not get it. What should I do?

    2. My images are of different aspect ratios. How do i make adjustment for each individual page?

    Many thanks indeed!
    avinash

    ReplyDelete
  8. @Avinash,

    1. I don't recall, sorry. I probably just added the borders in a preprocessing phase e.g. using imagemagick.

    2. You could crop them all to the same aspect ratio (e.g. with imagemagick). Alternatively if you want to keep images with different aspect ratios, you might be able to play around with the template to let you specify the picture placement on a per-day basis.

    ReplyDelete
  9. Hey Phil,
    thanks a lot for your prompt response last time. I am using your command a second time for another calendar i am making. But i am facing a problem time and again.

    Here it is:

    LATEX Warning: Marginpar on page 1 moved by 245.71754 pt.
    Overfull \vbox (21.27771pt too high) has occurred while \output is active
    [20 ]

    Overfull \hbox (74.683pt too wide) in paragraph at lines 23--23
    [][]

    The same error message shows up for every page of the calendar.

    Interestingly the problem does not arise if i do not use the pound sign before the image file name in the includegraphics command. Then the calendar turns out fine except that it has image1.jpg on all pages of the calendar.

    Please help sort this out. Many thanks. I have become a big fan of your create your own calendar idea.

    regards
    avinash

    ReplyDelete
  10. @Avinash,

    When you use "#1", is the layout actually messed up when you open the output file? And if so, in what way? LaTeX is very eager to print warnings but most of the time there's not a huge effect on the printed output.

    The "#1" is needed so that LaTeX fills in the appropriate image for each page rather than just "1.jpg", as you observed.

    ReplyDelete
  11. @Avinash,
    To autoscale your images to fit within the 3.4" x 3.4" box, change the \includegraphics parameters to:

    "\includegraphics[height=3.4in,width=3.4in,keepaspectratio]"

    ReplyDelete
  12. Thanks for the LaTeX template and ideas Phil! I wrote up my experience making a calendar including the Python code to generate the \daypage calls, in case it saves someone some time.

    ReplyDelete
  13. I am trying to make my own calendar but am having trouble linking to mrj10 code. Could you provide it to me? I'm not familiar with writing code so I'm trying to teach myself. Any help would be greatly appreciated.

    ReplyDelete
  14. Might be beyond me intellectually and time-wise, but I sure like your blog appearance. -kevin

    ReplyDelete