summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/calxxxx-yyyy/calxxxx-yyyy.tex
blob: 5d2b1b9e9a8fb382436ff9c9280fd91bc2f10a5c (plain)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
% calxxx-yyyy.tex
% version: v20.21a
% date: 2021/01/01
%
% Copyright (C) 2010 - 2021 H.-Martin M\"{u}nch (Martin dot Muench at Uni-Bonn dot de)
% Portions of code copyrighted by Slobodan Jankovi\'{c}.
% This file was invented in 1999 by Slobodan Jankovi\'{c}.
% I was not able to reach him at slobodan@archimed.filfak.ni.ac.yu
% (not surprisingly with a .yu address).
% Thanks to the translators (see below) and the reporter of a bug: Koloskov Gleb.
% Languages/Translations:
%  - English: Slobodan Jankovi\'{c}
%  - German (Deutsch): Martin M\"{u}nch
%  - Danish (Dansk): Michael Lodahl
%
% I updated Jankovi\'{c}'s file, so that it is possible to print the calendars
% for different years and to use different languages (and therefore also use weeks
% running from Monday to Sunday instead of Sunday to Saturday).
%
% Hint: Gernerally \newcommand would be better than \def, but because this is
% no style file and the original code used \def, I did not want to change it.
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License (LPPL),
% either version 1.3c of this license or (at your option) any later version.
% This version of this license is in
%   http://www.latex-project.org/lppl/lppl-1-3c.txt
% and the latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions of
% LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work is H.-Martin Muench.
%
% This work consists of the main source files
%   calxxxx-yyyy.tex, README, and calxxxx-yyyy-doc.tex,
% and the derived files
%   calxxxx-yyyy-doc.pdf, cal2021-2038_DE.pdf, cal2021-2038_DK.pdf,
%   and cal2021-2038_EN.pdf.
%
% In memoriam
%  Claudia Simone Barth + 1996/01/30
%  Tommy Muench + 2014/01/02
%  Hans-Klaus Muench + 2014/08/24
%
\documentclass[12pt,a4paper,danish,german,english]{report}
% In the options you need to place the desired language at the last position.
% Sorry for the inconvenience.
\usepackage{babel}[2016/02/24]% v3.9q
\selectlanguage{english}% Also possible: 'english', 'german', or 'danish'
\usepackage[a4paper,textwidth=\paperwidth,textheight=\paperheight]{geometry}[2010/09/12]% v5.6
\usepackage{array}[2014/10/28]% v2.4c
\listfiles
\thispagestyle{empty}

% Counters, logical, and lengths
% year, month, day of the week:
\newcount\y
\y=0\relax
\newcount\m
\m=0\relax
\newcount\x
\x=0\relax
% temporary counters:
\newcount\p
\p=0\relax
\newcount\q
\q=0\relax
\newif\ifleap     % if leap year
\newif\ifJulian   % if Julian calendar
\newif\ifZeroExist% if 0th year exist
\newif\ifCmRule   % cm rule at right
\newlength{\Wd}   % the widest name of days
\setlength{\Wd}{0pt}
\newlength{\Wdx}  % temporary dim
\setlength{\Wdx}{0pt}

%========== Start of Safe Modifications =============
% The following definitions are safe to change

% Fonts for Year, Months and Days
\def\yearfont{\normalsize\bfseries}
\def\monthfont{\scriptsize\scshape}
\def\dayfont{\tiny}

% Language Dependent Definitions (B.C., A.D., months, and days)
% Default language: English
\def\BC{\ B.\,C.}\def\AD{}% 'B.C.' after a negative year, nothing after a positive

\def\Jan{January}  \def\Feb{February}\def\Mar{March}   \def\Apr{April}
\def\May{May}      \def\Jun{June}    \def\Jul{July}    \def\Aug{August}
\def\Sep{September}\def\Oct{October} \def\Nov{November}\def\Dec{December}

\def\Sun{\textbf{S}} \def\Mon{\textbf{M}} \def\Tue{\textbf{T}} \def\Wen{\textbf{W}}
\def\Thr{\textbf{T}} \def\Fri{\textbf{F}} \def\Sat{\textbf{S}}

\iflanguage{english}{% That is already the default language. Nothing to be done.
\typeout{Language \languagename ^^J}
}{\iflanguage{german}{% Deutsch
 \typeout{Language \languagename ^^J}
 \def\BC{~v.~Chr.}\def\AD{}% 'B.C.' after a negative year, nothing after a positive

 \def\Jan{Januar}   \def\Feb{Februar}\def\Mar{M\"{a}rz}\def\Apr{April}
 \def\May{Mai}      \def\Jun{Juni}   \def\Jul{Juli}    \def\Aug{August}
 \def\Sep{September}\def\Oct{Oktober}\def\Nov{November}\def\Dec{Dezember}

 \def\Mon{\textbf{Mo}} \def\Tue{\textbf{Di}} \def\Wen{\textbf{Mi}}
 \def\Thr{\textbf{Do}} \def\Fri{\textbf{Fr}} \def\Sat{\textbf{Sa}} \def\Sun{\textbf{So}}
 }{\iflanguage{danish}{% Danish
  \typeout{Language \languagename ^^J}
  \def\BC{~f.~Kr.}\def\AD{}% 'B.C.' after a negative year, nothing after a positive

  \def\Jan{Januar}   \def\Feb{Februar}\def\Mar{Marts}   \def\Apr{April}
  \def\May{Maj}      \def\Jun{Juni}   \def\Jul{Juli}    \def\Aug{August}
  \def\Sep{September}\def\Oct{Oktober}\def\Nov{November}\def\Dec{December}

  \def\Mon{\textbf{Ma}} \def\Tue{\textbf{Ti}} \def\Wen{\textbf{On}}
  \def\Thr{\textbf{To}} \def\Fri{\textbf{Fr}} \def\Sat{\textbf{L{\o}}} \def\Sun{\textbf{S{\o}}}
  }{% Not English, Danish or German. Place your translation here!
    % Further down there is another place in the code which needs the "translation"
    % for further languages, search for "Place your translation here!".
    \typeout{Language \languagename \space not supported. Keeping the default: English.}
   }
  }
 }

% Margins and Spaces
\setlength{\topmargin}{-1in}\setlength{\oddsidemargin}{-1in}% no margins
\def\sm{\hspace{2pt}}% space between months

% Select Gregorian/Julian calendar and zero/nonzero (default are both false)
\Julianfalse   % don't use Julian, use Gregorian calendar
\ZeroExistfalse% zero year doesn't exist (before 1st is -1st year)
%\Juliantrue   % use Julian, don't use Gregorian calendar
%\ZeroExisttrue% zero year exists (before 1st is 0th year)

% Do you wish a cm rule? (default is false)
\CmRulefalse% don't print the cm rule
%\CmRuletrue% print the cm rule

%========== End of Safe Modifications =============
% It is not recommended to change anything below this line!

% Set \x=the day of the week (0=Sunday, 1=Monday,...)
\def\dayofweek#1{\m=#1 \x=\y%              x:=y;
\ifnum \x>0\else%                          if x<=0 then
  \ifZeroExist \else \advance\x by 1 \fi%  begin if not ZeroExist x:=y+1;
  \q=\x \divide\q by 2800 \advance\q by -1%  q:=x; q:=(q div 2800-1)*2800;
  \multiply\q by 2800 \advance\x by -\q%     x:=x-q
\fi%                                       end;
\p=\x%                                     p:=x;
\q=\m \multiply \q by 3%                   q=m*31;
\advance \x by \q \advance \x by 4%        x:=x+q+4;
\ifnum \m<3 \advance \p by -1 \else%       if m<3 then p:=p-1 else
  \q=\m \multiply\q by 4 \advance\q by 23% begin q:=(4*m+23) div 10;
  \divide\q by 10 \advance\x by -\q%         x:=x-q
\fi%                                       end;
\q=\p \divide\q by 4 \advance\x by \q%     q:=p div 4; x:=x+q;
\ifJulian \else%                           if not Julian then
  \divide\p by 100 \advance\p by 1%        begin p:=p div 100+1;
  \multiply\p by 3 \divide\p by 4%           p:=p*3 div 4;
  \advance\x by -\p%                         x:=x-p
\fi%                                       end;
\p=\x \divide\p by 7 \multiply\p by 7%     p:=(x div 7)*7;
\advance \x by -\p}%                       x:=x-p;

%Is \y a leap year?
\def\setleap{\leapfalse \x=\y%                 leap:=false; x:=y;
\ifnum \x<0%                                 if x<0 then
  \ifZeroExist \else \advance\x by 1 \fi%    begin if not ZeroExist else x:=x+1
\fi%                                         end;
\p=\x \divide\p by 4 \multiply\p by 4%       p:=(x div 4)*4;
\message{}%
\ifnum \x=\p%                                if x=p then
  \q=\x \divide\q by 100 \multiply\q by 100% begin q:=(x div 100)*100;
  \ifnum \x=\q%                                if x=q then
    \q=\x \divide\q by 400 \multiply\q by 400% begin q:=(x div 400)*400;
    \ifnum \x=\q \leaptrue \fi%                   if x=q then leap:=true
  \else \leaptrue%                              end else leap:=true
\fi\fi}%                                      end end

% Defines all kind of rows
\def\rows{%
\def\rone{&1&8&15&22&29&}%rows for a month with 31 days
\def\rtwo{&2&9&16&23&30&}\def\btwo{&&2&9&16&23&30}%
\def\rthree{&3&10&17&24&31&}\def\bthree{&&3&10&17&24&31}%
\def\rfour{&4&11&18&25&&}\def\bfour{&&4&11&18&25&}%
\def\rfive{&5&12&19&26&&}\def\bfive{&&5&12&19&26&}%
\def\rsix{&6&13&20&27&&}\def\bsix{&&6&13&20&27&}%
\def\rseven{&7&14&21&28&&}\def\bseven{&&7&14&21&28&}%
\ifnum\m=2%                  if February ...
  \ifleap\else\def\rone{&1&8&15&22&&}\fi%if it isn't a leap year
  \def\rtwo{&2&9&16&23&&}\def\btwo{&&2&9&16&23&}%
  \def\rthree{&3&10&17&24&&}\def\bthree{&&3&10&17&24&}%
\else%                       if other month with <=30 days ...
  \ifnum\m=1\else\ifnum\m=3\else\ifnum\m=5\else\ifnum\m=7\else\ifnum\m=8\else
  \ifnum\m=10\else\ifnum\m=12\else
  \def\rthree{&3&10&17&24&&}\def\bthree{&&3&10&17&24&}%
\fi\fi\fi\fi\fi\fi\fi\fi}

% Calendar of a month

\def\Month#1{% #1=month
\setleap\dayofweek{#1}\rows% set leap, set \x=day of the week, and define all rows
\setlength{\tabcolsep}{0pt}
\begin{tabular*}{7em}{|>{\centering}p{\Wd}|@{\extracolsep{\fill}}rrrrrr|}
\multicolumn{7}{l}{\sm\monthfont%print name of a month \m
  \ifcase\m \or\Jan\or\Feb\or\Mar\or\Apr\or\May\or\Jun\or\Jul\or\Aug\or\Sep\or\Oct\or\Nov\or\Dec \fi}\\
\hline
\ifcase\x
  \Sun\rone\\ \Mon\rtwo\\ \Tue\rthree\\ \Wen\rfour\\ \Thr\rfive\\ \Fri\rsix\\ \Sat\rseven\\ \or%if Sunday
  \Sun\bseven\\ \Mon\rone\\ \Tue\rtwo\\ \Wen\rthree\\ \Thr\rfour\\ \Fri\rfive\\ \Sat\rsix\\ \or%if Monday
  \Sun\bsix\\ \Mon\bseven\\ \Tue\rone\\ \Wen\rtwo\\ \Thr\rthree\\ \Fri\rfour\\ \Sat\rfive\\ \or%if Tuesday
  \Sun\bfive\\ \Mon\bsix\\ \Tue\bseven\\ \Wen\rone\\ \Thr\rtwo\\ \Fri\rthree\\ \Sat\rfour\\ \or%if Wednesday
  \Sun\bfour\\ \Mon\bfive\\ \Tue\bsix\\ \Wen\bseven\\ \Thr\rone\\ \Fri\rtwo\\ \Sat\rthree\\ \or%if Thursday
  \Sun\bthree\\ \Mon\bfour\\ \Tue\bfive\\ \Wen\bsix\\ \Thr\bseven\\ \Fri\rone\\ \Sat\rtwo\\ \or%if Friday
  \Sun\btwo\\ \Mon\bthree\\ \Tue\bfour\\ \Wen\bfive\\ \Thr\bsix\\ \Fri\bseven\\ \Sat\rone\\ \fi%if Saturday
\hline
\end{tabular*}}

\iflanguage{english}{% English. Nothing to be done, default language.
}{\iflanguage{german}{% Deutsch
\def\Month#1{% #1=month
\setleap\dayofweek{#1}\rows% set leap, set \x=day of the week, and define all rows
\setlength{\tabcolsep}{0pt}
\begin{tabular*}{7em}{|>{\centering}p{\Wd}|@{\extracolsep{\fill}}rrrrrr|}
\multicolumn{7}{l}{\sm\monthfont%print name of a month \m
  \ifcase\m \or\Jan\or\Feb\or\Mar\or\Apr\or\May\or\Jun\or\Jul\or\Aug\or\Sep\or\Oct\or\Nov\or\Dec \fi}\\
\hline
\ifcase\x
  \Mon\btwo\\   \Tue\bthree\\ \Wen\bfour\\  \Thr\bfive\\  \Fri\bsix\\   \Sat\bseven\\ \Sun\rone\\   \or%
  \Mon\rone\\   \Tue\rtwo\\   \Wen\rthree\\ \Thr\rfour\\  \Fri\rfive\\  \Sat\rsix\\   \Sun\rseven\\ \or%
  \Mon\bseven\\ \Tue\rone\\   \Wen\rtwo\\   \Thr\rthree\\ \Fri\rfour\\  \Sat\rfive\\  \Sun\rsix\\   \or%
  \Mon\bsix\\   \Tue\bseven\\ \Wen\rone\\   \Thr\rtwo\\   \Fri\rthree\\ \Sat\rfour\\  \Sun\rfive\\  \or%
  \Mon\bfive\\  \Tue\bsix\\   \Wen\bseven\\ \Thr\rone\\   \Fri\rtwo\\   \Sat\rthree\\ \Sun\rfour\\  \or%
  \Mon\bfour\\  \Tue\bfive\\  \Wen\bsix\\   \Thr\bseven\\ \Fri\rone\\   \Sat\rtwo\\   \Sun\rthree\\ \or%
  \Mon\bthree\\ \Tue\bfour\\  \Wen\bfive\\  \Thr\bsix\\   \Fri\bseven\\ \Sat\rone\\   \Sun\rtwo\\   \fi%
 \hline
 \end{tabular*}}%
 }{\iflanguage{danish}{% Danish
  \renewcommand{\Month}[1]{% #1=month
  \setleap\dayofweek{#1}\rows% set leap, set \x=day of the week, and define all rows
  \setlength{\tabcolsep}{0pt}
  \begin{tabular*}{7em}{|>{\centering}p{\Wd}|@{\extracolsep{\fill}}rrrrrr|}
  \multicolumn{7}{l}{\sm\monthfont%print name of a month \m
    \ifcase\m \or\Jan\or\Feb\or\Mar\or\Apr\or\May\or\Jun\or\Jul\or\Aug\or\Sep\or\Oct\or\Nov\or\Dec \fi}\\
  \hline
  \ifcase\x
    \Mon\btwo\\   \Tue\bthree\\ \Wen\bfour\\  \Thr\bfive\\  \Fri\bsix\\   \Sat\bseven\\ \Sun\rone\\   \or%
    \Mon\rone\\   \Tue\rtwo\\   \Wen\rthree\\ \Thr\rfour\\  \Fri\rfive\\  \Sat\rsix\\   \Sun\rseven\\ \or%
    \Mon\bseven\\ \Tue\rone\\   \Wen\rtwo\\   \Thr\rthree\\ \Fri\rfour\\  \Sat\rfive\\  \Sun\rsix\\   \or%
    \Mon\bsix\\   \Tue\bseven\\ \Wen\rone\\   \Thr\rtwo\\   \Fri\rthree\\ \Sat\rfour\\  \Sun\rfive\\  \or%
    \Mon\bfive\\  \Tue\bsix\\   \Wen\bseven\\ \Thr\rone\\   \Fri\rtwo\\   \Sat\rthree\\ \Sun\rfour\\  \or%
    \Mon\bfour\\  \Tue\bfive\\  \Wen\bsix\\   \Thr\bseven\\ \Fri\rone\\   \Sat\rtwo\\   \Sun\rthree\\ \or%
    \Mon\bthree\\ \Tue\bfour\\  \Wen\bfive\\  \Thr\bsix\\   \Fri\bseven\\ \Sat\rone\\   \Sun\rtwo\\   \fi%
  \hline
  \end{tabular*}}%
  }{% Neither English nor German nor Danish. Place your translation here!
   \typeout{Language \languagename \space not supported. Keeping the default: English.}
   }
  }
 }

% Enter the years. Well, could be sensitive to language, too...
\def\enteryear{\typeout{}
\typeout{Enter the year (negative for B.C., 0th year does\ifZeroExist \else \space not\fi \space exist),}
\typeout{with which to start the calendar!}\typeout{}
\typeout{For the current year, \number\year , just press the ENTER key!}
\loop
  \typein[\Year]{}
  \ifx \Year\empty \gdef\Year{\year} \fi
  \y=\Year%
  \leapfalse \ifnum \y=0 \ifZeroExist \else \leaptrue \fi\fi
\ifleap \typeout{}\typeout{0th year doesn't exist! Maybe you want the year -1.} \repeat
\typeout{}%
\typeout{Enter the year (negative for B.C., 0th year does\ifZeroExist \else \space not\fi \space exist),}%
\typeout{with which to end the calendar!}\typeout{}%
\typeout{For the current year, \number\year , just press the ENTER key!}%
\typeout{(More than 141 years will probably exceed TeX's memory.)}%
\loop
  \typein[\YearZ]{}
  \ifx \YearZ\empty \gdef\YearZ{\year} \fi
  \leapfalse \ifnum \y=0 \ifZeroExist \else \leaptrue \fi\fi
  \ifnum\YearZ<\Year \typeout{}\typeout{Error: (Start-)Year must be before (End-)YearZ!} \gdef\YearZ{\Year} \fi
  \ifleap \typeout{}\typeout{0th year doesn't exist! Maybe you want the year -1.} \repeat
\typeout{}%
\typeout{\ifJulian Julian \else Gregorian \fi Calendar for the years \number\y -\number\YearZ. }%
\typeout{(Leap years are starred * .)}%
\typeout{}}

% Set \Wd to the widest name of the days
\def\SetWidth{%
\settowidth{\Wd} {\dayfont\Sun}% Wd:=width(Sun);
\settowidth{\Wdx}{\dayfont\Mon}\ifdim\Wd<\Wdx \Wd=\Wdx \fi% if Wd<width(Mon) then Wd:=width(Mon);
\settowidth{\Wdx}{\dayfont\Tue}\ifdim\Wd<\Wdx \Wd=\Wdx \fi% etc.
\settowidth{\Wdx}{\dayfont\Wen}\ifdim\Wd<\Wdx \Wd=\Wdx \fi
\settowidth{\Wdx}{\dayfont\Thr}\ifdim\Wd<\Wdx \Wd=\Wdx \fi
\settowidth{\Wdx}{\dayfont\Fri}\ifdim\Wd<\Wdx \Wd=\Wdx \fi
\settowidth{\Wdx}{\dayfont\Sat}\ifdim\Wd<\Wdx \Wd=\Wdx \fi}

% Print the calendar for the given year
\newcommand{\printyear}[1]{%
\y=#1%
\setleap%
\ifleap\message{\the\y* ^^J}%
\else\message{\the\y\space}%
\fi%
\begin{minipage}{.3\paperwidth}\dayfont% set font for the days
{\sm \yearfont
  \ifnum\y>0 \number\y\AD \else \ifZeroExist \the\y \else \p=-\y \number\p\BC\fi\fi
  \ifJulian \ (Julian)\fi}\\[.5ex]% print year
\SetWidth
\Month{1}\sm\Month{2}\sm\Month{3}\\%  print all months
\Month{4}\sm\Month{5}\sm\Month{6}\\
\Month{7}\sm\Month{8}\sm\Month{9}\\
\Month{10}\sm\Month{11}\sm\Month{12}\par
\end{minipage}}

% Print cm scale at right
\def\cmscale(#1,#2){\setlength{\unitlength}{1mm}
\begin{picture}(0,0)(#1,#2)\scriptsize
  \newcounter{cms}\put(-.3,71){cm}
  \multiput(2,70)(0,-1){70}{\line(1,0){1}} \multiput(1,65)(0,-10){7}{\line(1,0){2}}
  \multiput(0,70)(0,-10){8}{\line(1,0){3}}
  \multiput(1,60.5)(0,-10){7}{\makebox(0,0)[b]{\addtocounter{cms}{1}\arabic{cms}}}
\end{picture}}

\newcounter{year}

\begin{document}
\noindent \enteryear
\setcounter{year}{\y}
\loop
\printyear{\value{year}}
  \ifnum \value{year}<\YearZ
    \stepcounter{year}
    \indent
\repeat
\message{^^J}\message{^^J}%
\newline%
\tiny{\indent Original calxxxx.\TeX{} \copyright{} 1999/12/19 Slobodan Jankovi\'{c}; %
these calendars produced with calxxxx-yyyy 2021/01/01 v20.21a by \texttt{Martin.Muench@Uni-Bonn.de};%
\newline\indent%
\iflanguage{english}{English by Slobodan Jankovi\'{c}.}{%
 \iflanguage{german}{Deutsch von H.-Martin M\"{u}nch.}{%
  \iflanguage{danish}{Dansk af Michael Lodahl.}{%
    (Unknown language/translator.)%
   }
  }
 }
}

\ifCmRule\cmscale(8,35)\fi% Print cm rule
\end{document}