Postscript Calendar Program

Rolf Howarth rolf at warwick.UUCP
Mon Sep 18 06:33:30 AEST 1989


Here's some PostScript, with a shell script front end, to produce a year
calendar. It will show 12 months starting from any month, so it is useful
for producing academic year calendars etc. As it stands it sends its
output straight to lpr, but it's trivial to change.

-Rolf

-------------------------------------------------------------------------
#!/bin/csh -f
# yearcal - Postscript year calendar      Rolf Howarth 17/9/89
#
# Originally...
# From: patwood at unirot.UUCP (Patrick Wood)
# Newsgroups: net.sources
# Subject: PostScript Calendar
# Date: 7 Mar 87 18:43:51 GMT
# Organization: Public Access Unix, Piscataway, NJ
# 
# The following is a PostScript program to print calendars.  It doesn't
# work on or before 1752.
# 
# Shell stuff added 3/9/87 by King Ables
# Leap year bug fixed Dec. 4th, 1987 by Neil Crellin (neilc at dmscanb.dms.oz.au)
#
# Modified to produce calendar for whole year Aug 1988 - Rolf
# Twelve months from any month - 17/9/89 Rolf Howarth (rolf at flame.warwick.ac.uk)
#
# Usage: yearcal [-Pprinter] month year message ... , eg.
#     yearcal -Ppsc 9 1989 "Rolf's Calendar"
# will produce a twelve month calendar from Sept 89 to Aug 90.

set printer="-Ppsc"

top:
if ($#argv > 0) then
	switch ("$argv[1]")
		case -*:
			set printer="$argv[1]"
			shift argv
			goto top
		case *:
			if ($?month) then
			    if ($?year) then
				if ($?name) then
				    set name="$name $argv[1]"
				else
				    set name="$argv[1]"
				endif
			    else
				set year="$argv[1]"
			    endif
			else
				set month="$argv[1]"
			endif
			shift argv
			goto top
	endsw
endif

if ($?year) then
else 
	echo "usage: $0 [-Pprinter] month year message ..."
	exit 1
endif

lpr $printer <<END-OF-CALENDAR
%!
% PostScript program to draw calendar
% Copyright (C) 1987 by Pipeline Associates, Inc.
% Permission is granted to modify and distribute this free of charge.

% /month should be set to a number from 1 to 12
% /year should be set to the year you want
% you can change the title and date fonts, if you want
% we figure out the rest
% won't produce valid calendars before 1800 (weird stuff happened
% in September of 1752)

/year $year def
/month $month 1 sub def
/titlefont /Times-Bold def
/dayfont /Helvetica-Bold def

/month_names [ (January) (February) (March) (April) (May) (June) (July)
		(August) (September) (October) (November) (December) ] def

/prtnum { 3 string cvs show} def

/drawgrid {		% draw calendar boxes
	dayfont findfont 7 scalefont setfont
	0 1 6 {
		dup dup 25 mul 12 moveto
		[ (Sun) (Mon) (Tue) (Wed) (Thu) (Fri) (Sat) ] exch get
		22.5 center
		25 mul 11.5 moveto
		.1 setlinewidth
		50 {
			gsave
			22 0 rlineto stroke
			grestore
			0 -2.5 rmoveto
		} repeat
	} for

} def

/drawnums {		% place day numbers on calendar
	dayfont findfont 12 scalefont setfont
	/start startday def
	/days ndays def
	start 25 mul 0 rmoveto
	1 1 days {
		/day exch def
		gsave
		  isdouble
		  {
			day prtdouble
		  }
		  {
			day prtnum
		  } ifelse
		grestore
		day start add 7 mod 0 eq
		{
			currentpoint exch pop 25 sub 0 exch moveto
		}
		{
			25 0 rmoveto
		} ifelse
	} for
} def

/isdouble {		% is today going to be overlaid on next week's?
	days start add 35 gt
	{
		day start add 35 gt
		{
			true true
		}
		{
			day start add 28 gt
			day 7 add days le and
			{
				false true
			}
			{
				false
			} ifelse
		} ifelse
	}
	{
		false
	} ifelse
} def

/prtdouble {
	gsave
	  dayfont findfont 6 scalefont setfont
	  exch
	  {
		9 25 rmoveto
		prtnum
	  }
	  {
		0 4 rmoveto
		prtnum
		0 -4 rmoveto
		gsave
		  dayfont findfont 12 scalefont setfont
		  (/) show
		grestore
	  } ifelse
	grestore
} def

/isleap {		% is this a leap year?
	year 4 mod 0 eq		% multiple of 4
	year 100 mod 0 ne 	% not century
	year 1000 mod 0 eq or and	% unless it's a millenia
} def

/days_month [ 31 28 31 30 31 30 31 31 30 31 30 31 ] def

/ndays {		% number of days in this month
	days_month month 1 sub get
	month 2 eq	% Feb
	isleap and
	{
		1 add
	} if
} def

/startday {		% starting day-of-week for this month
	/off year 2000 sub def	% offset from start of "epoch"
	off
	off 4 idiv add		% number of leap years
	off 100 idiv sub	% number of centuries
	off 1000 idiv add	% number of millenia
	6 add 7 mod 7 add 	% offset from Jan 1 2000
	/off exch def
	1 1 month 1 sub {
                1 copy
		days_month exch 1 sub get
		exch 2 eq
		isleap and
		{
			1 add
		} if
		/off exch off add def
	} for
	off 7 mod		% 0--Sunday, 1--monday, etc.
} def

/center {		% center string in given width
	/width exch def
	/str exch def width str 
	stringwidth pop sub 2 div 0 rmoveto str show
} def

90 rotate
40 -100 translate
titlefont findfont 36 scalefont setfont
/yearstring 10 string def
year yearstring cvs
month 0 ne {
    yearstring 4 47 put	% 47 is ascii for slash
    yearstring 5 year 1 add 100 mod 2 string cvs putinterval
    } if
0 40 moveto
($name) show
775 yearstring stringwidth pop sub 40 moveto
% 388 yearstring stringwidth pop 2 div sub 36 moveto
yearstring show

/showmonth {
    titlefont findfont 12 scalefont setfont
    0 20 moveto
    month_names month 1 sub get show
    0 0 moveto
    drawnums
    0 0 moveto
    drawgrid
} def

/nextmonth {
    month 1 add dup 13 eq {/year year 1 add def pop 1} if
    /month exch def
    showmonth
    } def

nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
-600 -160 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
-600 -160 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth
200 0 translate
nextmonth

showpage

END-OF-CALENDAR

-------------------------------------------------------------------------
Rolf Howarth,			  Tel:	  +44 203 523523 ext.2485
Dept. of Computer Science,	  Fax:	      203 525714
University of Warwick,		  JANET:  rolf at uk.ac.warwick.flame
Coventry,  CV4 7AL,  England.	  UUCP:	  {uunet,mcvax}!ukc!warwick!rolf
-------------------------------------------------------------------------



More information about the Alt.sources mailing list