* net/tramp.el (tramp-file-name-handler): Add 'debug to the error
[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)
bc4f7f3d 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)
bc4f7f3d 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))
bc4f7f3d 645 dow)
3260caf8
GM
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")
bc4f7f3d 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))
55abc44f
GM
752 (d1 (calendar-absolute-from-gregorian date))
753 (d2 (+ (* 7 n) d1))
9eb48cce 754 (holidays (if cal-tex-holidays
55abc44f 755 (cal-tex-list-holidays d1 d2))))
9eb48cce
ER
756 (cal-tex-preamble "12pt")
757 (cal-tex-cmd "\\textwidth 6.5in")
758 (cal-tex-cmd "\\textheight 10.5in")
759 (cal-tex-cmd "\\oddsidemargin 0in")
760 (cal-tex-cmd "\\evensidemargin 0in")
761 (insert cal-tex-LaTeX-hourbox)
762 (cal-tex-b-document)
763 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 764 (dotimes (i n)
a77e7064
GM
765 (cal-tex-vspace "-1.5in")
766 (cal-tex-b-center)
767 (cal-tex-Huge-bf (format "\\uppercase{%s}"
768 (cal-tex-month-name month)))
769 (cal-tex-hspace "2em")
770 (cal-tex-Huge-bf (number-to-string year))
771 (cal-tex-nl ".5cm")
772 (cal-tex-e-center)
773 (cal-tex-hspace "-.2in")
774 (cal-tex-b-parbox "l" "\\textwidth")
bc4f7f3d 775 (dotimes (_jdummy 3)
a77e7064
GM
776 (cal-tex-week-hours date holidays "5")
777 (setq date (cal-tex-incr-date date)))
778 (cal-tex-e-parbox)
779 (cal-tex-nl)
780 (insert (cal-tex-mini-calendar
e803eab7
GM
781 (calendar-extract-month (cal-tex-previous-month date))
782 (calendar-extract-year (cal-tex-previous-month date))
a77e7064
GM
783 "lastmonth" "1.1in" "1in"))
784 (insert (cal-tex-mini-calendar
e803eab7
GM
785 (calendar-extract-month date)
786 (calendar-extract-year date)
a77e7064
GM
787 "thismonth" "1.1in" "1in"))
788 (insert (cal-tex-mini-calendar
e803eab7
GM
789 (calendar-extract-month (cal-tex-next-month date))
790 (calendar-extract-year (cal-tex-next-month date))
a77e7064
GM
791 "nextmonth" "1.1in" "1in"))
792 (insert "\\hbox to \\textwidth{")
793 (cal-tex-hfill)
794 (insert "\\lastmonth")
795 (cal-tex-hfill)
796 (insert "\\thismonth")
797 (cal-tex-hfill)
798 (insert "\\nextmonth")
799 (cal-tex-hfill)
800 (insert "}")
801 (cal-tex-nl)
802 (cal-tex-b-parbox "l" "\\textwidth")
bc4f7f3d 803 (dotimes (_jdummy 4)
a77e7064
GM
804 (cal-tex-week-hours date holidays "5")
805 (setq date (cal-tex-incr-date date)))
806 (cal-tex-e-parbox)
e803eab7
GM
807 (setq month (calendar-extract-month date)
808 year (calendar-extract-year date))
55abc44f
GM
809 (unless (= i (1- n))
810 (run-hooks 'cal-tex-week-hook)
811 (cal-tex-newpage)))
9eb48cce
ER
812 (cal-tex-end-document)
813 (run-hooks 'cal-tex-hook)))
814
ee52e452
GM
815(autoload 'calendar-iso-from-absolute "cal-iso")
816
817;;;###cal-autoload
ed6c5737 818(defun cal-tex-cursor-week-iso (&optional n event)
a77e7064 819 "Make a LaTeX calendar buffer for a one page ISO-style weekly calendar.
ed6c5737 820Optional prefix argument N specifies number of weeks (default 1).
a77e7064 821The calendar shows holiday and diary entries if
3e8e9c6a 822`cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
ed6c5737
GM
823It does not show hours of the day. Optional EVENT indicates a buffer
824position to use instead of point."
825 (interactive (list (prefix-numeric-value current-prefix-arg)
826 last-nonmenu-event))
827 (or n (setq n 1))
828 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
829 (calendar-dayname-on-or-before
830 1
831 (calendar-absolute-from-gregorian
ed6c5737 832 (calendar-cursor-to-date t event)))))
e803eab7
GM
833 (month (calendar-extract-month date))
834 (year (calendar-extract-year date))
835 (day (calendar-extract-day date))
55abc44f
GM
836 (d1 (calendar-absolute-from-gregorian date))
837 (d2 (+ (* 7 n) d1))
9eb48cce 838 (holidays (if cal-tex-holidays
55abc44f 839 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
840 (diary-list (if cal-tex-diary
841 (cal-tex-list-diary-entries
55abc44f
GM
842 ;; FIXME d1?
843 (calendar-absolute-from-gregorian (list month 1 year))
844 d2)))
845 s)
9eb48cce
ER
846 (cal-tex-preamble "11pt")
847 (cal-tex-cmd "\\textwidth 6.5in")
848 (cal-tex-cmd "\\textheight 10.5in")
849 (cal-tex-cmd "\\oddsidemargin 0in")
850 (cal-tex-cmd "\\evensidemargin 0in")
851 (cal-tex-b-document)
852 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 853 (dotimes (i n)
a77e7064
GM
854 (cal-tex-vspace "-1.5in")
855 (cal-tex-b-center)
856 (cal-tex-Huge-bf
55abc44f
GM
857 (let ((d (calendar-iso-from-absolute
858 (calendar-absolute-from-gregorian date))))
a77e7064 859 (format "Week %d of %d"
e803eab7
GM
860 (calendar-extract-month d)
861 (calendar-extract-year d))))
a77e7064
GM
862 (cal-tex-nl ".5cm")
863 (cal-tex-e-center)
864 (cal-tex-b-parbox "l" "\\textwidth")
bc4f7f3d 865 (dotimes (_j 7)
a77e7064
GM
866 (cal-tex-b-parbox "t" "\\textwidth")
867 (cal-tex-b-parbox "t" "\\textwidth")
868 (cal-tex-rule "0pt" "\\textwidth" ".2mm")
869 (cal-tex-nl)
870 (cal-tex-b-parbox "t" "\\textwidth")
871 (cal-tex-large-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
872 (insert ", ")
873 (cal-tex-large-bf (cal-tex-month-name month))
874 (insert " ")
875 (cal-tex-large-bf (number-to-string day))
55abc44f
GM
876 (unless (string-equal "" (setq s (cal-tex-latexify-list
877 holidays date "; ")))
878 (insert ": ")
879 (cal-tex-large-bf s))
a77e7064
GM
880 (cal-tex-hfill)
881 (insert " " (eval cal-tex-daily-string))
882 (cal-tex-e-parbox)
883 (cal-tex-nl)
884 (cal-tex-noindent)
885 (cal-tex-b-parbox "t" "\\textwidth")
55abc44f
GM
886 (unless (string-equal "" (setq s (cal-tex-latexify-list
887 diary-list date)))
888 (insert "\\vbox to 0pt{")
889 (cal-tex-large-bf s)
890 (insert "}"))
a77e7064
GM
891 (cal-tex-e-parbox)
892 (cal-tex-nl)
55abc44f 893 (setq date (cal-tex-incr-date date)
e803eab7
GM
894 month (calendar-extract-month date)
895 day (calendar-extract-day date))
a77e7064
GM
896 (cal-tex-e-parbox)
897 (cal-tex-e-parbox "2cm")
898 (cal-tex-nl)
e803eab7
GM
899 (setq month (calendar-extract-month date)
900 year (calendar-extract-year date)))
a77e7064 901 (cal-tex-e-parbox)
55abc44f
GM
902 (unless (= i (1- n))
903 (run-hooks 'cal-tex-week-hook)
904 (cal-tex-newpage)))
9eb48cce
ER
905 (cal-tex-end-document)
906 (run-hooks 'cal-tex-hook)))
907
3e8e9c6a
GM
908;; TODO respect cal-tex-daily-start,end?
909;; Using different numbers of hours will probably break some layouts.
9eb48cce 910(defun cal-tex-week-hours (date holidays height)
a77e7064 911 "Insert hourly entries for DATE with HOLIDAYS, with line height HEIGHT.
3e8e9c6a
GM
912Uses the 24-hour clock if `cal-tex-24' is non-nil. Note that the hours
913shown are hard-coded to 8-12, 13-17."
e803eab7
GM
914 (let ((month (calendar-extract-month date))
915 (day (calendar-extract-day date))
916 (year (calendar-extract-year date))
55abc44f 917 morning afternoon s)
9eb48cce
ER
918 (cal-tex-comment "begin cal-tex-week-hours")
919 (cal-tex-cmd "\\ \\\\[-.2cm]")
920 (cal-tex-cmd "\\noindent")
921 (cal-tex-b-parbox "l" "6.8in")
1eb0045f 922 (cal-tex-large-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
9eb48cce 923 (insert ", ")
1eb0045f 924 (cal-tex-large-bf (cal-tex-month-name month))
9eb48cce
ER
925 (insert " ")
926 (cal-tex-large-bf (number-to-string day))
55abc44f
GM
927 (unless (string-equal "" (setq s (cal-tex-latexify-list
928 holidays date "; ")))
929 (insert ": ")
930 (cal-tex-large-bf s))
9eb48cce
ER
931 (cal-tex-hfill)
932 (insert " " (eval cal-tex-daily-string))
933 (cal-tex-e-parbox)
934 (cal-tex-nl "-.3cm")
935 (cal-tex-rule "0pt" "6.8in" ".2mm")
936 (cal-tex-nl "-.1cm")
55abc44f
GM
937 (dotimes (i 5)
938 (setq morning (+ i 8) ; 8-12 incl
939 afternoon (if cal-tex-24
940 (+ i 13) ; 13-17 incl
941 (1+ i))) ; 1-5 incl
942 (cal-tex-cmd "\\hourbox" (number-to-string morning))
943 (cal-tex-arg height)
944 (cal-tex-hspace ".4cm")
945 (cal-tex-cmd "\\hourbox" (number-to-string afternoon))
946 (cal-tex-arg height)
947 (cal-tex-nl))))
9eb48cce 948
a77e7064 949;; TODO cal-tex-diary support.
3e8e9c6a 950;; TODO respect cal-tex-daily-start,end (see cal-tex-weekly4-box).
ee52e452 951;;;###cal-autoload
ed6c5737 952(defun cal-tex-cursor-week-monday (&optional n event)
a77e7064 953 "Make a LaTeX calendar buffer for a two-page one-week calendar.
ab3a4359 954It applies to the week that point is in, and starts on Monday.
ed6c5737 955Optional prefix argument N specifies number of weeks (default 1).
a77e7064 956The calendar shows holidays if `cal-tex-holidays' is
3e8e9c6a 957non-nil (note that diary entries are not shown). The calendar shows
ed6c5737
GM
958the hours 8-12am, 1-5pm. Optional EVENT indicates a buffer position
959to use instead of point."
960 (interactive (list (prefix-numeric-value current-prefix-arg)
961 last-nonmenu-event))
962 (or n (setq n 1))
963 (let ((date (calendar-gregorian-from-absolute
55abc44f
GM
964 (calendar-dayname-on-or-before
965 0
966 (calendar-absolute-from-gregorian
ed6c5737 967 (calendar-cursor-to-date t event))))))
9eb48cce
ER
968 (cal-tex-preamble "11pt")
969 (cal-tex-cmd "\\textwidth 6.5in")
970 (cal-tex-cmd "\\textheight 10.5in")
971 (cal-tex-cmd "\\oddsidemargin 0in")
972 (cal-tex-cmd "\\evensidemargin 0in")
973 (cal-tex-b-document)
55abc44f 974 (dotimes (i n)
a77e7064
GM
975 (cal-tex-vspace "-1cm")
976 (insert "\\noindent ")
977 (cal-tex-weekly4-box (cal-tex-incr-date date) nil)
978 (cal-tex-weekly4-box (cal-tex-incr-date date 4) nil)
979 (cal-tex-nl ".2cm")
980 (cal-tex-weekly4-box (cal-tex-incr-date date 2) nil)
981 (cal-tex-weekly4-box (cal-tex-incr-date date 5) nil)
982 (cal-tex-nl ".2cm")
983 (cal-tex-weekly4-box (cal-tex-incr-date date 3) nil)
984 (cal-tex-weekly4-box (cal-tex-incr-date date 6) t)
55abc44f
GM
985 (unless (= i (1- n))
986 (run-hooks 'cal-tex-week-hook)
987 (setq date (cal-tex-incr-date date 7))
988 (cal-tex-newpage)))
9eb48cce
ER
989 (cal-tex-end-document)
990 (run-hooks 'cal-tex-hook)))
991
3e8e9c6a
GM
992;; TODO respect cal-tex-daily-start,end?
993;; Using different numbers of hours will probably break some layouts.
9eb48cce 994(defun cal-tex-weekly4-box (date weekend)
a77e7064 995 "Make one box for DATE, different if WEEKEND.
3e8e9c6a
GM
996Uses the 24-hour clock if `cal-tex-24' is non-nil. Note that the hours
997shown are hard-coded to 8-12, 13-17."
e803eab7
GM
998 (let* ((day (calendar-extract-day date))
999 (month (calendar-extract-month date))
1000 (year (calendar-extract-year date))
55abc44f
GM
1001 (dayname (cal-tex-LaTeXify-string (calendar-day-name date)))
1002 (date1 (cal-tex-incr-date date))
e803eab7
GM
1003 (day1 (calendar-extract-day date1))
1004 (month1 (calendar-extract-month date1))
1005 (year1 (calendar-extract-year date1))
55abc44f 1006 (dayname1 (cal-tex-LaTeXify-string (calendar-day-name date1))))
9eb48cce
ER
1007 (cal-tex-b-framebox "8cm" "l")
1008 (cal-tex-b-parbox "b" "7.5cm")
3e8e9c6a
GM
1009 (insert (format "\\textbf{\\Large %s,} %s/%s/%s\\\\\n"
1010 dayname month day year))
9eb48cce
ER
1011 (cal-tex-rule "0pt" "7.5cm" ".5mm")
1012 (cal-tex-nl)
55abc44f
GM
1013 (unless weekend
1014 (dotimes (i 5)
3e8e9c6a 1015 (insert (format "\\textsf{\\large %d}\\\\\n" (+ i 8))))
55abc44f 1016 (dotimes (i 5)
3e8e9c6a 1017 (insert (format "\\textsf{\\large %d}\\\\\n"
55abc44f
GM
1018 (if cal-tex-24
1019 (+ i 13) ; 13-17 incl
1020 (1+ i)))))) ; 1-5 incl
9eb48cce 1021 (cal-tex-nl ".5cm")
55abc44f
GM
1022 (when weekend
1023 (cal-tex-vspace "1cm")
1024 (insert "\\ \\vfill")
3e8e9c6a 1025 (insert (format "\\textbf{\\Large %s,} %s/%s/%s\\\\\n"
55abc44f
GM
1026 dayname1 month1 day1 year1))
1027 (cal-tex-rule "0pt" "7.5cm" ".5mm")
1028 (cal-tex-nl "1.5cm")
1029 (cal-tex-vspace "1cm"))
9eb48cce
ER
1030 (cal-tex-e-parbox)
1031 (cal-tex-e-framebox)
1032 (cal-tex-hspace "1cm")))
1033
ee52e452 1034;;;###cal-autoload
ed6c5737 1035(defun cal-tex-cursor-filofax-2week (&optional n event)
a77e7064 1036 "Two-weeks-at-a-glance Filofax style calendar for week cursor is in.
ed6c5737 1037Optional prefix argument N specifies number of weeks (default 1).
a77e7064 1038The calendar shows holiday and diary entries if
ed6c5737
GM
1039`cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
1040Optional EVENT indicates a buffer position to use instead of point."
1041 (interactive (list (prefix-numeric-value current-prefix-arg)
1042 last-nonmenu-event))
1043 (or n (setq n 1))
1044 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
1045 (calendar-dayname-on-or-before
1046 calendar-week-start-day
1047 (calendar-absolute-from-gregorian
ed6c5737 1048 (calendar-cursor-to-date t event)))))
e803eab7
GM
1049 (month (calendar-extract-month date))
1050 (year (calendar-extract-year date))
1051 (day (calendar-extract-day date))
55abc44f
GM
1052 (d1 (calendar-absolute-from-gregorian date))
1053 (d2 (+ (* 7 n) d1))
9eb48cce 1054 (holidays (if cal-tex-holidays
55abc44f 1055 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
1056 (diary-list (if cal-tex-diary
1057 (cal-tex-list-diary-entries
55abc44f
GM
1058 ;; FIXME d1?
1059 (calendar-absolute-from-gregorian (list month 1 year))
1060 d2))))
9eb48cce
ER
1061 (cal-tex-preamble "twoside")
1062 (cal-tex-cmd "\\textwidth 3.25in")
1063 (cal-tex-cmd "\\textheight 6.5in")
1064 (cal-tex-cmd "\\oddsidemargin 1.75in")
1065 (cal-tex-cmd "\\evensidemargin 1.5in")
1066 (cal-tex-cmd "\\topmargin 0pt")
1067 (cal-tex-cmd "\\headheight -0.875in")
1068 (cal-tex-cmd "\\headsep 0.125in")
1069 (cal-tex-cmd "\\footskip .125in")
1070 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1071\\long\\def\\rightday#1#2#3#4#5{%
1072 \\rule{\\textwidth}{0.3pt}\\\\%
1073 \\hbox to \\textwidth{%
1074 \\vbox to 0.7in{%
1075 \\vspace*{2pt}%
1076 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1077 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1078 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1079\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1080\\long\\def\\leftday#1#2#3#4#5{%
1081 \\rule{\\textwidth}{0.3pt}\\\\%
1082 \\hbox to \\textwidth{%
1083 \\vbox to 0.7in{%
1084 \\vspace*{2pt}%
1085 \\hbox to \\textwidth{\\noindent {\\normalsize \\bf #2} \\small #1 \\hfill #5}%
1086 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize \\em #4}}%
1087 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1088")
1089 (cal-tex-b-document)
1090 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f
GM
1091 (dotimes (i n)
1092 (if (zerop (mod i 2))
1093 (insert "\\righthead")
1094 (insert "\\lefthead"))
1095 (cal-tex-arg
1096 (let ((d (cal-tex-incr-date date 6)))
e803eab7
GM
1097 (if (= (calendar-extract-month date)
1098 (calendar-extract-month d))
55abc44f 1099 (format "%s %s"
e803eab7
GM
1100 (cal-tex-month-name (calendar-extract-month date))
1101 (calendar-extract-year date))
1102 (if (= (calendar-extract-year date)
1103 (calendar-extract-year d))
55abc44f 1104 (format "%s---%s %s"
e803eab7
GM
1105 (cal-tex-month-name (calendar-extract-month date))
1106 (cal-tex-month-name (calendar-extract-month d))
1107 (calendar-extract-year date))
9eb48cce 1108 (format "%s %s---%s %s"
e803eab7
GM
1109 (cal-tex-month-name (calendar-extract-month date))
1110 (calendar-extract-year date)
1111 (cal-tex-month-name (calendar-extract-month d))
1112 (calendar-extract-year d))))))
55abc44f 1113 (insert "%\n")
bc4f7f3d 1114 (dotimes (_jdummy 7)
55abc44f
GM
1115 (if (zerop (mod i 2))
1116 (insert "\\rightday")
1117 (insert "\\leftday"))
1118 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1119 (cal-tex-arg (number-to-string (calendar-extract-day date)))
55abc44f
GM
1120 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1121 (cal-tex-arg (cal-tex-latexify-list holidays date))
1122 (cal-tex-arg (eval cal-tex-daily-string))
1123 (insert "%\n")
1124 (setq date (cal-tex-incr-date date)))
1125 (unless (= i (1- n))
1126 (run-hooks 'cal-tex-week-hook)
1127 (cal-tex-newpage)))
9eb48cce
ER
1128 (cal-tex-end-document)
1129 (run-hooks 'cal-tex-hook)))
1130
ee52e452 1131;;;###cal-autoload
ed6c5737 1132(defun cal-tex-cursor-filofax-week (&optional n event)
9eb48cce 1133 "One-week-at-a-glance Filofax style calendar for week indicated by cursor.
ed6c5737 1134Optional prefix argument N specifies number of weeks (default 1),
a77e7064 1135starting on Mondays. The calendar shows holiday and diary entries
ed6c5737
GM
1136if `cal-tex-holidays' and `cal-tex-diary', respectively, are non-nil.
1137Optional EVENT indicates a buffer position to use instead of point."
1138 (interactive (list (prefix-numeric-value current-prefix-arg)
1139 last-nonmenu-event))
1140 (or n (setq n 1))
1141 (let* ((date (calendar-gregorian-from-absolute
9eb48cce
ER
1142 (calendar-dayname-on-or-before
1143 1
1144 (calendar-absolute-from-gregorian
ed6c5737 1145 (calendar-cursor-to-date t event)))))
e803eab7
GM
1146 (month (calendar-extract-month date))
1147 (year (calendar-extract-year date))
1148 (day (calendar-extract-day date))
55abc44f
GM
1149 (d1 (calendar-absolute-from-gregorian date))
1150 (d2 (+ (* 7 n) d1))
9eb48cce 1151 (holidays (if cal-tex-holidays
55abc44f 1152 (cal-tex-list-holidays d1 d2)))
9eb48cce
ER
1153 (diary-list (if cal-tex-diary
1154 (cal-tex-list-diary-entries
55abc44f
GM
1155 ;; FIXME d1?
1156 (calendar-absolute-from-gregorian (list month 1 year))
1157 d2))))
9eb48cce
ER
1158 (cal-tex-preamble "twoside")
1159 (cal-tex-cmd "\\textwidth 3.25in")
1160 (cal-tex-cmd "\\textheight 6.5in")
1161 (cal-tex-cmd "\\oddsidemargin 1.75in")
1162 (cal-tex-cmd "\\evensidemargin 1.5in")
1163 (cal-tex-cmd "\\topmargin 0pt")
1164 (cal-tex-cmd "\\headheight -0.875in")
1165 (cal-tex-cmd "\\headsep 0.125in")
1166 (cal-tex-cmd "\\footskip .125in")
1167 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1168\\long\\def\\rightday#1#2#3#4#5{%
1169 \\rule{\\textwidth}{0.3pt}\\\\%
1170 \\hbox to \\textwidth{%
1171 \\vbox to 1.85in{%
1172 \\vspace*{2pt}%
1173 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1174 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1175 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1176\\long\\def\\weekend#1#2#3#4#5{%
1177 \\rule{\\textwidth}{0.3pt}\\\\%
1178 \\hbox to \\textwidth{%
1179 \\vbox to .8in{%
1180 \\vspace*{2pt}%
1181 \\hbox to \\textwidth{\\small #5 \\hfill #1 {\\normalsize \\bf #2}}%
1182 \\hbox to \\textwidth{\\vbox {\\raggedleft \\footnotesize \\em #4}}%
1183 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1184\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1185\\long\\def\\leftday#1#2#3#4#5{%
1186 \\rule{\\textwidth}{0.3pt}\\\\%
1187 \\hbox to \\textwidth{%
1188 \\vbox to 1.85in{%
1189 \\vspace*{2pt}%
1190 \\hbox to \\textwidth{\\noindent {\\normalsize \\bf #2} \\small #1 \\hfill #5}%
1191 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize \\em #4}}%
1192 \\hbox to \\textwidth{\\vbox to 0pt {\\noindent \\footnotesize #3}}}}\\\\}
1193")
1194 (cal-tex-b-document)
1195 (cal-tex-cmd "\\pagestyle{empty}\\ ")
1196 (cal-tex-newpage)
55abc44f 1197 (dotimes (i n)
a77e7064
GM
1198 (insert "\\lefthead")
1199 (cal-tex-arg
1200 (let ((d (cal-tex-incr-date date 2)))
e803eab7
GM
1201 (if (= (calendar-extract-month date)
1202 (calendar-extract-month d))
a77e7064 1203 (format "%s %s"
e803eab7
GM
1204 (cal-tex-month-name (calendar-extract-month date))
1205 (calendar-extract-year date))
1206 (if (= (calendar-extract-year date)
1207 (calendar-extract-year d))
a77e7064 1208 (format "%s---%s %s"
e803eab7
GM
1209 (cal-tex-month-name (calendar-extract-month date))
1210 (cal-tex-month-name (calendar-extract-month d))
1211 (calendar-extract-year date))
a77e7064 1212 (format "%s %s---%s %s"
e803eab7
GM
1213 (cal-tex-month-name (calendar-extract-month date))
1214 (calendar-extract-year date)
1215 (cal-tex-month-name (calendar-extract-month d))
1216 (calendar-extract-year d))))))
a77e7064 1217 (insert "%\n")
bc4f7f3d 1218 (dotimes (_jdummy 3)
a77e7064
GM
1219 (insert "\\leftday")
1220 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1221 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1222 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1223 (cal-tex-arg (cal-tex-latexify-list holidays date))
1224 (cal-tex-arg (eval cal-tex-daily-string))
1225 (insert "%\n")
1226 (setq date (cal-tex-incr-date date)))
1227 (insert "\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n")
1228 (cal-tex-newpage)
1229 (insert "\\righthead")
1230 (cal-tex-arg
1231 (let ((d (cal-tex-incr-date date 3)))
e803eab7
GM
1232 (if (= (calendar-extract-month date)
1233 (calendar-extract-month d))
a77e7064 1234 (format "%s %s"
e803eab7
GM
1235 (cal-tex-month-name (calendar-extract-month date))
1236 (calendar-extract-year date))
1237 (if (= (calendar-extract-year date)
1238 (calendar-extract-year d))
a77e7064 1239 (format "%s---%s %s"
e803eab7
GM
1240 (cal-tex-month-name (calendar-extract-month date))
1241 (cal-tex-month-name (calendar-extract-month d))
1242 (calendar-extract-year date))
a77e7064 1243 (format "%s %s---%s %s"
e803eab7
GM
1244 (cal-tex-month-name (calendar-extract-month date))
1245 (calendar-extract-year date)
1246 (cal-tex-month-name (calendar-extract-month d))
1247 (calendar-extract-year d))))))
a77e7064 1248 (insert "%\n")
bc4f7f3d 1249 (dotimes (_jdummy 2)
a77e7064
GM
1250 (insert "\\rightday")
1251 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1252 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1253 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1254 (cal-tex-arg (cal-tex-latexify-list holidays date))
1255 (cal-tex-arg (eval cal-tex-daily-string))
1256 (insert "%\n")
1257 (setq date (cal-tex-incr-date date)))
bc4f7f3d 1258 (dotimes (_jdummy 2)
a77e7064
GM
1259 (insert "\\weekend")
1260 (cal-tex-arg (cal-tex-LaTeXify-string (calendar-day-name date)))
d92bcf94 1261 (cal-tex-arg (number-to-string (calendar-extract-day date)))
a77e7064
GM
1262 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1263 (cal-tex-arg (cal-tex-latexify-list holidays date))
1264 (cal-tex-arg (eval cal-tex-daily-string))
1265 (insert "%\n")
1266 (setq date (cal-tex-incr-date date)))
55abc44f
GM
1267 (unless (= i (1- n))
1268 (run-hooks 'cal-tex-week-hook)
1269 (cal-tex-newpage)))
9eb48cce
ER
1270 (cal-tex-end-document)
1271 (run-hooks 'cal-tex-hook)))
ff3f9a42 1272
ee52e452 1273;;;###cal-autoload
ed6c5737 1274(defun cal-tex-cursor-filofax-daily (&optional n event)
ff3f9a42 1275 "Day-per-page Filofax style calendar for week indicated by cursor.
ed6c5737 1276Optional prefix argument N specifies number of weeks (default 1),
a77e7064
GM
1277starting on Mondays. The calendar shows holiday and diary
1278entries if `cal-tex-holidays' and `cal-tex-diary', respectively,
ed6c5737
GM
1279are non-nil. Pages are ruled if `cal-tex-rules' is non-nil.
1280Optional EVENT indicates a buffer position to use instead of point."
1281 (interactive (list (prefix-numeric-value current-prefix-arg)
1282 last-nonmenu-event))
1283 (or n (setq n 1))
1284 (let* ((date (calendar-gregorian-from-absolute
ff3f9a42
KH
1285 (calendar-dayname-on-or-before
1286 1
1287 (calendar-absolute-from-gregorian
ed6c5737 1288 (calendar-cursor-to-date t event)))))
e803eab7
GM
1289 (month (calendar-extract-month date))
1290 (year (calendar-extract-year date))
1291 (day (calendar-extract-day date))
55abc44f
GM
1292 (d1 (calendar-absolute-from-gregorian date))
1293 (d2 (+ (* 7 n) d1))
ff3f9a42 1294 (holidays (if cal-tex-holidays
55abc44f 1295 (cal-tex-list-holidays d1 d2)))
ff3f9a42
KH
1296 (diary-list (if cal-tex-diary
1297 (cal-tex-list-diary-entries
55abc44f
GM
1298 ;; FIXME d1?
1299 (calendar-absolute-from-gregorian (list month 1 year))
71ea27ee 1300 d2))))
ff3f9a42
KH
1301 (cal-tex-preamble "twoside")
1302 (cal-tex-cmd "\\textwidth 3.25in")
1303 (cal-tex-cmd "\\textheight 6.5in")
1304 (cal-tex-cmd "\\oddsidemargin 1.75in")
1305 (cal-tex-cmd "\\evensidemargin 1.5in")
1306 (cal-tex-cmd "\\topmargin 0pt")
1307 (cal-tex-cmd "\\headheight -0.875in")
1308 (cal-tex-cmd "\\headsep 0.125in")
1309 (cal-tex-cmd "\\footskip .125in")
1310 (insert "\\def\\righthead#1{\\hfill {\\normalsize \\bf #1}\\\\[-6pt]}
1311\\long\\def\\rightday#1#2#3{%
1312 \\rule{\\textwidth}{0.3pt}\\\\%
1313 \\hbox to \\textwidth{%
c1212606 1314 \\vbox {%
ff3f9a42
KH
1315 \\vspace*{2pt}%
1316 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1317 \\hbox to \\textwidth{\\vbox {\\raggedleft \\em #2}}%
c1212606 1318 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
ff3f9a42
KH
1319\\long\\def\\weekend#1#2#3{%
1320 \\rule{\\textwidth}{0.3pt}\\\\%
1321 \\hbox to \\textwidth{%
c1212606 1322 \\vbox {%
ff3f9a42
KH
1323 \\vspace*{2pt}%
1324 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1325 \\hbox to \\textwidth{\\vbox {\\noindent \\em #2}}%
c1212606 1326 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
ff3f9a42
KH
1327\\def\\lefthead#1{\\noindent {\\normalsize \\bf #1}\\hfill\\\\[-6pt]}
1328\\long\\def\\leftday#1#2#3{%
1329 \\rule{\\textwidth}{0.3pt}\\\\%
1330 \\hbox to \\textwidth{%
c1212606 1331 \\vbox {%
ff3f9a42
KH
1332 \\vspace*{2pt}%
1333 \\hbox to \\textwidth{\\hfill \\small #3 \\hfill}%
1334 \\hbox to \\textwidth{\\vbox {\\noindent \\em #2}}%
c1212606
KH
1335 \\hbox to \\textwidth{\\vbox {\\noindent \\footnotesize #1}}}}}
1336\\newbox\\LineBox
1337\\setbox\\LineBox=\\hbox to\\textwidth{%
1338\\vrule height.2in width0pt\\leaders\\hrule\\hfill}
1339\\def\\linesfill{\\par\\leaders\\copy\\LineBox\\vfill}
ff3f9a42
KH
1340")
1341 (cal-tex-b-document)
1342 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f
GM
1343 (dotimes (i n)
1344 (dotimes (j 4)
1345 (let ((even (zerop (% j 2))))
1346 (insert (if even
1347 "\\righthead"
1348 "\\lefthead"))
1349 (cal-tex-arg (calendar-date-string date))
1350 (insert "%\n")
1351 (insert (if even
1352 "\\rightday"
1353 "\\leftday")))
1354 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1355 (cal-tex-arg (cal-tex-latexify-list holidays date "\\\\" t))
1356 (cal-tex-arg (eval cal-tex-daily-string))
1357 (insert "%\n")
1358 (if cal-tex-rules
1359 (insert "\\linesfill\n")
1360 (insert "\\vfill\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n"))
1361 (cal-tex-newpage)
1362 (setq date (cal-tex-incr-date date)))
a77e7064 1363 (insert "%\n")
bc4f7f3d 1364 (dotimes (_jdummy 2)
a77e7064
GM
1365 (insert "\\lefthead")
1366 (cal-tex-arg (calendar-date-string date))
1367 (insert "\\weekend")
1368 (cal-tex-arg (cal-tex-latexify-list diary-list date))
1369 (cal-tex-arg (cal-tex-latexify-list holidays date "\\\\" t))
1370 (cal-tex-arg (eval cal-tex-daily-string))
1371 (insert "%\n")
1372 (if cal-tex-rules
1373 (insert "\\linesfill\n")
1374 (insert "\\vfill"))
1375 (setq date (cal-tex-incr-date date)))
55abc44f 1376 (or cal-tex-rules
a77e7064 1377 (insert "\\noindent\\rule{\\textwidth}{0.3pt}\\\\%\n"))
55abc44f
GM
1378 (unless (= i (1- n))
1379 (run-hooks 'cal-tex-week-hook)
1380 (cal-tex-newpage)))
ff3f9a42
KH
1381 (cal-tex-end-document)
1382 (run-hooks 'cal-tex-hook)))
1383
1384
9eb48cce
ER
1385;;;
1386;;; Daily calendars
1387;;;
1388
ee52e452 1389;;;###cal-autoload
ed6c5737 1390(defun cal-tex-cursor-day (&optional n event)
9eb48cce 1391 "Make a buffer with LaTeX commands for the day cursor is on.
ed6c5737 1392Optional prefix argument N specifies number of days. The calendar shows
3e8e9c6a 1393the hours between `cal-tex-daily-start' and `cal-tex-daily-end', using
ed6c5737
GM
1394the 24-hour clock if `cal-tex-24' is non-nil. Optional EVENT indicates
1395a buffer position to use instead of point."
1396 (interactive (list (prefix-numeric-value current-prefix-arg)
1397 last-nonmenu-event))
1398 (or n (setq n 1))
1399 (let ((date (calendar-absolute-from-gregorian
1400 (calendar-cursor-to-date t event))))
9eb48cce 1401 (cal-tex-preamble "12pt")
3e8e9c6a 1402 (cal-tex-cmd "\\textwidth 6.5in")
9eb48cce
ER
1403 (cal-tex-cmd "\\textheight 10.5in")
1404 (cal-tex-b-document)
1405 (cal-tex-cmd "\\pagestyle{empty}")
55abc44f 1406 (dotimes (i n)
a77e7064
GM
1407 (cal-tex-vspace "-1.7in")
1408 (cal-tex-daily-page (calendar-gregorian-from-absolute date))
1409 (setq date (1+ date))
55abc44f
GM
1410 (unless (= i (1- n))
1411 (cal-tex-newpage)
1412 (run-hooks 'cal-tex-daily-hook)))
9eb48cce
ER
1413 (cal-tex-end-document)
1414 (run-hooks 'cal-tex-hook)))
1415
1416(defun cal-tex-daily-page (date)
a77e7064
GM
1417 "Make a calendar page for Gregorian DATE on 8.5 by 11 paper.
1418Uses the 24-hour clock if `cal-tex-24' is non-nil. Produces
1419hourly sections for the period specified by `cal-tex-daily-start'
1420and `cal-tex-daily-end'."
e803eab7 1421 (let ((month-name (cal-tex-month-name (calendar-extract-month date)))
80b24a35 1422 (i (1- cal-tex-daily-start))
55abc44f 1423 hour)
9eb48cce
ER
1424 (cal-tex-banner "cal-tex-daily-page")
1425 (cal-tex-b-makebox "4cm" "l")
1426 (cal-tex-b-parbox "b" "3.8cm")
1427 (cal-tex-rule "0mm" "0mm" "2cm")
e803eab7 1428 (cal-tex-Huge (number-to-string (calendar-extract-day date)))
9eb48cce
ER
1429 (cal-tex-nl ".5cm")
1430 (cal-tex-bf month-name )
1431 (cal-tex-e-parbox)
1432 (cal-tex-hspace "1cm")
1433 (cal-tex-scriptsize (eval cal-tex-daily-string))
1434 (cal-tex-hspace "3.5cm")
1435 (cal-tex-e-makebox)
1436 (cal-tex-hfill)
1437 (cal-tex-b-makebox "4cm" "r")
1eb0045f 1438 (cal-tex-bf (cal-tex-LaTeXify-string (calendar-day-name date)))
9eb48cce
ER
1439 (cal-tex-e-makebox)
1440 (cal-tex-nl)
1441 (cal-tex-hspace ".4cm")
1442 (cal-tex-rule "0mm" "16.1cm" "1mm")
1443 (cal-tex-nl ".1cm")
80b24a35
GM
1444 (while (<= (setq i (1+ i)) cal-tex-daily-end)
1445 (cal-tex-cmd "\\noindent")
1446 (setq hour (if cal-tex-24
1447 i
1448 (mod i 12)))
1449 (if (zerop hour) (setq hour 12))
1450 (cal-tex-b-makebox "1cm" "c")
1451 (cal-tex-arg (number-to-string hour))
1452 (cal-tex-e-makebox)
1453 (cal-tex-rule "0mm" "15.5cm" ".2mm")
1454 (cal-tex-nl ".2cm")
1455 (cal-tex-b-makebox "1cm" "c")
1456 (cal-tex-arg "$\\diamond$" )
1457 (cal-tex-e-makebox)
1458 (cal-tex-rule "0mm" "15.5cm" ".2mm")
1459 (cal-tex-nl ".2cm"))
9eb48cce
ER
1460 (cal-tex-hfill)
1461 (insert (cal-tex-mini-calendar
e803eab7
GM
1462 (calendar-extract-month (cal-tex-previous-month date))
1463 (calendar-extract-year (cal-tex-previous-month date))
9eb48cce
ER
1464 "lastmonth" "1.1in" "1in"))
1465 (insert (cal-tex-mini-calendar
e803eab7
GM
1466 (calendar-extract-month date)
1467 (calendar-extract-year date)
9eb48cce
ER
1468 "thismonth" "1.1in" "1in"))
1469 (insert (cal-tex-mini-calendar
e803eab7
GM
1470 (calendar-extract-month (cal-tex-next-month date))
1471 (calendar-extract-year (cal-tex-next-month date))
9eb48cce
ER
1472 "nextmonth" "1.1in" "1in"))
1473 (insert "\\hbox to \\textwidth{")
1474 (cal-tex-hfill)
1475 (insert "\\lastmonth")
1476 (cal-tex-hfill)
1477 (insert "\\thismonth")
1478 (cal-tex-hfill)
1479 (insert "\\nextmonth")
1480 (cal-tex-hfill)
1481 (insert "}")
1482 (cal-tex-banner "end of cal-tex-daily-page")))
a1506d29 1483
9eb48cce
ER
1484;;;
1485;;; Mini calendars
1486;;;
1487
0e22410a 1488(defun cal-tex-mini-calendar (month year name width height &optional ptsize colsep)
9eb48cce 1489 "Produce mini-calendar for MONTH, YEAR in macro NAME with WIDTH and HEIGHT.
55abc44f
GM
1490Optional string PTSIZE gives the point size (default \"scriptsize\").
1491Optional string COLSEP gives the column separation (default \"1mm\")."
1492 (or colsep (setq colsep "1mm"))
1493 (or ptsize (setq ptsize "scriptsize"))
1494 (let ((blank-days ; at start of month
1495 (mod
1496 (- (calendar-day-of-week (list month 1 year))
1497 calendar-week-start-day)
1498 7))
3260caf8 1499 (last( calendar-last-day-of-month month year))
55abc44f
GM
1500 (str (concat "\\def\\" name "{\\hbox to" width "{%\n"
1501 "\\vbox to" height "{%\n"
1502 "\\vfil \\hbox to" width "{%\n"
1503 "\\hfil\\" ptsize
1504 "\\begin{tabular}"
1505 "{@{\\hspace{0mm}}r@{\\hspace{" colsep
1506 "}}r@{\\hspace{" colsep "}}r@{\\hspace{" colsep
1507 "}}r@{\\hspace{" colsep "}}r@{\\hspace{" colsep
1508 "}}r@{\\hspace{" colsep "}}r@{\\hspace{0mm}}}%\n"
1509 "\\multicolumn{7}{c}{"
1510 (cal-tex-month-name month)
1511 " "
d92bcf94 1512 (number-to-string year)
55abc44f 1513 "}\\\\[1mm]\n")))
3e8e9c6a 1514 (dotimes (i 7)
1eb0045f
RS
1515 (setq str
1516 (concat str
1517 (cal-tex-LaTeXify-string
a1506d29 1518 (substring (aref calendar-day-name-array
1eb0045f 1519 (mod (+ calendar-week-start-day i) 7))
55abc44f 1520
1eb0045f 1521 0 2))
55abc44f
GM
1522 (if (= i 6)
1523 "\\\\[0.7mm]\n"
1524 " & "))))
bc4f7f3d 1525 (dotimes (_idummy blank-days)
9eb48cce 1526 (setq str (concat str " & ")))
55abc44f 1527 (dotimes (i last)
d92bcf94 1528 (setq str (concat str (number-to-string (1+ i)))
55abc44f 1529 str (concat str (if (zerop (mod (+ i 1 blank-days) 7))
3e8e9c6a
GM
1530 (if (= i (1- last))
1531 ""
1532 "\\\\[0.5mm]\n")
55abc44f 1533 " & "))))
9eb48cce 1534 (setq str (concat str "\n\\end{tabular}\\hfil}\\vfil}}}%\n"))
a77e7064 1535 str))
9eb48cce
ER
1536
1537;;;
1538;;; Various calendar functions
1539;;;
1540
1541(defun cal-tex-incr-date (date &optional n)
1542 "The date of the day following DATE.
1543If optional N is given, the date of N days after DATE."
1544 (calendar-gregorian-from-absolute
55abc44f 1545 (+ (or n 1) (calendar-absolute-from-gregorian date))))
9eb48cce 1546
c1212606 1547(defun cal-tex-latexify-list (date-list date &optional separator final-separator)
55abc44f 1548 "Return string with concatenated, LaTeX-ified entries in DATE-LIST for DATE.
c1212606
KH
1549Use double backslash as a separator unless optional SEPARATOR is given.
1550If resulting string is not empty, put separator at end if optional
3e8e9c6a 1551FINAL-SEPARATOR is non-nil."
55abc44f 1552 (or separator (setq separator "\\\\"))
3e8e9c6a
GM
1553 (let (result)
1554 (setq result
1555 (mapconcat (lambda (x) (cal-tex-LaTeXify-string x))
1556 (dolist (d date-list (reverse result))
1557 (and (car d)
1558 (calendar-date-equal date (car d))
1559 (setq result (cons (cadr d) result))))
1560 separator))
55abc44f
GM
1561 (if (and final-separator
1562 (not (string-equal result "")))
1563 (concat result separator)
1564 result)))
9eb48cce
ER
1565
1566(defun cal-tex-previous-month (date)
1567 "Return the date of the first day in the month previous to DATE."
e803eab7
GM
1568 (let ((month (calendar-extract-month date))
1569 (year (calendar-extract-year date)))
1570 (calendar-increment-month month year -1)
9eb48cce
ER
1571 (list month 1 year)))
1572
1573(defun cal-tex-next-month (date)
55abc44f 1574 "Return the date of the first day in the month following DATE."
e803eab7
GM
1575 (let ((month (calendar-extract-month date))
1576 (year (calendar-extract-year date)))
1577 (calendar-increment-month month year 1)
9eb48cce
ER
1578 (list month 1 year)))
1579
1580;;;
1581;;; LaTeX Code
1582;;;
1583
1584(defun cal-tex-end-document ()
1585 "Finish the LaTeX document.
a1506d29 1586Insert the trailer to LaTeX document, pop to LaTeX buffer, add
9eb48cce
ER
1587informative header, and run HOOK."
1588 (cal-tex-e-document)
088d0d61
GM
1589 (or (and cal-tex-preamble-extra
1590 (string-match "inputenc" cal-tex-preamble-extra))
1591 (not (re-search-backward "[^[:ascii:]]" nil 'move))
1592 (progn
1593 (goto-char (point-min))
1594 (when (search-forward "documentclass" nil t)
1595 (forward-line 1)
1596 ;; Eg for some Bahai holidays.
1597 ;; FIXME latin1 might not always be right.
1598 (insert "\\usepackage[latin1]{inputenc}\n"))))
9eb48cce
ER
1599 (latex-mode)
1600 (pop-to-buffer cal-tex-buffer)
a1506d29 1601 (goto-char (point-min))
3e8e9c6a
GM
1602 ;; FIXME auctex equivalents?
1603 (cal-tex-comment
1604 (format "\tThis buffer was produced by cal-tex.el.
1605\tTo print a calendar, type
1606\t\tM-x tex-buffer RET
1607\t\tM-x tex-print RET")))
9eb48cce
ER
1608
1609(defun cal-tex-insert-preamble (weeks landscape size &optional append)
3e8e9c6a
GM
1610 "Initialize the output LaTeX calendar buffer, `cal-tex-buffer'.
1611Select the output buffer, and insert the preamble for a calendar
1612of WEEKS weeks. Insert code for landscape mode if LANDSCAPE is
a078051c 1613non-nil. Use point-size SIZE. Optional argument APPEND, if
3e8e9c6a 1614non-nil, means add to end of buffer without erasing current contents."
9eb48cce
ER
1615 (let ((width "18cm")
1616 (height "24cm"))
55abc44f
GM
1617 (when landscape
1618 (setq width "24cm"
1619 height "18cm"))
1620 (unless append
1621 (cal-tex-preamble size)
1622 (if (not landscape)
1623 (progn
1624 (cal-tex-cmd "\\oddsidemargin -1.75cm")
1625 (cal-tex-cmd "\\def\\holidaymult{.06}"))
1626 (cal-tex-cmd "\\special{landscape}")
3e8e9c6a 1627 (cal-tex-cmd "\\textwidth 9.5in")
55abc44f
GM
1628 (cal-tex-cmd "\\textheight 7in")
1629 (cal-tex-comment)
1630 (cal-tex-cmd "\\def\\holidaymult{.08}"))
3e8e9c6a
GM
1631 (cal-tex-cmd cal-tex-caldate)
1632 (cal-tex-cmd cal-tex-myday)
55abc44f
GM
1633 (cal-tex-b-document)
1634 (cal-tex-cmd "\\pagestyle{empty}"))
9eb48cce
ER
1635 (cal-tex-cmd "\\setlength{\\cellwidth}" width)
1636 (insert (format "\\setlength{\\cellwidth}{%f\\cellwidth}\n"
1637 (/ 1.1 (length cal-tex-which-days))))
1638 (cal-tex-cmd "\\setlength{\\cellheight}" height)
1639 (insert (format "\\setlength{\\cellheight}{%f\\cellheight}\n"
a1506d29 1640 (/ 1.0 weeks)))
9eb48cce
ER
1641 (cal-tex-cmd "\\ \\par")
1642 (cal-tex-vspace "-3cm")))
1643
3e8e9c6a 1644(defconst cal-tex-LaTeX-subst-list
9eb48cce 1645 '(("\"". "``")
55abc44f
GM
1646 ("\"". "''") ; quote changes meaning when list is reversed
1647 ;; Don't think this is necessary, and in any case, does not work:
1648 ;; "LaTeX Error: \verb illegal in command argument".
1649;;; ("@" . "\\verb|@|")
a1506d29
JB
1650 ("&" . "\\&")
1651 ("%" . "\\%")
9eb48cce
ER
1652 ("$" . "\\$")
1653 ("#" . "\\#")
1654 ("_" . "\\_")
1655 ("{" . "\\{")
1656 ("}" . "\\}")
1657 ("<" . "$<$")
1658 (">" . "$>$")
55abc44f 1659 ("\n" . "\\ \\\\")) ; \\ needed for e.g \begin{center}\n AA\end{center}
3e8e9c6a 1660 "Alist of symbols and their LaTeX replacements.")
9eb48cce
ER
1661
1662(defun cal-tex-LaTeXify-string (string)
1663 "Protect special characters in STRING from LaTeX."
1664 (if (not string)
1665 ""
1666 (let ((head "")
1667 (tail string)
c7af68bc
GM
1668 (list cal-tex-LaTeX-subst-list)
1669 ch pair)
9eb48cce 1670 (while (not (string-equal tail ""))
c7af68bc
GM
1671 (setq ch (substring-no-properties tail 0 1)
1672 pair (assoc ch list))
1673 (if (and pair (string-equal ch "\""))
1674 (setq list (reverse list))) ; quote changes meaning each time
1675 (setq tail (substring-no-properties tail 1)
1676 head (concat head (if pair (cdr pair) ch))))
9eb48cce
ER
1677 head)))
1678
1eb0045f 1679(defun cal-tex-month-name (month)
a078051c 1680 "The name of MONTH, LaTeX-ified."
1eb0045f
RS
1681 (cal-tex-LaTeXify-string (calendar-month-name month)))
1682
55abc44f
GM
1683(defun cal-tex-hfill ()
1684 "Insert hfill."
1685 (insert "\\hfill"))
9eb48cce 1686
55abc44f
GM
1687(defun cal-tex-newpage ()
1688 "Insert newpage."
1689 (insert "\\newpage%\n"))
9eb48cce 1690
55abc44f
GM
1691(defun cal-tex-noindent ()
1692 "Insert noindent."
1693 (insert "\\noindent"))
9eb48cce
ER
1694
1695(defun cal-tex-vspace (space)
1696 "Insert vspace command to move SPACE vertically."
1697 (insert "\\vspace*{" space "}")
1698 (cal-tex-comment))
1699
1700(defun cal-tex-hspace (space)
1701 "Insert hspace command to move SPACE horizontally."
1702 (insert "\\hspace*{" space "}")
1703 (cal-tex-comment))
1704
1705(defun cal-tex-comment (&optional comment)
3e8e9c6a
GM
1706 "Insert `% ', followed by optional string COMMENT, followed by newline.
1707COMMENT may contain newlines, which are prefixed by `% ' in the output."
1708 (insert (format "%% %s\n"
1709 (if comment
1710 (replace-regexp-in-string "\n" "\n% " comment)
1711 ""))))
9eb48cce
ER
1712
1713(defun cal-tex-banner (comment)
3e8e9c6a
GM
1714 "Insert string COMMENT, separated by blank lines."
1715 (cal-tex-comment (format "\n\n\n\t\t\t%s\n" comment)))
9eb48cce
ER
1716
1717(defun cal-tex-nl (&optional skip comment)
1718 "End a line with \\. If SKIP, then add that much spacing.
3e8e9c6a
GM
1719Add trailing COMMENT if present."
1720 (insert (format "\\\\%s"
1721 (if skip
1722 (format "[%s]" skip)
1723 "")))
9eb48cce 1724 (cal-tex-comment comment))
a1506d29 1725
9eb48cce 1726(defun cal-tex-arg (&optional text)
3e8e9c6a
GM
1727 "Insert a brace {} pair containing the optional string TEXT."
1728 (insert (format "{%s}" (or text ""))))
9eb48cce
ER
1729
1730(defun cal-tex-cmd (cmd &optional arg)
55abc44f 1731 "Insert LaTeX CMD, with optional argument ARG, and end with %."
9eb48cce
ER
1732 (insert cmd)
1733 (cal-tex-arg arg)
1734 (cal-tex-comment))
1735
1736;;;
1737;;; Environments
1738;;;
1739
1740(defun cal-tex-b-document ()
1741 "Insert beginning of document."
1742 (cal-tex-cmd "\\begin{document}"))
1743
1744(defun cal-tex-e-document ()
1745 "Insert end of document."
1746 (cal-tex-cmd "\\end{document}"))
1747
1748(defun cal-tex-b-center ()
1749 "Insert beginning of centered block."
1750 (cal-tex-cmd "\\begin{center}"))
1751
1752(defun cal-tex-e-center ()
1753 "Insert end of centered block."
1754 (cal-tex-comment)
1755 (cal-tex-cmd "\\end{center}"))
1756
1757
1758;;;
1759;;; Boxes
1760;;;
1761
1762
1763(defun cal-tex-b-parbox (position width)
1764 "Insert parbox with parameters POSITION and WIDTH."
1765 (insert "\\parbox[" position "]{" width "}{")
1766 (cal-tex-comment))
1767
1768(defun cal-tex-e-parbox (&optional height)
55abc44f 1769 "Insert end of parbox. Optionally, force it to be a given HEIGHT."
9eb48cce
ER
1770 (cal-tex-comment)
1771 (if height
1772 (cal-tex-rule "0mm" "0mm" height))
1773 (insert "}")
1774 (cal-tex-comment "end parbox"))
1775
55abc44f
GM
1776(defun cal-tex-b-framebox (width position)
1777 "Insert framebox with parameters WIDTH and POSITION (clr)."
9eb48cce
ER
1778 (insert "\\framebox[" width "][" position "]{" )
1779 (cal-tex-comment))
1780
1781(defun cal-tex-e-framebox ()
1782 "Insert end of framebox."
1783 (cal-tex-comment)
1784 (insert "}")
1785 (cal-tex-comment "end framebox"))
1786
1787
c8de140b 1788(defun cal-tex-b-makebox (width position)
55abc44f 1789 "Insert makebox with parameters WIDTH and POSITION (clr)."
9eb48cce
ER
1790 (insert "\\makebox[" width "][" position "]{" )
1791 (cal-tex-comment))
1792
1793(defun cal-tex-e-makebox ()
1794 "Insert end of makebox."
1795 (cal-tex-comment)
1796 (insert "}")
1797 (cal-tex-comment "end makebox"))
1798
1799
1800(defun cal-tex-rule (lower width height)
1801 "Insert a rule with parameters LOWER WIDTH HEIGHT."
1802 (insert "\\rule[" lower "]{" width "}{" height "}"))
1803
1804;;;
1805;;; Fonts
1806;;;
1807
1808(defun cal-tex-em (string)
55abc44f
GM
1809 "Insert STRING in italic font."
1810 (insert "\\textit{" string "}"))
9eb48cce
ER
1811
1812(defun cal-tex-bf (string)
1813 "Insert STRING in bf font."
55abc44f 1814 (insert "\\textbf{ " string "}"))
9eb48cce
ER
1815
1816(defun cal-tex-scriptsize (string)
1817 "Insert STRING in scriptsize font."
1818 (insert "{\\scriptsize " string "}"))
1819
1820(defun cal-tex-huge (string)
3e8e9c6a 1821 "Insert STRING in huge font."
9eb48cce
ER
1822 (insert "{\\huge " string "}"))
1823
1824(defun cal-tex-Huge (string)
3e8e9c6a 1825 "Insert STRING in Huge font."
9eb48cce
ER
1826 (insert "{\\Huge " string "}"))
1827
1828(defun cal-tex-Huge-bf (string)
3e8e9c6a 1829 "Insert STRING in Huge bf font."
55abc44f 1830 (insert "\\textbf{\\Huge " string "}"))
9eb48cce
ER
1831
1832(defun cal-tex-large (string)
3e8e9c6a 1833 "Insert STRING in large font."
9eb48cce
ER
1834 (insert "{\\large " string "}"))
1835
1836(defun cal-tex-large-bf (string)
3e8e9c6a 1837 "Insert STRING in large bf font."
55abc44f 1838 (insert "\\textbf{\\large " string "}"))
9eb48cce 1839
3e8e9c6a 1840
9eb48cce
ER
1841(provide 'cal-tex)
1842
1843;;; cal-tex.el ends here