123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- %%
- %% This is file `kalendarium.sty',
- %% generated with the docstrip utility.
- %%
- %% The original source files were:
- %%
- %% kalendarium.dtx (with options: `package')
- %% ----------------------------------------------------------------
- %% kalendarium --- Format dates according to the Roman calendar
- %% E-mail: aws@awsmith.us
- %% Released under the LaTeX Project Public License v1.3c or later
- %% See http://www.latex-project.org/lppl.txt
- %% ----------------------------------------------------------------
- %%
- \NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{kalendarium}[2018/06/14 1.0 Format dates using the Roman calendar]
- \RequirePackage{xparse}
- \RequirePackage{l3keys2e}
- \ProvidesExplPackage
- {kalendarium}
- {2018-06-17}{1.0}
- {A package to display dates in the classical Roman style}
- \ExplSyntaxOn
- \keys_define:nn {kalendarium}{
- abbreviate .bool_set:N = \l_kal_abbreviate_bool,
- abbreviate .initial:n = { false },
- periods .bool_set:N = \l_kal_periods_bool,
- periods .initial:n = { true },
- era .tl_set:N = \l_kal_era_tl,
- era .initial:n = { ad },
- julian .bool_set:N = \l_kal_julian_bool,
- julian .initial:n = { false },
- dayfmt .tl_set:N = \l_kal_dayfmt_tl,
- dayfmt .initial:n = { roman },
- yearfmt .tl_set:N = \l_kal_yearfmt_tl,
- yearfmt .initial:n = { roman },
- antediem .bool_set:N = \l_kal_antediem_bool,
- antediem .initial:n = { true },
- bissextum .bool_set:N = \l_kal_bissextum_bool,
- bissextum .initial:n = { true },
- oldmonths .bool_set:N = \l_kal_oldmonths_bool,
- oldmonths .initial:n = { false }
- }
- \ProcessKeysOptions {kalendarium}
- \clist_new:N \c_kal_day_acc_clist
- \clist_set:Nn \c_kal_day_acc_clist {
- primum,secundum,tertium,quartum,quintum,sextum,septimum,octavum,nonum,decimum,
- undecimum,duodecimum,tertium\ decimum,quartum\ decimum,quintum\ decimum,
- sextum\ decimum,septimum\ decimum,duodevicesimum,undevicesimum,bissextum
- }
- \clist_new:N \c_kal_day_abl_clist
- \clist_set:Nn \c_kal_day_abl_clist {
- primo,secundo,tertio,quarto,quinto,sexto,septimo,octavo,nono,decimo,
- undecimo,duodecimo,tertio\ decimo,quarto\ decimo,quinto\ decimo,
- sexto\ decimo,septimo\ decimo,duodevicesimo,undevicesimo,bissexto
- }
- \clist_new:N \c_kal_weekday_gen_clist
- \clist_set:Nn \c_kal_weekday_gen_clist {
- Saturni,Solis,Lunae,Martis,Mercurii,Iovis,Veneris
- }
- \clist_new:N \c_kal_weekday_abbr_clist
- \clist_set:Nn \c_kal_weekday_abbr_clist {
- Sat,Sol,Lun,Mart,Merc,Iov,Ven
- }
- \clist_new:N \c_kal_month_acc_clist
- \clist_set:Nn \c_kal_month_acc_clist {
- Ianuarias,Februarias,Martias,Apriles,Maias,Iunias,Iulias,Augustas,
- Septembres,Octobres,Novembres,Decembres,Quintiles,Sextiles,Augustas
- }
- \clist_new:N \c_kal_month_abl_clist
- \clist_set:Nn \c_kal_month_abl_clist {
- Ianuariis,Februariis,Martiis,Aprilibus,Maiis,Iuniis,Iuliis,
- Augustis,Septembribus,Octobribus,Novembribus,Decembribus,
- Quintilibus,Sextilibus,Augustis
- }
- \clist_new:N \c_kal_month_abbr_clist
- \clist_set:Nn \c_kal_month_abbr_clist {
- Ian,Feb,Mar,Apr,Mai,Iun,Iul,Aug,Sept,Oct,Nov,Dec,Quin,Sex,Aug
- }
- \clist_new:N \c_kal_month_lengths_clist
- \clist_set:Nn \c_kal_month_lengths_clist {
- 31,28,31,30,31,30,31,31,30,31,30,31,31,31
- }
- \clist_new:N \c_kal_month_ides_clist
- \clist_set:Nn \c_kal_month_ides_clist {
- 13,13,15,13,15,13,15,13,13,15,13,13,15,13
- }
- \cs_new:Nn \kal_period:n {
- \bool_if:NT \l_kal_periods_bool {.}
- }
- \cs_new:Npn \kal_abbr:nn #1#2 {
- \bool_if:NTF \l_kal_abbreviate_bool {#2 \kal_period:n{}} {#1}
- }
- \cs_new:Npn \kal_month:nn #1#2 {
- \kal_abbr:nn
- { \clist_item:Nn {#1} {#2} }
- { \clist_item:Nn \c_kal_month_abbr_clist {#2} }
- }
- \cs_new:Npn \kal_ante_diem:nn #1#2 {
- \bool_if:nTF {\l_kal_antediem_bool}
- {
- \kal_abbr:nn {ante\ diem} {\KalAbbrFormat{a \kal_period:n{} d}}
- \ \int_compare:nNnTF {#2} = {1}
- { \clist_item:Nn \c_kal_day_acc_clist {#1} }
- { #1 }
- }
- {
- \int_compare:nNnTF {#2} = {1}
- { \clist_item:Nn \c_kal_day_abl_clist {#1} }
- { #1 }
- }
- }
- \cs_new:Npn \kal_day:n #1 {
- \int_compare:nNnTF {#1} = {2}
- { \kal_abbr:nn {pridie} {prid} }
- {
- \str_case_e:nnF { \l_kal_dayfmt_tl }
- {
- { latin } { \kal_ante_diem:nn {#1} {1} }
- { roman } { \kal_ante_diem:nn {\KalDayFormat{
- \int_to_roman:n {#1}}} {0} }
- { arabic } { \kal_ante_diem:nn {\int_eval:n {#1}} {0} }
- }
- { \kal_ante_diem:nn {\KalDayFormat{\int_to_roman:n {#1}}} {0} }
- }
- }
- \cs_new:Npn \kal_bissextum_day:n #1 {
- \int_compare:nNnTF {#1} < {24}
- { \kal_day:n { \l_kal_month_length_int - #1 + 1 } }
- {
- \int_compare:nNnTF {#1} > {24}
- { \kal_day:n { \l_kal_month_length_int - #1 + 2 } }
- {
- \str_case_e:nnF { \l_kal_dayfmt_tl }
- {
- { latin } { \kal_ante_diem:nn {20} {1} }
- { roman } { \kal_ante_diem:nn {bis\ \KalDayFormat{vi} } {0} }
- { arabic } { \kal_ante_diem:nn {bis\ \KalDayFormat{6} } {0} }
- }
- { \kal_ante_diem:nn {bis\ \KalDayFormat{vi} } {0} }
- }
- }
- }
- \cs_new:Npn \kal_year:n #1 {
- \KalYearFormat{
- \str_case_e:nnF { \l_kal_yearfmt_tl }
- {
- { roman } { \int_to_roman:n {#1} }
- { arabic } { \int_eval:n {#1} }
- }
- { \int_to_roman:n {#1} }
- }
- }
- \int_new:N \l_kal_month_idx_int
- \int_new:N \l_kal_month_length_int
- \int_new:N \l_kal_month_ides_int
- \cs_new:Npn \kal_date:nnn #1#2#3 {
- \bool_if:nTF {\l_kal_oldmonths_bool}
- {
- \int_case:nnF {#2}
- {
- {7} { \int_set:Nn \l_kal_month_idx_int {13} }
- {8} { \int_set:Nn \l_kal_month_idx_int {14} }
- }
- { \int_set:Nn \l_kal_month_idx_int {#2} }
- }
- { \int_set:Nn \l_kal_month_idx_int {#2} }
- \int_compare:nNnTF {\l_kal_month_idx_int} = {2}
- {
- \int_compare:nNnTF { \int_mod:nn {#1} {4} } = {0}
- {
- \bool_if:nTF
- {
- \l_kal_julian_bool ||
- \int_compare_p:n { \int_mod:nn {#1} {100} != 0 }
- }
- { \int_set:Nn \l_kal_month_length_int {29} }
- {
- \int_compare:nNnTF { \int_mod:nn {#1} {400} } = {0}
- { \int_set:Nn \l_kal_month_length_int {29} }
- { \int_set:Nn \l_kal_month_length_int {28} }
- }
- }
- { \int_set:Nn \l_kal_month_length_int {28} }
- }
- {
- \int_set:Nn \l_kal_month_length_int
- { \clist_item:Nn \c_kal_month_lengths_clist {\l_kal_month_idx_int} }
- }
- \int_set:Nn \l_kal_month_ides_int
- { \clist_item:Nn \c_kal_month_ides_clist {\l_kal_month_idx_int} }
- \int_case:nnTF {#3}
- {
- { 1 } { \kal_abbr:nn {Kalendis} {Kal} }
- { \l_kal_month_ides_int - 8 } { \kal_abbr:nn {Nonis} {Non} }
- { \l_kal_month_ides_int } { \kal_abbr:nn {Idibus} {Id} }
- }
- { \ \kal_month:nn {\c_kal_month_abl_clist} {\l_kal_month_idx_int} }
- {
- \int_compare:nNnTF {#3} < { \l_kal_month_ides_int - 8 }
- {
- \kal_day:n { \l_kal_month_ides_int - #3 - 7 }
- \ \kal_abbr:nn {Nonas} {Non}
- \ \kal_month:nn {\c_kal_month_acc_clist} {\l_kal_month_idx_int}
- }
- {
- \int_compare:nNnTF {#3} < {\l_kal_month_ides_int}
- {
- \kal_day:n { \l_kal_month_ides_int - #3 + 1 }
- \ \kal_abbr:nn {Idus} {Id}
- \ \kal_month:nn {\c_kal_month_acc_clist} {\l_kal_month_idx_int}
- }
- {
- \bool_if:nTF
- {
- \int_compare_p:nNn {\l_kal_month_idx_int} = {2} &&
- \l_kal_bissextum_bool
- }
- { \kal_bissextum_day:n {#3} }
- {
- \kal_day:n { \l_kal_month_length_int - #3 + 2 }
- }
- \ \kal_abbr:nn {Kalendas} {Kal}
- \ \int_compare:nNnTF {\l_kal_month_idx_int} = {12}
- { \kal_month:nn {\c_kal_month_acc_clist} {1} }
- {
- \kal_month:nn {\c_kal_month_acc_clist}
- {\l_kal_month_idx_int + 1}
- }
- }
- }
- }
- \str_case_e:nn { \l_kal_era_tl }
- {
- { auc } {
- \ \KalYearFormat{
- \int_compare:nNnTF {#1} < {0}
- { \kal_year:n { #1 + 754 } }
- { \kal_year:n { #1 + 753 } }
- }
- \ \kal_abbr:nn {ab\ urbe\ condita}
- {\KalAbbrFormat{a \kal_period:n{} u \kal_period:n{} c}}
- }
- { ad } {
- \int_compare:nNnTF {#1} < {0}
- {
- \ \KalYearFormat{\kal_year:n {\int_abs:n {#1}}}
- \ \kal_abbr:nn {ante\ Christum}
- {\KalAbbrFormat{a \kal_period:n{} c}}
- }
- {
- \ \kal_abbr:nn {anno\ Domini}
- {\KalAbbrFormat{a \kal_period:n{} d}}
- \ \KalYearFormat{\kal_year:n {#1}}
- }
- }
- { adshort } {
- \int_compare:nNnTF {#1} < {0}
- {
- \ \KalYearFormat{\kal_year:n {\int_abs:n {#1}}}
- \ \kal_abbr:nn {ante\ Christum}
- {\KalAbbrFormat{a \kal_period:n{} c}}
- }
- {
- \ \kal_abbr:nn {anno} {\KalAbbrFormat{a}}
- \ \KalYearFormat{\kal_year:n {#1}}
- }
- }
- { secular } {
- \int_compare:nNnTF {#1} < {0}
- {
- \ \KalYearFormat{\kal_year:n {\int_abs:n {#1}}}
- \ \kal_abbr:nn {ante\ saeculum\ commune}
- {\KalAbbrFormat{a \kal_period:n{} s \kal_period:n{} c}}
- }
- {
- \ \kal_abbr:nn {saeculo\ communi}
- {\KalAbbrFormat{s \kal_period:n{} c}}
- \ \KalYearFormat{\kal_year:n {#1}}
- }
- }
- }
- }
- \int_new:N \l_kal_date_year_int
- \int_new:N \l_kal_date_month_int
- \int_new:N \l_kal_date_day_int
- \seq_new:N \l_kal_date_split_seq
- \int_new:N \l_kal_date_idx_int
- \cs_new:Npn \kal_date_string:nnn #1#2#3 {
- \seq_set_split:Nnn \l_kal_date_split_seq {#2} {#3}
- \int_set:Nn \l_kal_date_idx_int {1}
- \int_do_until:nNnn {\l_kal_date_idx_int} = {4}
- {
- \str_case_e:nn {\tl_item:nn {#1} {\l_kal_date_idx_int}}
- {
- { Y } { \int_gset:Nn \l_kal_date_year_int
- { \seq_item:Nn \l_kal_date_split_seq {\l_kal_date_idx_int} } }
- { M } { \int_gset:Nn \l_kal_date_month_int
- { \seq_item:Nn \l_kal_date_split_seq {\l_kal_date_idx_int} } }
- { D } { \int_gset:Nn \l_kal_date_day_int
- { \seq_item:Nn \l_kal_date_split_seq {\l_kal_date_idx_int} } }
- }
- \int_incr:N \l_kal_date_idx_int
- }
- \kal_date:nnn {\l_kal_date_year_int}
- {\l_kal_date_month_int}
- {\l_kal_date_day_int}
- }
- \cs_generate_variant:Nn \kal_date_string:nnn { nno }
- \int_new:N \l_kal_weekday_idx_int
- \int_new:N \l_kal_weekday_month_int
- \int_new:N \l_kal_weekday_year_int
- \int_new:N \l_kal_weekday_century_int
- \cs_new:Npn \kal_weekday:nnn #1#2#3 {
- \int_compare:nNnTF {#2} < {3}
- { \int_set:Nn \l_kal_weekday_month_int { #2 + 13 } }
- { \int_set:Nn \l_kal_weekday_month_int { #2 + 1 } }
- \int_set:Nn \l_kal_weekday_year_int { \int_mod:nn {#1} {100} }
- \int_set:Nn \l_kal_weekday_century_int { \fp_eval:n { floor(#1 / 100) } }
- \int_set:Nn \l_kal_weekday_idx_int {#3}
- \int_add:Nn \l_kal_weekday_idx_int
- { \fp_eval:n { floor(13 * \l_kal_weekday_month_int / 5) } }
- \int_add:Nn \l_kal_weekday_idx_int { \l_kal_weekday_year_int }
- \int_add:Nn \l_kal_weekday_idx_int
- { \fp_eval:n { floor(\l_kal_weekday_year_int / 4) } }
- \bool_if:nTF {\l_kal_julian_bool}
- { \int_add:Nn \l_kal_weekday_idx_int { 5 + 6 * \l_kal_weekday_century_int } }
- {
- \int_add:Nn \l_kal_weekday_idx_int { \fp_eval:n
- { 5 * \l_kal_weekday_century_int + floor(\l_kal_weekday_century_int / 4) }
- }
- }
- \int_set:Nn \l_kal_weekday_idx_int { \int_mod:nn {\l_kal_weekday_idx_int} {7} }
- \int_incr:N \l_kal_weekday_idx_int
- \kal_abbr:nn
- { \clist_item:Nn \c_kal_weekday_gen_clist { \l_kal_weekday_idx_int } }
- { \clist_item:Nn \c_kal_weekday_abbr_clist { \l_kal_weekday_idx_int } }
- }
- \DeclareDocumentCommand{\KalDate}{o m m m}
- {
- \IfValueTF{#1}
- {
- \group_begin:
- \keys_set:nn {kalendarium} {#1}
- \kal_date:nnn {#2} {#3} {#4}
- \group_end:
- }
- { \kal_date:nnn {#2} {#3} {#4} }
- }
- \DeclareDocumentCommand{\KalDateStr}{o m m m}
- {
- \IfValueTF{#1}
- {
- \group_begin:
- \keys_set:nn {kalendarium} {#1}
- \kal_date_string:nno {#2} {#3} {#4}
- \group_end:
- }
- { \kal_date_string:nno {#2} {#3} {#4} }
- }
- \DeclareDocumentCommand{\KalToday}{o}
- {
- \IfValueTF{#1}
- {
- \group_begin:
- \keys_set:nn {kalendarium} {#1}
- \kal_date:nnn {\the\year} {\the\month} {\the\day}
- \group_end:
- }
- { \kal_date:nnn {\the\year} {\the\month} {\the\day} }
- }
- \DeclareDocumentCommand{\KalWeekday}{o m m m}
- {
- \IfValueTF{#1}
- {
- \group_begin:
- \keys_set:nn {kalendarium} {#1}
- \kal_weekday:nnn {#2} {#3} {#4}
- \group_end:
- }
- { \kal_weekday:nnn {#2} {#3} {#4} }
- }
- \ExplSyntaxOff
- \newcommand{\KalAbbrFormat}[1]{\textsc{#1}}
- \newcommand{\KalDayFormat}[1]{\MakeUppercase{#1}}
- \newcommand{\KalYearFormat}[1]{\MakeUppercase{#1}}
- %%
- %% Copyright (C) 2018 by Andrew Smith <aws@awsmith.us>
- %%
- %% This work may be distributed and/or modified under the
- %% conditions of the LaTeX Project Public License (LPPL), either
- %% version 1.3c of this license or (at your option) any later
- %% version. The latest version of this license is in the file:
- %%
- %% http://www.latex-project.org/lppl.txt
- %%
- %% This work is "maintained" (as per LPPL maintenance status) by
- %% Andrew Smith.
- %%
- %% This work consists of the file kalendarium.dtx
- %% and the derived files kalendarium.ins,
- %% kalendarium.pdf and
- %% kalendarium.sty.
- %%
- %%
- %% End of file `kalendarium.sty'.
|