
以前、Filofax (tm) オーガナイザーの A5 カレンダー ページを作成するための非常に優れたスニペットを見つけました。残念ながら、元のソースはもう見つかりませんでした。その後、それを修正し、今ではそれを使用するのを楽しみにしています。
しかし、2 つ以上の一貫したページを作成することができませんでした。ループを追加して、一度に 1 週間以上作成できれば本当に便利です。1 か月、1 年、または任意の期間でもかまいません。
\documentclass[%
a5paper,
BCOR=2cm,% Space for hole puncher
DIV=25,% Size of textbody
9pt% Fontsize
]{scrbook}
%
%%%%%%%%%% PACKAGES %%%%%%%%%%
%
\usepackage{tabularx,booktabs,multirow}
%\renewcommand*\familydefault{\sfdefault}
%\usepackage{roboto}
\renewcommand{\familydefault}{\sfdefault}
%
%%%%%%%%%% COUNTER %%%%%%%%%%
%
\newcount\counter
\newcount\startdate
\newcount\starttime
\newcount\stoptime
\newcount\sundaybegin
\newcount\week
%
%%%%%%%%%% CUSTOMISATIONS %%%%%%%%%%
%
%% Month
\renewcommand{\month}{March}
%% Date to start the week with
\startdate=13
%% Morning starttime
\starttime=8
%% Evening time
\stoptime=20
%% Starttime sunday
% Min \starttime+1
% Max \stoptime-2
\sundaybegin=14
%% Weeknumber
\week=11
%% Rule width thick
\newcommand{\rulew}{.15em}
%% Extra space
%\setlength{\extrarowheight}{1pt}
%
%%%%%%%%%% DEFINITIONS %%%%%%%%%%
%
\newcommand{\lendt}{\cmidrule[\rulew](l){1-2}\cmidrule[\rulew](l){3-4}\cmidrule[\rulew](l){5-6}}
\newcommand{\lend}{\cmidrule(l){1-2}\cmidrule(l){3-4}\cmidrule(l){5-6}}
\newcommand{\lsun}{\cmidrule(l){1-2}\cmidrule(l){3-4}}
\newcommand{\lsunt}{\cmidrule(l){1-2}\cmidrule(l){3-4}\cmidrule[\rulew](l){5-6}}
\newcommand{\printday}[2]{{\LARGE \textbf{#1}}\,\, \large \textbf{#2}}
\newcommand{\neutralline}{& & & & &}
\newcommand{\footer}{\centering\rule{5.5cm}{\cmidrulewidth} \raisebox{-0.5ex}{\textbf{Dragosh Christian OTTO}} \rule{5.5cm}{\cmidrulewidth}}
\newcommand{\printmonth}{{\LARGE \textbf{\month}}}
%
%%%%%%%%%% TABLE CONTENT LEFT SIDE %%%%%%%%%%
%
% Correction due to \global\advance
\advance\startdate-6
%
\advance\stoptime1
\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
%
\def\tabledataleft{} \counter=\the\starttime
\loop
\edef\tabline{\the\counter & & \the\counter & & \the\counter & }
\expandafter\addto\expandafter\tabledataleft\expandafter{\tabline \\\lend}
\expandafter\addto\expandafter\tabledataleft\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledataleft\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledataleft\expandafter{\neutralline \\\lend}
\advance \counter 2
\ifnum \counter<\the\stoptime
\repeat
%
%%%%%%%%%% TABLE CONTENT RIGHT SIDE %%%%%%%%%%
%
\def\tabledatarightupper{} \counter=\the\starttime
\loop
\edef\tabline{\the\counter & & \the\counter & & & }
\expandafter\addto\expandafter\tabledatarightupper\expandafter{\tabline \\\lend}
\expandafter\addto\expandafter\tabledatarightupper\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledatarightupper\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledatarightupper\expandafter{\neutralline \\\lend}
\advance \counter 2
\ifnum \counter<\the\sundaybegin
\repeat
%
\advance\sundaybegin1
\def\tabledatarightinter{} \counter=\the\sundaybegin
\newcount\sundaystop
\sundaystop=\the\sundaybegin
\advance\sundaystop1
\loop
\edef\tabline{\the\counter & & \the\counter & & & }
%\expandafter\addto\expandafter\tabledatarightinter\expandafter{\neutralline \\\lsun}
\expandafter\addto\expandafter\tabledatarightinter\expandafter{\neutralline \\\lsun}
\expandafter\addto\expandafter\tabledatarightinter\expandafter{\neutralline \\\lsun}
\advance \counter 2
\ifnum \counter<\the\sundaystop
\repeat
\advance\sundaybegin-1
\advance\sundaystop1
%
\def\tabledatarightlower{} \counter=\the\sundaystop
\loop
\advance \counter 1
\edef\tabline{\the\counter & & \the\counter & & & }
\expandafter\addto\expandafter\tabledatarightlower\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledatarightlower\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledatarightlower\expandafter{\neutralline \\\lend}
\expandafter\addto\expandafter\tabledatarightlower\expandafter{\tabline \\\lend}
\advance \counter 1
\ifnum \counter<\the\stoptime
\repeat
\advance\sundaystop-1
%
\begin{document}
%
%% Empty page to start left
\thispagestyle{empty}
\mbox{}
\clearpage
%
\pagestyle{empty}
\enlargethispage{1cm}
%
%%%%%%%%%% LEFT TABLE %%%%%%%%%%
%
\noindent
\begin{tabularx}{\linewidth}{lXlXlX}
\multicolumn{6}{l}{\printmonth \hfill Week \the\week}\\[.2em]
\midrule[\rulew]
\addlinespace[.5em]
\multicolumn{2}{l}{\printday{\the\startdate}{Monday}} \global\advance\startdate 1\relax &%
\multicolumn{2}{l}{\printday{\the\startdate}{Tuesday}} \global\advance\startdate 1\relax &%
\multicolumn{2}{l}{\printday{\the\startdate}{Wednesday}}\global\advance\startdate 1\relax \\[1cm]
& & & & & \\\lendt
\tabledataleft
& & & & & \\[1cm]
\midrule[\rulew]
\end{tabularx}
%
\vfill
%\footer
%
\clearpage
\enlargethispage{1cm}
% Correction due to \global\advance
\advance\startdate-6
%
%%%%%%%%%% RIGHT TABLE %%%%%%%%%%
%
\noindent
\begin{tabularx}{\linewidth}{lXlXlX}
\multicolumn{6}{l}{Week \the\week \hfill \printmonth}\\[.2em]\midrule[\rulew]
\addlinespace[.5em]
\multicolumn{2}{l}{\printday{\the\startdate}{Thursday}} \global\advance\startdate 1\relax &%
\multicolumn{2}{l}{\printday{\the\startdate}{Friday}} \global\advance\startdate 1\relax &%
\multicolumn{2}{l}{\printday{\the\startdate}{Saturday}} \global\advance\startdate 1\relax \\[1cm]
& & & & & \\\lendt
\tabledatarightupper
%& & & & & \\\lsunt
\addlinespace[-.15em]
\the\sundaybegin & & \the\sundaybegin & & \multicolumn{2}{l}{\multirow{4}{*}[1.5em]{\printday{\the\startdate}{Sunday}}}\\\lsun
\tabledatarightinter
& & & & & \\\lsun
\the\sundaystop & & \the\sundaystop & & & \\\lsunt
\tabledatarightlower
& & & & & \\\lend
& & & & & \\\lend
& & & & & \\\lend
& & & & & \\[1cm]
\midrule[\rulew]
\end{tabularx}
%
\vfill
%\footer
\end{document}
答え1
PGF/TikZには「ユーティリティ」が付属していますPGFカレンダーtikz-ext
私のパッケージには、週番号のサポートこのためには、実際にパッケージをロードする必要がありますpgfcalendar-ext
。
現在、PGFCalendar には 1 つのメイン コマンドがあります。\pgfcalendar
範囲内で指定されたすべての日付をループし、現在の日付に関する情報を保持するいくつかのマクロ (および 1 つの TeX カウント) を設定します。 (さらに、pgfcalendar-ext
週番号も利用できるように拡張します。)
ここで、すべての日付を実際にループするのではなく、月曜日 (左側) と木曜日 (右側) のみを確認したいと思います。
最後に、PGFCalendar を騙して水曜日 (左側) と日曜日 (右側) にタイムトラベルします。
\ifdate{Monday}{\advance\pgfcalendarcurrentjulian by 2}
{\advance\pgfcalendarcurrentjulian by 3}
\clearpage
\ifodd\value{page}
実際に、現在位置を把握するために を使用することもできますが、ここでは\ifdate
月曜日が左側である PGFCalendar を使用しています。
各ページのヘッダーとフッターはほぼ同じなので、これをループ内で直接タイプセットします。同じテストを使用して、左ヘッダー設定と右ヘッダー設定のどちらをタイプセットする必要があるかを判断します。(これには Koma クラスの左マークと右マークを使用することもできたかもしれませんが、ここではそれが主な関心事ではありません。)
上部に 3 日間を入力した後 (詳細は後述)、どのページにいるのかを再度考える必要があります (→ \ifdate{Monday}
)。
左側では、すべての時間のすべての行をタイプセットするだけです。右側では、日曜日に分割する必要があります。
あらかじめ構築されたテンプレートの代わりに、Latex3 の単純な for(each) ループを使用しています\int_step_function:nnnN
。 内で安全に使用できますtabularx
。 日曜日側は少し乱雑です。いくつか調整を加えました。
行間隔を追加した場所を見てください。
\lineEndSundayTop
これにより、表の余分な太さが無視され\ruleThick
、右側の行のグリッドの間隔が左側とまったく同じになります。日曜日のヘッダーは、
\smash
行を垂直方向に拡大せずに上の行にこっそりと入らないように、編集中に下げられます (マイナス方向に上げられます)。
ここで、月曜日や木曜日以外のページ上の他の曜日を取得するために、現在の日付に 1、2、または日曜日の場合は 3 を単純に加算することはできません。これらの曜日はいずれも翌月になる可能性があるからです。
28/29/30/31 を超えるかどうかを少し確認して、それに応じて調整することもできますが、PGFCalendar に 経由でその作業を再度実行させることにします\PGFCalendarPlus
。
このマクロは、現在の日(月曜日または木曜日)から 1 日、2 日、またはそれ以降の 1 日のループを開始します\pgfcalendar
。日付と曜日を出力します。
コード
\documentclass[a5paper, BCOR=2cm, DIV=25, fontsize=9pt]{scrbook}
% https://tex.stackexchange.com/a/651888
\usepackage{pgfcalendar-ext} % loads pgfcalendar and has weeknumbering
\usepackage{tabularx, booktabs, multirow}
\usepackage{xfp}% for \inteval for older TeX distributions
\renewcommand*\familydefault{\sfdefault}
% horizontal lines in tabularx
\newcommand*\lineEndTop {\cmidrule[\ruleThick](l){1-2}\cmidrule[\ruleThick](l){3-4}\cmidrule[\ruleThick](l){5-6}}
\newcommand*\lineEnd {\cmidrule (l){1-2}\cmidrule (l){3-4}\cmidrule (l){5-6}}
\newcommand*\lineEndSunday {\cmidrule (l){1-2}\cmidrule (l){3-4}}
\newcommand*\lineEndSundayTop{\cmidrule (l){1-2}\cmidrule (l){3-4}\cmidrule[\ruleThick](l){5-6}%
\addlinespace[\dimexpr-\ruleThick+\lightrulewidth]}
\newcommand*\printDay {{\LARGE \textbf{\%d-}}\,\, \large \textbf{\%wt}}
\newcommand*\printDays {%
\multicolumn{2}{l} {\printDay} &
\multicolumn{2}{l}{\PGFcalendarPlus{1}{\printDay}} &
\multicolumn{2}{l}{\PGFcalendarPlus{2}{\printDay}}}
\newcommand*\printWeekLeft {{\bfseries\LARGE\%mt} \hfill Week \%n-}
\newcommand*\printWeekRight {Week \%n-\hfill {\bfseries\LARGE\%mt}}
\newcommand*\timeStart {8}
\newcommand*\timeEnd {20}
\newcommand*\timeStep {2}
\newcommand*\timeSunday{14}
\newcommand*\timeBlockX[2]{%
#1 & & #1 & & #2 \\ \lineEnd
& & & & & \\ \lineEnd \\ \lineEnd \\ \lineEnd}
\newcommand*\timeBlockLeft [1]{\timeBlockX{#1}{#1}}
\newcommand*\timeBlockRight[1]{\timeBlockX{#1}{}}
\newcommand*\blockSunday[3]{% Ugh!
\inteval{\timeSunday-\timeStep} & &
\inteval{\timeSunday-\timeStep} & & \\ \lineEnd
\\ \lineEnd \\ \lineEnd \\ \lineEndSundayTop
\timeSunday & & \timeSunday & & #1 \\ \lineEndSunday
\\ \lineEndSunday \\ \lineEndSunday}
\newcommand*\PGFcalendarPlus[2]{%
\pgfcalendar{temp}{\pgfcalendarcurrentyear-\pgfcalendarcurrentmonth-\pgfcalendarcurrentday+#1}
{\pgfcalendarcurrentyear-\pgfcalendarcurrentmonth-\pgfcalendarcurrentday+#1}{#2}}
\newcommand*\ruleThick{.15em}
\pagestyle{empty}
\setlength\parindent{0pt}% instead of \noindent
\ExplSyntaxOn \let\FOREACH\int_step_function:nnnN \ExplSyntaxOff
\let\%\pgfcalendarshorthand
%\usepackage[showframe, pass]{geometry}
\begin{document}
\null\clearpage
\pgfcalendar{cal}{2023-03-13}{2023-06-30}{%
\enlargethispage{1cm}
\begin{tabularx}{\linewidth}{lXlXlX}
\multicolumn{6}{l}{\ifdate{Monday}{\printWeekLeft}{\printWeekRight}}\\[.2em]
\midrule[\ruleThick] \addlinespace[.5em]
\printDays \\[4em]\lineEndTop
\ifdate{Monday}{% left page
\FOREACH{\timeStart}{\timeStep}{\timeEnd}\timeBlockLeft
}{%
\FOREACH{\timeStart}{\timeStep}{\inteval{\timeSunday-2*\timeStep}}\timeBlockRight
\blockSunday{\multicolumn{2}{l}{\PGFcalendarPlus{3}{\smash{\raisebox{-.3em}{\printDay}}}}}{}{}
\\\lineEndSundayTop
\FOREACH{\inteval{\timeSunday+\timeStep}}{\timeStep}{\timeEnd}\timeBlockRight
}%
\\[1cm]
\midrule[\ruleThick]
\end{tabularx}
\ifdate{Monday}{\advance\pgfcalendarcurrentjulian by 2}
{\advance\pgfcalendarcurrentjulian by 3}
\clearpage
}
\end{document}