Postscript Calendar Program
Michael A. Patton
map at gaak.LCS.MIT.Edu
Wed Sep 20 05:14:21 AEST 1989
After receiving Rolf's post, I added a few "features" to the script.
It now has defaults for everything on the command line (these defaults
are, of course, the ones I like, your mileage may vary). Hack away.
-Mike
----------------------------------------------------------------
#!/bin/csh -f
# pscal - Postscript year calendar
#
# 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)
#
# Modified to add defaults Sep 1989 - MAP at LCS.MIT.Edu
# printer defaults to your "default" printer
# title defaults to "user's calendar"
# month defaults to January
# year defaults to this year
# Note: if there is a message and you wish to default the month or year,
# the first word of the message cannot begin with a digit.
#
#
# Usage: pscal [-Pprinter] [[month] year] [message ...] , eg.
# pscal -Ppsc 9 1989 "Rolf's Calendar"
# will produce a twelve month calendar from Sept 89 to Aug 90.
# printer defaults to the default (i.e. we say nothing, lpr figures it out)
set printer=""
top:
if ($#argv > 0) then
switch ("$argv[1]")
case -P*:
set printer="$argv[1]"
shift argv
goto top
case -*:
echo "usage: $0 [-Pprinter] [[month] year] [title ...]"
exit 1
case [0-9]*:
if ($?name) then
set name="$name $argv[1]"
else
if ($?month) then
if ($?year) then
set name="$argv[1]"
else
set year="$argv[1]"
endif
else
set month="$argv[1]"
endif
endif
shift argv
goto top
case *:
if ($?name) then
set name="$name $argv[1]"
else
set name="$argv[1]"
endif
shift argv
goto top
endsw
endif
if ($?year) then
else
if ($?month) then
set year=$month
else
set year=`date|awk '{print $6}'`
endif
set month=1
endif
if ($?name) then
else
set name="$user's calendar"
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
More information about the Alt.sources
mailing list