You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
348 lines
12 KiB
348 lines
12 KiB
\ProvidesPackage{hebrewcal}
|
|
[2019/12/03 v2.7 %
|
|
Hebrew calendar for polyglossia (adapted from hebcal.sty in Babel)]
|
|
\RequirePackage{xkeyval}
|
|
\ifluatex\RequirePackage{luabidi}\else\RequirePackage{bidi}\fi
|
|
|
|
\newif\if@xpg@hebrewcal@marcheshvan
|
|
\@xpg@hebrewcal@marcheshvanfalse
|
|
|
|
\DeclareOption{marcheshvan}{\@xpg@hebrewcal@marcheshvantrue}
|
|
|
|
\@ifundefined{if@xpg@hebrew@marcheshvan}{}{%
|
|
\if@xpg@hebrew@marcheshvan
|
|
\@xpg@hebrewcal@marcheshvantrue
|
|
\fi
|
|
}
|
|
|
|
%% TODO rewrite this on the basis of Reingold & Dershowitz
|
|
%% on the model of hijrical (using calc)
|
|
|
|
\@ifundefined{@Remainder}{\input{cal-util.def}}{}
|
|
|
|
\define@boolkey{hebrew}[@hebrew@]{fullyear}[true]{}
|
|
\setkeys{hebrew}{fullyear=false}
|
|
|
|
\newcount\hebrewday \newcount\hebrewmonth \newcount\hebrewyear
|
|
\def\hebrewdate#1#2#3{%
|
|
\HebrewFromGregorian{#1}{#2}{#3}%
|
|
{\hebrewday}{\hebrewmonth}{\hebrewyear}%
|
|
\if@RTL%
|
|
\@FormatForHebrew{\hebrewday}{\hebrewmonth}{\hebrewyear}%
|
|
\else%
|
|
\@FormatForEnglish{\hebrewday}{\hebrewmonth}{\hebrewyear}%
|
|
\fi}
|
|
\def\hebrewtoday{\hebrewdate{\day}{\month}{\year}}
|
|
% The command name is capitalised in the doc, and this is consistent
|
|
% with other names such as \Hijritoday and \Jalalitoday.
|
|
\let\Hebrewtoday=\hebrewtoday
|
|
\def\hebrewsetreg{%
|
|
\HebrewFromGregorian{\day}{\month}{\year}%
|
|
{\hebrewday}{\hebrewmonth}{\hebrewyear}}
|
|
\def\HebrewYearName#1{{%
|
|
\@tempcnta=#1\divide\@tempcnta by 1000\multiply\@tempcnta by 1000
|
|
\ifnum#1=\@tempcnta\relax % divisible by 1000: disambiguate
|
|
\Hebrewnumeral{#1}\ (לפ"ג)%
|
|
\else % not divisible by 1000
|
|
\ifnum#1<1000\relax % first millennium: disambiguate
|
|
\Hebrewnumeral{#1}\ (לפ"ג)%
|
|
\else
|
|
\ifnum#1<5000
|
|
\Hebrewnumeral{#1}%
|
|
\else
|
|
\ifnum#1<6000 % current millenium, print without thousands
|
|
\@tempcnta=#1\relax
|
|
\if@hebrew@fullyear\else\advance\@tempcnta by -5000\fi
|
|
\Hebrewnumeral{\@tempcnta}%
|
|
\else % #1>6000
|
|
\Hebrewnumeral{#1}%
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\fi}}
|
|
\def\HebrewMonthName#1#2{%
|
|
\ifnum #1 = 7 %
|
|
\@CheckLeapHebrewYear{#2}%
|
|
\if@HebrewLeap אדר\ ב'%
|
|
\else אדר%
|
|
\fi%
|
|
\else%
|
|
\ifcase#1%
|
|
% nothing for 0
|
|
\or תשרי%
|
|
\or\if@xpg@hebrewcal@marcheshvan מרחשון\else חשון\fi%
|
|
\or כסלו%
|
|
\or טבת%
|
|
\or שבט%
|
|
\or אדר\ א'%
|
|
\or אדר\ ב'%
|
|
\or ניסן%
|
|
\or אייר%
|
|
\or סיון%
|
|
\or תמוז%
|
|
\or אב%
|
|
\or אלול%
|
|
\fi%
|
|
\fi}
|
|
\def\@FormatForHebrew#1#2#3{%
|
|
\Hebrewnumeral{#1}~ב\HebrewMonthName{#2}{#3}~%
|
|
\HebrewYearName{#3}}
|
|
\def\HebrewMonthNameInEnglish#1#2{%
|
|
\ifnum #1 = 7%
|
|
\@CheckLeapHebrewYear{#2}%
|
|
\if@HebrewLeap Adar II\else Adar\fi%
|
|
\else%
|
|
\ifcase #1%
|
|
% nothing for 0
|
|
\or Tishrei%
|
|
\or\if@xpg@hebrewcal@marcheshvan Marcheshvan\else Heshvan\fi%
|
|
\or Kislev%
|
|
\or Tebeth%
|
|
\or Shebat%
|
|
\or Adar I%
|
|
\or Adar II%
|
|
\or Nisan%
|
|
\or Iyar%
|
|
\or Sivan%
|
|
\or Tammuz%
|
|
\or Av%
|
|
\or Elul%
|
|
\fi
|
|
\fi}
|
|
\def\@FormatForEnglish#1#2#3{%
|
|
\HebrewMonthNameInEnglish{#2}{#3} \number#1,\ \number#3}
|
|
\newcount\@common
|
|
\newif\if@HebrewLeap
|
|
\def\@CheckLeapHebrewYear#1{%
|
|
{%
|
|
\countdef\tmpa = 0% % \tmpa==\count0
|
|
\countdef\tmpb = 1% % \tmpb==\count1
|
|
\tmpa = #1%
|
|
\multiply \tmpa by 7%
|
|
\advance \tmpa by 1%
|
|
\@Remainder{\tmpa}{19}{\tmpb}%
|
|
\ifnum \tmpb < 7% % \tmpb = (7*year+1)%19
|
|
\global\@HebrewLeaptrue%
|
|
\else%
|
|
\global\@HebrewLeapfalse%
|
|
\fi}}
|
|
\def\@HebrewElapsedMonths#1#2{%
|
|
{%
|
|
\countdef\tmpa = 0% % \tmpa==\count0
|
|
\countdef\tmpb = 1% % \tmpb==\count1
|
|
\countdef\tmpc = 2% % \tmpc==\count2
|
|
\tmpa = #1% %
|
|
\advance \tmpa by -1% %
|
|
#2 = \tmpa% % #2 = \tmpa = year-1
|
|
\divide #2 by 19% % Number of complete Meton cycles
|
|
\multiply #2 by 235% % #2 = 235*((year-1)/19)
|
|
\@Remainder{\tmpa}{19}{\tmpb}% \tmpa = years%19-years this cycle
|
|
\tmpc = \tmpb% %
|
|
\multiply \tmpb by 12% %
|
|
\advance #2 by \tmpb% % add regular months this cycle
|
|
\multiply \tmpc by 7% %
|
|
\advance \tmpc by 1% %
|
|
\divide \tmpc by 19% % \tmpc = (1+7*((year-1)%19))/19 -
|
|
\advance #2 by \tmpc% % add leap months
|
|
\global\@common = #2}%
|
|
#2 = \@common}
|
|
\def\@HebrewElapsedDays#1#2{%
|
|
{%
|
|
\countdef\tmpa = 0% % \tmpa==\count0
|
|
\countdef\tmpb = 1% % \tmpb==\count1
|
|
\countdef\tmpc = 2% % \tmpc==\count2
|
|
\@HebrewElapsedMonths{#1}{#2}%
|
|
\tmpa = #2% %
|
|
\multiply \tmpa by 13753% %
|
|
\advance \tmpa by 5604% % \tmpa=MonthsElapsed*13758 + 5604
|
|
\@Remainder{\tmpa}{25920}{\tmpc}% \tmpc == ConjunctionParts
|
|
\divide \tmpa by 25920%
|
|
\multiply #2 by 29%
|
|
\advance #2 by 1%
|
|
\advance #2 by \tmpa% % #2 = 1 + MonthsElapsed*29 +
|
|
\@Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
|
|
\ifnum \tmpc < 19440%
|
|
\ifnum \tmpc < 9924%
|
|
\else% % New moon at 9 h. 204 p. or later
|
|
\ifnum \tmpa = 2% % on Tuesday ...
|
|
\@CheckLeapHebrewYear{#1}% of a common year
|
|
\if@HebrewLeap%
|
|
\else%
|
|
\advance #2 by 1%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\ifnum \tmpc < 16789%
|
|
\else% % New moon at 15 h. 589 p. or later
|
|
\ifnum \tmpa = 1% % on Monday ...
|
|
\advance #1 by -1%
|
|
\@CheckLeapHebrewYear{#1}% at the end of leap year
|
|
\if@HebrewLeap%
|
|
\advance #2 by 1%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\else%
|
|
\advance #2 by 1% % new moon at or after midday
|
|
\fi%
|
|
\@Remainder{#2}{7}{\tmpa}% % \tmpa == DayOfWeek
|
|
\ifnum \tmpa = 0% % if Sunday ...
|
|
\advance #2 by 1%
|
|
\else% %
|
|
\ifnum \tmpa = 3% % Wednesday ...
|
|
\advance #2 by 1%
|
|
\else%
|
|
\ifnum \tmpa = 5% % or Friday
|
|
\advance #2 by 1%
|
|
\fi%
|
|
\fi%
|
|
\fi%
|
|
\global\@common = #2}%
|
|
#2 = \@common}
|
|
\def\@DaysInHebrewYear#1#2{%
|
|
{%
|
|
\countdef\tmpe = 12% % \tmpe==\count12
|
|
\@HebrewElapsedDays{#1}{\tmpe}%
|
|
\advance #1 by 1%
|
|
\@HebrewElapsedDays{#1}{#2}%
|
|
\advance #2 by -\tmpe%
|
|
\global\@common = #2}%
|
|
#2 = \@common}
|
|
\def\@HebrewDaysInPriorMonths#1#2#3{%
|
|
{%
|
|
\countdef\tmpf= 14% % \tmpf==\count14
|
|
#3 = \ifcase #1% % Days in prior month of regular year
|
|
0 \or% % no month number 0
|
|
0 \or% % Tishri
|
|
30 \or% % Heshvan
|
|
59 \or% % Kislev
|
|
89 \or% % Tebeth
|
|
118 \or% % Shebat
|
|
148 \or% % Adar I
|
|
148 \or% % Adar II
|
|
177 \or% % Nisan
|
|
207 \or% % Iyar
|
|
236 \or% % Sivan
|
|
266 \or% % Tammuz
|
|
295 \or% % Av
|
|
325 \or% % Elul
|
|
400% % Dummy
|
|
\fi%
|
|
\@CheckLeapHebrewYear{#2}%
|
|
\if@HebrewLeap% % in leap year
|
|
\ifnum #1 > 6% % if month after Adar I
|
|
\advance #3 by 30% % add 30 days
|
|
\fi%
|
|
\fi%
|
|
\@DaysInHebrewYear{#2}{\tmpf}%
|
|
\ifnum #1 > 3%
|
|
\ifnum \tmpf = 353% %
|
|
\advance #3 by -1% %
|
|
\fi% % Short Kislev
|
|
\ifnum \tmpf = 383% %
|
|
\advance #3 by -1% %
|
|
\fi% %
|
|
\fi%
|
|
\ifnum #1 > 2%
|
|
\ifnum \tmpf = 355% %
|
|
\advance #3 by 1% %
|
|
\fi% % Long Heshvan
|
|
\ifnum \tmpf = 385% %
|
|
\advance #3 by 1% %
|
|
\fi% %
|
|
\fi%
|
|
\global\@common = #3}%
|
|
#3 = \@common}
|
|
\def\@FixedFromHebrew#1#2#3#4{%
|
|
{%
|
|
#4 = #1%
|
|
\@HebrewDaysInPriorMonths{#2}{#3}{#1}%
|
|
\advance #4 by #1% % Add days in prior months this year
|
|
\@HebrewElapsedDays{#3}{#1}%
|
|
\advance #4 by #1% % Add days in prior years
|
|
\advance #4 by -1373429% % Subtract days before Gregorian
|
|
\global\@common = #4}% % 01.01.0001
|
|
#4 = \@common}
|
|
\def\@GregorianDaysInPriorMonths#1#2#3{%
|
|
{%
|
|
#3 = \ifcase #1%
|
|
0 \or% % no month number 0
|
|
0 \or%
|
|
31 \or%
|
|
59 \or%
|
|
90 \or%
|
|
120 \or%
|
|
151 \or%
|
|
181 \or%
|
|
212 \or%
|
|
243 \or%
|
|
273 \or%
|
|
304 \or%
|
|
334%
|
|
\fi%
|
|
\@CheckIfGregorianLeap{#2}%
|
|
\if@GregorianLeap%
|
|
\ifnum #1 > 2% % if month after February
|
|
\advance #3 by 1% % add leap day
|
|
\fi%
|
|
\fi%
|
|
\global\@common = #3}%
|
|
#3 = \@common}
|
|
\def\@GregorianDaysInPriorYears#1#2{%
|
|
{%
|
|
\countdef\tmpc = 4% % \tmpc==\count4
|
|
\countdef\tmpb = 2% % \tmpb==\count2
|
|
\tmpb = #1% %
|
|
\advance \tmpb by -1% %
|
|
\tmpc = \tmpb% % \tmpc = \tmpb = year-1
|
|
\multiply \tmpc by 365% % Days in prior years =
|
|
#2 = \tmpc% % = 365*(year-1) ...
|
|
\tmpc = \tmpb% %
|
|
\divide \tmpc by 4% % \tmpc = (year-1)/4
|
|
\advance #2 by \tmpc% % ... plus Julian leap days ...
|
|
\tmpc = \tmpb% %
|
|
\divide \tmpc by 100% % \tmpc = (year-1)/100
|
|
\advance #2 by -\tmpc% % ... minus century years ...
|
|
\tmpc = \tmpb% %
|
|
\divide \tmpc by 400% % \tmpc = (year-1)/400
|
|
\advance #2 by \tmpc% % ... plus 4-century years.
|
|
\global\@common = #2}%
|
|
#2 = \@common}
|
|
\def\@AbsoluteFromGregorian#1#2#3#4{%
|
|
{%
|
|
\countdef\tmpd = 0% % \tmpd==\count0
|
|
#4 = #1% % days so far this month
|
|
\@GregorianDaysInPriorMonths{#2}{#3}{\tmpd}%
|
|
\advance #4 by \tmpd% % add days in prior months
|
|
\@GregorianDaysInPriorYears{#3}{\tmpd}%
|
|
\advance #4 by \tmpd% % add days in prior years
|
|
\global\@common = #4}%
|
|
#4 = \@common}
|
|
\def\HebrewFromGregorian#1#2#3#4#5#6{%
|
|
{%
|
|
\countdef\tmpx= 17% % \tmpx==\count17
|
|
\countdef\tmpy= 18% % \tmpy==\count18
|
|
\countdef\tmpz= 19% % \tmpz==\count19
|
|
#6 = #3% %
|
|
\global\advance #6 by 3761% approximation from above
|
|
\@AbsoluteFromGregorian{#1}{#2}{#3}{#4}%
|
|
\tmpz = 1 \tmpy = 1%
|
|
\@FixedFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
|
|
\ifnum \tmpx > #4% %
|
|
\global\advance #6 by -1% Hyear = Gyear + 3760
|
|
\@FixedFromHebrew{\tmpz}{\tmpy}{#6}{\tmpx}%
|
|
\fi% %
|
|
\advance #4 by -\tmpx% % Days in this year
|
|
\advance #4 by 1% %
|
|
#5 = #4% %
|
|
\divide #5 by 30% % Approximation for month from below
|
|
\loop% % Search for month
|
|
\@HebrewDaysInPriorMonths{#5}{#6}{\tmpx}%
|
|
\ifnum \tmpx < #4%
|
|
\advance #5 by 1%
|
|
\tmpy = \tmpx%
|
|
\repeat%
|
|
\global\advance #5 by -1%
|
|
\global\advance #4 by -\tmpy}}
|
|
\ProcessOptions*
|
|
\endinput
|
|
|