最終更新:2014-04-22 (火) 04:41:18 (1641d)

TeXマクロ

カレンダー

jcalendar.sty (未完成)

年月日を指定して,その日の曜日を取得するコマンドと,年月を指定してその 月の日数を取得するコマンドを実装すればすぐにできるはず.続きは誰かの手に…

未実装の関数

  • \Jc@set@theday#1#2#3 (#1年#2月#3日の)曜日の取得
  • \Jc@set@days#1#2 (#1年#2月の)日数の取得
\ProvidesPackage{jcalendar}[2007/09/08 v0.0a Thor Watanabe]
%
% 変数のアロケーション
%\RequirePackage{ifthen}
% カウンタ
\newcount \Jc@year  % 年 
\newcount \Jc@month % 月 [?..??]
\newcount \Jc@cnt@day % 日カウンタ [0..6]
\newcount \Jc@cnt@week % 週カウンタ [0..5]
\newcount \Jc@cnt@month % 月カウンタ [0..31]
\newcount \Jc@cnt@theday % 曜日カウンタ [0..6]
\newcount \Jc@cnt@days   % その月の日数 [..31]
% ブール値
\newif \if@Jc@color   % 色づけを行うかどうか
\newif \if@Jc@holiday % 休日かどうか
\newif \if@Jc@feteday % 祝日かどうか
\newif \if@Jc@workday % 労働日かどうか
%
% 標準値の設定
\Jc@year  = \year
\Jc@month = \month
% 年月
\def\Jc@year@name{年}
\def\Jc@month@name{月}
% ユーザコマンド
\def\jcYearName#1{\gdef\Jc@year@name{#1}}
\def\jcMonthName#1{\gdef\Jc@month@name{#1}}
% 日付がないセルの文字列
\def\Jc@emptyday@name{・}
% ユーザコマンド
\def\jcEmptyDayName#1{\gdef\Jc@emptyday@name{#1}}
% 表の揃え
\def\Jc@tab@align{r}
% ユーザコマンド
\def\jcTableAlign#1{\gdef\Jc@tab@align{#1}}
% 曜日
\@namedef{Jc@dayoftheweek0}{日}
\@namedef{Jc@dayoftheweek1}{月}
\@namedef{Jc@dayoftheweek2}{火}
\@namedef{Jc@dayoftheweek3}{水}
\@namedef{Jc@dayoftheweek4}{木}
\@namedef{Jc@dayoftheweek5}{金}
\@namedef{Jc@dayoftheweek6}{土}
% ユーザコマンド
\def\jcDayOfWeeek#1#2{%
   \@namedef{Jc@dayoftheweek#1}{#2}%
}
% 全ての曜日を設定するためのユーザコマンド
\def\jcDayOfWeeeks#1#2#3#4#5#6#7{%
  \@namedef{Jc@dayoftheweek0}{#1}%
  \@namedef{Jc@dayoftheweek1}{#2}%
  \@namedef{Jc@dayoftheweek2}{#3}%
  \@namedef{Jc@dayoftheweek3}{#4}%
  \@namedef{Jc@dayoftheweek4}{#5}%
  \@namedef{Jc@dayoftheweek5}{#6}%
  \@namedef{Jc@dayoftheweek6}{#7}%
}
% 数字の出力形式
\let \Jc@number = \@arabic
%
% color パッケージが読み込まれていた場合だけ色付け
\@ifpackageloaded {color}
  {\@Jc@colortrue}
  {\let \textcolor \@gobble}
%
%
% マクロ内コマンドの定義
% 曜日の取得 {#1=year, #2=month, #3=day}
\def\Jc@set@theday#1#2#3{% TODO
 \def\@@year  {#1}%
 \def\@@month {#2}%
 \def\@@day   {#3}%
 \Jc@cnt@theday = 2\relax
}
% 月の日数の取得
\def\Jc@set@days#1#2{% TODO
 \def\@@year {#1}%
 \def\@@month{#2}%
 \Jc@cnt@days = 30\relax
}
% ヘッダの出力
\def\Jc@cal@header{%
\begingroup
  \begin{tabular}{*7{|\Jc@tab@align}|}%
   \hline
   \multicolumn{7}{|c|}
     {\Jc@number\Jc@year\Jc@year@name\Jc@number\Jc@month\Jc@month@name}\\
   \hline
   \Jc@head@day{0}&\Jc@head@day{1}&\Jc@head@day{2}&\Jc@head@day{3}&%
   \Jc@head@day{4}&\Jc@head@day{5}&\Jc@head@day{6}\\
   \hline \hline
}
% フッタ
\def\Jc@cal@footer{%
   \hline
  \end{tabular}%
\endgroup
}
% 曜日ヘッダ
\def\Jc@head@day#1{%
\ifnum#1=0
  \multicolumn{1}{|c|}{%
    \textcolor{red}{\@nameuse{Jc@dayoftheweek#1}}%
  }%
\else
  \multicolumn{1}{|c|}{%
    \@nameuse{Jc@dayoftheweek#1}%
  }%
\fi
}
% 日付がないセルの表示
\def\Jc@cal@pre@emptydays{%
  \@tempcnta = \z@ 
  \let \@temp@col = \@empty
  \@whilenum \@tempcnta < \Jc@cnt@theday \do{%
    \advance \@tempcnta \@ne
    \ifnum \@tempcnta = \@ne 
       \def\@temp@col{\Jc@show@holiday\Jc@emptyday@name}%
    \else
       \toks@\expandafter{\@temp@col&\Jc@emptyday@name}%
       \edef\@temp@col{\the\toks@}%
    \fi
  }%
  \@temp@col
}
\def\Jc@cal@post@emptydays{%
  % ここで残りの日数カウンタが分かる
  \@tempcnta = \Jc@cnt@theday 
  \let \@temp@col = \@empty
  \@whilenum \@tempcnta < 7 \do{%
    \advance \@tempcnta \@ne 
    \ifnum \@tempcnta = \@ne
       \def\@temp@col{\Jc@show@holiday\Jc@emptyday@name}%
    \else
       \toks@\expandafter{\@temp@col&\Jc@emptyday@name}%
       \edef\@temp@col{\the\toks@}%
    \fi
  }%
  \@temp@col
}
%
\def\Jc@show@holiday#1{\textcolor{red}{#1}}
\def\Jc@show@workday#1{#1}
%
% 本体
\def\Jc@cal@body{%
  \global \let \@temp@col \@empty
  \@whilenum \Jc@cnt@day < \Jc@cnt@days \do{%
    \global \advance \Jc@cnt@day \@ne
    \global \advance \Jc@cnt@theday \@ne
    \xdef\temp@day{\Jc@number\Jc@cnt@day}%
    \ifnum \Jc@cnt@theday = \@ne
      \protected@xdef\@temp@col{\protect\Jc@show@holiday{\temp@day}}%
    \else
      \protected@xdef\@temp@col{\@temp@col&\temp@day}%
    \fi
    % 土曜日になったら出力
    \ifnum \Jc@cnt@theday = 7
      \global \Jc@cnt@theday = \z@
      \global \advance \Jc@cnt@week \@ne
      \toks@\expandafter{\@temp@col\\}%
      \xdef\@temp@col{\the\toks@}%
      \@temp@col
    \fi
  }%
  \@temp@col % 残りの日数の出力
}
% 休日の判定 
%
% ユーザコマンドの定義
% 年の指定
\def\setyear#1{%
   \Jc@year = #1\relax
}
%
% 指定された月のカレンダーの表示
\def \jcal#1{%
\begingroup
   \Jc@month = #1
   \Jc@cnt@week = 1
   \@Jc@holidayfalse
   \@Jc@fetedayfalse
   \@Jc@workdayfalse
   \Jc@cnt@theday = \z@
   \Jc@cnt@day    = \z@
   \Jc@set@theday{\Jc@year}{\Jc@month}{1}%
   \Jc@set@days  {\Jc@year}{\Jc@month}%
   \Jc@cal@header
   \Jc@cal@pre@emptydays
   \Jc@cal@body
   \Jc@cal@post@emptydays\\
   \Jc@cal@footer
\endgroup
}

\endinput

使用例

\documentclass{ujarticle}
\usepackage{color}
\usepackage{jcalendar}
\pagestyle{empty} 
\begin{document} 
\setyear{2007}
\jcal{1}
\end{document}
\jcal{2}
\jcYearName{/}
\jcMonthName{}
\jcTableAlign{c}
\jcEmptyDayName{×}
\jcDayOfWeeek{0}{Sun}
\jcDayOfWeeek{1}{Mon}
\jcDayOfWeeek{2}{Tue}
\jcDayOfWeeek{3}{Wed}
\jcDayOfWeeek{4}{Thu}
\jcDayOfWeeek{5}{Fri}
\jcDayOfWeeek{6}{Sat}

\jcal{2}

\jcYearName{年}
\jcMonthName{月}
\jcEmptyDayName{○}
\jcDayOfWeeeks{日}{月}{火}{水}{木}{金}{土}
\jcal{3}
\end{document}