Convert consecutive FSF copyright years to ranges.
[bpt/emacs.git] / lisp / calendar / cal-tex.el
CommitLineData
3afbc435 1;;; cal-tex.el --- calendar functions for printing calendars with LaTeX
9eb48cce 2
73b0cd50 3;; Copyright (C) 1995, 2001-2011 Free Software Foundation, Inc.
9eb48cce
ER
4
5;; Author: Steve Fisk <fisk@bowdoin.edu>
a078051c 6;; Edward M. Reingold <reingold@cs.uiuc.edu>
dbfca9c4 7;; Maintainer: Glenn Morris <rgm@gnu.org>
9eb48cce
ER
8;; Keywords: calendar
9;; Human-Keywords: Calendar, LaTeX
bd78fa1d 10;; Package: calendar
9eb48cce
ER
11
12;; This file is part of GNU Emacs.
13
2ed66575 14;; GNU Emacs is free software: you can redistribute it and/or modify
9eb48cce 15;; it under the terms of the GNU General Public License as published by
2ed66575
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
9eb48cce
ER
18
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
2ed66575 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
9eb48cce
ER
26
27;;; Commentary:
28
6df87f14
ER
29;; This collection of functions implements the creation of LaTeX calendars
30;; based on the user's holiday choices and diary file.
9eb48cce 31
3e8e9c6a
GM
32;; The user commands are:
33;; cal-tex-cursor-year
34;; cal-tex-cursor-year-landscape
35;; cal-tex-cursor-filofax-year
36;; cal-tex-cursor-month-landscape
37;; cal-tex-cursor-month
38;; cal-tex-cursor-week
39;; cal-tex-cursor-week2
40;; cal-tex-cursor-week-iso
41;; cal-tex-cursor-week-monday
42;; cal-tex-cursor-filofax-2week
43;; cal-tex-cursor-filofax-week
44;; cal-tex-cursor-filofax-daily
45;; cal-tex-cursor-day
46
b578f267
EN
47;; TO DO
48;;
49;; (*) Add holidays and diary entries to daily calendar.
50;;
51;; (*) Add diary entries to weekly calendar functions.
52;;
53;; (*) Make calendar styles for A4 paper.
54;;
ff3f9a42 55;; (*) Make monthly styles Filofax paper.
9eb48cce
ER
56
57;;; Code:
58
59(require 'calendar)
60
9eb48cce 61;;;
a1506d29 62;;; Customizable variables
9eb48cce
ER
63;;;
64
ab4f654f
GM
65(defgroup calendar-tex nil
66 "Options for printing calendar with LaTeX."
67 :prefix "cal-tex-"
68 :group 'calendar)
69
5e11a170 70(defcustom cal-tex-which-days '(0 1 2 3 4 5 6)
55abc44f 71 "The days of the week that are displayed on the portrait monthly calendar.
9eb48cce 72Sunday is 0, Monday is 1, and so on. The default is to print from Sunday to
3e8e9c6a 73Saturday. For example, use '(1 3 5) to only print Monday, Wednesday, Friday."
5e11a170
RS
74 :type '(repeat integer)
75 :group 'calendar-tex)
9eb48cce 76
5e11a170 77(defcustom cal-tex-holidays t
a77e7064 78 "Non-nil means holidays are printed in the LaTeX calendars that support it.
3e8e9c6a 79Setting this to nil may speed up calendar generation."
5e11a170
RS
80 :type 'boolean
81 :group 'calendar-tex)
9eb48cce 82
5e11a170 83(defcustom cal-tex-diary nil
a77e7064
GM
84 "Non-nil means diary entries are printed in LaTeX calendars that support it.
85At present, this only affects the monthly, filofax, and iso-week
3e8e9c6a
GM
86calendars (i.e. not the yearly, plain weekly, or daily calendars).
87Setting this to nil may speed up calendar generation."
5e11a170
RS
88 :type 'boolean
89 :group 'calendar-tex)
9eb48cce 90
c1212606 91(defcustom cal-tex-rules nil
a77e7064
GM
92 "Non-nil means pages will be ruled in some LaTeX calendar styles.
93At present, this only affects the daily filofax calendar."
c1212606
KH
94 :type 'boolean
95 :group 'calendar-tex)
96
5e11a170 97(defcustom cal-tex-daily-string
e803eab7 98 '(let* ((year (calendar-extract-year date))
55abc44f 99 (day (calendar-day-number date))
9eb48cce 100 (days-remaining (- (calendar-day-number (list 12 31 year)) day)))
55abc44f 101 (format "%d/%d" day days-remaining))
3e8e9c6a
GM
102 "Lisp expression giving the date format to use in the LaTeX calendars.
103This should be an expression involving the variable `date'. When
104this expression is called, `date' is a list of the form '(MONTH DAY YEAR)'.
105
106The string resulting from evaluating this expression is placed at
107the bottom center of each date in monthly calendars, next to the
108date in the weekly calendars, and in the top center of daily calendars.
9eb48cce 109
3e8e9c6a
GM
110The default is ordinal day number of the year and the number of
111days remaining. As an example, setting this to
9eb48cce 112
3e8e9c6a 113 '(calendar-hebrew-date-string date)
9eb48cce 114
5e11a170
RS
115will put the Hebrew date at the bottom of each day."
116 :type 'sexp
117 :group 'calendar-tex)
118
119(defcustom cal-tex-buffer "calendar.tex"
a77e7064 120 "The name for the output LaTeX calendar buffer."
5e11a170
RS
121 :type 'string
122 :group 'calendar-tex)
123
124(defcustom cal-tex-24 nil
a77e7064 125 "Non-nil means use a 24 hour clock in the daily calendar."
5e11a170
RS
126 :type 'boolean
127 :group 'calendar-tex)
128
129(defcustom cal-tex-daily-start 8
3e8e9c6a
GM
130 "The first hour of the daily LaTeX calendar page.
131At present, this only affects `cal-tex-cursor-day'."
5e11a170
RS
132 :type 'integer
133 :group 'calendar-tex)
134
135(defcustom cal-tex-daily-end 20
3e8e9c6a 136 "The last hour of the daily LaTeX calendar page.
c8de140b 137At present, this only affects `cal-tex-cursor-day'."
5e11a170
RS
138 :type 'integer
139 :group 'calendar-tex)
9eb48cce 140
89aab5d4
GM
141(defcustom cal-tex-preamble-extra nil
142 "A string giving extra LaTeX commands to insert in the calendar preamble.
143For example, to include extra packages:
144\"\\\\usepackage{foo}\\n\\\\usepackage{bar}\\n\"."
a20013c1
GM
145 :type '(choice (const nil)
146 ;; An example to help people format things in custom.
147 (string :value "\\usepackage{foo}\n\\usepackage{bar}\n"))
89aab5d4
GM
148 :group 'calendar-tex
149 :version "22.1")
150
1eb0045f 151(defcustom cal-tex-hook nil
55abc44f 152 "List of functions called after any LaTeX calendar buffer is generated.
a078051c 153You can use this to do post-processing on the buffer. For example, to change
1eb0045f 154characters with diacritical marks to their LaTeX equivalents, use
3e8e9c6a
GM
155 (add-hook 'cal-tex-hook
156 (lambda () (iso-iso2tex (point-min) (point-max))))"
1eb0045f
RS
157 :type 'hook
158 :group 'calendar-tex)
159
160(defcustom cal-tex-year-hook nil
55abc44f 161 "List of functions called after a LaTeX year calendar buffer is generated."
1eb0045f
RS
162 :type 'hook
163 :group 'calendar-tex)
164
165(defcustom cal-tex-month-hook nil
55abc44f 166 "List of functions called after a LaTeX month calendar buffer is generated."
1eb0045f
RS
167 :type 'hook
168 :group 'calendar-tex)
169
170(defcustom cal-tex-week-hook nil
55abc44f 171 "List of functions called after a LaTeX week calendar buffer is generated."
1eb0045f
RS
172 :type 'hook
173 :group 'calendar-tex)
174
175(defcustom cal-tex-daily-hook nil
55abc44f 176 "List of functions called after a LaTeX daily calendar buffer is generated."
1eb0045f
RS
177 :type 'hook
178 :group 'calendar-tex)
179
9eb48cce
ER
180;;;
181;;; Definitions for LaTeX code
182;;;
183
3e8e9c6a 184(defconst cal-tex-day-prefix "\\caldate{%s}{%s}"
a1506d29 185 "The initial LaTeX code for a day.
9eb48cce 186The holidays, diary entries, bottom string, and the text follow.")
a1506d29 187
3e8e9c6a 188(defconst cal-tex-day-name-format "\\myday{%s}%%"
55abc44f
GM
189 "The format for LaTeX code for a day name.
190The names are taken from `calendar-day-name-array'.")
9eb48cce 191
3e8e9c6a 192(defconst cal-tex-cal-one-month
55abc44f 193 "\\def\\calmonth#1#2%
9eb48cce
ER
194{\\begin{center}%
195\\Huge\\bf\\uppercase{#1} #2 \\\\[1cm]%
a1506d29 196\\end{center}}%
9eb48cce
ER
197\\vspace*{-1.5cm}%
198%
199"
3e8e9c6a 200 "LaTeX code for the month header, for a single month calendar.")
9eb48cce 201
3e8e9c6a 202(defconst cal-tex-cal-multi-month
55abc44f 203 "\\def\\calmonth#1#2#3#4%
9eb48cce
ER
204{\\begin{center}%
205\\Huge\\bf #1 #2---#3 #4\\\\[1cm]%
a1506d29 206\\end{center}}%
9eb48cce
ER
207\\vspace*{-1.5cm}%
208%
209"
3e8e9c6a 210 "LaTeX code for the month header, for a multi-month calendar.")
9eb48cce 211
3e8e9c6a 212(defconst cal-tex-myday
55abc44f 213 "\\renewcommand{\\myday}[1]%
9eb48cce
ER
214{\\makebox[\\cellwidth]{\\hfill\\large\\bf#1\\hfill}}
215%
216"
55abc44f 217 "LaTeX code for a day heading.")
9eb48cce 218
3e8e9c6a 219(defconst cal-tex-caldate
9eb48cce
ER
220"\\fboxsep=0pt
221\\long\\def\\caldate#1#2#3#4#5#6{%
222 \\fbox{\\hbox to\\cellwidth{%
223 \\vbox to\\cellheight{%
224 \\hbox to\\cellwidth{%
225 {\\hspace*{1mm}\\Large \\bf \\strut #2}\\hspace{.05\\cellwidth}%
226 \\raisebox{\\holidaymult\\cellheight}%
227 {\\parbox[t]{.75\\cellwidth}{\\tiny \\raggedright #4}}}
228 \\hbox to\\cellwidth{%
229 \\hspace*{1mm}\\parbox{.95\\cellwidth}{\\tiny \\raggedright #3}}
230 \\hspace*{1mm}%
231 \\hbox to\\cellwidth{#6}%
232 \\vfill%
233 \\hbox to\\cellwidth{\\hfill \\tiny #5 \\hfill}%
234 \\vskip 1.4pt}%
235 \\hskip -0.4pt}}}
236"
237 "LaTeX code to insert one box with date info in calendar.
238This definition is the heart of the calendar!")
239
ee52e452
GM
240(autoload 'calendar-holiday-list "holidays")
241
9eb48cce
ER
242(defun cal-tex-list-holidays (d1 d2)
243 "Generate a list of all holidays from absolute date D1 to D2."
f6f83635 244 (let* ((start (calendar-gregorian-from-absolute d1))
e803eab7
GM
245 (displayed-month (calendar-extract-month start))
246 (displayed-year (calendar-extract-year start))
f6f83635 247 (end (calendar-gregorian-from-absolute d2))
e803eab7
GM
248 (end-month (calendar-extract-month end))
249 (end-year (calendar-extract-year end))
f6f83635
ER
250 (number-of-intervals
251 (1+ (/ (calendar-interval displayed-month displayed-year
252 end-month end-year)
253 3)))
55abc44f 254 holidays in-range a)
e803eab7 255 (calendar-increment-month displayed-month displayed-year 1)
55abc44f 256 (dotimes (idummy number-of-intervals)
f6f83635 257 (setq holidays (append holidays (calendar-holiday-list)))
e803eab7 258 (calendar-increment-month displayed-month displayed-year 3))
55abc44f
GM
259 (dolist (hol holidays)
260 (and (car hol)
261 (setq a (calendar-absolute-from-gregorian (car hol)))
262 (and (<= d1 a) (<= a d2))
263 (setq in-range (append (list hol) in-range))))
f6f83635 264 in-range))
9eb48cce 265
ee52e452
GM
266(autoload 'diary-list-entries "diary-lib")
267
9eb48cce
ER
268(defun cal-tex-list-diary-entries (d1 d2)
269 "Generate a list of all diary-entries from absolute date D1 to D2."
75c72180
GM
270 (let (diary-list-include-blanks)
271 (diary-list-entries (calendar-gregorian-from-absolute d1)
272 (1+ (- d2 d1)) t)))
9eb48cce
ER
273
274(defun cal-tex-preamble (&optional args)
3e8e9c6a 275 "Insert the LaTeX calendar preamble into `cal-tex-buffer'.
55abc44f 276Preamble includes initial definitions for various LaTeX commands.
3e8e9c6a
GM
277Optional string ARGS are included as options for the article document class."
278 ;; FIXME use generate-new-buffer, and adjust cal-tex-end-document.
9eb48cce 279 (set-buffer (get-buffer-create cal-tex-buffer))
3e8e9c6a
GM
280 (insert (format "\\documentclass%s{article}\n"
281 (if (stringp args)
282 (format "[%s]" args)
283 "")))
89aab5d4
GM
284 (if (stringp cal-tex-preamble-extra)
285 (insert cal-tex-preamble-extra "\n"))
286 (insert "\\hbadness 20000
b5295cea 287\\hfuzz=1000pt
9eb48cce 288\\vbadness 20000
ca57718c 289\\lineskip 0pt
9eb48cce
ER
290\\marginparwidth 0pt
291\\oddsidemargin -2cm
292\\evensidemargin -2cm
293\\marginparsep 0pt
294\\topmargin 0pt
295\\textwidth 7.5in
296\\textheight 9.5in
297\\newlength{\\cellwidth}
298\\newlength{\\cellheight}
299\\newlength{\\boxwidth}
300\\newlength{\\boxheight}
301\\newlength{\\cellsize}
302\\newcommand{\\myday}[1]{}
303\\newcommand{\\caldate}[6]{}
304\\newcommand{\\nocaldate}[6]{}
305\\newcommand{\\calsmall}[6]{}
306%
307"))
308
309;;;
310;;; Yearly calendars
311;;;
312
ee52e452 313;;;###cal-autoload
ed6c5737 314(defun cal-tex-cursor-year (&optional n event)
9eb48cce 315 "Make a buffer with LaTeX commands for the year cursor is on.
ed6c5737
GM
316Optional prefix argument N specifies number of years.
317Optional EVENT indicates a buffer position to use instead of point."
318 (interactive (list (prefix-numeric-value current-prefix-arg)
319 last-nonmenu-event))
320 (cal-tex-year (calendar-extract-year (calendar-cursor-to-date t event))
321 (or n 1)))
9eb48cce 322
ee52e452 323;;;###cal-autoload
ed6c5737 324(defun cal-tex-cursor-year-landscape (&optional n event)
9eb48cce 325 "Make a buffer with LaTeX commands for the year cursor is on.
ed6c5737
GM
326Optional prefix argument N specifies number of years.
327Optional EVENT indicates a buffer position to use instead of point."
328 (interactive (list (prefix-numeric-value current-prefix-arg)
329 last-nonmenu-event))
330 (cal-tex-year (calendar-extract-year (calendar-cursor-to-date t event))
331 (or n 1) t))
9eb48cce
ER
332
333(defun cal-tex-year (year n &optional landscape)
334 "Make a one page yearly calendar of YEAR; do this for N years.
3e8e9c6a
GM
335There are four rows of three months each, unless optional
336LANDSCAPE is non-nil, in which case the calendar is printed in
337landscape mode with three rows of four months each."
9eb48cce
ER
338 (cal-tex-insert-preamble 1 landscape "12pt")
339 (if landscape
340 (cal-tex-vspace "-.6cm")
341 (cal-tex-vspace "-3.1cm"))
55abc44f 342 (dotimes (j n)
a77e7064
GM
343 (insert "\\vfill%\n")
344 (cal-tex-b-center)
345 (cal-tex-Huge (number-to-string year))
346 (cal-tex-e-center)
347 (cal-tex-vspace "1cm")
348 (cal-tex-b-center)
349 (cal-tex-b-parbox "l" (if landscape "5.9in" "4.3in"))
350 (insert "\n")
351 (cal-tex-noindent)
352 (cal-tex-nl)
55abc44f
GM
353 (dotimes (i 12)
354 (insert (cal-tex-mini-calendar (1+ i) year "month" "1.1in" "1in"))
355 (insert "\\month")
356 (cal-tex-hspace "0.5in")
357 (if (zerop (mod (1+ i) (if landscape 4 3)))
358 (cal-tex-nl "0.5in")))
a77e7064
GM
359 (cal-tex-e-parbox)
360 (cal-tex-e-center)
361 (insert "\\vfill%\n")
362 (setq year (1+ year))
55abc44f
GM
363 (if (= j (1- n))
364 (cal-tex-end-document)
365 (cal-tex-newpage))
a77e7064 366 (run-hooks 'cal-tex-year-hook))
9eb48cce
ER
367 (run-hooks 'cal-tex-hook))
368
ee52e452 369;;;###cal-autoload
ed6c5737 370(defun cal-tex-cursor-filofax-year (&optional n event)
9eb48cce 371 "Make a Filofax one page yearly calendar of year indicated by cursor.
ed6c5737
GM
372Optional prefix argument N specifies number of years.
373Optional EVENT indicates a buffer position to use instead of point."
374 (interactive (list (prefix-numeric-value current-prefix-arg)
375 last-nonmenu-event))
376 (or n (setq n 1))
377 (let ((year (calendar-extract-year (calendar-cursor-to-date t event))))
9eb48cce
ER
378 (cal-tex-preamble "twoside")
379 (cal-tex-cmd "\\textwidth 3.25in")
380 (cal-tex-cmd "\\textheight 6.5in")
2d1214b8
ER
381 (cal-tex-cmd "\\oddsidemargin 1.675in")
382 (cal-tex-cmd "\\evensidemargin 1.675in")
9eb48cce
ER
383 (cal-tex-cmd "\\topmargin 0pt")
384 (cal-tex-cmd "\\headheight -0.875in")
0e22410a 385 (cal-tex-cmd "\\fboxsep 0.5mm")
9eb48cce
ER
386 (cal-tex-cmd "\\pagestyle{empty}")
387 (cal-tex-b-document)
0e22410a 388 (cal-tex-cmd "\\vspace*{0.25in}")
55abc44f 389 (dotimes (j n)
3e8e9c6a 390 (insert (format "\\hfil \\textbf{\\Large %s} \\hfil\\\\\n" year))
a77e7064
GM
391 (cal-tex-b-center)
392 (cal-tex-b-parbox "l" "\\textwidth")
393 (insert "\n")
394 (cal-tex-noindent)
395 (cal-tex-nl)
396 (let ((month-names; don't use default in case user changed it
397 ;; These are only used to define the command names, not
398 ;; the names of the months they insert.
399 ["January" "February" "March" "April" "May" "June"
400 "July" "August" "September" "October" "November" "December"]))
55abc44f
GM
401 (dotimes (i 12)
402 (insert (cal-tex-mini-calendar (1+ i) year (aref month-names i)
a77e7064
GM
403 "1in" ".9in" "tiny" "0.6mm"))))
404 (insert
405 "\\noindent\\fbox{\\January}\\fbox{\\February}\\fbox{\\March}\\\\
9eb48cce
ER
406\\noindent\\fbox{\\April}\\fbox{\\May}\\fbox{\\June}\\\\
407\\noindent\\fbox{\\July}\\fbox{\\August}\\fbox{\\September}\\\\
408\\noindent\\fbox{\\October}\\fbox{\\November}\\fbox{\\December}
409")
a77e7064
GM
410 (cal-tex-e-parbox)
411 (cal-tex-e-center)
412 (setq year (1+ year))
55abc44f 413 (if (= j (1- n))
a77e7064
GM
414 (cal-tex-end-document)
415 (cal-tex-newpage)
416 (cal-tex-cmd "\\vspace*{0.25in}"))
417 (run-hooks 'cal-tex-year-hook))
9eb48cce
ER
418 (run-hooks 'cal-tex-hook)))
419
420;;;
421;;; Monthly calendars
422;;;
423
ee52e452 424;;;###cal-autoload
ed6c5737 425(defun cal-tex-cursor-month-landscape (&optional n event)
a77e7064 426 "Make a LaTeX calendar buffer for the month the cursor is on.
ed6c5737 427Optional prefix argument N specifies number of months to be
a77e7064
GM
428produced (default 1). The output is in landscape format, one
429month to a page. It shows holiday and diary entries if
ed6c5737
GM
430`cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
431Optional EVENT indicates a buffer position to use instead of point."
432 (interactive (list (prefix-numeric-value current-prefix-arg)
433 last-nonmenu-event))
434 (or n (setq n 1))
435 (let* ((date (calendar-cursor-to-date t event))
e803eab7
GM
436 (month (calendar-extract-month date))
437 (year (calendar-extract-year date))
9eb48cce
ER
438 (end-month month)
439 (end-year year)
55abc44f
GM
440 (cal-tex-which-days '(0 1 2 3 4 5 6))
441 (d1 (calendar-absolute-from-gregorian (list month 1 year)))
00169eb6
GM
442 (d2 (progn
443 (calendar-increment-month end-month end-year (1- n))
444 (calendar-absolute-from-gregorian
445 (list end-month
446 (calendar-last-day-of-month end-month end-year)
447 end-year))))
448 (diary-list (if cal-tex-diary (cal-tex-list-diary-entries d1 d2)))
c7af68bc
GM
449 (holidays (if cal-tex-holidays (cal-tex-list-holidays d1 d2)))
450 other-month other-year small-months-at-start)
451 (cal-tex-insert-preamble (cal-tex-number-weeks month year 1) t "12pt")
452 (cal-tex-cmd cal-tex-cal-one-month)
453 (dotimes (i n)
454 (setq other-month month
455 other-year year)
e803eab7 456 (calendar-increment-month other-month other-year -1)
c7af68bc
GM
457 (insert (cal-tex-mini-calendar other-month other-year "lastmonth"
458 "\\cellwidth" "\\cellheight"))
e803eab7 459 (calendar-increment-month other-month other-year 2)
c7af68bc
GM
460 (insert (cal-tex-mini-calendar other-month other-year "nextmonth"
461 "\\cellwidth" "\\cellheight"))
462 (cal-tex-insert-month-header 1 month year month year)
463 (cal-tex-insert-day-names)
464 (cal-tex-nl ".2cm")
465 (if (setq small-months-at-start
466 (< 1 (mod (- (calendar-day-of-week (list month 1 year))
a77e7064 467 calendar-week-start-day)
c7af68bc
GM
468 7)))
469 (insert "\\lastmonth\\nextmonth\\hspace*{-2\\cellwidth}"))
470 (cal-tex-insert-blank-days month year cal-tex-day-prefix)
471 (cal-tex-insert-days month year diary-list holidays
472 cal-tex-day-prefix)
473 (cal-tex-insert-blank-days-at-end month year cal-tex-day-prefix)
474 (if (and (not small-months-at-start)
475 (< 1 (mod (- (1- calendar-week-start-day)
476 (calendar-day-of-week
477 (list month
478 (calendar-last-day-of-month month year)
479 year)))
480 7)))
481 (insert "\\vspace*{-\\cellwidth}\\hspace*{-2\\cellwidth}"
482 "\\lastmonth\\nextmonth%
1eb0045f 483"))
c7af68bc
GM
484 (unless (= i (1- n))
485 (run-hooks 'cal-tex-month-hook)
486 (cal-tex-newpage)
e803eab7 487 (calendar-increment-month month year 1)
c7af68bc
GM
488 (cal-tex-vspace "-2cm")
489 (cal-tex-insert-preamble
490 (cal-tex-number-weeks month year 1) t "12pt" t))))
491 (cal-tex-end-document)
492 (run-hooks 'cal-tex-hook))
9eb48cce 493
ee52e452 494;;;###cal-autoload
ed6c5737 495(defun cal-tex-cursor-month (&optional n event)
a77e7064 496 "Make a LaTeX calendar buffer for the month the cursor is on.
ed6c5737 497Optional prefix argument N specifies number of months to be
a77e7064
GM
498produced (default 1). The calendar is condensed onto one page.
499It shows holiday and diary entries if `cal-tex-holidays' and
ed6c5737
GM
500`cal-tex-diary', respectively, are non-nil. Optional EVENT
501indicates a buffer position to use instead of point."
502 (interactive (list (prefix-numeric-value current-prefix-arg)
503 last-nonmenu-event))
504 (or n (setq n 1))
505 (let* ((date (calendar-cursor-to-date t event))
e803eab7
GM
506 (month (calendar-extract-month date))
507 (year (calendar-extract-year date))
9eb48cce
ER
508 (end-month month)
509 (end-year year)
3260caf8 510 ;; FIXME -landscape sets cal-tex-which-days?
55abc44f 511 (d1 (calendar-absolute-from-gregorian (list month 1 year)))
00169eb6
GM
512 (d2 (progn
513 (calendar-increment-month end-month end-year (1- n))
514 (calendar-absolute-from-gregorian
515 (list end-month
516 (calendar-last-day-of-month end-month end-year)
517 end-year))))
518 (diary-list (if cal-tex-diary (cal-tex-list-diary-entries d1 d2)))
3260caf8 519 (holidays (if cal-tex-holidays (cal-tex-list-holidays d1 d2))))
c7af68bc
GM
520 (cal-tex-insert-preamble (cal-tex-number-weeks month year n) nil "12pt")
521 (if (> n 1)
522 (cal-tex-cmd cal-tex-cal-multi-month)
523 (cal-tex-cmd cal-tex-cal-one-month))
524 (cal-tex-insert-month-header n month year end-month end-year)
525 (cal-tex-insert-day-names)
526 (cal-tex-nl ".2cm")
527 (cal-tex-insert-blank-days month year cal-tex-day-prefix)
528 (dotimes (idummy n)
c7af68bc 529 (cal-tex-insert-days month year diary-list holidays cal-tex-day-prefix)
3260caf8
GM
530 (when (= (calendar-week-end-day)
531 (calendar-day-of-week
532 (list month
533 (calendar-last-day-of-month month year)
534 year))) ; last day of month was last day of week
c7af68bc
GM
535 (cal-tex-hfill)
536 (cal-tex-nl))
e803eab7 537 (calendar-increment-month month year 1))
c7af68bc
GM
538 (cal-tex-insert-blank-days-at-end end-month end-year cal-tex-day-prefix))
539 (cal-tex-end-document)
9eb48cce
ER
540 (run-hooks 'cal-tex-hook))
541
a1506d29 542(defun cal-tex-insert-days (month year diary-list holidays day-format)
9eb48cce
ER
543 "Insert LaTeX commands for a range of days in monthly calendars.
544LaTeX commands are inserted for the days of the MONTH in YEAR.
a77e7064
GM
545Diary entries on DIARY-LIST are included. Holidays on HOLIDAYS
546are included. Each day is formatted using format DAY-FORMAT."
55abc44f
GM
547 (let ((blank-days ; at start of month
548 (mod
549 (- (calendar-day-of-week (list month 1 year))
550 calendar-week-start-day)
551 7))
552 (last (calendar-last-day-of-month month year))
553 date j)
554 (dotimes (i last)
555 (setq j (1+ i) ; 1-last, incl
556 date (list month j year))
557 (when (memq (calendar-day-of-week date) cal-tex-which-days)
558 (insert (format day-format (cal-tex-month-name month) j))
559 (cal-tex-arg (cal-tex-latexify-list diary-list date))
560 (cal-tex-arg (cal-tex-latexify-list holidays date))
561 (cal-tex-arg (eval cal-tex-daily-string))
562 (cal-tex-arg)
563 (cal-tex-comment))
564 (when (and (zerop (mod (+ j blank-days) 7))
565 (/= j last))
566 (cal-tex-hfill)
567 (cal-tex-nl)))))
9eb48cce
ER
568
569(defun cal-tex-insert-day-names ()
570 "Insert the names of the days at top of a monthly calendar."
3260caf8
GM
571 (let (j)
572 (dotimes (i 7)
573 (if (memq (setq j (mod (+ calendar-week-start-day i) 7))
574 cal-tex-which-days)
575 (insert (format cal-tex-day-name-format
576 (cal-tex-LaTeXify-string
577 (aref calendar-day-name-array j)))))
578 (cal-tex-comment))))
9eb48cce
ER
579
580(defun cal-tex-insert-month-header (n month year end-month end-year)
581 "Create a title for a calendar.
a1506d29 582A title is inserted for a calendar with N months starting with
9eb48cce 583MONTH YEAR and ending with END-MONTH END-YEAR."
55abc44f
GM
584 (let ((month-name (cal-tex-month-name month))
585 (end-month-name (cal-tex-month-name end-month)))
9eb48cce
ER
586 (if (= 1 n)
587 (insert (format "\\calmonth{%s}{%s}\n\\vspace*{-0.5cm}"
55abc44f
GM
588 month-name year) )
589 (insert (format "\\calmonth{%s}{%s}{%s}{%s}\n\\vspace*{-0.5cm}"
590 month-name year end-month-name end-year))))
9eb48cce
ER
591 (cal-tex-comment))
592
593(defun cal-tex-insert-blank-days (month year day-format)
594 "Insert code for initial days not in calendar.
595Insert LaTeX code for the blank days at the beginning of the MONTH in
596YEAR. The entry is formatted using DAY-FORMAT. If the entire week is
597blank, no days are inserted."
598 (if (cal-tex-first-blank-p month year)
55abc44f
GM
599 (let ((blank-days ; at start of month
600 (mod
601 (- (calendar-day-of-week (list month 1 year))
602 calendar-week-start-day)
603 7)))
604 (dotimes (i blank-days)
3260caf8 605 (if (memq (mod (+ calendar-week-start-day i) 7) cal-tex-which-days)
a77e7064 606 (insert (format day-format " " " ") "{}{}{}{}%\n"))))))
9eb48cce
ER
607
608(defun cal-tex-insert-blank-days-at-end (month year day-format)
609 "Insert code for final days not in calendar.
610Insert LaTeX code for the blank days at the end of the MONTH in YEAR.
611The entry is formatted using DAY-FORMAT."
612 (if (cal-tex-last-blank-p month year)
613 (let* ((last-day (calendar-last-day-of-month month year))
55abc44f 614 (blank-days ; at end of month
9eb48cce
ER
615 (mod
616 (- (calendar-day-of-week (list month last-day year))
617 calendar-week-start-day)
80b24a35
GM
618 7))
619 (i blank-days))
620 (while (<= (setq i (1+ i)) 6)
3260caf8 621 (if (memq (mod (+ calendar-week-start-day i) 7) cal-tex-which-days)
80b24a35 622 (insert (format day-format "" "") "{}{}{}{}%\n"))))))
9eb48cce
ER
623
624(defun cal-tex-first-blank-p (month year)
625 "Determine if any days of the first week will be printed.
626Return t if there will there be any days of the first week printed
627in the calendar starting in MONTH YEAR."
3260caf8
GM
628 ;; Check days 1-7 of the month, until we find the last day of the week.
629 (catch 'found
630 (let (dow)
631 (dotimes (i 7)
632 (if (memq (setq dow (calendar-day-of-week (list month (1+ i) year)))
633 cal-tex-which-days)
634 (throw 'found t)
635 (if (= dow (calendar-week-end-day)) (throw 'found nil)))))))
9eb48cce
ER
636
637(defun cal-tex-last-blank-p (month year)
638 "Determine if any days of the last week will be printed.
639Return t if there will there be any days of the last week printed
640in the calendar starting in MONTH YEAR."
3260caf8
GM
641 ;; Check backwards from the last day of the month, until we find the
642 ;; start of the last week in the month.
643 (catch 'found
644 (let ((last-day (calendar-last-day-of-month month year))
645 day dow)
646 (dotimes (i 7)
647 (if (memq (setq dow (calendar-day-of-week
648 (list month (- last-day i) year)))
649 cal-tex-which-days)
650 (throw 'found t)
651 (if (= dow calendar-week-start-day) (throw 'found nil)))))))
9eb48cce
ER
652
653(defun cal-tex-number-weeks (month year n)
654 "Determine the number of weeks in a range of dates.
c8de140b 655Compute the number of weeks in the calendar starting with MONTH and YEAR,
55abc44f 656and lasting N months, including only the days in WHICH-DAYS. As it stands,
9eb48cce
ER
657this is only an upper bound."
658 (let ((d (list month 1 year)))
e803eab7 659 (calendar-increment-month month year (1- n))
9eb48cce
ER
660 (/ (- (calendar-dayname-on-or-before
661 calendar-week-start-day
662 (+ 7 (calendar-absolute-from-gregorian
663 (list month (calendar-last-day-of-month month year) year))))
664 (calendar-dayname-on-or-before
665 calendar-week-start-day
666 (calendar-absolute-from-gregorian d)))
667 7)))
668
669;;;
670;;; Weekly calendars
671;;;
672
3e8e9c6a 673(defconst cal-tex-LaTeX-hourbox
30f5dd98
GM
674 "\\newcommand{\\hourbox}[2]%
675{\\makebox[2em]{\\rule{0cm}{#2ex}#1}\\rule{3in}{.15mm}}\n"
676 "One hour and a line on the right.")
677
a77e7064 678;; TODO cal-tex-diary-support.
3e8e9c6a 679;; TODO respect cal-tex-daily-start,end (see cal-tex-week-hours).
ee52e452 680;;;###cal-autoload
ed6c5737 681(defun cal-tex-cursor-week (&optional n event)
a77e7064
GM
682 "Make a LaTeX calendar buffer for a two-page one-week calendar.
683It applies to the week that point is in. The optional prefix
c8de140b 684argument N specifies number of weeks (default 1). The calendar
3e8e9c6a
GM
685shows holidays if `cal-tex-holidays' is non-nil (note that diary
686entries are not shown). The calendar shows the hours 8-12am, 1-5pm."
ed6c5737
GM
687 (interactive (list (prefix-numeric-value current-prefix-arg)
688 last-nonmenu-event))
689 (or n (setq n 1))
690 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
691 (calendar-dayname-on-or-before
692 calendar-week-start-day
693 (calendar-absolute-from-gregorian
ed6c5737 694 (calendar-cursor-to-date t event)))))
e803eab7
GM
695 (month (calendar-extract-month date))
696 (year (calendar-extract-year date))
55abc44f
GM
697 (d1 (calendar-absolute-from-gregorian date))
698 (d2 (+ (* 7 n) d1))
9eb48cce 699 (holidays (if cal-tex-holidays
55abc44f 700 (cal-tex-list-holidays d1 d2))))
9eb48cce
ER
701 (cal-tex-preamble "11pt")
702 (cal-tex-cmd "\\textwidth 6.5in")
703 (cal-tex-cmd "\\textheight 10.5in")
704 (cal-tex-cmd "\\oddsidemargin 0in")
705 (cal-tex-cmd "\\evensidemargin 0in")
706 (insert cal-tex-LaTeX-hourbox)
707 (cal-tex-b-document)
708 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 709 (dotimes (i n)
a77e7064
GM
710 (cal-tex-vspace "-1.5in")
711 (cal-tex-b-center)
712 (cal-tex-Huge-bf (format "\\uppercase{%s}"
713 (cal-tex-month-name month)))
714 (cal-tex-hspace "2em")
715 (cal-tex-Huge-bf (number-to-string year))
716 (cal-tex-nl ".5cm")
717 (cal-tex-e-center)
718 (cal-tex-hspace "-.2in")
719 (cal-tex-b-parbox "l" "7in")
55abc44f 720 (dotimes (jdummy 7)
a77e7064
GM
721 (cal-tex-week-hours date holidays "3.1")
722 (setq date (cal-tex-incr-date date)))
723 (cal-tex-e-parbox)
e803eab7
GM
724 (setq month (calendar-extract-month date)
725 year (calendar-extract-year date))
55abc44f
GM
726 (unless (= i (1- n))
727 (run-hooks 'cal-tex-week-hook)
728 (cal-tex-newpage)))
9eb48cce
ER
729 (cal-tex-end-document)
730 (run-hooks 'cal-tex-hook)))
731
a77e7064 732;; TODO cal-tex-diary support.
3e8e9c6a 733;; TODO respect cal-tex-daily-start,end (see cal-tex-week-hours).
ee52e452 734;;;###cal-autoload
ed6c5737 735(defun cal-tex-cursor-week2 (&optional n event)
a77e7064
GM
736 "Make a LaTeX calendar buffer for a two-page one-week calendar.
737It applies to the week that point is in. Optional prefix
ed6c5737 738argument N specifies number of weeks (default 1). The calendar
a77e7064 739shows holidays if `cal-tex-holidays' is non-nil (note that diary
ed6c5737
GM
740entries are not shown). The calendar shows the hours 8-12am, 1-5pm.
741Optional EVENT indicates a buffer position to use instead of point."
742 (interactive (list (prefix-numeric-value current-prefix-arg)
743 last-nonmenu-event))
744 (or n (setq n 1))
745 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
746 (calendar-dayname-on-or-before
747 calendar-week-start-day
748 (calendar-absolute-from-gregorian
ed6c5737 749 (calendar-cursor-to-date t event)))))
e803eab7
GM
750 (month (calendar-extract-month date))
751 (year (calendar-extract-year date))
9eb48cce 752 (d date)
55abc44f
GM
753 (d1 (calendar-absolute-from-gregorian date))
754 (d2 (+ (* 7 n) d1))
9eb48cce 755 (holidays (if cal-tex-holidays
55abc44f 756 (cal-tex-list-holidays d1 d2))))
9eb48cce
ER
757 (cal-tex-preamble "12pt")
758 (cal-tex-cmd "\\textwidth 6.5in")
759 (cal-tex-cmd "\\textheight 10.5in")
760 (cal-tex-cmd "\\oddsidemargin 0in")
761 (cal-tex-cmd "\\evensidemargin 0in")
762 (insert cal-tex-LaTeX-hourbox)
763 (cal-tex-b-document)
764 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 765 (dotimes (i n)
a77e7064
GM
766 (cal-tex-vspace "-1.5in")
767 (cal-tex-b-center)
768 (cal-tex-Huge-bf (format "\\uppercase{%s}"
769 (cal-tex-month-name month)))
770 (cal-tex-hspace "2em")
771 (cal-tex-Huge-bf (number-to-string year))
772 (cal-tex-nl ".5cm")
773 (cal-tex-e-center)
774 (cal-tex-hspace "-.2in")
775 (cal-tex-b-parbox "l" "\\textwidth")
55abc44f 776 (dotimes (jdummy 3)
a77e7064
GM
777 (cal-tex-week-hours date holidays "5")
778 (setq date (cal-tex-incr-date date)))
779 (cal-tex-e-parbox)
780 (cal-tex-nl)
781 (insert (cal-tex-mini-calendar
e803eab7
GM
782 (calendar-extract-month (cal-tex-previous-month date))
783 (calendar-extract-year (cal-tex-previous-month date))
a77e7064
GM
784 "lastmonth" "1.1in" "1in"))
785 (insert (cal-tex-mini-calendar
e803eab7
GM
786 (calendar-extract-month date)
787 (calendar-extract-year date)
a77e7064
GM
788 "thismonth" "1.1in" "1in"))
789 (insert (cal-tex-mini-calendar
e803eab7
GM
790 (calendar-extract-month (cal-tex-next-month date))
791 (calendar-extract-year (cal-tex-next-month date))
a77e7064
GM
792 "nextmonth" "1.1in" "1in"))
793 (insert "\\hbox to \\textwidth{")
794 (cal-tex-hfill)
795 (insert "\\lastmonth")
796 (cal-tex-hfill)
797 (insert "\\thismonth")
798 (cal-tex-hfill)
799 (insert "\\nextmonth")
800 (cal-tex-hfill)
801 (insert "}")
802 (cal-tex-nl)
803 (cal-tex-b-parbox "l" "\\textwidth")
55abc44f 804 (dotimes (jdummy 4)
a77e7064
GM
805 (cal-tex-week-hours date holidays "5")
806 (setq date (cal-tex-incr-date date)))
807 (cal-tex-e-parbox)
e803eab7
GM
808 (setq month (calendar-extract-month date)
809 year (calendar-extract-year date))
55abc44f
GM
810 (unless (= i (1- n))
811 (run-hooks 'cal-tex-week-hook)
812 (cal-tex-newpage)))
9eb48cce
ER
813 (cal-tex-end-document)
814 (run-hooks 'cal-tex-hook)))
815
ee52e452
GM
816(autoload 'calendar-iso-from-absolute "cal-iso")
817
818;;;###cal-autoload
ed6c5737 819(defun cal-tex-cursor-week-iso (&optional n event)
a77e7064 820 "Make a LaTeX calendar buffer for a one page ISO-style weekly calendar.
ed6c5737 821Optional prefix argument N specifies number of weeks (default 1).
a77e7064 822The calendar shows holiday and diary entries if
3e8e9c6a 823`cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
ed6c5737
GM
824It does not show hours of the day. Optional EVENT indicates a buffer
825position to use instead of point."
826 (interactive (list (prefix-numeric-value current-prefix-arg)
827 last-nonmenu-event))
828 (or n (setq n 1))
829 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
830 (calendar-dayname-on-or-before
831 1
832 (calendar-absolute-from-gregorian
ed6c5737 833 (calendar-cursor-to-date t event)))))
e803eab7
GM
834 (month (calendar-extract-month date))
835 (year (calendar-extract-year date))
836 (day (calendar-extract-day date))
55abc44f
GM
837 (d1 (calendar-absolute-from-gregorian date))
838 (d2 (+ (* 7 n) d1))
9eb48cce 839 (holidays (if cal-tex-holidays
55abc44f 840 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
841 (diary-list (if cal-tex-diary
842 (cal-tex-list-diary-entries
55abc44f
GM
843 ;; FIXME d1?
844 (calendar-absolute-from-gregorian (list month 1 year))
845 d2)))
846 s)
9eb48cce
ER
847 (cal-tex-preamble "11pt")
848 (cal-tex-cmd "\\textwidth 6.5in")
849 (cal-tex-cmd "\\textheight 10.5in")
850 (cal-tex-cmd "\\oddsidemargin 0in")
851 (cal-tex-cmd "\\evensidemargin 0in")
852 (cal-tex-b-document)
853 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 854 (dotimes (i n)
a77e7064
GM
855 (cal-tex-vspace "-1.5in")
856 (cal-tex-b-center)
857 (cal-tex-Huge-bf
55abc44f
GM
858 (let ((d (calendar-iso-from-absolute
859 (calendar-absolute-from-gregorian date))))
a77e7064 860 (format "Week %d of %d"
e803eab7
GM
861 (calendar-extract-month d)
862 (calendar-extract-year d))))
a77e7064
GM
863 (cal-tex-nl ".5cm")
864 (cal-tex-e-center)
865 (cal-tex-b-parbox "l" "\\textwidth")
55abc44f 866 (dotimes (j 7)
a77e7064
GM
867 (cal-tex-b-parbox "t" "\\textwidth")
868 (cal-tex-b-parbox "t" "\\textwidth")
869 (cal-tex-rule "0pt" "\\textwidth" ".2mm")
870 (cal-tex-nl)
871 (cal-tex-b-parbox "t" "\\textwidth")
872 (cal-tex-large-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
873 (insert ", ")
874 (cal-tex-large-bf (cal-tex-month-name month))
875 (insert " ")
876 (cal-tex-large-bf (number-to-string day))
55abc44f
GM
877 (unless (string-equal "" (setq s (cal-tex-latexify-list
878 holidays date "; ")))
879 (insert ": ")
880 (cal-tex-large-bf s))
a77e7064
GM
881 (cal-tex-hfill)
882 (insert " " (eval cal-tex-daily-string))
883 (cal-tex-e-parbox)
884 (cal-tex-nl)
885 (cal-tex-noindent)
886 (cal-tex-b-parbox "t" "\\textwidth")
55abc44f
GM
887 (unless (string-equal "" (setq s (cal-tex-latexify-list
888 diary-list date)))
889 (insert "\\vbox to 0pt{")
890 (cal-tex-large-bf s)
891 (insert "}"))
a77e7064
GM
892 (cal-tex-e-parbox)
893 (cal-tex-nl)
55abc44f 894 (setq date (cal-tex-incr-date date)
e803eab7
GM
895 month (calendar-extract-month date)
896 day (calendar-extract-day date))
a77e7064
GM
897 (cal-tex-e-parbox)
898 (cal-tex-e-parbox "2cm")
899 (cal-tex-nl)
e803eab7
GM
900 (setq month (calendar-extract-month date)
901 year (calendar-extract-year date)))
a77e7064 902 (cal-tex-e-parbox)
55abc44f
GM
903 (unless (= i (1- n))
904 (run-hooks 'cal-tex-week-hook)
905 (cal-tex-newpage)))
9eb48cce
ER
906 (cal-tex-end-document)
907 (run-hooks 'cal-tex-hook)))
908
3e8e9c6a
GM
909;; TODO respect cal-tex-daily-start,end?
910;; Using different numbers of hours will probably break some layouts.
9eb48cce 911(defun cal-tex-week-hours (date holidays height)
a77e7064 912 "Insert hourly entries for DATE with HOLIDAYS, with line height HEIGHT.
3e8e9c6a
GM
913Uses the 24-hour clock if `cal-tex-24' is non-nil. Note that the hours
914shown are hard-coded to 8-12, 13-17."
e803eab7
GM
915 (let ((month (calendar-extract-month date))
916 (day (calendar-extract-day date))
917 (year (calendar-extract-year date))
55abc44f 918 morning afternoon s)
9eb48cce
ER
919 (cal-tex-comment "begin cal-tex-week-hours")
920 (cal-tex-cmd "\\ \\\\[-.2cm]")
921 (cal-tex-cmd "\\noindent")
922 (cal-tex-b-parbox "l" "6.8in")
1eb0045f 923 (cal-tex-large-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
9eb48cce 924 (insert ", ")
1eb0045f 925 (cal-tex-large-bf (cal-tex-month-name month))
9eb48cce
ER
926 (insert " ")
927 (cal-tex-large-bf (number-to-string day))
55abc44f
GM
928 (unless (string-equal "" (setq s (cal-tex-latexify-list
929 holidays date "; ")))
930 (insert ": ")
931 (cal-tex-large-bf s))
9eb48cce
ER
932 (cal-tex-hfill)
933 (insert " " (eval cal-tex-daily-string))
934 (cal-tex-e-parbox)
935 (cal-tex-nl "-.3cm")
936 (cal-tex-rule "0pt" "6.8in" ".2mm")
937 (cal-tex-nl "-.1cm")
55abc44f
GM
938 (dotimes (i 5)
939 (setq morning (+ i 8) ; 8-12 incl
940 afternoon (if cal-tex-24
941 (+ i 13) ; 13-17 incl
942 (1+ i))) ; 1-5 incl
943 (cal-tex-cmd "\\hourbox" (number-to-string morning))
944 (cal-tex-arg height)
945 (cal-tex-hspace ".4cm")
946 (cal-tex-cmd "\\hourbox" (number-to-string afternoon))
947 (cal-tex-arg height)
948 (cal-tex-nl))))
9eb48cce 949
a77e7064 950;; TODO cal-tex-diary support.
3e8e9c6a 951;; TODO respect cal-tex-daily-start,end (see cal-tex-weekly4-box).
ee52e452 952;;;###cal-autoload
ed6c5737 953(defun cal-tex-cursor-week-monday (&optional n event)
a77e7064 954 "Make a LaTeX calendar buffer for a two-page one-week calendar.
ab3a4359 955It applies to the week that point is in, and starts on Monday.
ed6c5737 956Optional prefix argument N specifies number of weeks (default 1).
a77e7064 957The calendar shows holidays if `cal-tex-holidays' is
3e8e9c6a 958non-nil (note that diary entries are not shown). The calendar shows
ed6c5737
GM
959the hours 8-12am, 1-5pm. Optional EVENT indicates a buffer position
960to use instead of point."
961 (interactive (list (prefix-numeric-value current-prefix-arg)
962 last-nonmenu-event))
963 (or n (setq n 1))
964 (let ((date (calendar-gregorian-from-absolute
55abc44f
GM
965 (calendar-dayname-on-or-before
966 0
967 (calendar-absolute-from-gregorian
ed6c5737 968 (calendar-cursor-to-date t event))))))
9eb48cce
ER
969 (cal-tex-preamble "11pt")
970 (cal-tex-cmd "\\textwidth 6.5in")
971 (cal-tex-cmd "\\textheight 10.5in")
972 (cal-tex-cmd "\\oddsidemargin 0in")
973 (cal-tex-cmd "\\evensidemargin 0in")
974 (cal-tex-b-document)
55abc44f 975 (dotimes (i n)
a77e7064
GM
976 (cal-tex-vspace "-1cm")
977 (insert "\\noindent ")
978 (cal-tex-weekly4-box (cal-tex-incr-date date) nil)
979 (cal-tex-weekly4-box (cal-tex-incr-date date 4) nil)
980 (cal-tex-nl ".2cm")
981 (cal-tex-weekly4-box (cal-tex-incr-date date 2) nil)
982 (cal-tex-weekly4-box (cal-tex-incr-date date 5) nil)
983 (cal-tex-nl ".2cm")
984 (cal-tex-weekly4-box (cal-tex-incr-date date 3) nil)
985 (cal-tex-weekly4-box (cal-tex-incr-date date 6) t)
55abc44f
GM
986 (unless (= i (1- n))
987 (run-hooks 'cal-tex-week-hook)
988 (setq date (cal-tex-incr-date date 7))
989 (cal-tex-newpage)))
9eb48cce
ER
990 (cal-tex-end-document)
991 (run-hooks 'cal-tex-hook)))
992
3e8e9c6a
GM
993;; TODO respect cal-tex-daily-start,end?
994;; Using different numbers of hours will probably break some layouts.
9eb48cce 995(defun cal-tex-weekly4-box (date weekend)
a77e7064 996 "Make one box for DATE, different if WEEKEND.
3e8e9c6a
GM
997Uses the 24-hour clock if `cal-tex-24' is non-nil. Note that the hours
998shown are hard-coded to 8-12, 13-17."
e803eab7
GM
999 (let* ((day (calendar-extract-day date))
1000 (month (calendar-extract-month date))
1001 (year (calendar-extract-year date))
55abc44f
GM
1002 (dayname (cal-tex-LaTeXify-string (calendar-day-name date)))
1003 (date1 (cal-tex-incr-date date))
e803eab7
GM
1004 (day1 (calendar-extract-day date1))
1005 (month1 (calendar-extract-month date1))
1006 (year1 (calendar-extract-year date1))
55abc44f 1007 (dayname1 (cal-tex-LaTeXify-string (calendar-day-name date1))))
9eb48cce
ER
1008 (cal-tex-b-framebox "8cm" "l")
1009 (cal-tex-b-parbox "b" "7.5cm")
3e8e9c6a
GM
1010 (insert (format "\\textbf{\\Large %s,} %s/%s/%s\\\\\n"
1011 dayname month day year))
9eb48cce
ER
1012 (cal-tex-rule "0pt" "7.5cm" ".5mm")
1013 (cal-tex-nl)
55abc44f
GM
1014 (unless weekend
1015 (dotimes (i 5)
3e8e9c6a 1016 (insert (format "\\textsf{\\large %d}\\\\\n" (+ i 8))))
55abc44f 1017 (dotimes (i 5)
3e8e9c6a 1018 (insert (format "\\textsf{\\large %d}\\\\\n"
55abc44f
GM
1019 (if cal-tex-24
1020 (+ i 13) ; 13-17 incl
1021 (1+ i)))))) ; 1-5 incl
9eb48cce 1022 (cal-tex-nl ".5cm")
55abc44f
GM
1023 (when weekend
1024 (cal-tex-vspace "1cm")
1025 (insert "\\ \\vfill")
3e8e9c6a 1026 (insert (format "\\textbf{\\Large %s,} %s/%s/%s\\\\\n"
55abc44f
GM
1027 dayname1 month1 day1 year1))
1028 (cal-tex-rule "0pt" "7.5cm" ".5mm")
1029 (cal-tex-nl "1.5cm")
1030 (cal-tex-vspace "1cm"))
9eb48cce
ER
1031 (cal-tex-e-parbox)
1032 (cal-tex-e-framebox)
1033 (cal-tex-hspace "1cm")))
1034
ee52e452 1035;;;###cal-autoload
ed6c5737 1036(defun cal-tex-cursor-filofax-2week (&optional n event)
a77e7064 1037 "Two-weeks-at-a-glance Filofax style calendar for week cursor is in.
ed6c5737 1038Optional prefix argument N specifies number of weeks (default 1).
a77e7064 1039The calendar shows holiday and diary entries if
ed6c5737
GM
1040`cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
1041Optional EVENT indicates a buffer position to use instead of point."
1042 (interactive (list (prefix-numeric-value current-prefix-arg)
1043 last-nonmenu-event))
1044 (or n (setq n 1))
1045 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
1046 (calendar-dayname-on-or-before
1047 calendar-week-start-day
1048 (calendar-absolute-from-gregorian
ed6c5737 1049 (calendar-cursor-to-date t event)))))
e803eab7
GM
1050 (month (calendar-extract-month date))
1051 (year (calendar-extract-year date))
1052 (day (calendar-extract-day date))
55abc44f
GM
1053 (d1 (calendar-absolute-from-gregorian date))
1054 (d2 (+ (* 7 n) d1))
9eb48cce 1055 (holidays (if cal-tex-holidays
55abc44f 1056 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
1057 (diary-list (if cal-tex-diary
1058 (cal-tex-list-diary-entries
55abc44f
GM
1059 ;; FIXME d1?
1060 (calendar-absolute-from-gregorian (list month 1 year))
1061 d2))))
9eb48cce
ER
1062 (cal-tex-preamble "twoside")
1063 (cal-tex-cmd "\\textwidth 3.25in")
1064 (cal-tex-cmd "\\textheight 6.5in")
1065 (cal-tex-cmd "\\oddsidemargin 1.75in")
1066 (cal-tex-cmd "\\evensidemargin 1.5in")
1067 (cal-tex-cmd "\\topmargin 0pt")
1068 (cal-tex-cmd "\\headheight -0.875in")
1069 (cal-tex-cmd "\\headsep 0.125in")
1070 (cal-tex-cmd "\\footskip .125in")
1071 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1072\\long\\def\\rightday#1#2#3#4#5{%
1073 \\rule{\\textwidth}{0.3pt}\\\\%
1074 \\hbox to \\textwidth{%
1075 \\vbox to 0.7in{%
1076 \\vspace*{2pt}%
1077 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1078 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1079 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1080\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1081\\long\\def\\leftday#1#2#3#4#5{%
1082 \\rule{\\textwidth}{0.3pt}\\\\%
1083 \\hbox to \\textwidth{%
1084 \\vbox to 0.7in{%
1085 \\vspace*{2pt}%
1086 \\hbox to \\textwidth{\\noindent {\\normalsize \\bf #2} \\small #1 \\hfill #5}%
1087 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize \\em #4}}%
1088 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1089")
1090 (cal-tex-b-document)
1091 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f
GM
1092 (dotimes (i n)
1093 (if (zerop (mod i 2))
1094 (insert "\\righthead")
1095 (insert "\\lefthead"))
1096 (cal-tex-arg
1097 (let ((d (cal-tex-incr-date date 6)))
e803eab7
GM
1098 (if (= (calendar-extract-month date)
1099 (calendar-extract-month d))
55abc44f 1100 (format "%s %s"
e803eab7
GM
1101 (cal-tex-month-name (calendar-extract-month date))
1102 (calendar-extract-year date))
1103 (if (= (calendar-extract-year date)
1104 (calendar-extract-year d))
55abc44f 1105 (format "%s---%s %s"
e803eab7
GM
1106 (cal-tex-month-name (calendar-extract-month date))
1107 (cal-tex-month-name (calendar-extract-month d))
1108 (calendar-extract-year date))
9eb48cce 1109 (format "%s %s---%s %s"
e803eab7
GM
1110 (cal-tex-month-name (calendar-extract-month date))
1111 (calendar-extract-year date)
1112 (cal-tex-month-name (calendar-extract-month d))
1113 (calendar-extract-year d))))))
55abc44f
GM
1114 (insert "%\n")
1115 (dotimes (jdummy 7)
1116 (if (zerop (mod i 2))
1117 (insert "\\rightday")
1118 (insert "\\leftday"))
1119 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1120 (cal-tex-arg (number-to-string (calendar-extract-day date)))
55abc44f
GM
1121 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1122 (cal-tex-arg (cal-tex-latexify-list holidays date))
1123 (cal-tex-arg (eval cal-tex-daily-string))
1124 (insert "%\n")
1125 (setq date (cal-tex-incr-date date)))
1126 (unless (= i (1- n))
1127 (run-hooks 'cal-tex-week-hook)
1128 (cal-tex-newpage)))
9eb48cce
ER
1129 (cal-tex-end-document)
1130 (run-hooks 'cal-tex-hook)))
1131
ee52e452 1132;;;###cal-autoload
ed6c5737 1133(defun cal-tex-cursor-filofax-week (&optional n event)
9eb48cce 1134 "One-week-at-a-glance Filofax style calendar for week indicated by cursor.
ed6c5737 1135Optional prefix argument N specifies number of weeks (default 1),
a77e7064 1136starting on Mondays. The calendar shows holiday and diary entries
ed6c5737
GM
1137if `cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
1138Optional EVENT indicates a buffer position to use instead of point."
1139 (interactive (list (prefix-numeric-value current-prefix-arg)
1140 last-nonmenu-event))
1141 (or n (setq n 1))
1142 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
1143 (calendar-dayname-on-or-before
1144 1
1145 (calendar-absolute-from-gregorian
ed6c5737 1146 (calendar-cursor-to-date t event)))))
e803eab7
GM
1147 (month (calendar-extract-month date))
1148 (year (calendar-extract-year date))
1149 (day (calendar-extract-day date))
55abc44f
GM
1150 (d1 (calendar-absolute-from-gregorian date))
1151 (d2 (+ (* 7 n) d1))
9eb48cce 1152 (holidays (if cal-tex-holidays
55abc44f 1153 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
1154 (diary-list (if cal-tex-diary
1155 (cal-tex-list-diary-entries
55abc44f
GM
1156 ;; FIXME d1?
1157 (calendar-absolute-from-gregorian (list month 1 year))
1158 d2))))
9eb48cce
ER
1159 (cal-tex-preamble "twoside")
1160 (cal-tex-cmd "\\textwidth 3.25in")
1161 (cal-tex-cmd "\\textheight 6.5in")
1162 (cal-tex-cmd "\\oddsidemargin 1.75in")
1163 (cal-tex-cmd "\\evensidemargin 1.5in")
1164 (cal-tex-cmd "\\topmargin 0pt")
1165 (cal-tex-cmd "\\headheight -0.875in")
1166 (cal-tex-cmd "\\headsep 0.125in")
1167 (cal-tex-cmd "\\footskip .125in")
1168 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1169\\long\\def\\rightday#1#2#3#4#5{%
1170 \\rule{\\textwidth}{0.3pt}\\\\%
1171 \\hbox to \\textwidth{%
1172 \\vbox to 1.85in{%
1173 \\vspace*{2pt}%
1174 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1175 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1176 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1177\\long\\def\\weekend#1#2#3#4#5{%
1178 \\rule{\\textwidth}{0.3pt}\\\\%
1179 \\hbox to \\textwidth{%
1180 \\vbox to .8in{%
1181 \\vspace*{2pt}%
1182 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1183 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1184 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1185\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1186\\long\\def\\leftday#1#2#3#4#5{%
1187 \\rule{\\textwidth}{0.3pt}\\\\%
1188 \\hbox to \\textwidth{%
1189 \\vbox to 1.85in{%
1190 \\vspace*{2pt}%
1191 \\hbox to \\textwidth{\\noindent {\\normalsize \\bf #2} \\small #1 \\hfill #5}%
1192 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize \\em #4}}%
1193 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1194")
1195 (cal-tex-b-document)
1196 (cal-tex-cmd "\\pagestyle{empty}\\ ")
1197 (cal-tex-newpage)
55abc44f 1198 (dotimes (i n)
a77e7064
GM
1199 (insert "\\lefthead")
1200 (cal-tex-arg
1201 (let ((d (cal-tex-incr-date date 2)))
e803eab7
GM
1202 (if (= (calendar-extract-month date)
1203 (calendar-extract-month d))
a77e7064 1204 (format "%s %s"
e803eab7
GM
1205 (cal-tex-month-name (calendar-extract-month date))
1206 (calendar-extract-year date))
1207 (if (= (calendar-extract-year date)
1208 (calendar-extract-year d))
a77e7064 1209 (format "%s---%s %s"
e803eab7
GM
1210 (cal-tex-month-name (calendar-extract-month date))
1211 (cal-tex-month-name (calendar-extract-month d))
1212 (calendar-extract-year date))
a77e7064 1213 (format "%s %s---%s %s"
e803eab7
GM
1214 (cal-tex-month-name (calendar-extract-month date))
1215 (calendar-extract-year date)
1216 (cal-tex-month-name (calendar-extract-month d))
1217 (calendar-extract-year d))))))
a77e7064 1218 (insert "%\n")
55abc44f 1219 (dotimes (jdummy 3)
a77e7064
GM
1220 (insert "\\leftday")
1221 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1222 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1223 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1224 (cal-tex-arg (cal-tex-latexify-list holidays date))
1225 (cal-tex-arg (eval cal-tex-daily-string))
1226 (insert "%\n")
1227 (setq date (cal-tex-incr-date date)))
1228 (insert "\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n")
1229 (cal-tex-newpage)
1230 (insert "\\righthead")
1231 (cal-tex-arg
1232 (let ((d (cal-tex-incr-date date 3)))
e803eab7
GM
1233 (if (= (calendar-extract-month date)
1234 (calendar-extract-month d))
a77e7064 1235 (format "%s %s"
e803eab7
GM
1236 (cal-tex-month-name (calendar-extract-month date))
1237 (calendar-extract-year date))
1238 (if (= (calendar-extract-year date)
1239 (calendar-extract-year d))
a77e7064 1240 (format "%s---%s %s"
e803eab7
GM
1241 (cal-tex-month-name (calendar-extract-month date))
1242 (cal-tex-month-name (calendar-extract-month d))
1243 (calendar-extract-year date))
a77e7064 1244 (format "%s %s---%s %s"
e803eab7
GM
1245 (cal-tex-month-name (calendar-extract-month date))
1246 (calendar-extract-year date)
1247 (cal-tex-month-name (calendar-extract-month d))
1248 (calendar-extract-year d))))))
a77e7064 1249 (insert "%\n")
55abc44f 1250 (dotimes (jdummy 2)
a77e7064
GM
1251 (insert "\\rightday")
1252 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1253 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1254 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1255 (cal-tex-arg (cal-tex-latexify-list holidays date))
1256 (cal-tex-arg (eval cal-tex-daily-string))
1257 (insert "%\n")
1258 (setq date (cal-tex-incr-date date)))
55abc44f 1259 (dotimes (jdummy 2)
a77e7064
GM
1260 (insert "\\weekend")
1261 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1262 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1263 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1264 (cal-tex-arg (cal-tex-latexify-list holidays date))
1265 (cal-tex-arg (eval cal-tex-daily-string))
1266 (insert "%\n")
1267 (setq date (cal-tex-incr-date date)))
55abc44f
GM
1268 (unless (= i (1- n))
1269 (run-hooks 'cal-tex-week-hook)
1270 (cal-tex-newpage)))
9eb48cce
ER
1271 (cal-tex-end-document)
1272 (run-hooks 'cal-tex-hook)))
ff3f9a42 1273
ee52e452 1274;;;###cal-autoload
ed6c5737 1275(defun cal-tex-cursor-filofax-daily (&optional n event)
ff3f9a42 1276 "Day-per-page Filofax style calendar for week indicated by cursor.
ed6c5737 1277Optional prefix argument N specifies number of weeks (default 1),
a77e7064
GM
1278starting on Mondays. The calendar shows holiday and diary
1279entries if `cal-tex-holidays' and `cal-tex-diary', respectively,
ed6c5737
GM
1280are non-nil. Pages are ruled if `cal-tex-rules' is non-nil.
1281Optional EVENT indicates a buffer position to use instead of point."
1282 (interactive (list (prefix-numeric-value current-prefix-arg)
1283 last-nonmenu-event))
1284 (or n (setq n 1))
1285 (let* ((date (calendar-gregorian-from-absolute
ff3f9a42
KH
1286 (calendar-dayname-on-or-before
1287 1
1288 (calendar-absolute-from-gregorian
ed6c5737 1289 (calendar-cursor-to-date t event)))))
e803eab7
GM
1290 (month (calendar-extract-month date))
1291 (year (calendar-extract-year date))
1292 (day (calendar-extract-day date))
55abc44f
GM
1293 (d1 (calendar-absolute-from-gregorian date))
1294 (d2 (+ (* 7 n) d1))
ff3f9a42 1295 (holidays (if cal-tex-holidays
55abc44f 1296 (cal-tex-list-holidays d1 d2)))
ff3f9a42
KH
1297 (diary-list (if cal-tex-diary
1298 (cal-tex-list-diary-entries
55abc44f
GM
1299 ;; FIXME d1?
1300 (calendar-absolute-from-gregorian (list month 1 year))
71ea27ee 1301 d2))))
ff3f9a42
KH
1302 (cal-tex-preamble "twoside")
1303 (cal-tex-cmd "\\textwidth 3.25in")
1304 (cal-tex-cmd "\\textheight 6.5in")
1305 (cal-tex-cmd "\\oddsidemargin 1.75in")
1306 (cal-tex-cmd "\\evensidemargin 1.5in")
1307 (cal-tex-cmd "\\topmargin 0pt")
1308 (cal-tex-cmd "\\headheight -0.875in")
1309 (cal-tex-cmd "\\headsep 0.125in")
1310 (cal-tex-cmd "\\footskip .125in")
1311 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1312\\long\\def\\rightday#1#2#3{%
1313 \\rule{\\textwidth}{0.3pt}\\\\%
1314 \\hbox to \\textwidth{%
c1212606 1315 \\vbox {%
ff3f9a42
KH
1316 \\vspace*{2pt}%
1317 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1318 \\hbox to \\textwidth{\\vbox {\\raggedleft \\em #2}}%
c1212606 1319 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
ff3f9a42
KH
1320\\long\\def\\weekend#1#2#3{%
1321 \\rule{\\textwidth}{0.3pt}\\\\%
1322 \\hbox to \\textwidth{%
c1212606 1323 \\vbox {%
ff3f9a42
KH
1324 \\vspace*{2pt}%
1325 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1326 \\hbox to \\textwidth{\\vbox {\\noindent \\em #2}}%
c1212606 1327 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
ff3f9a42
KH
1328\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1329\\long\\def\\leftday#1#2#3{%
1330 \\rule{\\textwidth}{0.3pt}\\\\%
1331 \\hbox to \\textwidth{%
c1212606 1332 \\vbox {%
ff3f9a42
KH
1333 \\vspace*{2pt}%
1334 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1335 \\hbox to \\textwidth{\\vbox {\\noindent \\em #2}}%
c1212606
KH
1336 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
1337\\newbox\\LineBox
1338\\setbox\\LineBox=\\hbox to\\textwidth{%
1339\\vrule height.2in width0pt\\leaders\\hrule\\hfill}
1340\\def\\linesfill{\\par\\leaders\\copy\\LineBox\\vfill}
ff3f9a42
KH
1341")
1342 (cal-tex-b-document)
1343 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f
GM
1344 (dotimes (i n)
1345 (dotimes (j 4)
1346 (let ((even (zerop (% j 2))))
1347 (insert (if even
1348 "\\righthead"
1349 "\\lefthead"))
1350 (cal-tex-arg (calendar-date-string date))
1351 (insert "%\n")
1352 (insert (if even
1353 "\\rightday"
1354 "\\leftday")))
1355 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1356 (cal-tex-arg (cal-tex-latexify-list holidays date "\\\\" t))
1357 (cal-tex-arg (eval cal-tex-daily-string))
1358 (insert "%\n")
1359 (if cal-tex-rules
1360 (insert "\\linesfill\n")
1361 (insert "\\vfill\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n"))
1362 (cal-tex-newpage)
1363 (setq date (cal-tex-incr-date date)))
a77e7064 1364 (insert "%\n")
55abc44f 1365 (dotimes (jdummy 2)
a77e7064
GM
1366 (insert "\\lefthead")
1367 (cal-tex-arg (calendar-date-string date))
1368 (insert "\\weekend")
1369 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1370 (cal-tex-arg (cal-tex-latexify-list holidays date "\\\\" t))
1371 (cal-tex-arg (eval cal-tex-daily-string))
1372 (insert "%\n")
1373 (if cal-tex-rules
1374 (insert "\\linesfill\n")
1375 (insert "\\vfill"))
1376 (setq date (cal-tex-incr-date date)))
55abc44f 1377 (or cal-tex-rules
a77e7064 1378 (insert "\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n"))
55abc44f
GM
1379 (unless (= i (1- n))
1380 (run-hooks 'cal-tex-week-hook)
1381 (cal-tex-newpage)))
ff3f9a42
KH
1382 (cal-tex-end-document)
1383 (run-hooks 'cal-tex-hook)))
1384
1385
9eb48cce
ER
1386;;;
1387;;; Daily calendars
1388;;;
1389
ee52e452 1390;;;###cal-autoload
ed6c5737 1391(defun cal-tex-cursor-day (&optional n event)
9eb48cce 1392 "Make a buffer with LaTeX commands for the day cursor is on.
ed6c5737 1393Optional prefix argument N specifies number of days. The calendar shows
3e8e9c6a 1394the hours between `cal-tex-daily-start' and `cal-tex-daily-end', using
ed6c5737
GM
1395the 24-hour clock if `cal-tex-24' is non-nil. Optional EVENT indicates
1396a buffer position to use instead of point."
1397 (interactive (list (prefix-numeric-value current-prefix-arg)
1398 last-nonmenu-event))
1399 (or n (setq n 1))
1400 (let ((date (calendar-absolute-from-gregorian
1401 (calendar-cursor-to-date t event))))
9eb48cce 1402 (cal-tex-preamble "12pt")
3e8e9c6a 1403 (cal-tex-cmd "\\textwidth 6.5in")
9eb48cce
ER
1404 (cal-tex-cmd "\\textheight 10.5in")
1405 (cal-tex-b-document)
1406 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 1407 (dotimes (i n)
a77e7064
GM
1408 (cal-tex-vspace "-1.7in")
1409 (cal-tex-daily-page (calendar-gregorian-from-absolute date))
1410 (setq date (1+ date))
55abc44f
GM
1411 (unless (= i (1- n))
1412 (cal-tex-newpage)
1413 (run-hooks 'cal-tex-daily-hook)))
9eb48cce
ER
1414 (cal-tex-end-document)
1415 (run-hooks 'cal-tex-hook)))
1416
1417(defun cal-tex-daily-page (date)
a77e7064
GM
1418 "Make a calendar page for Gregorian DATE on 8.5 by 11 paper.
1419Uses the 24-hour clock if `cal-tex-24' is non-nil. Produces
1420hourly sections for the period specified by `cal-tex-daily-start'
1421and `cal-tex-daily-end'."
e803eab7 1422 (let ((month-name (cal-tex-month-name (calendar-extract-month date)))
80b24a35 1423 (i (1- cal-tex-daily-start))
55abc44f 1424 hour)
9eb48cce
ER
1425 (cal-tex-banner "cal-tex-daily-page")
1426 (cal-tex-b-makebox "4cm" "l")
1427 (cal-tex-b-parbox "b" "3.8cm")
1428 (cal-tex-rule "0mm" "0mm" "2cm")
e803eab7 1429 (cal-tex-Huge (number-to-string (calendar-extract-day date)))
9eb48cce
ER
1430 (cal-tex-nl ".5cm")
1431 (cal-tex-bf month-name )
1432 (cal-tex-e-parbox)
1433 (cal-tex-hspace "1cm")
1434 (cal-tex-scriptsize (eval cal-tex-daily-string))
1435 (cal-tex-hspace "3.5cm")
1436 (cal-tex-e-makebox)
1437 (cal-tex-hfill)
1438 (cal-tex-b-makebox "4cm" "r")
1eb0045f 1439 (cal-tex-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
9eb48cce
ER
1440 (cal-tex-e-makebox)
1441 (cal-tex-nl)
1442 (cal-tex-hspace ".4cm")
1443 (cal-tex-rule "0mm" "16.1cm" "1mm")
1444 (cal-tex-nl ".1cm")
80b24a35
GM
1445 (while (<= (setq i (1+ i)) cal-tex-daily-end)
1446 (cal-tex-cmd "\\noindent")
1447 (setq hour (if cal-tex-24
1448 i
1449 (mod i 12)))
1450 (if (zerop hour) (setq hour 12))
1451 (cal-tex-b-makebox "1cm" "c")
1452 (cal-tex-arg (number-to-string hour))
1453 (cal-tex-e-makebox)
1454 (cal-tex-rule "0mm" "15.5cm" ".2mm")
1455 (cal-tex-nl ".2cm")
1456 (cal-tex-b-makebox "1cm" "c")
1457 (cal-tex-arg "$\\diamond$" )
1458 (cal-tex-e-makebox)
1459 (cal-tex-rule "0mm" "15.5cm" ".2mm")
1460 (cal-tex-nl ".2cm"))
9eb48cce
ER
1461 (cal-tex-hfill)
1462 (insert (cal-tex-mini-calendar
e803eab7
GM
1463 (calendar-extract-month (cal-tex-previous-month date))
1464 (calendar-extract-year (cal-tex-previous-month date))
9eb48cce
ER
1465 "lastmonth" "1.1in" "1in"))
1466 (insert (cal-tex-mini-calendar
e803eab7
GM
1467 (calendar-extract-month date)
1468 (calendar-extract-year date)
9eb48cce
ER
1469 "thismonth" "1.1in" "1in"))
1470 (insert (cal-tex-mini-calendar
e803eab7
GM
1471 (calendar-extract-month (cal-tex-next-month date))
1472 (calendar-extract-year (cal-tex-next-month date))
9eb48cce
ER
1473 "nextmonth" "1.1in" "1in"))
1474 (insert "\\hbox to \\textwidth{")
1475 (cal-tex-hfill)
1476 (insert "\\lastmonth")
1477 (cal-tex-hfill)
1478 (insert "\\thismonth")
1479 (cal-tex-hfill)
1480 (insert "\\nextmonth")
1481 (cal-tex-hfill)
1482 (insert "}")
1483 (cal-tex-banner "end of cal-tex-daily-page")))
a1506d29 1484
9eb48cce
ER
1485;;;
1486;;; Mini calendars
1487;;;
1488
0e22410a 1489(defun cal-tex-mini-calendar (month year name width height &optional ptsize colsep)
9eb48cce 1490 "Produce mini-calendar for MONTH, YEAR in macro NAME with WIDTH and HEIGHT.
55abc44f
GM
1491Optional string PTSIZE gives the point size (default \"scriptsize\").
1492Optional string COLSEP gives the column separation (default \"1mm\")."
1493 (or colsep (setq colsep "1mm"))
1494 (or ptsize (setq ptsize "scriptsize"))
1495 (let ((blank-days ; at start of month
1496 (mod
1497 (- (calendar-day-of-week (list month 1 year))
1498 calendar-week-start-day)
1499 7))
3260caf8 1500 (last( calendar-last-day-of-month month year))
55abc44f
GM
1501 (str (concat "\\def\\" name "{\\hbox to" width "{%\n"
1502 "\\vbox to" height "{%\n"
1503 "\\vfil \\hbox to" width "{%\n"
1504 "\\hfil\\" ptsize
1505 "\\begin{tabular}"
1506 "{@{\\hspace{0mm}}r@{\\hspace{" colsep
1507 "}}r@{\\hspace{" colsep "}}r@{\\hspace{" colsep
1508 "}}r@{\\hspace{" colsep "}}r@{\\hspace{" colsep
1509 "}}r@{\\hspace{" colsep "}}r@{\\hspace{0mm}}}%\n"
1510 "\\multicolumn{7}{c}{"
1511 (cal-tex-month-name month)
1512 " "
d92bcf94 1513 (number-to-string year)
55abc44f 1514 "}\\\\[1mm]\n")))
3e8e9c6a 1515 (dotimes (i 7)
1eb0045f
RS
1516 (setq str
1517 (concat str
1518 (cal-tex-LaTeXify-string
a1506d29 1519 (substring (aref calendar-day-name-array
1eb0045f 1520 (mod (+ calendar-week-start-day i) 7))
55abc44f 1521
1eb0045f 1522 0 2))
55abc44f
GM
1523 (if (= i 6)
1524 "\\\\[0.7mm]\n"
1525 " & "))))
1526 (dotimes (idummy blank-days)
9eb48cce 1527 (setq str (concat str " & ")))
55abc44f 1528 (dotimes (i last)
d92bcf94 1529 (setq str (concat str (number-to-string (1+ i)))
55abc44f 1530 str (concat str (if (zerop (mod (+ i 1 blank-days) 7))
3e8e9c6a
GM
1531 (if (= i (1- last))
1532 ""
1533 "\\\\[0.5mm]\n")
55abc44f 1534 " & "))))
9eb48cce 1535 (setq str (concat str "\n\\end{tabular}\\hfil}\\vfil}}}%\n"))
a77e7064 1536 str))
9eb48cce
ER
1537
1538;;;
1539;;; Various calendar functions
1540;;;
1541
1542(defun cal-tex-incr-date (date &optional n)
1543 "The date of the day following DATE.
1544If optional N is given, the date of N days after DATE."
1545 (calendar-gregorian-from-absolute
55abc44f 1546 (+ (or n 1) (calendar-absolute-from-gregorian date))))
9eb48cce 1547
c1212606 1548(defun cal-tex-latexify-list (date-list date &optional separator final-separator)
55abc44f 1549 "Return string with concatenated, LaTeX-ified entries in DATE-LIST for DATE.
c1212606
KH
1550Use double backslash as a separator unless optional SEPARATOR is given.
1551If resulting string is not empty, put separator at end if optional
3e8e9c6a 1552FINAL-SEPARATOR is non-nil."
55abc44f 1553 (or separator (setq separator "\\\\"))
3e8e9c6a
GM
1554 (let (result)
1555 (setq result
1556 (mapconcat (lambda (x) (cal-tex-LaTeXify-string x))
1557 (dolist (d date-list (reverse result))
1558 (and (car d)
1559 (calendar-date-equal date (car d))
1560 (setq result (cons (cadr d) result))))
1561 separator))
55abc44f
GM
1562 (if (and final-separator
1563 (not (string-equal result "")))
1564 (concat result separator)
1565 result)))
9eb48cce
ER
1566
1567(defun cal-tex-previous-month (date)
1568 "Return the date of the first day in the month previous to DATE."
e803eab7
GM
1569 (let ((month (calendar-extract-month date))
1570 (year (calendar-extract-year date)))
1571 (calendar-increment-month month year -1)
9eb48cce
ER
1572 (list month 1 year)))
1573
1574(defun cal-tex-next-month (date)
55abc44f 1575 "Return the date of the first day in the month following DATE."
e803eab7
GM
1576 (let ((month (calendar-extract-month date))
1577 (year (calendar-extract-year date)))
1578 (calendar-increment-month month year 1)
9eb48cce
ER
1579 (list month 1 year)))
1580
1581;;;
1582;;; LaTeX Code
1583;;;
1584
1585(defun cal-tex-end-document ()
1586 "Finish the LaTeX document.
a1506d29 1587Insert the trailer to LaTeX document, pop to LaTeX buffer, add
9eb48cce
ER
1588informative header, and run HOOK."
1589 (cal-tex-e-document)
1590 (latex-mode)
1591 (pop-to-buffer cal-tex-buffer)
a1506d29 1592 (goto-char (point-min))
3e8e9c6a
GM
1593 ;; FIXME auctex equivalents?
1594 (cal-tex-comment
1595 (format "\tThis buffer was produced by cal-tex.el.
1596\tTo print a calendar, type
1597\t\tM-x tex-buffer RET
1598\t\tM-x tex-print RET")))
9eb48cce
ER
1599
1600(defun cal-tex-insert-preamble (weeks landscape size &optional append)
3e8e9c6a
GM
1601 "Initialize the output LaTeX calendar buffer, `cal-tex-buffer'.
1602Select the output buffer, and insert the preamble for a calendar
1603of WEEKS weeks. Insert code for landscape mode if LANDSCAPE is
a078051c 1604non-nil. Use point-size SIZE. Optional argument APPEND, if
3e8e9c6a 1605non-nil, means add to end of buffer without erasing current contents."
9eb48cce
ER
1606 (let ((width "18cm")
1607 (height "24cm"))
55abc44f
GM
1608 (when landscape
1609 (setq width "24cm"
1610 height "18cm"))
1611 (unless append
1612 (cal-tex-preamble size)
1613 (if (not landscape)
1614 (progn
1615 (cal-tex-cmd "\\oddsidemargin -1.75cm")
1616 (cal-tex-cmd "\\def\\holidaymult{.06}"))
1617 (cal-tex-cmd "\\special{landscape}")
3e8e9c6a 1618 (cal-tex-cmd "\\textwidth 9.5in")
55abc44f
GM
1619 (cal-tex-cmd "\\textheight 7in")
1620 (cal-tex-comment)
1621 (cal-tex-cmd "\\def\\holidaymult{.08}"))
3e8e9c6a
GM
1622 (cal-tex-cmd cal-tex-caldate)
1623 (cal-tex-cmd cal-tex-myday)
55abc44f
GM
1624 (cal-tex-b-document)
1625 (cal-tex-cmd "\\pagestyle{empty}"))
9eb48cce
ER
1626 (cal-tex-cmd "\\setlength{\\cellwidth}" width)
1627 (insert (format "\\setlength{\\cellwidth}{%f\\cellwidth}\n"
1628 (/ 1.1 (length cal-tex-which-days))))
1629 (cal-tex-cmd "\\setlength{\\cellheight}" height)
1630 (insert (format "\\setlength{\\cellheight}{%f\\cellheight}\n"
a1506d29 1631 (/ 1.0 weeks)))
9eb48cce
ER
1632 (cal-tex-cmd "\\ \\par")
1633 (cal-tex-vspace "-3cm")))
1634
3e8e9c6a 1635(defconst cal-tex-LaTeX-subst-list
9eb48cce 1636 '(("\"". "``")
55abc44f
GM
1637 ("\"". "''") ; quote changes meaning when list is reversed
1638 ;; Don't think this is necessary, and in any case, does not work:
1639 ;; "LaTeX Error: \verb illegal in command argument".
1640;;; ("@" . "\\verb|@|")
a1506d29
JB
1641 ("&" . "\\&")
1642 ("%" . "\\%")
9eb48cce
ER
1643 ("$" . "\\$")
1644 ("#" . "\\#")
1645 ("_" . "\\_")
1646 ("{" . "\\{")
1647 ("}" . "\\}")
1648 ("<" . "$<$")
1649 (">" . "$>$")
55abc44f 1650 ("\n" . "\\ \\\\")) ; \\ needed for e.g \begin{center}\n AA\end{center}
3e8e9c6a 1651 "Alist of symbols and their LaTeX replacements.")
9eb48cce
ER
1652
1653(defun cal-tex-LaTeXify-string (string)
1654 "Protect special characters in STRING from LaTeX."
1655 (if (not string)
1656 ""
1657 (let ((head "")
1658 (tail string)
c7af68bc
GM
1659 (list cal-tex-LaTeX-subst-list)
1660 ch pair)
9eb48cce 1661 (while (not (string-equal tail ""))
c7af68bc
GM
1662 (setq ch (substring-no-properties tail 0 1)
1663 pair (assoc ch list))
1664 (if (and pair (string-equal ch "\""))
1665 (setq list (reverse list))) ; quote changes meaning each time
1666 (setq tail (substring-no-properties tail 1)
1667 head (concat head (if pair (cdr pair) ch))))
9eb48cce
ER
1668 head)))
1669
1eb0045f 1670(defun cal-tex-month-name (month)
a078051c 1671 "The name of MONTH, LaTeX-ified."
1eb0045f
RS
1672 (cal-tex-LaTeXify-string (calendar-month-name month)))
1673
55abc44f
GM
1674(defun cal-tex-hfill ()
1675 "Insert hfill."
1676 (insert "\\hfill"))
9eb48cce 1677
55abc44f
GM
1678(defun cal-tex-newpage ()
1679 "Insert newpage."
1680 (insert "\\newpage%\n"))
9eb48cce 1681
55abc44f
GM
1682(defun cal-tex-noindent ()
1683 "Insert noindent."
1684 (insert "\\noindent"))
9eb48cce
ER
1685
1686(defun cal-tex-vspace (space)
1687 "Insert vspace command to move SPACE vertically."
1688 (insert "\\vspace*{" space "}")
1689 (cal-tex-comment))
1690
1691(defun cal-tex-hspace (space)
1692 "Insert hspace command to move SPACE horizontally."
1693 (insert "\\hspace*{" space "}")
1694 (cal-tex-comment))
1695
1696(defun cal-tex-comment (&optional comment)
3e8e9c6a
GM
1697 "Insert `% ', followed by optional string COMMENT, followed by newline.
1698COMMENT may contain newlines, which are prefixed by `% ' in the output."
1699 (insert (format "%% %s\n"
1700 (if comment
1701 (replace-regexp-in-string "\n" "\n% " comment)
1702 ""))))
9eb48cce
ER
1703
1704(defun cal-tex-banner (comment)
3e8e9c6a
GM
1705 "Insert string COMMENT, separated by blank lines."
1706 (cal-tex-comment (format "\n\n\n\t\t\t%s\n" comment)))
9eb48cce
ER
1707
1708(defun cal-tex-nl (&optional skip comment)
1709 "End a line with \\. If SKIP, then add that much spacing.
3e8e9c6a
GM
1710Add trailing COMMENT if present."
1711 (insert (format "\\\\%s"
1712 (if skip
1713 (format "[%s]" skip)
1714 "")))
9eb48cce 1715 (cal-tex-comment comment))
a1506d29 1716
9eb48cce 1717(defun cal-tex-arg (&optional text)
3e8e9c6a
GM
1718 "Insert a brace {} pair containing the optional string TEXT."
1719 (insert (format "{%s}" (or text ""))))
9eb48cce
ER
1720
1721(defun cal-tex-cmd (cmd &optional arg)
55abc44f 1722 "Insert LaTeX CMD, with optional argument ARG, and end with %."
9eb48cce
ER
1723 (insert cmd)
1724 (cal-tex-arg arg)
1725 (cal-tex-comment))
1726
1727;;;
1728;;; Environments
1729;;;
1730
1731(defun cal-tex-b-document ()
1732 "Insert beginning of document."
1733 (cal-tex-cmd "\\begin{document}"))
1734
1735(defun cal-tex-e-document ()
1736 "Insert end of document."
1737 (cal-tex-cmd "\\end{document}"))
1738
1739(defun cal-tex-b-center ()
1740 "Insert beginning of centered block."
1741 (cal-tex-cmd "\\begin{center}"))
1742
1743(defun cal-tex-e-center ()
1744 "Insert end of centered block."
1745 (cal-tex-comment)
1746 (cal-tex-cmd "\\end{center}"))
1747
1748
1749;;;
1750;;; Boxes
1751;;;
1752
1753
1754(defun cal-tex-b-parbox (position width)
1755 "Insert parbox with parameters POSITION and WIDTH."
1756 (insert "\\parbox[" position "]{" width "}{")
1757 (cal-tex-comment))
1758
1759(defun cal-tex-e-parbox (&optional height)
55abc44f 1760 "Insert end of parbox. Optionally, force it to be a given HEIGHT."
9eb48cce
ER
1761 (cal-tex-comment)
1762 (if height
1763 (cal-tex-rule "0mm" "0mm" height))
1764 (insert "}")
1765 (cal-tex-comment "end parbox"))
1766
55abc44f
GM
1767(defun cal-tex-b-framebox (width position)
1768 "Insert framebox with parameters WIDTH and POSITION (clr)."
9eb48cce
ER
1769 (insert "\\framebox[" width "][" position "]{" )
1770 (cal-tex-comment))
1771
1772(defun cal-tex-e-framebox ()
1773 "Insert end of framebox."
1774 (cal-tex-comment)
1775 (insert "}")
1776 (cal-tex-comment "end framebox"))
1777
1778
c8de140b 1779(defun cal-tex-b-makebox (width position)
55abc44f 1780 "Insert makebox with parameters WIDTH and POSITION (clr)."
9eb48cce
ER
1781 (insert "\\makebox[" width "][" position "]{" )
1782 (cal-tex-comment))
1783
1784(defun cal-tex-e-makebox ()
1785 "Insert end of makebox."
1786 (cal-tex-comment)
1787 (insert "}")
1788 (cal-tex-comment "end makebox"))
1789
1790
1791(defun cal-tex-rule (lower width height)
1792 "Insert a rule with parameters LOWER WIDTH HEIGHT."
1793 (insert "\\rule[" lower "]{" width "}{" height "}"))
1794
1795;;;
1796;;; Fonts
1797;;;
1798
1799(defun cal-tex-em (string)
55abc44f
GM
1800 "Insert STRING in italic font."
1801 (insert "\\textit{" string "}"))
9eb48cce
ER
1802
1803(defun cal-tex-bf (string)
1804 "Insert STRING in bf font."
55abc44f 1805 (insert "\\textbf{ " string "}"))
9eb48cce
ER
1806
1807(defun cal-tex-scriptsize (string)
1808 "Insert STRING in scriptsize font."
1809 (insert "{\\scriptsize " string "}"))
1810
1811(defun cal-tex-huge (string)
3e8e9c6a 1812 "Insert STRING in huge font."
9eb48cce
ER
1813 (insert "{\\huge " string "}"))
1814
1815(defun cal-tex-Huge (string)
3e8e9c6a 1816 "Insert STRING in Huge font."
9eb48cce
ER
1817 (insert "{\\Huge " string "}"))
1818
1819(defun cal-tex-Huge-bf (string)
3e8e9c6a 1820 "Insert STRING in Huge bf font."
55abc44f 1821 (insert "\\textbf{\\Huge " string "}"))
9eb48cce
ER
1822
1823(defun cal-tex-large (string)
3e8e9c6a 1824 "Insert STRING in large font."
9eb48cce
ER
1825 (insert "{\\large " string "}"))
1826
1827(defun cal-tex-large-bf (string)
3e8e9c6a 1828 "Insert STRING in large bf font."
55abc44f 1829 (insert "\\textbf{\\large " string "}"))
9eb48cce 1830
3e8e9c6a 1831
9eb48cce
ER
1832(provide 'cal-tex)
1833
1834;;; cal-tex.el ends here