%!PS-Adobe-1.0
%%Title: deskcal.ps version 1.0 alpha.
%%Creator: Andrew Rogers (adapted from Ole Arntzen's polyeder.ps)
%%CreationDate: 6/1/93
%%Pages: 1
%%EndComments
%----------------------------------------------------------------------
% A small program to create a dodecahedral desk calendar; adapted from
% Ole Arntzen's (olea@ii.uib.no) generic polyhedron program, polyeder.ps,
% by Andrew Rogers
%
% This program is public domain.
%
%----------------------------------------------------------------------
/year 2004 def % define desired year here
/pos 0 def % starting position
/mon [1 8 2 7 6 11 5 12 10 4 9 3] def % position -> month
/ndays [0 31 28 31 30 31 30 31 31 30 31 30 31] def % month lengths
/name [() (January) (February) (March) (April) (May) (June) (July)
(August) (September) (October) (November) (December)] def
/wkday [(Su) (Mo) (Tu) (We) (Th) (Fr) (Sa)] def
/LineLength 80 def % length of the edges
/fsize LineLength 10 idiv def % font size
/center { % str width center
/width exch def
/str exch def
width str stringwidth pop sub 2 div 0 rmoveto str show
} def
/strcat { % str1 str2 >> str1str2
2 copy
length exch length
dup 3 -1 roll add
string
dup 0 6 -1 roll putinterval
dup 3 -1 roll 4 -1 roll putinterval
} def
/printcal {
/m mon pos get def % convert position to month
gsave
/Helvetica-Bold findfont fsize scalefont setfont
/Y LineLength 1.05 mul def
0 Y moveto
name m get ( ) strcat year 4 string cvs strcat LineLength center
/l ndays m get def % calculate length, starting offset
/s start def
1 1 m 1 sub {
/i exch def
/s s ndays i get add def
} for
/s s 7 mod def
% calculate centering information for weekdays/dates
/Helvetica-Bold findfont fsize 1 sub scalefont setfont
/w3 (222) stringwidth pop def
/w2 (22) stringwidth pop def
/X LineLength w3 6 mul w2 add sub 2 div def
/Helvetica-Bold findfont fsize 2 sub scalefont setfont
/Y Y fsize 1.5 mul sub def
0 1 6 { % weekdays
/w exch def
X w w3 mul add Y moveto
wkday w get w2 center
} for
/Helvetica-Bold findfont fsize 1 sub scalefont setfont
/Y Y fsize sub def
1 1 l { % dates
/d exch 3 string cvs def
X s 7 mod w3 mul add w2 add d stringwidth pop sub
Y s 7 idiv fsize mul sub moveto
d show
/s s 1 add def
} for
grestore
/pos pos 1 add def
} def
/ReadCharacter
{
% This routine looks for an interesting character, and return it on
% the stack. Illegal character => Quit.
/OneCharacter 1 string def
{
currentfile OneCharacter readstring % Read one character.
not { (Unexpected end of FILE. Quit) print quit } if
OneCharacter (e) eq OneCharacter (f) eq or { exit } if
OneCharacter (3) ge OneCharacter (9) le and { exit } if
pop
OneCharacter (%) eq
{ % Found commentcharacter, drop rest of line.
{
currentfile OneCharacter readstring % Read one character.
not { (Unexpected end of FILE. Quit) print quit } if
pop
OneCharacter (\012) eq { exit } if
} loop
}
{
OneCharacter ( ) gt
{
% Illegal character => Quit.
(Illegal characeter: ") print
OneCharacter print
("\012. Quit) print
quit
} if
} ifelse
} loop
} def
/DrawEdge
{
0 0 moveto
LineLength 0 lineto stroke
} def
/DrawFlip
{
[1 4] 4 setdash
0 0 moveto
LineLength 0 lineto stroke
[] 0 setdash
0 0 moveto
LineLength 0.5 mul LineLength 0.3125 mul neg lineto
LineLength 0 lineto stroke
} def
/InnerLoop
{
/OneCharacter ReadCharacter def % Read one character.
OneCharacter (e) eq { DrawEdge }
{ OneCharacter (f) eq { DrawFlip } { DrawPolygon } ifelse } ifelse
LineLength 0 translate
CurrentAngle rotate
} def
/DrawPolygon
{
[1 4] 4 setdash
0 0 moveto
LineLength 0 lineto stroke
[] 0 setdash
CurrentAngle % Put previous CurrentAngle on stack for later use.
/NumEdges OneCharacter cvi def
/CurrentAngle 360 NumEdges div def
180 CurrentAngle add rotate
NumEdges 1 sub {
InnerLoop
} repeat
printcal
LineLength 0 translate % Transformer back to start.
180 rotate
/CurrentAngle exch def % Fetch CurrentAngle from the stack.
} def
/DrawPolyhedron
{
/OneCharacter ReadCharacter def % Read one character.
/NumEdges OneCharacter cvi def
/CurrentAngle 360 NumEdges div def
printcal
NumEdges {
InnerLoop
} repeat
} def
0 setlinewidth % Set line thickness.
% calculate starting day of year; adjust month lengths for leap year
/y1 year 1 sub def
/start year y1 4 idiv add y1 100 idiv sub y1 400 idiv add 7 mod def
year 4 mod 0 eq year 100 mod 0 ne year 400 mod 0 eq or and {
ndays 2 29 put
} if
% Draw pentagon dodecaheadron.
gsave
270 350 translate % Translate to make the polyhedron fit the paper.
DrawPolyhedron
5 % This is a comment.
5 f 5fff e ee % Blanks are ignored.
5 f 5fff e ee
5 f 5fff e ee
5 f 5ff5eeeee ee
5 f 5fff e ee
grestore
% Print some instructions.
/Helvetica findfont 12 scalefont setfont
40 40 moveto
(Cut along solid line; fold along dotted lines.) show
showpage