PCAL(1) UNIX Programmer's Manual PCAL(1) NAME pcal - generate PostScript calendars SYNOPSIS pcal [-e|-f _c_a_l] [-o _f_i_l_e] [-j | -J] [-l | -p] [-m | -M] [-b _d_a_y|all] [-g _d_a_y|all] [-O] [-G] [-s [_d_a_t_e__s_h_a_d_e][/_f_i_l_l__s_h_a_d_e]] [-F _d_a_y] [-A|-E] [-t _t_i_t_l_e__f_o_n_t] [-d _d_a_y__f_o_n_t] [-n _t_e_x_t__f_o_n_t[/_s_i_z_e]] [-L _f_o_o_t_e_r__s_t_r] [-C _f_o_o_t_e_r__s_t_r] [-R _f_o_o_t_e_r__s_t_r] [-N _n_o_t_e_s__s_t_r] [-D _s_y_m_b_o_l] [-U _s_y_m_b_o_l] [-x _x_s_c_a_l_e] [-y _y_s_c_a_l_e] [-X _x_t_r_a_n_s] [-Y _y_t_r_a_n_s] [-I] [-B] [-S | -k | -K] [-w] [-h | -u | -v] [_m_o_n_t_h] [_y_e_a_r] [_n_m_o_n_t_h_s] DESCRIPTION _P_c_a_l generates PostScript to produce landscape or portrait calendars for any month and year. The arguments month, year, and nmonths, if provided, should be numeric. The month value should be in the range 1 - 12, and the year value should be specified as 1 or 2 digits or as the full 4 digit year. If no numeric arguments are provided, the calendar for the current month and year will be generated. If one numeric argument is provided, it is interpreted as the year value, and calendars for the entire year will be generated. Otherwise, nmonths months, starting with month and year, will be generated. For whole-year calendars (i.e. the -w option is given), the command line arguments are interpreted somewhat differently. By default, all months in the current year are printed, starting with January. If the month argument alone is given, it is expected to be the desired year to print, and prints all of the months in the given year. If both month and year are given, then 12 consecutive months are printed starting at the given month and year. If the month, year, and nmonths arguments are all present, printing begins with the given month and year and nmonths months are printed, rounded up to the nearest multiple of 12. The Date File By default, _p_c_a_l simply prints an empty calendar. Its real power is in its ability to place ``events'' in appropriate days on the calendar, thus allowing the user to create per- sonalized calendars. This is achieved through the use of the ``date file''. The date file is named ._c_a_l_e_n_d_a_r (_p_c_a_l._d_a_t under MS-DOS), or _c_a_l_e_n_d_a_r for compatibility with older versions. _P_c_a_l will look in several places for such a file. First, if the environment variable PCAL_DIR is defined, _p_c_a_l searches the Printed 12/31/91 1 PCAL(1) UNIX Programmer's Manual PCAL(1) directory indicated by that variable. Next, _p_c_a_l searches the user's home directory (as specified by the HOME environ- ment variable). If neither PCAL_DIR nor HOME is defined, _p_c_a_l searches the current directory instead. Finally, the directory where the _p_c_a_l executable resides will be checked. If no date file is found, an empty calendar is printed; no error is generated. If a date file is found, it will be searched for lines with leading dates matching the requested month and year. Any text following the dates found will be printed on the calen- dar under the appropriate day of the month. Dates in the ._c_a_l_e_n_d_a_r file may be expressed in any of several formats: in {*} {} {*} {} {*} {} Where: := first 3+ characters of name of month, or ``all'' := , or ``year'' := first 3+ characters of name of weekday, ``day'', ``weekday'', ``workday'', ``holiday'', ``nonweekday'', ``nonworkday'', ``nonholiday'', ``new_moon'', ``first_quarter'', ``full_moon'', or ``last_quarter'' := any ordinal number (``1st'', ``2nd'', etc.), ``first'' ... ``fifth'', ``last'', ``odd'', ``even'', or ``all'' := ``before'', ``preceding'', ``after'', ``following'', ``on_or_before'' (``oob''), or ``on_or_after'' (``ooa'') := one or more non-numeric, non-space, non-`*' characters := a numeric month (1-12) := day of month (1-31) := a numeric year If the -A option (American date formats, the default) is given: := | {} If the -E option (European date formats) is given: := | {} _P_c_a_l also allows format specifiers in both the text and foot strings (see the -L, -C, -R, and -N options below); each will be replaced by a corresponding string as outlined in the table below. Most of these are derived from the ANSI C strftime() function; the %[louwMD] and %[o0+-] format specifiers are specific to _p_c_a_l: %a abbreviated weekday Printed 12/31/91 2 PCAL(1) UNIX Programmer's Manual PCAL(1) %A full weekday %b abbreviated month name %B full month name %d day of month (1-31) %j day of year (1-366) %l days left in year (0-365) %m month (1-12) %U week number (0-53) %W week number (0-53) %u week number (1-54) %w week number (1-54) %y year w/o century (00-99) %Y year w/century %% `%' character %o print number as ordinal %0 print number with leading zeroes %+ use following month or year %- use previous month or year %{+N}[DWMY] adjust date by +N days/weeks/months/years %{-N}[DWMY] adjust date by -N days/weeks/months/years The %u specifier considers the week containing 1/1 as week 1 and the following logical Sunday (the first day of the week as printed; cf. the -F option below) as the start of week 2; %U considers the first logical Sunday as the first day of week 1. %w and %W behave like %u and %U respectively, but use the first logical Monday instead. Note that %w strftime(). The %o format specifier prints a number as an ordinal, with the appropriate suffix (``st'', ``nd'', ``rd'', or ``th'' in English) appended. For example, %od prints the day of the month as ``1st'', ``2nd'', ``3rd'', etc. Unlike strftime(), _p_c_a_l defaults to printing numbers (except %y) without leading zeroes. If leading zeroes are desired, the `0' prefix may be used. For example, %0j prints the first day of year as ``001''. The %+ and %- format specifiers direct _p_c_a_l to substitute the following/previous month/year in the following [bBmyY] specifier. For example, %+B prints the name of the next month. The %{[+-]N}[DWMY] format specifiers do not print anything, but instead adjust the working date by +_ Ndays (D), weeks (W), months (M), or years (Y). Subsequent format specifiers use the adjusted date instead of the current date. For example, %+1M %B %Y adjusts the date forward by one month and then prints the resulting month and year (``January 1992'' in December, 1991); %-2W %b %d adjusts the date Printed 12/31/91 3 PCAL(1) UNIX Programmer's Manual PCAL(1) backward by two weeks and prints the resulting month and day (``Jul 26'' on August 9). Such date adjustments are normally cumulative; for example, %+1Y%-1D adjusts the date forward by one year and then back- ward by one day. If %D or %M is specified alone (or if N is zero), _p_c_a_l restores the original date. Note that %M has a different meaning to the strftime() function. The ``Notes'' box (see below) uses the first of the current month as the default date. All foot strings use the first of the current month in single-month mode and the first of the starting month in whole-year mode. Examples: last Monday in May* Memorial Day Holiday all Fridays in Oct Status Meeting, 11 AM first workday in all %-B progress report due all Fri in all Time card due, 3 PM all Monday in all Fiscal week %0W -2nd workday in all Schedule for %+B due %+2D 2nd full_moon in all Blue Moon Fri on_or_before all 15 Pay Day even Fridays in year Pay Day 183rd day of year Mid-year (%l days left) Tue after first Mon in Nov Election Day (USA) 4th Thu in Nov* Thanksgiving Fri after 4th Thu in Nov* Day after Thanksgiving 12/25/90* Christmas # American 25.12.90* Christmas # European Dec 25* Christmas # American 25 Dec* Christmas # European Any non-numeric character may separate numeric dates. Holi- days may be flagged by following the date immediately with `*' as in the examples above; this will cause the date to be printed in gray. ``Each'' and ``every'' are accepted as synonyms for ``all'', and any word may be used in place of ``in''. The abbreviations ``oob'' and ``ooa'' may be used in place of the keywords ``on_or_before'' and ``on_or_after'', respectively. ``Nearest'' attempts to match the specified date; if that fails, it tries the day after, then the day before, then two days after, two days before, and so forth until a match occurs. Wildcard day names are also provided. The keyword Printed 12/31/91 4 PCAL(1) UNIX Programmer's Manual PCAL(1) ``weekday'' applies to any days which are normally printed in black on the calendar. The keyword ``workday'' is the same, but does not include any holidays. The keyword ``holiday'' includes only those days flagged as holidays. The keywords ``nonweekday'', ``nonworkday'', and ``nonholi- day'' are also recognized as negations of the above. See the CAVEATS below for important notes on using these key- words. Moon phases may also appear as wildcards; ``nm'' is accepted as a synonym for ``new_moon'', ``1q'' and ``fq'' for ``first_quarter'', ``fm'' for ``full_moon'', ``3q'' for ``third_quarter'', and ``lq'' for ``last_quarter''. Ordinal day numbers may be used to specify dates, either relative to the month or to the year. Either words or numeric abbreviations may be used for ``first'' through ``fifth''; higher numbers must be given using the numeric equivalent (e.g. 100th). Negative ordinal numbers may even be used. For example, ``-2nd'' means ``next to last''. ``Odd'' and ``even'' do not refer to the actual date; instead, ``odd'' means ``alternate, starting with the first'', and ``even'' means ``alternate, starting with the second''. Thus, ``odd Fridays in March'' refers to the first, third, and (if present) fifth Fridays in March - not to those Fridays falling on odd dates. ``All'' refers to each individual month; ``year'' refers to the year as an entity. Thus ``odd Fridays in all'' refers to the first, third, and fifth Friday of each month, while ``odd Fridays in year'' refers to the first Friday of Janu- ary and every other Friday thereafter. Text in the date file may use C-like escape sequences (i.e. a `\' followed by a character, 1 - 3 octal digits, or `x' followed by 1 - 2 hexadecimal digits). Escaped whitespace (including newline ) and the standard ANSI character escapes (`\a', `\b', `\f', `\n', `\r', `\t', `\v') are all replaced by a single blank. Lines in the ._c_a_l_e_n_d_a_r file consisting of year #### (where #### is a numeric year) can be used to set the year for fol- lowing entries. This assumes that the following entries do not contain a year; any date entries containing year infor- mation will set the remembered year to that year. Lines in the ._c_a_l_e_n_d_a_r file consisting of opt can be used to override the defaults for any command-line options except -c, -e, -f, -h, -u, -v, -D, and -U. Any options specified in this manner are, in turn, overridden by those specified explicitly on the command line. Lines in the ._c_a_l_e_n_d_a_r file consisting of note{/} Printed 12/31/91 5 PCAL(1) UNIX Programmer's Manual PCAL(1) can be used to place notes regarding the entire month in one of the unused blocks of the calendar. The indicator may be either a number 1 through 12 or an alphabetic month name as described above; ``note all'' will place the associated text in the notes block for each month in the current year. is an optional positive or negative number specifying the empty box where the associ- ated text is to be placed. If positive, _p_c_a_l counts forward from the first empty box; if negative, _p_c_a_l counts backward from the last empty box. Thus, ``note/1'' places the asso- ciated text in the first empty box; note/-3 in the third- to-last. The default is -1 if no is given (last empty box, immediately preceding the small calendars on the bottom row; cf. -S, -k, and -K, below). Comments are supported in the ._c_a_l_e_n_d_a_r file. Any charac- ters following a `#' character through the end of the line are ignored. _P_c_a_l supports rudimentary _c_p_p-like functionality in the date file, allowing the following constructs: define | undef, if{{n}def} ... {elif ...}* {else ...} and include. Note that these are not preceded by `#' as they are in C. Symbol names defined using these keywords (or via the -D option) are case-insensitive. It is not an error to undef an unde- fined symbol, nor to define a previously-defined one. An ifdef alone is always false; an ifndef alone is always true. if is accepted as a synonym for ifdef. The name of the file in the include directive may optionally be surrounded by either "" or <>, both of which are ignored. If the name is not an absolute path, it is taken to be rela- tive to the directory where the file containing the direc- tive is located. _P_c_a_l is smart enough to translate ~/ to the user's home directory. In addition to pre-processing keywords, _p_c_a_l also accepts boolean expressions in if{{n}def} and elif directives. These expressions consist of symbol names joined by the boolean operators !, &, ^, and |, in order of precedence, high to low. Parentheses may be used to alter the pre- cedence. The synonyms && and || are accepted for & and |. A symbol name evaluates to true if currently defined, false if not; thus: ifdef A | B | C ...is true if any of the symbols A, B, and C is defined, and: ifdef A & B & C Printed 12/31/91 6 PCAL(1) UNIX Programmer's Manual PCAL(1) ...is true if they all are. Note that ifndef is equivalent to ifdef !( ). The Moon File If a file of the name ._m_o_o_n## (_m_o_o_n##._d_a_t under MS-DOS), where ## is the last two digits of the calendar year, exists in the same directory as the date file (or in the directory where _p_c_a_l resides), _p_c_a_l uses the information contained within to calculate the phase of the moon. If no such file exists, _p_c_a_l uses an approximate algorithm. Entries in the moon file must conform to the following syn- tax: If the -A option (American date formats, the default) is given: {} If the -E option (European date formats) is given: {} Where: := ``nm'', ``fq'' or ``1q'', ``fm'', ``3q'' or ``lq'' (new moon, first quarter, full moon, last quarter) := number 0-23 (24-hour clock) := number 0-59 This file must contain entries for all quarter moons in the year, in chronological order; if any errors are encountered, _p_c_a_l will revert to using its default algorithm. As in the date file, comments start with `#' and run through the end of the given line. Options _P_c_a_l has many options: -e Prints an empty calendar. Do not print entries from a ._c_a_l_e_n_d_a_r file. -f _c_a_l Directs _p_c_a_l to use the file name _c_a_l as the input file in place of the default ._c_a_l_e_n_d_a_r file. Note that the search rules are different when -f is used. If _c_a_l is an absolute file name (i.e., starting with a `/'), then _p_c_a_l attempts to open only that file. Otherwise, _p_c_a_l looks for _c_a_l in the current directory, Printed 12/31/91 7 PCAL(1) UNIX Programmer's Manual PCAL(1) then in the directory indicated by the environ- ment variable PCAL_DIR (if defined), and finally in the directory where the _p_c_a_l executable resides. If the given _c_a_l file is not found, an error results. -o _f_i_l_e Directs _p_c_a_l to write the output to _f_i_l_e instead of to stdout. -l Causes the output to be in landscape mode (default). This also resets the x- and y-axis scaling and translation factors to the defaults for landscape mode. -p Causes the output to be in portrait mode. This also resets the x- and y-axis scaling and trans- lation factors to the defaults for portrait mode. -j Causes the Julian date (day of year) to be printed in each calendar box. -J Causes the Julian date and the number of days remaining in the year to be printed in each calendar box. -m Causes moon icons to be printed on dates corresponding to new, half, and full moons (the default is that no moons are printed). -M Causes moon icons to be printed on all dates (the default is that no moons are printed). -b _d_a_y | all Causes all dates falling on weekday _d_a_y to be printed in black; -b all causes all weekdays to be printed in black. -g _d_a_y | all Causes all dates falling on weekday _d_a_y to be printed in gray; -g all causes all weekdays to be printed in gray. The default for the -b and -g options is to print Saturdays and Sundays in gray and other days, unless flagged as holidays, in black. -O Causes ``gray'' dates to be printed as outlined characters. -G Causes ``gray'' dates to be printed as outlined characters filled with gray. Printed 12/31/91 8 PCAL(1) UNIX Programmer's Manual PCAL(1) -s{_d_a_t_e}{/_f_i_l_l} Overrides the default values for date and/or fill box shading. These values must be in the range 0.0 (black) through 1.0 (white); they may be set independently of each other. The default values are 0.8 for dates and 0.9 for empty boxes. -F _d_a_y Selects weekday _d_a_y as the first day of the week. The given day will appear in the left- most column of the calendar. -A Directs _p_c_a_l to use American date conventions mm/dd{/yy} and month dd ) when parsing the date file (default). -E Directs _p_c_a_l to use European date conventions dd/mm{/yy} and dd month ) when parsing the date file. -X _x_t_r_a_n_s Specifies the x-axis translation value for posi- tioning the output on the page. -Y _y_t_r_a_n_s Specifies the y-axis translation value for posi- tioning the output on the page. -x _x_s_c_a_l_e Specifies the x-axis scaling factor for the calendar size. -y _y_s_c_a_l_e Specifies the y-axis scaling factor for the calendar size. -t _t_i_t_l_e__f_o_n_t Specifies the name of a font to use to print the month name and year at the top of the calendar, the foot strings, and the notes box heading. For example, pcal -t Times-Roman. -d _d_a_y__f_o_n_t Similar to the -t option, but selects the font used to print the day numbers and weekday names. -n _t_e_x_t__f_o_n_t[/_s_i_z_e] Similar to the -t option, but selects the font used to print the text inside each day and in the notes block. The user may also select the font size; pcal -n Helvetica/8 sets the font to 8-point Helvetica. -D _s_y_m_b_o_l Defines the named symbol prior to reading the date file. -U _s_y_m_b_o_l Un-defines the named symbol prior to reading the Printed 12/31/91 9 PCAL(1) UNIX Programmer's Manual PCAL(1) date file. -L _s_t_r_i_n_g Causes the accompanying string to be printed as a left-justified footer. Format specifiers denoting the month and/or year may appear in the string; the appropriate values will be substi- tuted upon printing. -C _s_t_r_i_n_g Similar to -L, but causes the accompanying string to be printed as a centered footer. -R _s_t_r_i_n_g Similar to -L, but causes the accompanying string to be printed as a right-justified footer. -N _s_t_r_i_n_g Causes the accompanying string to be printed as the heading for the "Notes" box. Note, however, that _p_c_a_l makes no attempt to ensure that it fits. -B Causes _p_c_a_l to leave unused calendar boxes blank (default is gray). -S Causes _p_c_a_l to suppress printing the small calendars. See the CAVEATS section for further details. -k Causes _p_c_a_l to print the small calendars in the upper left corner (the default is to print them at the lower right). -K Causes _p_c_a_l to print the small calendar for the previous month in the upper left corner and the next month in the lower right (the default is to print both at the lower right). -w Causes _p_c_a_l to print a calendar for 12 consecu- tive months: 3 rows / 4 columns in landscape mode, 4 rows / 3 columns in portrait mode. See the CAVEATS section for details on the use of this option with other options. -c Causes _p_c_a_l to generate a date file suitable for use as input to the Un*x _c_a_l_e_n_d_a_r(_1) utility. The normal PostScript output is suppressed. -I Resets all parameters to the program defaults. -h Causes _p_c_a_l to write version information, param- eter usage message, and full explanation of options and file formats (to _s_t_d_o_u_t) and ter- minate. Printed 12/31/91 10 PCAL(1) UNIX Programmer's Manual PCAL(1) -u Causes _p_c_a_l to write version information and parameter usage message (to _s_t_d_o_u_t) and ter- minate. -v Causes _p_c_a_l to write version information only (to _s_t_d_o_u_t) and terminate. Any option which normally takes an argument may be specified without the argument in order to reset the value to the pro- gram default. Note that while the -D option alone clears all the defined symbols, the -U option alone has no effect. The - (or -- as per System V) argument may be used to disam- biguate command lines such as: pcal -t 9 90 This could be written instead as one of the following: pcal -t - 9 90 pcal -t -- 9 90 If the environment variable PCAL_OPTS is defined, its con- tents are parsed as a command line. Flags set via PCAL_OPTS override the program defaults, but are overridden by options set via opt lines in the ._c_a_l_e_n_d_a_r file or explicitly on the command line. CAVEATS The ``workday'' and ``holiday'' keywords are aware of only those holidays which have already been flagged at the point where they appear. For example, consider January 1990: January 1990 S M Tu W Th F S 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 If the ._c_a_l_e_n_d_a_r file looked like this: workday on_or_before all 15 payday 3rd Mon in Jan* MLK day ... then _p_c_a_l would mark the 15th as ``payday'' since at that point in the ._c_a_l_e_n_d_a_r file it has no way of knowing that January 15th will later be flagged as a holiday. If the two lines were reversed, such that the holiday preceded the ``workday'' wildcard, then _p_c_a_l would work as intended, marking instead the 12th as ``payday''. Also, beware of year boundaries which affect the handling of all of the day Printed 12/31/91 11 PCAL(1) UNIX Programmer's Manual PCAL(1) wildcard keywords. In general, it is best to place monthly wildcards such as the example above at the end of each year to achieve the desired effect. When the -w and -p options are used together, _p_c_a_l revises the y-scale factor in order to use the entire portrait page; therefore, the user should avoid using use the -y option when using both the -w and -p options. Use of the -w option in any case effectively disables the -m, -M, -j, and -J options. The output of the -c option may be used as input to subse- quent runs of _p_c_a_l. Note, however, that opt lines (except for an automatic opt -[A|E]), comments, ``note'' text, and ifdef'd-out source will be lost. The -S option interacts with note{/}; if used, it should be specified either on the command line or prior to the first note line in the date file. SEE ALSO cal(1), calendar(1). AUTHORS The original PostScript code to generate the calendars was written by Patrick Wood (Copyright (c) 1987 by Patrick Wood of Pipeline Associates, Inc.), and authorized for modifica- tion and redistribution. The calendar file inclusion code was originally written in _b_s(1) by Bill Vogel of AT&T. Patrick's original PostScript was modified and enhanced several times by others whose names have regrettably been lost. Ken Keirnan of Pacific Bell assembled the original ``C'' version upon which this is based; additional modifica- tions and enhancements are the work of Joseph P. Larson, Ed Hand, Andrew W. Rogers, Mark Kantrowitz, Joe Brownlee, Jamie Zawinski, Richard L. Dyson, Bill Hogsett, Floyd Miller, Andy Fyfe, and Geoff Kuenning. Printed 12/31/91 12