summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-02-03 22:47:00 +0000
committerKarl Berry <karl@freefriends.org>2019-02-03 22:47:00 +0000
commit94ca4d6eda3232fcca41b1f37bf34d12908406b3 (patch)
tree4fdb506244f0efaa914c9198c0359f3422611fb1 /Master/texmf-dist
parentc5d84d1a3ab85b1f314ff62717a7af3c6b75c7af (diff)
bxjaholiday (3feb19)
git-svn-id: svn://tug.org/texlive/trunk@49924 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/latex/bxjaholiday/LICENSE21
-rw-r--r--Master/texmf-dist/doc/latex/bxjaholiday/README.md62
-rw-r--r--Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.pdfbin0 -> 87495 bytes
-rw-r--r--Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.tex279
-rw-r--r--Master/texmf-dist/tex/latex/bxjaholiday/bxjaholiday.sty926
5 files changed, 1288 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/bxjaholiday/LICENSE b/Master/texmf-dist/doc/latex/bxjaholiday/LICENSE
new file mode 100644
index 00000000000..488617373db
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/bxjaholiday/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright 2018 Takuto ASAKURA (wtsnjp)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Master/texmf-dist/doc/latex/bxjaholiday/README.md b/Master/texmf-dist/doc/latex/bxjaholiday/README.md
new file mode 100644
index 00000000000..86ee29a75e5
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/bxjaholiday/README.md
@@ -0,0 +1,62 @@
+# BXjaholiday Package
+
+LaTeX: Support for Japanese holidays
+
+## System requirements
+
+* TeX format: LaTeX
+* TeX engine: pdfTeX, XeTeX, LuaTeX, pTeX, and upTeX (The e-TeX extension is **required**)
+
+## Usage
+
+This package provides following LaTeX2e commands:
+
+```tex
+\jaholidayname{<year>}{<month>}{<day>}
+\jadayofweek{<year>}{<month>}{<day>}
+\IfJaHoliday(TF){<year>}{<month>}{<day>}{<true code>}{<false code>}
+```
+
+Further functions are provided for expl3. See the manual (`bxjaholiday.pdf`) for the details.
+
+## Building
+
+You can easily build this package with [l3build](https://github.com/latex3/l3build).
+
+* Installing the package to TEXMFHOME
+
+```
+$ ./build.lua install --full
+```
+
+* Typesetting documentation
+
+```
+$ ./build.lua doc
+```
+
+* Running tests
+
+```
+$ ./build.lua check
+```
+
+## License
+
+This package is distributed under [the MIT license](./LICENSE).
+
+## Revision History
+
+* Version 1.0.0 ‹2019/02/03›
+ * Add documentation
+ * Rename `\g_bxjh_sport_tl` -> `\g_bxjh_sports_tl`
+* Version 0.2.0 ‹2019/01/27›
+ * Support special holidays in 2019
+ * Add new expl3 interface `\bxjh_apply_(next|prev)_day:Nnnn`
+ * Fix a potential bug
+* Version 0.1.0 ‹2018/12/03›
+ * The first public version
+
+---
+
+Takuto ASAKURA ([wtsnjp](https://twitter.com/wtsnjp))
diff --git a/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.pdf b/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.pdf
new file mode 100644
index 00000000000..a67a5cdb655
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.tex b/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.tex
new file mode 100644
index 00000000000..7980e7a8d16
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/bxjaholiday/bxjaholiday.tex
@@ -0,0 +1,279 @@
+%#!xelatex
+\RequirePackage{fontspec}
+\documentclass{l3doc}
+
+% packages
+\usepackage{bxjaholiday}
+\usepackage{caption}
+
+% fonts
+\newfontfamily{\fIpaex}{IPAexMincho}[Scale=0.95]
+\newcommand*{\Ja}[1]{{\fIpaex#1}}
+
+% logos
+\usepackage{bxtexlogo}
+\bxtexlogoimport{*}
+
+% syntax
+\newenvironment{code}{\quote\small}{\endquote}
+
+% cross-refs
+\usepackage{wtref}
+\newref{tab,sec}
+
+% macros
+\newcommand{\PkgName}{\pkg{bxjaholiday}}
+\newcommand{\Ie}{i.\,e.}
+\newcommand{\Eg}{e.\,g.}
+
+\ExplSyntaxOn
+\cs_set_eq:NN \_ \c_underscore_str
+\cs_new:Npn \__bxjh_doc_holiday_line:nn #1#2
+ {
+ % first column: holiday
+ #1 &
+ % second column: variable
+ \cs { g_bxjh_#2_tl } &
+ % third column: Name in Japanese
+ \Ja { \tl_use:c { g_bxjh_#2_tl } } \\
+ }
+\cs_new:Npn \__bxjh_doc_week_of_day:nn #1#2
+ {
+ % first column: holiday
+ #1 &
+ % second column: int variable
+ \cs { c_bxjh_ \tl_lower_case:n{ #1 } _int } &
+ % third column: int value
+ \int_use:c { c_bxjh_ \tl_lower_case:n{ #1 } _int } &
+ % fourth column: tl variable
+ \cs { g_bxjh_#2_tl } &
+ % fifth column: tl value
+ \Ja { \tl_use:c { g_bxjh_#2_tl } } \\
+ }
+\cs_new_eq:NN \HolidayLine \__bxjh_doc_holiday_line:nn
+\cs_new_eq:NN \WeekofdayLine \__bxjh_doc_week_of_day:nn
+\ExplSyntaxOff
+
+% metadata
+\GetFileInfo{\jobname.sty}
+\title{The {\PkgName} package}
+\author{Takuto ASAKURA (wtsnjp)}
+\date{\fileversion \quad [\filedate]}
+
+\begin{document}
+
+\maketitle
+
+\begin{abstract}
+This package provides a command to convert dates to names of Japanese holidays
+(\emph{shukujitsu}; \Ja{祝日}). For internal use, I need to implement a
+function to judge the day of week (\emph{youbi}; \Ja{曜日}), so a command
+converting dates to \emph{youbi} in the same manner is also available as a free
+gift. The equivalent functions and further (lower-level) APIs are provided for
+expl3.
+%All {\LaTeXe} and expl3 interfaces are (first-)fully expandable, so
+%those could be used almost anywhere in your documents.
+\end{abstract}
+
+%\tableofcontents
+
+\begin{documentation}
+
+%\section{Introduction}
+
+\section{System requirements}
+
+As one of the BX series\footnote{BX series is a collection of {\LaTeX} packages
+mainly developed by Takayuki YATO (a.k.a.~ZR.) ``BX'' stands for
+``\underline{b}abel e\underline{x}tensions'' and packages in this series are
+normally support various {\TeX} engines not only Japanese-specific ones
+({\pTeX}, {\upTeX}, and so on.)} packages, {\PkgName} supports all {\TeX}
+engines which supported by expl3 (\Ie, the {\eTeX} extension is required.)
+Specifically, following {\TeX} systems are supported:
+%
+\begin{itemize}
+\item {\TeX} format: {\LaTeXe}.
+\item {\TeX} engine: {\pdfTeX}, {\XeTeX}, {\LuaTeX},\footnote{Note that if you
+want to print Japanese characters with {\TeX} engines which is not specifically
+designed for Japanese, you need to setup proper fonts and other things.}
+{\pTeX}, and {\upTeX}.
+\end{itemize}
+
+\section{Loading the package}
+
+The package should be loaded in the usual {\LaTeXe} way. No package option is
+available.
+%
+\begin{code}
+|\usepackage{bxjaholiday}|
+\end{code}
+
+\section{{\LaTeXe} interfaces}
+
+\begin{function}[EXP]{\jaholidayname}
+\begin{syntax}
+|\jaholidayname|\marg{year}\marg{month}\marg{day}
+\end{syntax}
+%
+This command is expanded to the name of Japanese holiday corresponding to the
+specified date, if it is a holiday. For a date which is not a holiday, it will
+be expanded to nothing (an empty token.) See Table~\tabref{holidays} for all
+possible results.
+
+For \meta{year}, \meta{month}, and \meta{day}, you can explicitly write
+numbers, or use counters, \Eg, |\year|, |\month|, and |\day|. To be exact,
+those could be any \meta{integer expression}.
+\end{function}
+
+\begin{function}[EXP]{\jadayofweek}
+\begin{syntax}
+|\jadayofweek|\marg{year}\marg{month}\marg{day}
+\end{syntax}
+%
+This command converts from a date to the name of week, \Ie, one of \Ja{月, 火,
+水, 木, 金, 土, 日}. You can specify the arguments in exactly the same way as
+|\jaholidayname|.
+\end{function}
+
+\begin{function}[EXP]{\IfJaHolidayTF,\IfJaHolidayT,\IfJaHolidayF}
+\begin{syntax}
+|\IfJaHolidayTF|\marg{year}\marg{month}\marg{day}\marg{true code}\marg{false code}
+|\IfJaHolidayT|\marg{year}\marg{month}\marg{day}\marg{true code}
+|\IfJaHolidayF|\marg{year}\marg{month}\marg{day}\marg{false code}
+\end{syntax}
+%
+The |\IfJaHoliday(TF)| tests are used to check if a date is a Japanese holiday
+or not. Note that substitute holidays (\Ja{振替休日}) are also judged as a
+holiday in this test.
+\end{function}
+
+\section{expl3 interfaces}
+
+All expl3 interfaces provided by {\PkgName} belong to the \texttt{bxjh} module.
+
+\subsection{Functions}
+
+\begin{function}[EXP]{\bxjh_holiday_name:nnn}
+\begin{syntax}
+|\bxjh_holiday_name:nnn| \marg{year} \marg{month} \marg{day}
+\end{syntax}
+%
+This is expl3 version of |\jaholidayname|. It converts dates into Japanese
+holiday names.
+\end{function}
+
+\begin{function}[EXP]{\bxjh_day_of_week_name:nnn,\bxjh_day_of_week:nnn}
+\begin{syntax}
+|\bxjh_day_of_week_name:nnn| \marg{year} \marg{month} \marg{day}
+|\bxjh_day_of_week:nnn| \marg{year} \marg{month} \marg{day}
+\end{syntax}
+%
+|\bxjh_day_of_week_name:nnn| is an expl3 version of |\jadayofweek|. It converts
+a date into day of week in Japanese. To use that information in expl3, \Eg, for
+branching, |\bxjh_day_of_week:nnn| is more suitable. It returns an internal
+\texttt{int} value, so you can compare those results with the constants provided
+by this package. See Section~\secref{variables}.
+\end{function}
+
+\begin{function}[EXP,TF]{\bxjh_if_holiday:nnn}
+\begin{syntax}
+|\bxjh_if_holiday:nnnTF| \marg{year} \marg{month} \marg{day} \marg{true code} \marg{false code}
+\end{syntax}
+%
+This test is expl3 version of |\IfJaHoliday(TF)|.
+\end{function}
+
+\begin{function}[EXP]{\bxjh_apply_prev_day:Nnnn,\bxjh_apply_next_day:Nnnn}
+\begin{syntax}
+|\bxjh_apply_prev_day:Nnnn| \meta{function} \marg{year} \marg{month} \marg{day}
+|\bxjh_apply_next_day:Nnnn| \meta{function} \marg{year} \marg{month} \marg{day}
+\end{syntax}
+%
+These functions get previous/next day of the specified date, and apply it to
+the specified \meta{function}. The \meta{function} must take three arguments in
+the order. For example,
+%
+\begin{code}
+|\bxjh_apply_next_day:Nnnn \bxjh_holiday_name:nnn { 2019 } { 12 } { 31 }|
+\end{code}
+%
+produces the result of:
+%
+\begin{code}
+|\bxjh_holiday_name:nnn { 2020 } { 1 } { 1 }|
+\end{code}
+\end{function}
+
+\subsection{Variables and constants}\seclabel{variables}
+
+\paragraph{Names of Japanese holidays}
+
+All of them are provided as global \texttt{tl} variables. See
+Table~\tabref{holidays}.
+%
+\begin{table}[p]
+\centering\small
+\caption{Japanese holidays}
+\tablabel{holidays}
+\begin{tabular}{lll}
+\hline
+Holiday & Variable & Name in Japanese \\ \hline
+\HolidayLine{New Year's Day}{ganjitsu}
+\HolidayLine{Coming of Age Day}{seijin}
+\HolidayLine{National Foundation Day}{kenkoku}
+\HolidayLine{The Emperor's Birthday}{tennou}
+\HolidayLine{Vernal Equinox Day}{shunbun}
+\HolidayLine{Showa Day}{showa}
+\HolidayLine{Greenery Day}{midori}
+\HolidayLine{Constitution Memorial Day}{kenpou}
+\HolidayLine{National Holiday}{kokumin}
+\HolidayLine{Children's Day}{kodomo}
+\HolidayLine{(substitute holiday)}{furikae}
+\HolidayLine{Marine Day}{umi}
+\HolidayLine{Mountain Day}{yama}
+\HolidayLine{Autumnal Equinox Day}{shunbun}
+\HolidayLine{Respect for the Aged Day}{keirou}
+\HolidayLine{Sports Day}{sports}
+\HolidayLine{Health and Sports Day}{taiiku}
+\HolidayLine{Culture Day}{bunka}
+\HolidayLine{Labor Thanksgiving Day}{kinrou}
+\HolidayLine{National Mourning of Showa}{showa\_taisou}
+\HolidayLine{National Wedding of Akihito}{akihito\_kekkon}
+\HolidayLine{National Wedding of Naruhito}{naruhito\_kekkon}
+\HolidayLine{Core Enthronement Ceremony}{sokuirei}
+\HolidayLine{Coronation Day}{sokui}
+\hline
+\end{tabular}
+\end{table}
+
+\paragraph{Day of week}
+
+Internally, {\PkgName} uses integers to represent day of week, and corresponding
+\texttt{int} constants are defined. In addition to that, Japanese names of those
+are also provided as global \texttt{tl} variables. See
+Table~\tabref{dayofweek}.
+%
+\begin{table}[p]
+\centering\small
+\caption{Day of week}
+\tablabel{dayofweek}
+\begin{tabular}{l|lr|ll}
+\hline
+Day of week & Constant (\texttt{int}) & & Variable (\texttt{tl}) & \\ \hline
+\WeekofdayLine{Monday}{getsu}
+\WeekofdayLine{Tuesday}{ka}
+\WeekofdayLine{Wednesday}{sui}
+\WeekofdayLine{Thursday}{moku}
+\WeekofdayLine{Friday}{kin}
+\WeekofdayLine{Saturday}{do}
+\WeekofdayLine{Sunday}{nichi}
+\hline
+\end{tabular}
+\end{table}
+
+\end{documentation}
+
+%\PrintChanges
+
+\end{document}
+% vim: spell:
diff --git a/Master/texmf-dist/tex/latex/bxjaholiday/bxjaholiday.sty b/Master/texmf-dist/tex/latex/bxjaholiday/bxjaholiday.sty
new file mode 100644
index 00000000000..ce47457367b
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/bxjaholiday/bxjaholiday.sty
@@ -0,0 +1,926 @@
+%%
+%% This is file 'bxjaholiday.sty'.
+%%
+%% Copyright 2018 Takuto ASAKURA (wtsnjp)
+%% GitHub: https://github.com/wtsnjp
+%% Twitter: @wtsnjp
+%%
+%% This package is distributed under the MIT License.
+%%
+
+% Note: This file is encoded entirely in us-ascii.
+
+% -------------------------------------------------- declarations
+
+\RequirePackage{expl3}
+\ProvidesExplPackage {bxjaholiday} {2019/02/03} {1.0.0}
+ {Support for Japanese holidays}
+
+% -------------------------------------------------- utilities
+
+% LaTeX2e stuff
+%% \__bxjh_only_preamble:N \CS
+\cs_new_eq:Nc \__bxjh_only_preamble:N { @onlypreamble }
+
+% short hands
+%% \__bxjh_int_compare_and:nn(TF) { <intexpr1> } { <intexpr2> }
+%% ( { <true code> } ) ( { <false code> } )
+\prg_new_conditional:Npnn \__bxjh_int_compare_and:nn #1#2 { T, TF }
+ {
+ \bool_lazy_and:nnTF
+ { \int_compare_p:n { #1 } }
+ { \int_compare_p:n { #2 } }
+ { \prg_return_true: } { \prg_return_false: }
+ }
+
+%% \__bxjh_date_compare(_p):nn(TF)
+%% { <year1> } { <month1> } { <day1> } <rel> { <year2> } { <month2> } { <day2> }
+%% ( { <true code> } ) ( { <false code> } )
+\prg_new_conditional:Npnn \__bxjh_date_compare:nnnNnnn #1#2#3#4#5#6#7 { p, T, TF }
+ {
+ \int_compare:nNnTF
+ { ( #1 ) * 10000 + ( #2 ) * 100 + ( #3 ) }
+ #4 % relation
+ { ( #5 ) * 10000 + ( #6 ) * 100 + ( #7 ) }
+ { \prg_return_true: } { \prg_return_false: }
+ }
+
+% -------------------------------------------------- messages
+
+\msg_new:nnn { bxjaholiday } { unknown-engine }
+ {
+ Unknown~TeX~engine; \\
+ loading~bxjaholiday~will~abort!
+ }
+
+% -------------------------------------------------- constants
+
+\int_const:Nn \c_bxjh_monday_int { 0 }
+\int_const:Nn \c_bxjh_tuesday_int { 1 }
+\int_const:Nn \c_bxjh_wednesday_int { 2 }
+\int_const:Nn \c_bxjh_thursday_int { 3 }
+\int_const:Nn \c_bxjh_friday_int { 4 }
+\int_const:Nn \c_bxjh_saturday_int { 5 }
+\int_const:Nn \c_bxjh_sunday_int { 6 }
+
+% -------------------------------------------------- Japanese string maker
+
+%% \__bxjh_next:n { <char> }
+\cs_new:Npn \__bxjh_next:n #1 {}
+
+%% \__bxjh_add_jchar:Nnnn <tl-var> { <hex-dump-of-utf8-bytes> }
+%% { <hex-dump-of-unicode-point> } { <hex-dump-of-JIS-bytes> }
+\__bxjh_only_preamble:N \__bxjh_add_jchar:Nnnn
+\__bxjh_only_preamble:N \__bxjh_add_jchar_dec:nnn
+\__bxjh_only_preamble:N \__bxjh_add_jchar_dec_helper:n
+
+\cs_new:Npn \__bxjh_add_jchar:Nnnn #1#2#3#4
+ {
+ \group_begin:
+ \cs_set:Npn \__bxjh_next:n ##1
+ {
+ \tl_gset:Nx #1 { \exp_not:o { #1 } ##1 }
+ }
+ \__bxjh_add_jchar_dec:nnn { #2 } { #3 } { #4 }
+ \group_end:
+ }
+
+% engine-dependent parts
+\str_case_e:nnF { \c_sys_engine_str }
+ {
+ { pdftex }
+ {
+ \cs_new:Npn \__bxjh_add_jchar_dec:nnn #1#2#3
+ {
+ \__bxjh_add_jchar_dec_helper:n { #1 }
+ }
+ \cs_new:Npn \__bxjh_add_jchar_dec_helper:n #1
+ {
+ % #1 should have three tl items
+ \tl_map_inline:nn { #1 }
+ {
+ \tl_set_rescan:Nnx \l_tmpa_tl
+ { \char_set_catcode_active:n { "##1 } }
+ { \char_generate:nn { "##1 } { 12 } }
+ \__bxjh_next:n { \exp_not:o { \l_tmpa_tl } }
+ }
+ }
+ }
+
+ { ptex }
+ {
+ \cs_new:Npn \__bxjh_add_jchar_dec:nnn #1#2#3
+ {
+ \ptex_kansujichar:D \c_one_int = \ptex_jis:D "#3 \scan_stop:
+ \__bxjh_next:n { \ptex_kansuji:D \c_one_int }
+ }
+ }
+
+ { uptex }
+ {
+ \cs_new:Npn \__bxjh_add_jchar_dec:nnn #1#2#3
+ {
+ \ptex_kansujichar:D \c_one_int = \ptex_jis:D "#3 \scan_stop:
+ \__bxjh_next:n { \ptex_kansuji:D \c_one_int }
+ }
+ }
+
+ { xetex }
+ {
+ \cs_new:Npn \__bxjh_add_jchar_dec:nnn #1#2#3
+ {
+ \__bxjh_next:n { \char_generate:nn { "#2 } { 11 } }
+ }
+ }
+
+ { luatex }
+ {
+ \cs_new:Npn \__bxjh_add_jchar_dec:nnn #1#2#3
+ {
+ \__bxjh_next:n { \char_generate:nn { "#2 } { 11 } }
+ }
+ }
+ }
+ {
+ % engines which expl3 does not support
+ \msg_warning:nn { bxjaholiday } { unknown-engine }
+ \file_input_stop:
+ }
+
+% -------------------------------------------------- Japanese words
+
+% youbi
+\tl_new:N \g_bxjh_getsu_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_getsu_tl { {E6}{9C}{88} } { 6708 } { 376E }
+
+\tl_new:N \g_bxjh_ka_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_ka_tl { {E7}{81}{AB} } { 706B } { 3250 }
+
+\tl_new:N \g_bxjh_sui_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_sui_tl { {E6}{B0}{B4} } { 6C34 } { 3F65 }
+
+\tl_new:N \g_bxjh_moku_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_moku_tl { {E6}{9C}{A8} } { 6728 } { 4C5A }
+
+\tl_new:N \g_bxjh_kin_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kin_tl { {E9}{87}{91} } { 91D1 } { 3662 }
+
+\tl_new:N \g_bxjh_do_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_do_tl { {E5}{9C}{9F} } { 571F } { 455A }
+
+\tl_new:N \g_bxjh_nichi_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_nichi_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+% common holidays
+\tl_new:N \g_bxjh_ganjitsu_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_ganjitsu_tl { {E5}{85}{83} } { 5143 } { 3835 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_ganjitsu_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_seijin_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_seijin_tl { {E6}{88}{90} } { 6210 } { 402E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_seijin_tl { {E4}{BA}{BA} } { 4EBA } { 3F4D }
+\__bxjh_add_jchar:Nnnn \g_bxjh_seijin_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_seijin_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_kenkoku_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E5}{BB}{BA} } { 5EFA } { 377A }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E5}{9B}{BD} } { 56FD } { 3971 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E8}{A8}{98} } { 8A18 } { 352D }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E5}{BF}{B5} } { 5FF5 } { 4730 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenkoku_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_tennou_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_tennou_tl { {E5}{A4}{A9} } { 5929 } { 4537 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_tennou_tl { {E7}{9A}{87} } { 7687 } { 3944 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_tennou_tl { {E8}{AA}{95} } { 8A95 } { 4342 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_tennou_tl { {E7}{94}{9F} } { 751F } { 4038 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_tennou_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_shunbun_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_shunbun_tl { {E6}{98}{A5} } { 6625 } { 3D55 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shunbun_tl { {E5}{88}{86} } { 5206 } { 4A2C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shunbun_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shunbun_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_showa_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_tl { {E6}{98}{AD} } { 662D } { 3E3C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_tl { {E5}{92}{8C} } { 548C } { 4F42 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_midori_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_midori_tl { {E3}{81}{BF} } { 307F } { 245F }
+\__bxjh_add_jchar:Nnnn \g_bxjh_midori_tl { {E3}{81}{A9} } { 3069 } { 2449 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_midori_tl { {E3}{82}{8A} } { 308A } { 246A }
+\__bxjh_add_jchar:Nnnn \g_bxjh_midori_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_midori_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_kenpou_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenpou_tl { {E6}{86}{B2} } { 61B2 } { 377B }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenpou_tl { {E6}{B3}{95} } { 6CD5 } { 4B21 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenpou_tl { {E8}{A8}{98} } { 8A18 } { 352D }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenpou_tl { {E5}{BF}{B5} } { 5FF5 } { 4730 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kenpou_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_kokumin_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kokumin_tl { {E5}{9B}{BD} } { 56FD } { 3971 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kokumin_tl { {E6}{B0}{91} } { 6C11 } { 4C31 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kokumin_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kokumin_tl { {E4}{BC}{91} } { 4F11 } { 3559 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kokumin_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_kodomo_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kodomo_tl { {E3}{81}{93} } { 3053 } { 2433 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kodomo_tl { {E3}{81}{A9} } { 3069 } { 2449 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kodomo_tl { {E3}{82}{82} } { 3082 } { 2462 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kodomo_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kodomo_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_furikae_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_furikae_tl { {E6}{8C}{AF} } { 632F } { 3F36 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_furikae_tl { {E6}{9B}{BF} } { 66FF } { 4258 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_furikae_tl { {E4}{BC}{91} } { 4F11 } { 3559 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_furikae_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_umi_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_umi_tl { {E6}{B5}{B7} } { 6D77 } { 3324 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_umi_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_umi_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_yama_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_yama_tl { {E5}{B1}{B1} } { 5C71 } { 3B33 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_yama_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_yama_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_shubun_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_shubun_tl { {E7}{A7}{8B} } { 79CB } { 3D29 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shubun_tl { {E5}{88}{86} } { 5206 } { 4A2C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shubun_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_shubun_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_keirou_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_keirou_tl { {E6}{95}{AC} } { 656C } { 3749 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_keirou_tl { {E8}{80}{81} } { 8001 } { 4F37 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_keirou_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_keirou_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_sports_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E3}{82}{B9} } { 30B9 } { 2539 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E3}{83}{9D} } { 30DD } { 255D }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E3}{83}{BC} } { 30FC } { 213C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E3}{83}{84} } { 30C4 } { 2544 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sports_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_taiiku_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_taiiku_tl { {E4}{BD}{93} } { 4F53 } { 424E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_taiiku_tl { {E8}{82}{B2} } { 80B2 } { 3069 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_taiiku_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_taiiku_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_bunka_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_bunka_tl { {E6}{96}{87} } { 6587 } { 4A38 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_bunka_tl { {E5}{8C}{96} } { 5316 } { 323D }
+\__bxjh_add_jchar:Nnnn \g_bxjh_bunka_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_bunka_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+\tl_new:N \g_bxjh_kinrou_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E5}{8B}{A4} } { 52E4 } { 3650 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E5}{8A}{B4} } { 52B4 } { 4F2B }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E6}{84}{9F} } { 611F } { 3436 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E8}{AC}{9D} } { 8B1D } { 3C55 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_kinrou_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+% special holidays (mainly Emperor related)
+\tl_new:N \g_bxjh_showa_taisou_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E6}{98}{AD} } { 662D } { 3E3C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E5}{92}{8C} } { 548C } { 4F42 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E5}{A4}{A9} } { 5929 } { 4537 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E7}{9A}{87} } { 7687 } { 3944 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E5}{A4}{A7} } { 5927 } { 4267 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E5}{96}{AA} } { 55AA } { 4153 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_showa_taisou_tl { {E7}{A4}{BC} } { 793C } { 4E69 }
+
+\tl_new:N \g_bxjh_akihito_kekkon_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E7}{9A}{87} } { 7687 } { 3944 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E5}{A4}{AA} } { 592A } { 4240 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E5}{AD}{90} } { 5B50 } { 3B52 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E6}{98}{8E} } { 660E } { 4C40 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E4}{BB}{81} } { 4EC1 } { 3F4E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E8}{A6}{AA} } { 89AA } { 3F46 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E7}{8E}{8B} } { 738B } { 3226 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E7}{B5}{90} } { 7D50 } { 376B }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E5}{A9}{9A} } { 5A5A } { 3A27 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_akihito_kekkon_tl { {E5}{84}{80} } { 5100 } { 3537 }
+
+\tl_new:N \g_bxjh_naruhito_kekkon_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E7}{9A}{87} } { 7687 } { 3944 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E5}{A4}{AA} } { 592A } { 4240 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E5}{AD}{90} } { 5B50 } { 3B52 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E5}{BE}{B3} } { 5FB3 } { 4641 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E4}{BB}{81} } { 4EC1 } { 3F4E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E8}{A6}{AA} } { 89AA } { 3F46 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E7}{8E}{8B} } { 738B } { 3226 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E7}{B5}{90} } { 7D50 } { 376B }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E5}{A9}{9A} } { 5A5A } { 3A27 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_naruhito_kekkon_tl { {E5}{84}{80} } { 5100 } { 3537 }
+
+\tl_new:N \g_bxjh_sokuirei_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E5}{8D}{B3} } { 5373 } { 4228 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E4}{BD}{8D} } { 4F4D } { 304C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E7}{A4}{BC} } { 793C } { 4E69 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E6}{AD}{A3} } { 6B63 } { 4035 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E6}{AE}{BF} } { 6BBF } { 4542 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokuirei_tl { {E5}{84}{80} } { 5100 } { 3537 }
+
+\tl_new:N \g_bxjh_sokui_tl
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokui_tl { {E5}{8D}{B3} } { 5373 } { 4228 }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokui_tl { {E4}{BD}{8D} } { 4F4D } { 304C }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokui_tl { {E3}{81}{AE} } { 306E } { 244E }
+\__bxjh_add_jchar:Nnnn \g_bxjh_sokui_tl { {E6}{97}{A5} } { 65E5 } { 467C }
+
+% -------------------------------------------------- day of week
+
+%% \bxjh_day_of_week_name:nnn { <year> } { <month> } { <day> }
+%% \bxjh_day_of_week:nnn { <year> } { <month> } { <day> }
+% The calculation is based on Zeller's congruence:
+%
+% W = y + floor ( y / 4 ) + floor ( h / 4 ) + ( 5 * h )
+% + floor ( ( 13 * ( m + 1 ) ) / 5 ) + d
+%
+% where
+%
+% h = \int_div_truncate:nn { #1 } { 100 } ,
+% y = \int_mod:nn { #1 } { 100 } ,
+% m = #2 ,
+% d = #3 .
+%
+% Note that January and February needs to be treated as 13th and 14th
+% month of the former year respectively.
+\cs_new:Npn \bxjh_day_of_week_name:nnn #1#2#3
+ {
+ \int_case:nn { \bxjh_day_of_week:nnn { #1 } { #2 } { #3 } }
+ {
+ { \c_bxjh_monday_int } { \g_bxjh_getsu_tl }
+ { \c_bxjh_tuesday_int } { \g_bxjh_ka_tl }
+ { \c_bxjh_wednesday_int } { \g_bxjh_sui_tl }
+ { \c_bxjh_thursday_int } { \g_bxjh_moku_tl }
+ { \c_bxjh_friday_int } { \g_bxjh_kin_tl }
+ { \c_bxjh_saturday_int } { \g_bxjh_do_tl }
+ { \c_bxjh_sunday_int } { \g_bxjh_nichi_tl }
+ }
+ }
+
+\cs_new:Npn \bxjh_day_of_week:nnn #1#2#3
+ {
+ \int_compare:nNnTF { #2 } < { 3 }
+ {
+ \__bxjh_zeller:nnn { #1 - 1 } { #2 + 12 } { #3 }
+ }
+ {
+ \__bxjh_zeller:nnn { #1 } { #2 } { #3 }
+ }
+ }
+
+\cs_new:Npn \__bxjh_zeller:nnn #1#2#3
+ {
+ \int_mod:nn
+ {
+ \int_mod:nn { #1 } { 100 }
+ + \int_div_truncate:nn { \int_mod:nn { #1 } { 100 } } { 4 }
+ + \int_div_truncate:nn { \int_div_truncate:nn { #1 } { 100 } } { 4 }
+ + ( 5 * \int_div_truncate:nn { #1 } { 100 } )
+ + \int_div_truncate:nn { ( 13 * ( #2 + 1 ) ) } { 5 }
+ + #3 + 5
+ }
+ { 7 }
+ }
+
+% -------------------------------------------------- next/prev day
+
+%% \__bxjh_number_of_days_in_month:nn { <year> } { <month> }
+\cs_new:Npn \__bxjh_number_of_days_in_month:nn #1#2
+ {
+ \int_case:nn { #2 }
+ {
+ { 1 } { 31 } % January
+ { 2 } % February
+ {
+ \int_compare:nNnTF { \int_mod:nn { #1 } { 4 } } = { 0 }
+ {
+ \__bxjh_int_compare_and:nnTF
+ { \int_mod:nn { #1 } { 100 } = 0 }
+ { \int_mod:nn { #1 } { 400 } > 0 }
+ { 28 }
+ { 29 } % leap year
+ }
+ { 28 }
+ }
+ { 3 } { 31 } % March
+ { 4 } { 30 } % April
+ { 5 } { 31 } % May
+ { 6 } { 30 } % June
+ { 7 } { 31 } % July
+ { 8 } { 31 } % August
+ { 9 } { 30 } % September
+ { 10 } { 31 } % October
+ { 11 } { 30 } % November
+ { 12 } { 31 } % December
+ }
+ }
+
+%% \__bxjh_apply_after_int_eval:Nnnn \CS { <intexpr1> } { <intexpr2> } { <intexpr3> }
+% this is for calculation efficiency
+\cs_new:Npn \__bxjh_apply_after_int_eval:Nnnn #1#2#3#4
+ {
+ \exp_args:Nfff #1
+ { \int_eval:n { #2 } } { \int_eval:n { #3 } } { \int_eval:n { #4 } }
+ }
+
+% get \exp_args:Nfff
+\exp_args_generate:n { fff }
+
+%% \bxjh_apply_next_day:Nnnn \CS { <year> } { <month> } { <day> }
+\cs_new:Npn \bxjh_apply_next_day:Nnnn #1#2#3#4
+ {
+ \int_compare:nNnTF
+ { #4 } < { \__bxjh_number_of_days_in_month:nn { #2 } { #3 } }
+ {
+ % just next day in the month
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 } { #3 } { #4 + 1 }
+ }
+ {
+ \int_compare:nNnTF { #3 } < { 12 }
+ {
+ % the first day of next month
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 } { #3 + 1 } { 1 }
+ }
+ {
+ % the first day of next year
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 + 1 } { 1 } { 1 }
+ }
+ }
+ }
+
+%% \bxjh_apply_prev_day:Nnnn \CS { <year> } { <month> } { <day> }
+\cs_new:Npn \bxjh_apply_prev_day:Nnnn #1#2#3#4
+ {
+ \int_compare:nNnTF { #4 } > { 1 }
+ {
+ % just prev day in the month
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 } { #3 } { #4 - 1 }
+ }
+ {
+ \int_compare:nNnTF { #3 } > { 1 }
+ {
+ % the last day of prev month
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 } { #3 - 1 }
+ { \__bxjh_number_of_days_in_month:nn { #2 } { #3 - 1 } }
+ }
+ {
+ % the last day of prev year
+ \__bxjh_apply_after_int_eval:Nnnn #1 { #2 - 1 } { 12 } { 31 }
+ }
+ }
+ }
+
+% -------------------------------------------------- holidays
+
+%% \__bxjh_vernal_equinox:n { <year> }
+\cs_new:Npn \__bxjh_vernal_equinox:n #1
+ {
+ \int_compare:nNnTF { #1 } < { 1948 }
+ {
+ 99 % before the Act on National Holidays
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 1980 }
+ {
+ \__bxjh_va_formula:nn { 20.8357 } { #1 }
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 2100 }
+ {
+ \__bxjh_va_formula:nn { 20.8431 } { #1 }
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 2151 }
+ {
+ \__bxjh_va_formula:nn { 20.8510 } { #1 }
+ }
+ {
+ 99 % unknown because no calculation formula
+ }
+ }
+ }
+ }
+ }
+
+%% \__bxjh_autumn_equinox:n { <year> }
+\cs_new:Npn \__bxjh_autumn_equinox:n #1
+ {
+ \int_compare:nNnTF { #1 } < { 1948 }
+ {
+ 99 % before the Act on National Holidays
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 1980 }
+ {
+ \__bxjh_va_formula:nn { 23.2588 } { #1 }
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 2100 }
+ {
+ \__bxjh_va_formula:nn { 23.2488 } { #1 }
+ }
+ {
+ \int_compare:nNnTF { #1 } < { 2151 }
+ {
+ \__bxjh_va_formula:nn { 24.2488 } { #1 }
+ }
+ {
+ 99 % unknown because no calculation formula
+ }
+ }
+ }
+ }
+ }
+
+%% \__bxjh_va_formula:nn { <magic> } { <year> }
+\cs_new:Npn \__bxjh_va_formula:nn #1#2
+ {
+ \fp_eval:n {
+ floor (
+ #1 + 0.242194 * ( #2 - 1980 ) - \int_div_truncate:nn { #2 - 1980 } { 4 }
+ )
+ }
+ }
+
+%% \bxjh_holiday_name:nnn { <year> } { <month> } { <day> }
+\cs_new:Npn \bxjh_holiday_name:nnn #1#2#3
+ {
+ \exp_args:Nf \__bxjh_holiday_name_wrapper:nnnn
+ { \__bxjh_holiday_name_naive:nnn { #1 } { #2 } { #3 } }
+ { #1 } { #2 } { #3 }
+ }
+
+%% \__bxjh_holiday_name_wrapper:nnnn { <naive holiday name> }
+%% { <year> } { <month> } { <day> }
+\cs_set:Npn \__bxjh_holiday_name_wrapper:nnnn #1#2#3#4
+ {
+ \tl_if_empty:nTF { #1 }
+ {
+ \bool_lazy_and:nnT
+ {
+ \__bxjh_date_compare_p:nnnNnnn
+ { #2 } { #3 } { #4 } > { 1973 } { 4 } { 11 }
+ }
+ {
+ \int_compare_p:n
+ {
+ \bxjh_day_of_week:nnn { #2 } { #3 } { #4 } = \c_bxjh_monday_int
+ }
+ }
+ {
+ \bxjh_apply_prev_day:Nnnn \bxjh_if_holiday:nnnT
+ { #2 } { #3 } { #4 } { \g_bxjh_furikae_tl }
+ }
+ }
+ { #1 }
+ }
+
+%% \__bxjh_holiday_name_naive:nnn { <year> } { <month> } { <day> }
+\cs_new:Npn \__bxjh_holiday_name_naive:nnn #1#2#3
+ {
+ \__bxjh_date_compare:nnnNnnnTF { #1 } { #2 } { #3 } < { 1948 } { 7 } { 20 }
+ {
+ % empty because before the Act on National Holidays
+ }
+ {
+ \int_case:nn { #2 }
+ {
+ { 1 } % January
+ {
+ \int_compare:nNnTF { #3 } = { 1 }
+ { \g_bxjh_ganjitsu_tl }
+ {
+ \int_compare:nNnTF { #1 } > { 1999 }
+ {
+ \__bxjh_int_compare_and:nnT % second Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 1 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_seijin_tl }
+ }
+ {
+ \int_compare:nNnT { #3 } = { 15 }
+ { \g_bxjh_seijin_tl }
+ }
+ }
+ }
+
+ { 2 } % February
+ {
+ \__bxjh_int_compare_and:nnTF { #3 = 11 } { #1 > 1966 }
+ { \g_bxjh_kenkoku_tl }
+ {
+ \__bxjh_int_compare_and:nnTF { #3 = 23 } { #1 > 2019 }
+ { \g_bxjh_tennou_tl } % the "next" era (2020-)
+ {
+ \__bxjh_date_compare:nnnNnnnT
+ { #1 } { #2 } { #3 } = { 1989 } { 2 } { 24 }
+ { \g_bxjh_showa_taisou_tl }
+ }
+ }
+ }
+
+ { 3 } % March
+ {
+ \int_compare:nNnT { #3 } = { \__bxjh_vernal_equinox:n { #1 } }
+ { \g_bxjh_shunbun_tl }
+ }
+
+ { 4 } % April
+ {
+ \int_compare:nNnTF { #3 } = { 29 }
+ {
+ \int_compare:nNnTF { #1 } > { 2006 }
+ { \g_bxjh_showa_tl }
+ {
+ \int_compare:nNnTF { #1 } > { 1988 }
+ { \g_bxjh_midori_tl }
+ { \g_bxjh_tennou_tl } % the Showa period
+ }
+ }
+ {
+ \__bxjh_date_compare:nnnNnnnTF
+ { #1 } { #2 } { #3 } = { 2019 } { 4 } { 30 }
+ { \g_bxjh_kokumin_tl } % the abdication of the Heisei Emperor
+ {
+ \__bxjh_date_compare:nnnNnnnT
+ { #1 } { #2 } { #3 } = { 1959 } { 4 } { 10 }
+ { \g_bxjh_akihito_kekkon_tl }
+ }
+ }
+ }
+
+ { 5 } % May
+ {
+ \int_compare:nNnTF { #3 } = { 3 }
+ { \g_bxjh_kenpou_tl }
+ {
+ \int_compare:nNnTF { #3 } = { 4 }
+ {
+ \int_compare:nNnTF { #1 } > { 2006 }
+ { \g_bxjh_midori_tl }
+ {
+ \int_compare:nNnT { #1 } > { 1985 }
+ {
+ \int_case:nnF % if later than Tuesday (Tue. - Sat.)
+ { \bxjh_day_of_week:nnn { #1 } { #2 } { #3 } }
+ {
+ { \c_bxjh_monday_int } {} % substitute for Constitution Day
+ { \c_bxjh_sunday_int } {} % just a "normal" Sunday
+ }
+ { \g_bxjh_kokumin_tl }
+ }
+ }
+ }
+ {
+ \int_compare:nNnTF { #3 } = { 5 }
+ { \g_bxjh_kodomo_tl }
+ {
+ \int_compare:nNnTF { #3 } = { 6 }
+ {
+ \int_compare:nNnT { #1 } > { 2006 }
+ {
+ \int_case:nn
+ { \bxjh_day_of_week:nnn { #1 } { #2 } { #3 } }
+ {
+ { \c_bxjh_tuesday_int } { \g_bxjh_furikae_tl }
+ { \c_bxjh_wednesday_int } { \g_bxjh_furikae_tl }
+ }
+ }
+ }
+ {
+ \__bxjh_date_compare:nnnNnnnTF
+ { #1 } { #2 } { #3 } = { 2019 } { 5 } { 1 }
+ { \g_bxjh_sokui_tl } % Naruhito
+ {
+ \__bxjh_date_compare:nnnNnnnT
+ { #1 } { #2 } { #3 } = { 2019 } { 5 } { 2 }
+ { \g_bxjh_kokumin_tl }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ { 6 } % June
+ {
+ \__bxjh_date_compare:nnnNnnnT { #1 } { #2 } { #3 } = { 1993 } { 6 } { 9 }
+ { \g_bxjh_naruhito_kekkon_tl }
+ }
+
+ { 7 } % July
+ {
+ \int_compare:nNnTF { #1 } > { 2020 }
+ {
+ \__bxjh_int_compare_and:nnT % third Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 2 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_umi_tl }
+ }
+ {
+ \int_compare:nNnTF { #1 } = { 2020 }
+ {
+ % 2020 Tokyo Olympic year: special case
+ \int_compare:nNnTF { #3 } = { 23 }
+ { \g_bxjh_umi_tl }
+ {
+ \int_compare:nNnT { #3 } = { 24 }
+ { \g_bxjh_sports_tl }
+ }
+ }
+ {
+ \int_compare:nNnTF { #1 } > { 2002 }
+ {
+ \__bxjh_int_compare_and:nnT % third Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 2 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_umi_tl }
+ }
+ {
+ \__bxjh_int_compare_and:nnT { #1 > 1995 } { #3 = 20 }
+ { \g_bxjh_umi_tl }
+ }
+ }
+ }
+ }
+
+ { 8 } % August
+ {
+ \int_compare:nNnTF { #1 } > { 2020 }
+ {
+ \int_compare:nNnT { #3 } = { 11 }
+ { \g_bxjh_yama_tl }
+ }
+ {
+ \int_compare:nNnTF { #1 } = { 2020 }
+ {
+ % 2020 Tokyo Olympic year: special case
+ \int_compare:nNnT { #3 } = { 10 }
+ { \g_bxjh_yama_tl }
+ }
+ {
+ \__bxjh_int_compare_and:nnT { #1 > 2015 } { #3 = 11 }
+ { \g_bxjh_yama_tl }
+ }
+ }
+ }
+
+ { 9 } % September
+ {
+ \int_compare:nNnTF { #3 } = { \__bxjh_autumn_equinox:n { #1 } }
+ { \g_bxjh_shubun_tl }
+ {
+ \int_compare:nNnTF { #1 } > { 2002 }
+ {
+ \__bxjh_int_compare_and:nnTF % third Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 2 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_keirou_tl }
+ {
+ \__bxjh_int_compare_and:nnT
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_tuesday_int
+ }
+ { #3 = \__bxjh_autumn_equinox:n { #1 } - 1 }
+ { \g_bxjh_kokumin_tl }
+ }
+ }
+ {
+ \__bxjh_int_compare_and:nnT { #1 > 1965 } { #3 = 15 }
+ { \g_bxjh_keirou_tl }
+ }
+ }
+ }
+
+ { 10 } % October
+ {
+ \int_compare:nNnTF { #1 } > { 2020 }
+ {
+ \__bxjh_int_compare_and:nnT % second Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 1 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_sports_tl }
+ }
+ {
+ \int_compare:nNnTF { #1 } = { 2020 }
+ {
+ % pass because of 2020 Tokyo Olympic
+ }
+ {
+ \int_compare:nNnTF { #1 } > { 1999 }
+ {
+ \__bxjh_int_compare_and:nnTF % second Monday
+ { \int_div_truncate:nn { #3 - 1 } { 7 } = 1 }
+ {
+ \bxjh_day_of_week:nnn { #1 } { #2 } { #3 }
+ = \c_bxjh_monday_int
+ }
+ { \g_bxjh_taiiku_tl }
+ {
+ \__bxjh_date_compare:nnnNnnnT
+ { #1 } { #2 } { #3 } = { 2019 } { 10 } { 22 }
+ { \g_bxjh_sokuirei_tl } % Naruhito
+ }
+ }
+ {
+ \__bxjh_int_compare_and:nnT
+ { #1 > 1965 } { #3 = 10 }
+ { \g_bxjh_taiiku_tl }
+ }
+ }
+ }
+ }
+
+ { 11 } % November
+ {
+ \int_compare:nNnTF { #3 } = { 3 }
+ { \g_bxjh_bunka_tl }
+ {
+ \int_compare:nNnTF { #3 } = { 23 }
+ { \g_bxjh_kinrou_tl }
+ {
+ \__bxjh_date_compare:nnnNnnnT
+ { #1 } { #2 } { #3 } = { 1990 } { 11 } { 12 }
+ { \g_bxjh_sokuirei_tl }
+ }
+ }
+ }
+
+ { 12 } % December
+ {
+ \int_compare:nNnT { #3 } = { 23 }
+ {
+ \__bxjh_int_compare_and:nnT
+ { #1 > 1988 } { #1 < 2019 }
+ { \g_bxjh_tennou_tl } % the Heisei period
+ }
+ }
+ }
+ }
+ }
+
+%% \bxjh_if_holiday:nnn(TF) { <year> } { <month> } { <day> }
+%% ( { <true code> } ) ( { <false code> } )
+\prg_new_conditional:Npnn \bxjh_if_holiday:nnn #1#2#3 { T, F, TF }
+ {
+ \exp_args:Nf \tl_if_empty:nTF
+ { \bxjh_holiday_name:nnn { #1 } { #2 } { #3 } }
+ { \prg_return_false: }
+ { \prg_return_true: }
+ }
+
+% -------------------------------------------------- LaTeX2e interface
+
+%% \jaholidayname { <year> } { <month> } { <day> }
+\cs_new_eq:NN \jaholidayname \bxjh_holiday_name:nnn
+
+%% \jadayofweek { <year> } { <month> } { <day> }
+\cs_new_eq:NN \jadayofweek \bxjh_day_of_week_name:nnn
+
+%% \IfJaHoliday(TF) { <year> } { <month> } { <day> }
+%% ( { <true code> } ) ( { <false code> } )
+\cs_new_eq:NN \IfJaHolidayF \bxjh_if_holiday:nnnF
+\cs_new_eq:NN \IfJaHolidayT \bxjh_if_holiday:nnnT
+\cs_new_eq:NN \IfJaHolidayTF \bxjh_if_holiday:nnnTF
+
+% vim: ft=expl3 nospell:
+%% EOF