Defs.rem: Difference between revisions

From Skoll.CA
Jump to navigation Jump to search
remind>Admin
No edit summary
m (5 revisions imported)
 
(2 intermediate revisions by one other user not shown)
Line 21: Line 21:
#     #
#     #
# This file is part of REMIND.     #
# This file is part of REMIND.     #
# Copyright (C) 1992-1997 Dianne Skoll                                     #
# Copyright (C) 1992-1997 Dianne Skoll                                   #
# Copyright (C) 1999-2000 Roaring Penguin Software Inc.                    #
# Copyright (C) 1999-2000 Roaring Penguin Software Inc.                    #
#     #
#     #
#############################################################################
#############################################################################
#
# $Id: defs.rem,v 1.4 2000/02/18 03:45:36 dfs Exp $
#


RUN OFF
RUN OFF
Line 35: Line 31:
# Ensure required version of remind is used... #
# Ensure required version of remind is used... #
################################################
################################################
IF version() < "03.00.19"
IF version() < "03.01.08"
   ERRMSG This file requires at least version 03.00.19 of Remind.%
   ERRMSG This file requires at least version 03.01.08 of Remind.%
   ERRMSG This version is version [version()].
   ERRMSG This version is version [version()].
   EXIT
   EXIT
Line 101: Line 97:
SET  Week_3 15
SET  Week_3 15
SET  Week_4 22
SET  Week_4 22
FSET _last(mo) "1 " + MON((mo%12)+1)+" --7"
FSET _last(mo) "1 " + MON((mo%12)+1) + " --7"
 
# Shorthand for commonly used expression...
FSET _trig() TRIGGER(TRIGDATE())


# Handy function to provide SCANFROM dates...
# Handy function to provide SCANFROM dates...
FSET _back(days) TRIGGER(TODAY()-days)
FSET _back(days) TODAY()-days
 
###########################################################
# On MS-DOS systems, the standard C library functions are #
# not reliable for computing offsets from local time to  #
# UTC.  The following provides a work-around for the      #
# sunrise() and sunset() functions.  Note, however, that  #
# if Daylight Savings Time is in effect for today(), the  #
# sun functions return times in DST even for dates on    #
# which DST is not in effect; the converse can also occur.#
#                                                        #
# Change the timezone to your timezone - the default is  #
# for EST which is 5 hours (300 minutes) behind UTC.      #
# The code is correct for places in which Daylight Savings#
# Time begins on the last Sunday in April and ends on the #
# last Sunday in October.                                #
###########################################################
 
IF OSTYPE() == "MSDOS"
    # Eastern Standard Time
    SET TimeZone -300
 
    # Use --8 rather than --7 because we want the last day BEFORE
    # the time switch occurs.
    REM Sun 1 May --8 SATISFY 1
    SET BegDst TRIGDATE()
 
    REM Sun 1 Nov --8 SATISFY 1
    SET EndDst TRIGDATE()
 
    SET $CalcUTC 0
 
    # Check out the following IF statement and figure out why it works!
    IF EndDst < BegDst
        # Daylight Savings Time
        SET $MinsFromUTC TimeZone+60
    ELSE
        # Standard Time
        SET $MinsFromUTC TimeZone
    ENDIF
ENDIF


###########################################################
###########################################################
Line 217: Line 170:


IF WKDAYNUM(TRIGDATE()) == Sat
IF WKDAYNUM(TRIGDATE()) == Sat
REM [TRIGGER(TRIGDATE())] MSG Independence day (actual)
REM [TRIGDATE()] MSG Independence day (actual)
OMIT [TRIGGER(TRIGDATE()-1)] MSG Independence day (observed)
OMIT [TRIGDATE()-1] MSG Independence day (observed)
ELSE
ELSE
IF WKDAYNUM(TRIGDATE()) == Sun
IF WKDAYNUM(TRIGDATE()) == Sun
REM [TRIGGER(TRIGDATE())] MSG Independence day (actual)
REM [TRIGDATE()] MSG Independence day (actual)
OMIT [TRIGGER(TRIGDATE()+1)] MSG Independence day (observed)
OMIT [TRIGDATE()+1] MSG Independence day (observed)
ELSE
ELSE
OMIT [TRIGGER(TRIGDATE())] MSG Independence day
OMIT [TRIGDATE()] MSG Independence day
ENDIF
ENDIF
ENDIF
ENDIF
Line 245: Line 198:
# Monday was a holiday
# Monday was a holiday
IF ISOMITTED(TRIGDATE()-7)
IF ISOMITTED(TRIGDATE()-7)
   REM [TRIGGER(TRIGDATE())] MSG Delayed meeting
   REM [TRIGDATE()] MSG Delayed meeting
ENDIF
ENDIF


Line 336: Line 289:
SET SaveTrig $NumTrig
SET SaveTrig $NumTrig
SET easter EASTERDATE(YEAR(TODAY()))
SET easter EASTERDATE(YEAR(TODAY()))
REM  [TRIGGER(easter-46)] MSG %"Ash Wednesday%"
REM  [easter-46] MSG %"Ash Wednesday%"
REM  [TRIGGER(easter-7)]  MSG %"Palm Sunday%"
REM  [easter-7]  MSG %"Palm Sunday%"
OMIT [TRIGGER(easter-2)]  MSG %"Good Friday%"
OMIT [easter-2]  MSG %"Good Friday%"
OMIT [TRIGGER(easter)]    MSG %"Easter%" Sunday
OMIT [easter]    MSG %"Easter%" Sunday
REM  [TRIGGER(easter+39)] MSG %"Ascension Day%"
REM  [easter+39] MSG %"Ascension Day%"
REM  [TRIGGER(easter+49)] MSG %"Pentecost%"
REM  [easter+49] MSG %"Pentecost%"


# Some holidays are omitted, some are not.  You may want to change
# Some holidays are omitted, some are not.  You may want to change
Line 353: Line 306:
REM      Feb 14 MSG %"Valentine's%" Day
REM      Feb 14 MSG %"Valentine's%" Day
REM  Mon Feb [Week_3] SCANFROM [_back(7)] SATISFY 1
REM  Mon Feb [Week_3] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG %"President's Day%"
OMIT [trigdate()] MSG %"President's Day%"
REM      Mar 17 MSG %"St. Patrick's%" Day
REM      Mar 17 MSG %"St. Patrick's%" Day
REM Sun Apr 1 ++2 MSG Daylight Savings Time - %"DST starts%" %b
 
# The DST rules are accurate for most locations in
# North America
REM Sun Apr 1 ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b
REM Sun Mar 8 ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b
 
REM Sun [_last(Oct)] ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b
REM Sun 1 Nov ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b
 
REM      Apr  1 MSG %"April Fool's%" Day
REM      Apr  1 MSG %"April Fool's%" Day
REM  Mon Tue Wed Thu Fri Sat 15 Apr MSG %"Income tax%" due
REM  Mon Tue Wed Thu Fri Sat 15 Apr MSG %"Income tax%" due
Line 363: Line 324:
REM  Sat May [Week_3] MSG %"Armed Forces Day%"
REM  Sat May [Week_3] MSG %"Armed Forces Day%"
REM  Mon [_last(May)] SCANFROM [_back(7)] SATISFY 1
REM  Mon [_last(May)] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG %"Memorial Day%"
OMIT [trigdate()] MSG %"Memorial Day%"
REM      Jun 14 MSG %"Flag Day%"
REM      Jun 14 MSG %"Flag Day%"
REM  Sun Jun [Week_3] MSG %"Father's Day%"
REM  Sun Jun [Week_3] MSG %"Father's Day%"
REM  Mon Sep [Week_1] SCANFROM [_back(7)] SATISFY 1
REM  Mon Sep [Week_1] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG %"Labor Day%"
OMIT [trigdate()] MSG %"Labor Day%"
REM  Mon Oct [Week_2] MSG %"Columbus Day%"
REM  Mon Oct [Week_2] MSG %"Columbus Day%"
REM      Nov 11 MSG %"Veterans Day%"
REM      Nov 11 MSG %"Veterans Day%"
REM  Sun [_last(Oct)] MSG Daylight Savings Time - %"DST over%"
 
REM      Oct 30 MSG %"Mischief Night%"
REM      Oct 30 MSG %"Mischief Night%"
REM      Oct 31 MSG %"Halloween%"
REM      Oct 31 MSG %"Halloween%"
Line 377: Line 338:
MSG %"Election%" Day
MSG %"Election%" Day
REM  Thu Nov [Week_4] SCANFROM [_back(7)] SATISFY 1
REM  Thu Nov [Week_4] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG %"Thanksgiving%" Day
OMIT [trigdate()] MSG %"Thanksgiving%" Day
REM  Fri Nov [Week_4+1] SCANFROM [_back(7)] SATISFY 1
REM  Fri Nov [Week_4+1] SCANFROM [_back(7)] SATISFY 1
OMIT [_trig()] MSG %"Thanksgiving%" (cont.)
OMIT [trigdate()] MSG %"Thanksgiving%" (cont.)
OMIT    Dec 24 MSG %"Christmas Eve%"
OMIT    Dec 24 MSG %"Christmas Eve%"
OMIT    Dec 25 MSG %"Christmas%" Day
OMIT    Dec 25 MSG %"Christmas%" Day
Line 417: Line 378:


# Fill in the phases of the moon on the PostScript calendar
# Fill in the phases of the moon on the PostScript calendar
[trigger(moondate(0))] SPECIAL MOON 0
[moondate(0)] SPECIAL MOON 0
[trigger(moondate(1))] SPECIAL MOON 1
[moondate(1)] SPECIAL MOON 1
[trigger(moondate(2))] SPECIAL MOON 2
[moondate(2)] SPECIAL MOON 2
[trigger(moondate(3))] SPECIAL MOON 3
[moondate(3)] SPECIAL MOON 3


# The following example puts sunrise and sunset times in PostScript in the
# The following example puts sunrise and sunset times in PostScript in the
Line 443: Line 404:
# and Michael and Sharon Strassfeld, published by the Jewish Publication #
# and Michael and Sharon Strassfeld, published by the Jewish Publication #
# Society of America.  The Reform version of the calendar was guessed #
# Society of America.  The Reform version of the calendar was guessed #
# at by Dianne Skoll based on experience.  There is probably no standard #
# at by Dianne Skoll based on experience.  There is probably no standard #
# Reform position on many of the holidays, so you may have to adjust    #
# Reform position on many of the holidays, so you may have to adjust    #
# the file as required.                                                  #
# the file as required.                                                  #
Line 473: Line 434:


# Convenient function definition to save typing
# Convenient function definition to save typing
FSET _h(x, y) TRIGGER(HEBDATE(x,y))
FSET _h(x, y) HEBDATE(x,y)
FSET _h2(x, y) HEBDATE(x, y, TODAY()-7)
FSET _h2(x, y) HEBDATE(x, y, TODAY()-7)
FSET _PastSat(x, y) TRIGGER(IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1))
FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1)
FSET _PastSun(x, y) IIF(WKDAYNUM(_h2(x,y))!=0, _h2(x,y), _h2(x,y)+1)
FSET _PastMon(x, y) IIF(WKDAYNUM(_h2(x,y))!=1, _h2(x,y), _h2(x,y)+1)


# Default values in case InIsrael and Reform are not set
# Default values in case InIsrael and Reform are not set
Line 496: Line 459:
ENDIF
ENDIF


[_h(21, "Tishrey")] ++4 MSG %"Hashana Rabba%" is %b.
[_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
[_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.
[_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.


Line 506: Line 469:


# Because Kislev can change length, we must be more careful about Chanukah
# Because Kislev can change length, we must be more careful about Chanukah
FSET _chan(x) TRIGGER(HEBDATE(24, "Kislev", today()-9)+x)
FSET _chan(x) HEBDATE(24, "Kislev", today()-9)+x
[_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
[_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
[_chan(2)] MSG %"Chanukah 2%"
[_chan(2)] MSG %"Chanukah 2%"
Line 524: Line 487:


[_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
[_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
[_h(15, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
[_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
[_h(15, "Adar A")] ++4 MSG %"Shushan Purim Katan%" is %b.


# If Purim is on Sunday, then Fast of Esther is 11 Adar.
# If Purim is on Sunday, then Fast of Esther is 11 Adar.
IF WKDAYNUM(_h2(13, "Adar")) != 6
IF WKDAYNUM(_h2(13, "Adar")) != 6
   REM [TRIGGER(_h2(13, "Adar"))] ++4 MSG %"Fast of Esther%" is %b.
   REM [_h2(13, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
ELSE
ELSE
   REM [TRIGGER(_h2(11, "Adar"))] ++4 MSG %"Fast of Esther%" is %b.
   REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
ENDIF
ENDIF
[_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
[_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
[_h(15, "Adar")] ++4 MSG %"Shushan Purim%" is %b.
[_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.
[_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.


Line 545: Line 510:
ENDIF
ENDIF


[_h(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
REM [_PastSun(27, "Nisan")] SATISFY 1
[_h(4, "Iyar")] ++4 MSG %"Yom HaZikaron%" is %b.
 
[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
IF $Tw == 5
  REM [_PastSun(26, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
ELSE
  REM [_PastSun(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
ENDIF
 
# If 4 Iyar is a Thursday or Friday, then Yom Hazikaron is
# the Wednesday before and Yom Ha'atzmaut is on
# Thursday.  If 4 Iyar is a Sunday, then Yom Hazikaron
# moves to 5 Iyar and Yom Ha'atzmaut to 6 Iyar.
IF WKDAYNUM(_h2(4, "Iyar")) == 4 || WKDAYNUM(_h2(4, "Iyar")) == 5
[_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
IF WKDAYNUM(_h2(4, "Iyar")) == 0
[_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
[_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ENDIF
ENDIF


# Not sure about Reform's position on Lag B'Omer
# Not sure about Reform's position on Lag B'Omer

Latest revision as of 09:19, 14 April 2021

Main article: Remind
#############################################################################
# 									    #
# DEFS.REM								    #
# 									    #
# This file is a reminder script, which contains a few handy definitions.   #
# Cut and paste as desired!  Also, near the end, there are a bunch of	    #
# holiday definitions for the U.S.					    #
# 									    #
# Some examples provided by George M. Sipe <gsipe@pyratl.ga.pyramid.com>    #
# 									    #
# U.S. holidays provided by Dave Rickel <drickel@sjc.mentorg.com>	    #
# 									    #
# Use your text editor to search for:					    #
#  "#USHOLS" for U.S. holidays						    #
#  "#JHOLS"  for Jewish holidays					    #
#  "#PSSTUFF" for nifty PostScript examples				    #
#  "#COLORS" for examples of ANSI color escape sequences.                   #
# 									    #
# This file is part of REMIND.						    #
# Copyright (C) 1992-1997 Dianne Skoll                                    #
# Copyright (C) 1999-2000 Roaring Penguin Software Inc.                     #
# 									    #
#############################################################################

RUN OFF

################################################
# Ensure required version of remind is used... #
################################################
IF version() < "03.01.08"
   ERRMSG This file requires at least version 03.01.08 of Remind.%
   ERRMSG This version is version [version()].
   EXIT
ENDIF

######################################
# Symbolic constants for weekdays... #
######################################
SET Sunday    0
SET Monday    1
SET Tuesday   2
SET Wednesday 3
SET Thursday  4
SET Friday    5
SET Saturday  6

SET Sun 0
SET Mon 1
SET Tue 2
SET Wed 3
SET Thu 4
SET Fri 5
SET Sat 6

#########################################
# Symbolic constants for month names... #
#########################################

SET Jan 1
SET Feb 2
SET Mar 3
SET Apr 4
SET May 5
SET Jun 6
SET Jul 7
SET Aug 8
SET Sep 9
SET Oct 10
SET Nov 11
SET Dec 12

SET January   1
SET February  2
SET March     3
SET April     4
SET May       5
SET June      6
SET July      7
SET August    8
SET September 9
SET October   10
SET November  11
SET December  12

###########################################################
# Other symbolic constants and functions for "pasting"... #
###########################################################

SET Quote CHAR(34)

# Handy constants/function for specifing week of month...
SET  Week_1		 1
SET  Week_2		 8
SET  Week_3		15
SET  Week_4		22
FSET _last(mo)		"1 " + MON((mo%12)+1) + " --7"

# Handy function to provide SCANFROM dates...
FSET _back(days)	TODAY()-days

###########################################################
# Function which returns a string in "am/pm" format based #
# on the time.  For example, set a am_pm(NOW())...        #
###########################################################

FSET _am_pm(tm)	IIF(tm<01:00, tm+12*60+"am", \
                    tm<12:00, tm+"am", \
                    tm<13:00, tm+"pm", \
                              tm-12*60+"pm")

#################################################################
# Function which removes a single leading zero from a string... #
#################################################################

FSET _no_lz(s) IIF(SUBSTR(s, 1, 1)=="0", SUBSTR(s, 2), s)

#################################################################
# Return the length of the daylight/night portion of a date,    #
# in minutes.                                                   #
#################################################################

FSET _light_len(date) MAX(SUNSET(date)-SUNRISE(date), 0)
FSET _dark_len(date) 1440-_light_len(date)

############################################################
# Function to calculate number of years since a given year #
# or number of months since a given month and year...      #
############################################################

FSET _yr_num(yr)		ORD(YEAR(TRIGDATE()) - yr)
FSET _mo_num(mo, yr)		ORD(12 * (YEAR(TRIGDATE()) - yr) + \
					MONNUM(TRIGDATE()) - mo)

# Here's an example of how to use them:
REM 1 Nov ++12 MSG %"Dean's [_yr_num(1984)] birthday%" is %b.
REM 1 MSG Dean's [_mo_num(11, 1984)] 'monthly' anniversary

###########################################################
# Function to send mail via elm's "fastmail" (by GMS!)... #
###########################################################

#FSET _mail(from, subj)	"mailx -s " + \
#				Quote + from + " : " + subj + Quote \
#				GETENV("LOGNAME") + " < /dev/null 1>&0"
FSET _mail(from, subj)	"fastmail -f " + \
				Quote + from + Quote + \
				" -s " + Quote + subj + Quote + \
				" /dev/null " + GETENV("LOGNAME")

#############################################################################
# Here's a tricky problem:  The 4th of July is a holiday in the U.S.
# However, if it falls on a Saturday, the previous Friday is a holiday.
# If it falls on a Sunday, the next Monday is a holiday.  Here's how
# to do it.  NOTE that the following procedure makes the OMIT context
# dependent upon the current date.  SInce it only depends on the current
# year, which is not likely to change while producing a calendar, we
# are fairly safe.  However, reminders with huge DELTA or BACK components
# may not operate as expected.  In general, any time you make OMIT
# dependent upon the current date, it's tricky and results may not be
# what you expect.  You should try to make sure that the OMIT context
# "near" any current reminders will not change during a calendar run.
# The SCANFROM clause should help make these OMITs very safe.
############################################################################

# Calculate the weekday of the holiday.
REM 4 July SCANFROM [_back(7)] SATISFY 1

IF WKDAYNUM(TRIGDATE()) == Sat
	REM [TRIGDATE()] MSG Independence day (actual)
	OMIT [TRIGDATE()-1] MSG Independence day (observed)
ELSE
	IF WKDAYNUM(TRIGDATE()) == Sun
		REM [TRIGDATE()] MSG Independence day (actual)
		OMIT [TRIGDATE()+1] MSG Independence day (observed)
	ELSE
		OMIT [TRIGDATE()] MSG Independence day
	ENDIF
ENDIF

############################################################################
#									   #
# A meeting on the first Monday of every month which is moved to the       #
# second Monday in the event of a holiday.                                 #
#									   #
############################################################################

# First, the normal meeting.  However, the SKIP keyword means this
# one won't be triggered if the first Monday is a holiday
REM Mon 1 SKIP MSG Meeting

# Now, calculate the "potential" delayed meeting
REM Mon 8 SATISFY 1

# But only actually trigger the delayed meeting if the previous
# Monday was a holiday
IF ISOMITTED(TRIGDATE()-7)
   REM [TRIGDATE()] MSG Delayed meeting
ENDIF

############################################################################
#									   #
# A very complicated reminder sent in by a Remind user.			   #
# This person gets paid every two weeks, starting from 8 January 1993.	   #
# If a pay date occurs before the twelfth of a month, then that		   #
# he pays his mortgage on that pay date.  Otherwise, he pays the mortgage  #
# on the previous pay date.  Furthermore, he has to schedule his	   #
# mortgage payment six days before it is due.  He wants to be reminded	   #
# a further four days before the scheduling deadline.  He also		   #
# wants to be mailed a notice two weeks before the scheduling deadline.	   #
#									   #
# Here's the solution - if you can follow this, consider yourself a	   #
# Remind programmer extraordinaire!					   #
#									   #
############################################################################

# A function to determine whether or not a pay-date is a mortgage-date.

FSET _IsMortDate(x) DAY(x) < 12 || (DAY(x+14) >= 12 && DAY(x+14) <= 14)

# Paydays - for reference

REM 8 Jan 1993 *14 MSG Payday

# Calculate the mortgage payment six days ahead of time.  Note that this
# is done "implicitly" by subtracting 6 from the starting date - we start
# on 2 Jan rather than 8 Jan.  We add 6 to TRIGDATE() in _IsMortDate to
# compensate.

REM 2 Jan 1993 *14 ++4 SATISFY [_IsMortDate(TRIGDATE()+6)] \
	MSG %"Schedule mortgage payment%" for %a.

# Now the mail reminder two weeks before the payment date - because two
# weeks before a payment date is also a payment date, no pre-compensation
# in the starting date of 8 Jan is necessary - convince yourself of this!
# This uses the _mail() function defined earlier.

REM ONCE 8 Jan 1993 *14 SATISFY [_IsMortDate(TRIGDATE()+14)] \
	RUN [_mail("Decatur Federal", \
		"Pay mortgage by the " + ORD(DAY(TRIGDATE()+14)))]

# Make an entry on the calendar when the mortgage should be paid

REM 8 Jan 1993 *14 SATISFY [_IsMortDate(TRIGDATE())] \
	CAL Mortgage payment

##########################################################################
#								         #
# On our UNIX system, I run a program which queries the university       #
# library and creates a file called ".booksdue".  This file is           #
# a REMIND script to tell me when my library books are due.  Here's      #
# an example from my reminder file - it shows the use of filedate().     #
# When the .booksdue file is at least 7 days old, I create a new version #
# by querying the library computer.  Note the use of realtoday() rather  #
# than today.   						         #
#								         #
##########################################################################

IF !$RunOff && !$CalMode && !$SimpleCal
   IF REALTODAY()-FILEDATE("/home/dfs/.booksdue") >= 7
      REM RUN /home/dfs/bilge/library/getbooks
   ENDIF
ENDIF

#PSSTUFF1
##########################################################################
#								         #
# This portion of the file contains some cute examples of the new        #
# PS-type reminders.  You need a PostScript printer or viewer to         #
# appreciate these.  To use them, pipe the output of remind -p into the  #
# rem2ps program.  More examples are in the PSSTUFF2 section, below.     #
#								         #
##########################################################################

# The following reminder will shade the Saturday and Sunday calendar
# entries.
REM Sat Sun SPECIAL SHADE 220

#USHOLS
#############################################################################
#       								    #
# The following holidays were provided by Dave Rickel			    #
# Modified by D. Skoll to give safe OMITs for moveable holidays		    #
#									    #
#############################################################################

SET SaveTrig $NumTrig
SET easter EASTERDATE(YEAR(TODAY()))
REM  [easter-46] MSG %"Ash Wednesday%"
REM  [easter-7]  MSG %"Palm Sunday%"
OMIT [easter-2]  MSG %"Good Friday%"
OMIT [easter]    MSG %"Easter%" Sunday
REM  [easter+39] MSG %"Ascension Day%"
REM  [easter+49] MSG %"Pentecost%"

# Some holidays are omitted, some are not.  You may want to change
# which ones are omitted - use the general forms shown below.
# You'll need the _back() function and the Week_n variables defined
# way up in the file.

OMIT     Jan  1		MSG %"New Year's%" Day
REM  Mon Jan [Week_3]	MSG Martin Luther King - %"MLK Day%"
REM      Feb  2		MSG %"Ground Hog Day%"
REM      Feb 14		MSG %"Valentine's%" Day
REM  Mon Feb [Week_3]	SCANFROM [_back(7)] SATISFY 1
OMIT [trigdate()] MSG %"President's Day%"
REM      Mar 17		MSG %"St. Patrick's%" Day

# The DST rules are accurate for most locations in
# North America
REM Sun Apr 1 ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b
REM Sun Mar 8 ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b

REM Sun [_last(Oct)] ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b
REM Sun 1 Nov ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b

REM      Apr  1		MSG %"April Fool's%" Day
REM  Mon Tue Wed Thu Fri Sat 15 Apr MSG %"Income tax%" due
REM      May  5		MSG %"Cinco de Mayo%"
REM  Sat May [Week_1]	MSG %"Kentucky Derby%"
REM  Sun May [Week_2]	MSG %"Mother's Day%"
REM  Sat May [Week_3]	MSG %"Armed Forces Day%"
REM  Mon [_last(May)]	SCANFROM [_back(7)] SATISFY 1
OMIT [trigdate()] MSG %"Memorial Day%"
REM      Jun 14		MSG %"Flag Day%"
REM  Sun Jun [Week_3]	MSG %"Father's Day%"
REM  Mon Sep [Week_1]	SCANFROM [_back(7)] SATISFY 1
OMIT [trigdate()] MSG %"Labor Day%"
REM  Mon Oct [Week_2]	MSG %"Columbus Day%"
REM      Nov 11		MSG %"Veterans Day%"

REM      Oct 30		MSG %"Mischief Night%"
REM      Oct 31		MSG %"Halloween%"
REM  Tue Nov  2		SCANFROM [_back(7)] \
	SATISFY [(YEAR(TRIGDATE()) % 4) == 0] \
	MSG %"Election%" Day
REM  Thu Nov [Week_4]	SCANFROM [_back(7)] SATISFY 1
OMIT [trigdate()] MSG %"Thanksgiving%" Day
REM  Fri Nov [Week_4+1]	SCANFROM [_back(7)] SATISFY 1
OMIT [trigdate()] MSG %"Thanksgiving%" (cont.)
OMIT     Dec 24		MSG %"Christmas Eve%"
OMIT     Dec 25		MSG %"Christmas%" Day

##########################################################################
#								         #
# If any US holidays were triggered above, shade in the calendar         #
# entry in PostScript.  This is not quite correct, as it blots out any   #
# other PostScript stuff above.  I was too lazy to do it properly :-)    #
#								         #
##########################################################################
if $NumTrig > SaveTrig
	REM SPECIAL SHADE 220
endif

# Seasons (valid from 1992 to 2000)...
REM Mar 20 MSG %"Spring%" begins
REM Jun [IIF(YEAR(TODAY())%4, 21, 20)] MSG %"Summer%" begins
REM Sep [CHOOSE(YEAR(TODAY())-1991, 22,22,23,23,22,22,22,23,22)] \
	MSG %"Fall%" begins
REM Dec [IIF((YEAR(TODAY())+1)%4, 21, 22)] MSG %"Winter%" begins

#PSSTUFF2
##########################################################################
#									 #
# Since the SHADE special blots out any previous PostScript		 #
# reminders for a date, these examples need to follow the US Holidays	 #
# section, which uses SHADE.                                             #
#									 #
##########################################################################

# The following will fill in the Hebrew dates on the calendar.  For this
# example, I recommend that you use the -sd 10 option for Rem2PS.
REM PS Border Border moveto \
   /DayFont findfont DaySize scalefont setfont \
   ([hebday(today())] [hebmon(today())]) show

# Fill in the phases of the moon on the PostScript calendar
[moondate(0)] SPECIAL MOON 0
[moondate(1)] SPECIAL MOON 1
[moondate(2)] SPECIAL MOON 2
[moondate(3)] SPECIAL MOON 3

# The following example puts sunrise and sunset times in PostScript in the
# calendar - the sizes are hard-coded, however, and work best in landscape.
REM PS Border Border 5 sub moveto \
	/SmallFont findfont 4 scalefont setfont \
	(Sunrise: [sunrise(trigdate())] Sunset: [sunset(trigdate())]) show

# The next one puts the day number (1-366) and days left in the year at the
# bottom of the post-script calendar.  Again, the hard-coded sizes work best
# in landscape.
FSET _DayOfYear(x) x-(date(year(x),1,1) - 1)
REM PS BoxWidth 3 mul 4 div Border 5 sub moveto \
	/SmallFont findfont 4 scalefont setfont \
	([_DayOfYear(today())]([365+isleap(today())-_DayOfYear(today())])) show

#JHOLS
##########################################################################
#								         #
# This portion of the file contains reminders for Jewish holidays.  The	 #
# dates were obtained from "The First Jewish Catalog" by Richard Siegel	 #
# and Michael and Sharon Strassfeld, published by the Jewish Publication #
# Society of America.  The Reform version of the calendar was guessed	 #
# at by Dianne Skoll based on experience.  There is probably no standard  #
# Reform position on many of the holidays, so you may have to adjust     #
# the file as required.                                                  #
#									 #
# Additional corrections were made from the paper "Calendrical		 #
# Calculations" by Nachum Dershowitz and Edward M. Reingold.  Any	 #
# further corrections are welcome.					 #
#				        			         #
##########################################################################

# Here are some general functions that you might find nice to use

# _hstr:  Returns a string which is the full Hebrew date of its argument.
#         Example: hstr('1994/02/02') returns "21 Shvat 5754"
FSET _hstr(x) HEBDAY(x) + " " + HEBMON(x) + " " + HEBYEAR(x)

# _hyrlen:  Return the length of the specified Hebrew year
#           Example: _hyrlen(5754) returns 355
FSET _hyrlen(x) HEBDATE(1, "Tishrey", x+1) - HEBDATE(1, "Tishrey", x)

# --- HERE ARE THE JEWISH HOLIDAYS ---
# Set the variable InIsrael to 1 if you live in Israel.  Otherwise,
# you get the Diaspora versions of Jewish holidays
SET InIsrael 0

# Set the variable Reform to 1 if you want the Reform version of the
# Jewish calendar.  Otherwise, you get the traditional version
SET Reform 0

# Convenient function definition to save typing
FSET _h(x, y) HEBDATE(x,y)
FSET _h2(x, y) HEBDATE(x, y, TODAY()-7)
FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1)
FSET _PastSun(x, y) IIF(WKDAYNUM(_h2(x,y))!=0, _h2(x,y), _h2(x,y)+1)
FSET _PastMon(x, y) IIF(WKDAYNUM(_h2(x,y))!=1, _h2(x,y), _h2(x,y)+1)

# Default values in case InIsrael and Reform are not set
SET InIsrael VALUE("InIsrael", 0)
SET Reform   VALUE("Reform", 0)

[_h(1,  "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b.

# No RH-2 or Tzom Gedalia in Reform
IF !Reform
   [_h(2,  "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b.
   [_PastSat(3,  "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b.
ENDIF

[_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b.
[_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b.

IF !InIsrael
   [_h(16, "Tishrey")] MSG %"Sukkot 2%"
ENDIF

[_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b.
[_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b.

IF InIsrael
   [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
ELSE
   [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b.
ENDIF

# Because Kislev can change length, we must be more careful about Chanukah
FSET _chan(x) HEBDATE(24, "Kislev", today()-9)+x
[_chan(1)] ++4 MSG %"Chanukah 1%" is %b.
[_chan(2)] MSG %"Chanukah 2%"
[_chan(3)] MSG %"Chanukah 3%"
[_chan(4)] MSG %"Chanukah 4%"
[_chan(5)] MSG %"Chanukah 5%"
[_chan(6)] MSG %"Chanukah 6%"
[_chan(7)] MSG %"Chanukah 7%"
[_chan(8)] MSG %"Chanukah 8%"

# Not sure about Reform's position on the next one.
IF !Reform
# 10 Tevet will never be a Saturday, so whether or not to
# move it is moot.  (Thanks to Art Werschulz.)
   [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b.
ENDIF

[_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b.
[_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b.
[_h(15, "Adar A")] ++4 MSG %"Shushan Purim Katan%" is %b.

# If Purim is on Sunday, then Fast of Esther is 11 Adar.
IF WKDAYNUM(_h2(13, "Adar")) != 6
   REM [_h2(13, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
ELSE
   REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b.
ENDIF
[_h(14, "Adar")] ++4 MSG %"Purim%" is %b.
[_h(15, "Adar")] ++4 MSG %"Shushan Purim%" is %b.
[_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b.

IF !InIsrael
   [_h(16, "Nisan")] MSG %"Pesach 2%"
ENDIF

[_h(21, "Nisan")] MSG %"Pesach 7%"

IF !InIsrael && !Reform
   [_h(22, "Nisan")] MSG %"Pesach 8%"
ENDIF

REM [_PastSun(27, "Nisan")] SATISFY 1

IF $Tw == 5
   REM [_PastSun(26, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
ELSE
   REM [_PastSun(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b.
ENDIF

# If 4 Iyar is a Thursday or Friday, then Yom Hazikaron is
# the Wednesday before and Yom Ha'atzmaut is on
# Thursday.  If 4 Iyar is a Sunday, then Yom Hazikaron
# moves to 5 Iyar and Yom Ha'atzmaut to 6 Iyar.
IF WKDAYNUM(_h2(4, "Iyar")) == 4 || WKDAYNUM(_h2(4, "Iyar")) == 5
	[_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
	[_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
IF WKDAYNUM(_h2(4, "Iyar")) == 0
	[_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
	[_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ELSE
	[_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b.
	[_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b.
ENDIF
ENDIF

# Not sure about Reform's position on Lag B'Omer
IF !Reform
   [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b.
ENDIF

[_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b.
[_h(6,  "Sivan")] ++4 MSG %"Shavuot%" is %b.

IF !InIsrael && !Reform
   [_h(7, "Sivan")] MSG %"Shavuot 2%"
ENDIF

# Fairly sure Reform Jews don't observe the next two
IF !Reform
# Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally
# fall on a Saturday
   [_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b.
   [_PastSat(9,  "Av")] ++4 MSG %"Tish'a B'Av%" is %b.
ENDIF

# Counting the omer - do the whole spiel, i.e:
# "This is the xth day of the omer, being y weeks and z days of the omer."
# Nice Remind programming example here!
SET ostart HEBDATE(16, "Nisan", TODAY()-50)
IF ostart <= TODAY() && (TODAY() - ostart < 49)
   SET odays TODAY()-ostart+1
   IF odays < 7
      MSG %"%"Today is the [ORD(odays)] day of the Omer.
   ELSE
      IF !(odays % 7)
         MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer.
      ELSE
	 MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer.
      ENDIF
   ENDIF
   CAL [ORD(odays)] of Omer
ENDIF

### Candle lighting and Havdalah.  You should probably add candle lighting
### for other holidays besides Shabbat.  These just create calendar entries
### for Friday and Saturday.  Note:  You must set your latitude, longitude
### and possibly time zone for these to work properly!

REM Friday   CAL Candle lighting at [sunset(trigdate())-18]
REM Saturday CAL Havdalah at [sunset(trigdate())+42]

#COLORS
##########################################################################
#								         #
# This contains sample ANSI escape sequences for coloring messages.      #
# It should work on an IBM PC with the ANSI.SYS driver, and on           #
# other terminals which use the ANSI sequences.                          #
#								         #
# This information was provided by Gail Gurman.
#								         #
##########################################################################
# Colors - use Nrm to reset to normal text.
SET Esc   CHAR(27)

SET Nrm   Esc + "[0m"
SET Blk   Esc + "[0;30m"
SET Red   Esc + "[0;31m"
SET Grn   Esc + "[0;32m"
SET Ylw   Esc + "[0;33m"
SET Blu   Esc + "[0;34m"
SET Mag   Esc + "[0;35m"
SET Cyn   Esc + "[0;36m"
SET Wht   Esc + "[0;37m"
SET Gry   Esc + "[30;1m"
SET BrRed Esc + "[31;1m"
SET BrGrn Esc + "[32;1m"
SET BrYlw Esc + "[33;1m"
SET BrBlu Esc + "[34;1m"
SET BrMag Esc + "[35;1m"
SET BrCyn Esc + "[36;1m"
SET BrWht Esc + "[37;1m"

# Examples
REM MSG A [Blu]blue[Nrm] reminder.
REM MSG [Red]%"A red reminder%" safe to use in the calendar mode.[Nrm]

# Here is an example of how to use msgprefix() and msgsuffix().  These
# will highlight priority-0 reminders in bright red,
# priority-2500 in red, and priority-7500 in blue.  All others
# will be in the normal colors
FSET msgprefix(x) iif(x==0, BrRed, x==2500, Red, x==7500, Blu, Nrm)

# Don't forget to return to normal color set at the end of reminder!
FSET msgsuffix(x) Nrm

# The next examples are great for putting right at the end of the reminder
# file.  They make queued reminders more eye-catching when they pop up.
FSET msgprefix(x) char(13,10,13,10)+"******************"+char(13,10,13,10)
FSET msgsuffix(x) char(13,10)+"******************"+char(13,10,13,10)