@c -*-texinfo-*-
@c This is part of the GNU Emacs Lisp Reference Manual.
@c Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc. 
@c See the file elisp-jp.texi for copying conditions.
@c 複製の条件は elisp-jp.texi に書いてあります。
@setfilename ../info/calender-jp
@node Calendar, Tips, Display, Top
@chapter カレンダとダイアリのカスタマイズ

    カレンダとダイアリを自分の好みに合わせるカスタマイズにはいろいろあります。

@menu
* Calendar Customizing::   設定可能なデフォルト値。
* Holiday Customizing::    休日の設定方法。
* Date Display Format::    日付の表示形式の変更方法。
* Time Display Format::    時刻の表示形式の変更方法。
* Daylight Savings::       夏時間の変更方法。
* Diary Customizing::      設定可能なデフォルト値。
* Hebrew/Islamic Entries:: ヘブライ暦/イスラム教暦の休日を取得する方法。
* Fancy Diary Display::    ダイアリ表示の強調、登録日のソート、
                                ダイアリ・ファイルでの使用方法。
* Sexp Diary Entries::     自分でできる飾りつけ。
* Appt Customizing::	   約束日時合図のカスタマイズ。
@end menu

@node Calendar Customizing, Holiday Customizing, Calendar, Calendar
@section カレンダのカスタマイズ
@vindex view-diary-entries-initially

@c  word    current date    今日の日付
@c  word    visible         見える
    変数@code{view-diary-entries-initially}を@code{t}に設定すると、カレンダが
呼び出されたとき、自動的に今日の日付のダイアリ・エントリも表示します。
ダイアリの日付は、今日の日付が見える場合のみ表示します。以下の2行を
@file{.emacs}ファイルに加えると、

@example
(setq view-diary-entries-initially t)
(calendar)
@end example

@noindent
カレンダとダイアリがEmacsの起動時に表示されます。

@vindex view-calendar-holidays-initially
    同様に、変数@code{view-calendar-holidays-initially}を@code{t}にすると、
カレンダに入ったとき、自動的に当該3ヵ月の休日表を表示します。休日の一覧は、
別のウインドウに表示します。

@vindex mark-diary-entries-in-calendar
@c  word    display     (Xの?)ディスプレイ
    変数@code{mark-diary-entries-in-calendar}を@code{t}にすると、ダイアリに
登録してある全ての日に印をつけることができます。これは、カレンダ・ウインドウの
内容を再計算するときに作用します。これらの日に印をつける方法は二つあります。
ディスプレイのサポートがある場合にはフェース(@pxref{Faces})を変える方法、
さもなくば、日付の横にプラス・サイン(@samp{+})を置く方法があります。

@vindex mark-holidays-in-calendar
    同様に、変数@code{mark-holidays-in-calendar}を@code{t}に設定すると
休日にフェースを変えるか、または、アスタリスク(@samp{*})をつけます。

@vindex calendar-holiday-marker
@vindex diary-entry-marker
    変数@code{calendar-holiday-marker}は、休日となる日付の印のつけ方を
指定します。この値は、休日となる日付の隣に挿入する文字か、その日付を
表示するために使うフェース名になります。同様に、変数@code{diary-entry-marker}も
ダイアリに登録されている日付に対する印のつけ方を指定します。カレンダは、
この目的のために@code{holiday-face}と@code{diary-face}を作成します。 Emacsが
端末で複数のフェースをサポートしている場合、これらのシンボルは、これらの変数の
デフォルト値になっています。

@vindex calendar-load-hook
    変数@code{calendar-load-hook}は、カレンダ・パッケージが最初に
ロードされたときに(実際にカレンダの表示をはじめようとする前に)実行する
正規フックです。

@vindex initial-calendar-window-hook
    カレンダが起動するとき、正規フック@code{initial-calendar-window-hook}を
実行します。カレンダ表示の再計算時には、このフックは実行しません。しかし、
@kbd{q}コマンドでカレンダを抜けてから再入した場合、このフックを再度実行します。

@vindex today-visible-calendar-hook
    変数@code{today-visible-calendar-hook}は、今日の日付がウィンドウに
見えるときに、表示するカレンダをカレンダ・バッファに準備した後に実行する
正規フックです。このフックの一つの使い方は、今日の日付をアスタリスクに
置き換えることです。そうするには、フック関数@code{calendar-star-date}を
使います。

@findex calendar-star-date
@example
(add-hook 'today-visible-calendar-hook 'calendar-star-date)
@end example


@noindent
ほかの標準フック関数は今日の日付に、そのフェースを変えるか、アスタリスクを
追加するかして、印をつけます。以下に例を示します:

@findex calendar-mark-today
@example
(add-hook 'today-visible-calendar-hook 'calendar-mark-today)
@end example

@noindent
@vindex calendar-today-marker
変数@code{calendar-today-marker}は、今日を示す印をつける方法を指定します。
この値は、今日の日付の隣に挿入する文字か、日付を表示するために使用する
フェースの名前になります。@code{calendar-today-face}という名前のフェースが
この目的のために用意されています。使用端末上でEmacsが複数フェースを
サポートしている場合、このシンボルが、この変数のデフォルト値になります。

@vindex today-invisible-calendar-hook
@noindent
    似たような正規フック@code{today-invisible-calendar-hook}は今日の日付が
ウインドウで見え@emph{ない}時に実行します。

@node Holiday Customizing, Date Display Format, Calendar Customizing, Calendar
@section 休日のカスタマイズ

@vindex calendar-holidays
@vindex christian-holidays
@vindex hebrew-holidays
@vindex islamic-holidays
    Emacsでは、いくつかのリストを用いてあらかじめ休日が定義されています。
必要に応じてこれらの休日リストに休日を追加、削除してカスタマイズできます。
Emacsが使う休日リストは、一般的な休日(@code{general-holidays})、ローカルな休日
(@code{local-holidays})、キリスト教の休日(@code{christian-holidays})、
ヘブライ(ユダヤ)暦の休日(@code{hebrew-holidays})、イスラム教(モスレム)暦の
休日(@code{islamic-holidays})と、そのほかの休日(@code{other-holidays})です。
@c  word    local holiday   ローカルな休日

@vindex general-holidays
@c  word    eliminate   取り除く
    デフォルトでは、一般的な休日にはアメリカ合州国共通の休日が
定義されています。これらの休日の設定を取り除くには、@code{general-holidays}を
@code{nil}にします。

@vindex local-holidays
    デフォルトではローカルな休日は設定されていません(しかし、サイトで
設定しているかも知れません)。以下に述べるように、変数@code{local-holidays}に
いろいろな休日リストを設定することができます。

@vindex all-christian-calendar-holidays
@vindex all-hebrew-calendar-holidays
@vindex all-islamic-calendar-holidays
@c  word    collection  コレクション
    デフォルトでは、Emacsは知っている全ての宗教上の休日を含まずに、
世間一般のカレンダの中にある休日のみを含んでいます。これ以上の宗教上の休日の
コレクションについては、変数@code{all-christian-calendar-holidays}, 
@code{all-hebrew-calendar-holidays}, @code{all-islamic-calendar-holidays}の
どれか(または全て)を@code{t}に設定してください。宗教上の休日を
取り除きたいならば、対応する変数@code{christian-holidays},
@code{hebrew-holidays}, @code{islamic-holidays}のいずれかまたは全てを
@code{nil}に設定してください。

@vindex other-holidays
    変数@code{other-holidays}には、どのような休日のリストも設定することが
できます。このリストは、通常空で、個人使用を意図しています。

@cindex holiday forms
@cindex 休日形式[きゅうじつけいしき]
    リスト(@code{general-holidays}, @code{local-holidays},
@code{christian-holidays}, @code{hebrew-holidays},
@code{islamic-holidays}, @code{other-holidays})のそれぞれは、
@dfn{休日形式(holiday forms)}のリストです。各休日形式は、休日
(時には休日リスト)を表します。

@c  word    dayname     曜日名
    以下が、休日形式としてとることができる種類の一覧です。日付と月の数は1から
数えますが、「曜日名」を表す数は日曜日を0と数えます。要素@var{string}は
いつでも文字列での休日名です。

@table @code
@item (holiday-fixed @var{month} @var{day} @var{string})
グレゴリオ暦で固定の日付。

@item (holiday-float @var{month} @var{dayname} @var{k} @var{string})
グレゴリオ暦@var{month}月の@var{k}番目の@var{dayname}曜日
(日曜を@var{dayname}0とし、以下同様)。
@var{k}が負なら、月の終りから逆に数えることを意味します。

@item (holiday-hebrew @var{month} @var{day} @var{string})
ヘブライ暦で固定の日付。

@item (holiday-islamic @var{month} @var{day} @var{string})
イスラム教暦で固定の日付。

@item (holiday-julian @var{month} @var{day} @var{string})
ユリウス暦で固定の日付。

@item (holiday-sexp @var{sexp} @var{string})
Lisp式@var{sexp}で計算する日付。この式は計算のために変数@code{year}を
使用すべきです。そして、休日の日付を返すか、今年は休日にならないならば、
@code{nil}を返さなければなりません。@var{sexp}の値は、休日の日付を
形式@code{(@var{month} @var{day} @var{year})}というリストとして
表現しなければなりません。

@item (if @var{condition} @var{holiday-form})
@var{condition}が真のときだけ、なる休日です。

@item (@var{function} @r{[}@var{args}@r{]})
引数 @var{args}で呼び出した関数@var{function}が計算した日付のリストです。
@end table

    たとえば、7月14日のフランス革命記念日を追加したいとします。
以下のようにすればできます:

@smallexample
(setq other-holidays '((holiday-fixed 7 14 "Bastille Day")))
@end smallexample

@noindent
休日形式@code{(holiday-fixed 7 14 "Bastille Day")}が、7番目の月(7月)の
14番目の日を指定します。

@c  XXX time of monthって、何だ?
    多くの休日は、特定の月の特定の週の曜日になります。ここに、Virgin Islandsで
8月の第4月曜日に祝うとされるHurricane Supplication Dayを表す休日形式を挙げます:

@smallexample
(holiday-float 8 1 4 "Hurricane Supplication Day")
@end smallexample

@noindent
ここで8月を8で指定し、月曜を1で指定し(日曜は0火曜は2以下同様)、
その月の4週目を4で指定しています(1は最初の週を、2は2週目を、-1は最後の週を、
-2は最後から2番目の週を、以下同様)。

    ヘブライ暦やイスラム教暦、ユリウス暦などの固定の日付になる休日も
指定することができます。たとえば、

@smallexample
(setq other-holidays
      '((holiday-hebrew 10 2 "Last day of Hanukkah")
        (holiday-islamic 3 12 "Mohammed's Birthday")
        (holiday-julian 4 2 "Jefferson's Birthday")))
@end smallexample

@noindent
は、ハヌカー最終日(ヘブライ暦の月はNisanを1として数えるため)、
イスラム教暦のモハメッド誕生際(イスラム教暦の月はMuharramを1として数えるため)、
ユリウス暦で1743年4月2日であるThomas Jeffersonの誕生日を追加します。

    条件つき休日を含めるには、Emacs Lispの@code{if}か@code{holiday-sexp}形式を
使います。たとえば、アメリカ大統領選挙は4で割り切れる年の11月の最初の月曜日の
次の火曜日に行なわれます:

@smallexample
(holiday-sexp (if (= 0 (% year 4))
                   (calendar-gregorian-from-absolute
                    (1+ (calendar-dayname-on-or-before
                          1 (+ 6 (calendar-absolute-from-gregorian
                                  (list 11 1 year))))))
              "US Presidential Election"))
@end smallexample

@noindent
かもしくは、

@smallexample
(if (= 0 (% displayed-year 4))
    (fixed 11
           (extract-calendar-day
             (calendar-gregorian-from-absolute
               (1+ (calendar-dayname-on-or-before
                     1 (+ 6 (calendar-absolute-from-gregorian
                              (list 11 1 displayed-year)))))))
           "US Presidential Election"))
@end smallexample
    いくつかの休日は、これらの形式のいずれにも収まりません。
なぜならそれらの判別には特別な計算が絡んでいるからです。
このような場合、計算するためのLisp関数を書かねばなりません。
たとえば、食を含めるには、@code{other-holidays}に@code{(eclipses)}を追加して、
Emacs Lisp関数@code{eclipses}を書かなければなりません。
その関数は、次のようなカレンダ・ウィンドウで見える範囲内の
適切なグレゴリオ暦の日付とその説明文字列のリスト(空かもしれない)を
返さなければなりません:

@smallexample
(((6 27 1991) "Lunar Eclipse") ((7 11 1991) "Solar Eclipse") ... )
@end smallexample

@node Date Display Format, Time Display Format, Holiday Customizing, Calendar
@section 日付表示フォーマット
@vindex calendar-date-display-form
@c  word    mode line   モード行
    @code{calendar-date-display-form}を設定することで、モード行、ダイアリや
メッセージでの日付の表示の仕方をカスタマイズすることができます。
この変数は、変数@code{month}, @code{day}, @code{year}(これら全て文字列形式
の数)、変数@code{monthname}, @code{dayname}(どちらもアルファベット文字列)を
含むことができる式のリストを保持しています。
アメリカ・スタイルでの、このリストのデフォルト値は以下のとおりです:

@smallexample
((if dayname (concat dayname ", ")) monthname " " day ", " year)
@end smallexample

@noindent
一方、ヨーロッパ・スタイルでのこの値のデフォルトは以下のとおりです:

@smallexample
((if dayname (concat dayname ", ")) day " " monthname " " year)
@end smallexample

@noindent
ISO標準日付(ISO standard date)表現は以下のとおりです:

@smallexample
(year "-" month "-" day)
@end smallexample

@noindent
以下にアメリカ・フォーマットを示します。

@smallexample
(month "/" day "/" (substring year -2))
@end smallexample

@node Time Display Format, Daylight Savings, Date Display Format, Calendar
@section 時刻表示フォーマット
@vindex calendar-time-display-form
@c  word    conventional    お決まりの; これはうまい!
    デフォルトではカレンダとダイアリは、1〜12までの時、分、
@samp{am}か@samp{pm}のいずれか、というお決まりのアメリカ・スタイルで
時刻を表示します。もし、ヨーロッパ・スタイル、またはアメリカ陸軍スタイル
としても知られている、時を00〜23で示す方を好む場合、
変数@code{calendar-time-display-form}を変えることができます。
この変数は、変数@code{12-hours}、@code{24-hours}、@code{minutes}
(全て文字列形式の数)と、@code{am-pm}、@code{time-zone}(どちらもアルファベット
文字列)を含むことができる式のリストです。
@code{calendar-time-display-form}のデフォルト値は以下のようになります:

@smallexample
(12-hours ":" minutes am-pm
          (if time-zone " (") time-zone (if time-zone ")"))
@end smallexample

@noindent
ヨーロッパ・スタイルの時刻を与える値です:

@smallexample
(24-hours ":" minutes
          (if time-zone " (") time-zone (if time-zone ")"))
@end smallexample

@node Daylight Savings, Diary Customizing, Time Display Format, Calendar
@section 夏時間
@cindex daylight savings time
@cindex 夏時間[なつじかん]
@c  XXX daylight savings time は、決して「夏」だけのものじゃないと思うが……
@c  word    solstices   至;     夏至、冬至
@c  word    equinoxes   分;     春分、秋分
    Emacsは標準時と夏時間(日の出日の入り、夏至冬至、春分秋分、
月の満ち欠けを勘定に入れることで与えられる)の違いを理解します。
夏時間の規則は、地域ごとに、および、年ごとに異なっています。
正確に求めるために、Emacsはどのルールを使うのかを知る必要があります。

@c  word    keep track of       追随する
@c  word    gap                 不足
@c  word    operating system    オペレーティング・システム
    いくつかのオペレーティング・システムは、自分のいる地域に応じた規則に
追随しています。これらシステムでは、Emacsは必要な情報をシステムから自動的に
取得します。もし、いくつかあるいは全てのこれらの情報が見つからない場合、
EmacsはGNU世界の中心であるケンブリッジやマサツーセッツで使われている規則を
用いて不足を埋めます。

@vindex calendar-daylight-savings-starts
@vindex calendar-daylight-savings-ends
    デフォルト規則の選択が自分の地域では不適当な場合、
変数@code{calendar-daylight-savings-starts}と
@code{calendar-daylight-savings-ends}を設定することによって、
Emacsに使うべき規則を教えることができます。
これらの値は、変数@code{year}を参照して、評価結果がグレゴリオ暦の夏時間の
始まる日と終る日をリスト@code{(@var{month} @var{day} @var{year})}の形式
で与える、Lisp式でなければなりません。自分の地域で夏時間が使われて
いないときは、この値を@code{nil}にしなければなりません。

    Emacsは、休日と同様に、夏時間の始まる日、終る日を判別するために、
それから時刻を太陽暦、太陰暦に合わせるために、これらの式を使います。
@c  XXX day in the solar/lunar calculation  って、太陽/太陰暦?

    ケンブリッジ、マサチューセッツでの値は、次のとおりです:

@example
@group
(calendar-nth-named-day 1 0 4 year)
(calendar-nth-named-day -1 0 10 year)
@end group
@end example

@noindent
即ち、@code{year}で指定する年の第4月(4月)の第1第0曜日(日曜日)、
そして、第10月(10月)の最後の日曜日です。
夏時間が10月1日から始まるように変わったとすると、
@code{calendar-daylight-savings-starts}を以下のようにします:

@example
(list 10 1 year)
@end example
    さらに複雑な例として、ヘブライ暦Nisanの1日から夏時間が始まると仮定します。
@code{calendar-daylight-savings-starts}を以下の値に設定しなければなりません。

@example
(calendar-gregorian-from-absolute
  (calendar-absolute-from-hebrew
    (list 1 1 (+ year 3760))))
@end example

@noindent
これは、Nisanがヘブライ暦で最初の月であり、Nisanにおいて、ヘブライ年は
グレゴリオ年と3760の差があるためです。

    自分の地域に夏時間がない場合、もしくは、いつも標準時が欲しいときは、
@code{calendar-daylight-savings-starts}と、
@code{calendar-daylight-savings-ends}を@code{nil}にします。

@vindex calendar-daylight-time-offset
    変数@code{calendar-daylight-time-offset}は、分単位で夏時間と標準時の差を
指定します。ケンブリッジでの値は60です。

@vindex calendar-daylight-savings-starts-time
@vindex calendar-daylight-savings-ends-time
@c  word    local time  現地時間
    変数@code{calendar-daylight-savings-starts-time}と
変数@code{calendar-daylight-savings-ends-time}は、
夏時間へおよび夏時間から移行するとき、現地時間で深夜以後経過すべき分数を
指定します。ケンブリッジでは、この値は両方とも120です。

@node Diary Customizing, Hebrew/Islamic Entries, Daylight Savings, Calendar
@section ダイアリのカスタマイズ

@vindex holidays-in-diary-buffer
    たいてい、ダイアリ・バッファ・ウィンドウのモード行は、ダイアリ・エントリの
日付にあたるなんらかの休日を示しています。休日をチェックする処理は数秒を
要するので、休日に関する情報を含める場合、ダイアリ・バッファの表示は著しく
遅くなります。もし休日の情報がなくてもダイアリ・バッファの表示が速い方が
いい場合、変数@code{holidays-in-diary-buffer}を@code{nil}に設定します。
@refill

@vindex number-of-diary-entries
    変数@code{number-of-diary-entries}は、一度に表示するダイアリ・エントリの
日数を制御します。これは@code{view-diary-entries-initially}が@code{t}のときに
@kbd{M-x diary}コマンド同様に最初の表示に影響します。たとえば、
デフォルト値が1のとき、今日の日付のダイアリ・エントリのみ表示することを
示しています。この値が2ならば、今日と明日のエントリの両方が表示されます。
値は、七つの要素からなるベクタもとることができます。
たとえば、値が@code{[0 2 2 2 2 4 1]}のとき日曜日にはダイアリ・エントリは
表示されず、月曜日から木曜日までは今日と明日のダイアリ・エントリが表示され、
金曜日には金曜日から月曜日のエントリが表示され、
そして土曜日には今日のエントリのみが表示されます。

@vindex print-diary-entries-hook
@findex print-diary-entries
    変数@code{print-diary-entries-hook}は、現在ダイアリ・バッファで見える
ダイアリ・エントリだけを含む、一時バッファの準備の後に、実行する正規フックです
(そのほかの、関係ないダイアリ・エントリは一時バッファには全然存在しません。
ダイアリ・バッファでは、それらはほとんど隠されています)。
このフックのデフォルト値は、コマンド@code{lpr-buffer}による印刷です。
印刷するために別のコマンドを使いたい場合、このフックの値を変えるだけです。
ほかの使用法としてたとえば、日時の順に、行を再配置するなどがあります。

@vindex diary-date-forms
    ダイアリ・ファイルでの日付の形式は、標準アメリカ・スタイルでも
ヨーロッパ・スタイルでもないものが必要なとき、変数@code{diary-date-forms}を
設定することでカスタマイズできます。この変数は、日付を識別するためのパターンの
リストです。それぞれの日付パターンは、全要素が正規表現
(@pxref{Regular Expressions})かシンボル@code{month}, @code{day}, @code{year},
@code{monthname}, @code{dayname}であるリストです。
これらの要素全てはダイアリ・ファイル中のある種のテキストと照合するために使う
パターンです。日付パターンが一致するためには、全体としてその要素全てが連続して
一致しなければなりません。

    日付パターンの正規表現照合の普通の手法では、
@samp{*}が語構成可能であるように変更した標準構文テーブルを使います。

@c  word    being considered    判断中
    シンボル@code{month}, @code{day}, @code{year}, @code{monthname},
@code{dayname}は、判断中の日付の月数、日数、年数、月名、曜日名に一致します。
数に一致するシンボルでは、先頭に0がついても大丈夫です。名前に一致するものは、
3字の省略形にしても、頭文字を大文字にしても大丈夫です。全てのシンボルは
@samp{*}と一致します。なぜなら、ダイアリ・エントリでの@samp{*}は
「任意の日」、「任意の月」、などを意味するので、判断中の日付に無関係に
一致しなければならないからです。

    アメリカ・スタイルでの@code{diary-date-forms}のデフォルト値は以下のように
なります:

@example
((month "/" day "[^/0-9]")
 (month "/" day "/" year "[^0-9]")
 (monthname " *" day "[^,0-9]")
 (monthname " *" day ", *" year "[^0-9]")
 (dayname "\\W"))
@end example

@c  word    mutually exclusive  相互排他的
    リスト中の日付パターンは@emph{相互排他的}かつ、ダイアリ・エントリ自身には
一致してはならず、日付と空白文字一つだけに一致しなければなりません。
相互排他的であるために、パターンが(日付の終りの空白を超える)
ダイアリ・エントリ・テキストの一部分に一致しなければならないのならば、
日付パターンの第1要素は@code{backup}@emph{でなければなりません}。
これによって、日付の認識において一致を完了した後、そのダイアリ・エントリの
現在の語頭に戻ることができます。@code{backup}を使ったとしても、
その日付パターンは絶対にそのダイアリ・エントリの第1語の一部分以上に一致しては
なりません。ヨーロッパ・スタイルでの@code{diary-date-forms}のデフォルト値は、
このリストになります:

@example
((day "/" month "[^/0-9]")
 (day "/" month "/" year "[^0-9]")
 (backup day " *" monthname "\\W+\\<[^*0-9]")
 (day " *" monthname " *" year "[^0-9]")
 (dayname "\\W"))
@end example

@noindent
3番目のパターン中で@code{backup}を使っていることに注意してください。
ここでは、4番目のパターンとの区別のために、日付自身を超えて語の一部と
一致しなければならなかったのです。

@node Hebrew/Islamic Entries, Fancy Diary Display, Diary Customizing, Calendar
@section ヘブライ暦やイスラム教暦での日付に基づくダイアリ・エントリ

    自分のダイアリ・ファイルで、世界標準のグレゴリオ暦に基づくエントリ同様に、
ヘブライ暦やイスラム教暦の日付に基づくエントリを置くことができます。しかし、
そういったエントリの認識は時間を消費しますし、ほとんどの人は使わないので、
明示的にそれを使用可能にしなければなりません。ダイアリにヘブライ暦の日付の
ダイアリ・エントリを認識させたいのなら、たとえば、このようにしなければ
なりません:

@vindex nongregorian-diary-listing-hook
@vindex nongregorian-diary-marking-hook
@findex list-hebrew-diary-entries
@findex mark-hebrew-diary-entries
@smallexample
(add-hook 'nongregorian-diary-listing-hook 'list-hebrew-diary-entries)
(add-hook 'nongregorian-diary-marking-hook 'mark-hebrew-diary-entries)
@end smallexample

@noindent
イスラム教暦の日付のエントリを使いたいなら、こうします:

@findex list-islamic-diary-entries
@findex mark-islamic-diary-entries
@smallexample
(add-hook 'nongregorian-diary-listing-hook 'list-islamic-diary-entries)
(add-hook 'nongregorian-diary-marking-hook 'mark-islamic-diary-entries)
@end smallexample

@c  word    precede     前置する
    ヘブライ暦やイスラム教暦の日付のダイアリ・エントリはグレゴリオ暦の日付の
ダイアリ・エントリと同じフォーマットを持ちますが、ヘブライ暦では@samp{H}が、
イスラム教暦では@samp{I}が前置される点だけが違います。さらに、ヘブライ暦や
イスラム教暦の月名は最初の3字では一意に指定できないため、省略してはなりません。
たとえばヘブライ暦の日付Heshvan 25のダイアリ・エントリは、こんな感じになります:

@smallexample
HHeshvan 25 Happy Hebrew birthday!
@end smallexample

@noindent
するとこのエントリはヘブライ暦でのHeshvan 25に対応する全ての日付のダイアリに
現れます。そして、これがDhu al-Qada 25に一致するイスラム教暦の日付の
ダイアリ・エントリです:

@smallexample
IDhu al-Qada 25 Happy Islamic birthday!
@end smallexample

    グレゴリオ暦の日付のダイアリ・エントリについては、ヘブライ暦や
イスラム教暦の日付のエントリにアンパサンド(@samp{&})が前置されていたら、
印をつけません。
@c  XXX as with がようわからん

    これがカレンダで使用する、ヘブライ暦とイスラム教暦で類似する、
選択された日付やほかの日付に一致するダイアリ・エントリを作成するための
コマンドの表です:

@table @kbd
@item i h d
選択された日付に対応するヘブライ暦の日付で、ダイアリ・エントリを追加します
(@code{insert-hebrew-diary-entry})。
@item i h m
選択された日付に対応するヘブライ暦の月の同じ日で、ダイアリ・エントリを
追加します(@code{insert-monthly-hebrew-diary-entry})。このダイアリ・エントリは
選択された日付とヘブライ暦で同じ日になる任意の日付に一致します。
@item i h y
選択された日付に対応するヘブライ暦の年の同じ月日で、ダイアリ・エントリを
追加します(@code{insert-yearly-hebrew-diary-entry})。このダイアリ・エントリは
選択された日付とヘブライ暦で同じ月日になる任意の日付に一致します。
@item i i d
選択された日付に対応するイスラム教暦の日付で、ダイアリ・エントリを追加します
(@code{insert-islamic-diary-entry})。
@item i i m
選択された日付に対応するイスラム教暦の月の同じ日で、ダイアリ・エントリを
追加します(@code{insert-monthly-islamic-diary-entry})。
@item i i y
選択された日付に対応するイスラム教暦の年の同じ月日で、ダイアリ・エントリを
追加します(@code{insert-yearly-hebrew-diary-entry})。
@end table

@findex insert-hebrew-diary-entry
@findex insert-monthly-hebrew-diary-entry
@findex insert-yearly-hebrew-diary-entry
@findex insert-islamic-diary-entry
@findex insert-monthly-islamic-diary-entry
@findex insert-yearly-islamic-diary-entry
    これらコマンドは普通のダイアリ・エントリの対応するコマンドと同じように
動作します。実行すると、カレンダ・ウィンドウでポイントがある日付に対して、
自分のダイアリ・ファイルの末尾にダイアリ・エントリの一部分としての
日付部分だけを挿入します。それに続くダイアリ・エントリの残りの部分は、自分で
挿入しなければなりません。

@node Fancy Diary Display, Sexp Diary Entries, Hebrew/Islamic Entries, Calendar
@section ダイアリ表示の飾りつけ
@vindex diary-display-hook
@findex simple-diary-display
@c  word    fancy   飾りつけ

    ダイアリは、ダイアリ・バッファを準備してからフック
@code{diary-display-hook}を実行して、表示されます。このフック
(@code{simple-diary-display})のデフォルト値は、関係ないダイアリ・エントリを
隠してダイアリ・バッファを表示します。けれども、自分で次のようにフックを
指定すると、

@cindex diary buffer
@cindex ダイアリ・バッファ[だいあり・ばっふぁ]
@findex fancy-diary-display
@example
(add-hook 'diary-display-hook 'fancy-diary-display)
@end example

@noindent
これによって、飾りつきダイアリ表示ができます。これは、表示のためだけに存在する
特別なバッファにダイアリ・エントリと休日をコピーして、表示します。
別のバッファにコピーすることで、表示されるテキストをきれいにするための変更を
加えることができます(たとえば、エントリをそれが適用される日付でソートする
など)。

@c  word    hard copy   ハード・コピー
@c  word    print       印刷;   と、書いて、「プリント」と読む。問題なし!
    単純なダイアリ表示では、@code{print-diary-entries}でバッファの
ハード・コピーを印刷できます。1週間分の日ごとのダイアリのハード・コピーを
印刷するには、ポイントをその週の日曜に置いて、@kbd{7 d}とタイプし、
それから@kbd{M-x print-diary-entries}を実行します。いつものことですが、
休日を含めると表示が若干遅くなります。変数@code{holidays-in-diary-buffer}を
@code{nil}に設定すれば、速度を稼ぐことができます。

@vindex diary-list-include-blanks
    普通は飾りつきダイアリ・バッファはダイアリ・エントリのない日は、
それが休日であっても、表示しません。飾りつきダイアリ・バッファでそういった日を
表示したいならば、変数@code{diary-list-include-blanks}を@code{t}に設定して
ください。@refill

@cindex sorting diary entries
@cindex ダイアリ・エントリのソート[だいあり・えんとりーのそーと]
    飾りつきダイアリ表示をするのならば、正規フック
@code{list-diary-entries-hook}を使って、各日のダイアリ・エントリをその時刻で
ソートできます。このようにします
@c  word    time of day     時刻

@findex sort-diary-entries
@example
(add-hook 'list-diary-entries-hook 'sort-diary-entries t)
@end example

@noindent
各日について、これで認識可能な日時で始まるダイアリ・エントリが、
その時刻でソートされます。日時のないダイアリ・エントリは、各日の中で
最初に来ます。

@c  word    include     インクルード
    飾りつきダイアリ表示はインクルードされたダイアリ・ファイルを
処理することもできます。これによって、複数の人が関係するイベントについての
ダイアリ・ファイルを彼らの間で共有することができます。
ダイアリ・ファイル中のこの形式の行は:

@smallexample
#include "@var{filename}"
@end smallexample

@noindent
飾りつきダイアリ・バッファに、ファイル@var{filename}からダイアリ・エントリを
インクルードします。インクルード機構は再帰的なので、インクルード・ファイルが
さらにほかのファイルをインクルードし、というようにできます。もちろん、
インクルードが循環しないように気をつけなければなりません。インクルード機能を
可能にするにはこうします:

@vindex list-diary-entries-hook
@vindex mark-diary-entries-hook
@findex include-other-diary-files
@findex mark-included-diary-files
@smallexample
(add-hook 'list-diary-entries-hook 'include-other-diary-files)
(add-hook 'mark-diary-entries-hook 'mark-included-diary-files)
@end smallexample

インクルード機構は、飾りつきダイアリ表示に限って働きます。理由は、
普通のダイアリ表示はダイアリ・ファイルのエントリを直接表示するからです。

@node Sexp Diary Entries, Appt Customizing, Fancy Diary Display, Calendar
@section S式のエントリと飾りつきダイアリ表示
@cindex sexp diary entries
@cindex S式のダイアリ・エントリ[Sしきのだいありえんとり]

    S式ダイアリ・エントリは、単にそのダイアリ・エントリに複雑な条件をつけるだけ
ではありません。飾りつきダイアリ表示を使う場合は、S式エントリでそのエントリの
日付自体に依存するテキストを生成できます。たとえば、記念日の
ダイアリ・エントリは記念日からの年数をダイアリ・エントリのテキストに
挿入できます。そのため、このダイアリ・エントリに@samp{%d}があります:

@findex diary-anniversary
@smallexample
%%(diary-anniversary 10 31 1948) Arthur's birthday (%d years old)
@end smallexample

@noindent
これが年齢に置き換えられるので、飾りつきダイアリ・バッファに現れる
1990年10月31日のエントリは、こうなります:

@smallexample
Arthur's birthday (42 years old)
@end smallexample

@noindent
もし、ダイアリ・ファイルが代わりにこのエントリを含んでいたなら:

@smallexample
%%(diary-anniversary 10 31 1948) Arthur's %d%s birthday
@end smallexample

@noindent
1990年10月31日の飾りつきダイアリ・バッファのエントリは、こうなります:

@smallexample
Arthur's 42nd birthday
@end smallexample

@c  word    cyclic      循環
@c  word    interpolate 挿入
    同様に、循環ダイアリ・エントリは繰り返しの回数を挿入できます:

@findex diary-cyclic
@smallexample
%%(diary-cyclic 50 1 1 1990) Renew medication (%d%s time)
@end smallexample

@noindent
は、こんな感じになります:

@smallexample
Renew medication (5th time)
@end smallexample

@noindent
1990年9月8日の飾りつきダイアリ表示になります。

    S式ダイアリ・エントリの一般性により、アルゴリズム的に記述可能な
任意のダイアリ・エントリの指定ができます。S式ダイアリ・エントリは、
そのエントリが任意の与えられた日付に適用されるか否かを計算する式を含みます。
その値が非@code{nil}ならば、エントリはその日付に適用されます。
そうでなければ、適用されません。式は変数@code{date}を判断中の日付を知るために
使うことができます。この値は、グレゴリオ暦のリスト
(@var{month} @var{day} @var{year})です。

@c  word    weekday     平日
@c  word    weekend     週末
    たとえば、毎月21日が平日ならばその日に給料を貰い、21日が週末ならその前の
金曜に貰えると仮定します。こういった日付に一致するS式ダイアリ・エントリは、
このように書きます:

@smallexample
&%%(let ((dayname (calendar-day-of-week date))
         (day (car (cdr date))))
      (or (and (= day 21) (memq dayname '(1 2 3 4 5)))
          (and (memq day '(19 20)) (= dayname 5)))
         ) Pay check deposited
@end smallexample

    以下のS式ダイアリ・エントリで(飾りつきダイアリ表示において)、
テキストが日付によって異なるダイアリ・エントリを調合することができます。

@findex diary-sunrise-sunset
@findex diary-phases-of-moon
@findex diary-day-of-year
@findex diary-iso-date
@findex diary-julian-date
@findex diary-astro-day-number
@findex diary-hebrew-date
@findex diary-islamic-date
@findex diary-french-date
@findex diary-mayan-date
@table @code
@item %%(diary-sunrise-sunset)
今日の日の出と日の入りの、現地時間のダイアリ・エントリを作ります。
@item %%(diary-phases-of-moon)
月の相(1/4)のダイアリ・エントリを作ります。
@item %%(diary-day-of-year)
今日が1年の何日目かとことと、今年の残り日数つきのダイアリ・エントリを作ります。
@item %%(diary-iso-date)
@c  word    ISO commercial date     ISO商業日付;    XXX 聞いたことない
今日のISO商業日付(ISO commercial date)つきのダイアリ・エントリを作ります。
@item %%(diary-julian-date)
今日のユリウス暦日付つきのダイアリ・エントリを作ります。
@item %%(diary-astro-day-number)
今日の天文(ユリウス)日付のダイアリ・エントリを作ります。
@item %%(diary-hebrew-date)
今日のヘブライ暦日付つきのダイアリ・エントリを作ります。
@item %%(diary-islamic-date)
今日のイスラム教暦日付付のダイアリ・エントリを作ります。
@item %%(diary-french-date)
今日のフランス革命暦日付付のダイアリ・エントリを作ります。
@item %%(diary-mayan-date)
今日のマヤ暦日付付のダイアリ・エントリを作ります。
@end table

@noindent
よって、ダイアリ・エントリ

@example
&%%(diary-hebrew-date)
@end example

@noindent
を含めると、飾りつきダイアリ表示を使ったときに、毎日のダイアリ表示が
ヘブライ暦の日付も含むようになります(単純なダイアリ表示では、
行@samp{&%%(diary-hebrew-date)}が任意の日付のダイアリに現れますが、
特に便利なことはしません)。

    これら関数は、ヘブライ暦に基づくS式ダイアリ・エントリを構築するために
ある程度標準的に使うことができます。

@c  XXX ここのところの@cindexどう訳す?
@c  この辺りの宗教的話は、何のことやらさっぱりわからん。
@cindex rosh hodesh
@findex diary-rosh-hodesh
@cindex parasha, weekly
@findex diary-parasha
@cindex candle lighting times
@findex diary-sabbath-candles
@cindex omer count
@findex diary-omer
@cindex yahrzeits
@findex diary-yahrzeit
@table @code
@item %%(diary-rosh-hodesh)
ヘブライ暦の新しい月が始まるとき、その通知と儀式の案内をする
ダイアリ・エントリを作ります。
@item %%(diary-parasha)
@c  word    synagogue   ユダヤの集会
@c  word    scripture   教典
毎週のユダヤの集会で読む教典を教える土曜日のダイアリ・エントリを作ります。
@item %%(diary-sabbath-candles)
@c  word    Sabbath     安息日
安息日のキャンドルを灯す@emph{現地時間}を教える金曜日の
ダイアリ・エントリを作ります。
@item %%(diary-omer)
@c  XXX omerとはなんぞや?
適切なときに、omerの回数を与えるダイアリ・エントリを作ります。
@item %%(diary-yahrzeit @var{month} @var{day} @var{year}) @var{name}
命日を記念日として印づけるダイアリ・エントリを作ります。日付は
@emph{グレゴリオ暦}(法律上の)命日です。適切なヘブライ暦の記念日とその前日に、
このダイアリ・エントリは現れます(ヨーロッパ・スタイルでは、パラメータの順序が
@var{day}, @var{month}, @var{year}に変わります)。
@end table

@node Appt Customizing,  , Sexp Diary Entries, Calendar
@section 約束日時合図のカスタマイズ

    Emacsが自分の約束日時の合図をどのように行なうか、そして、どれだけの間、
合図を行なうかを、これら変数の設定で完全に指定できます:

@vindex appt-message-warning-time
@vindex appt-audible
@vindex appt-visible
@vindex appt-display-mode-line
@vindex appt-msg-window
@vindex appt-display-duration
@vindex appt-disp-window-function
@vindex appt-delete-window-function
@table @code
@item appt-message-warning-time
約束日時のどれだけ前に合図を開始するかの分数。デフォルトは10分。
@item appt-audible
これが非@code{nil}ならば、Emacsは端末ベルを約束日時の合図として鳴らします。
デフォルトは@code{t}。
@item appt-visible
これが非@code{nil}ならば、Emacsは約束についてのメッセージをエコー領域に
表示します。デフォルトは@code{t}。
@item appt-display-mode-line
これが非@code{nil}ならば、Emacsは約束日時までの分数をモード行に表示します。
デフォルトは@code{t}。
@item appt-msg-window
これが非@code{nil}ならば、Emacsは約束についてのメッセージを別ウィンドウに
表示します。デフォルトは@code{t}。
@item appt-disp-window-function
この変数は、約束についてのメッセージの別ウィンドウを作るために使う関数を
保持します。
@item appt-delete-window-function
この変数は、時間がきたときに、約束についてのメッセージ・ウィンドウを
取り除くために使う関数を保持します。
@item appt-display-duration
約束についてのメッセージを表示する秒数です。デフォルトは5秒です。
@end table
