SysNo02

システム手帳02

About

外見は極力シンプル&コンパクトで。 中身をlatex + pythonで作るのに苦労しました。 A4を4つ折りする特殊形状。

携帯しやすさを重視したSysNo02です。 A4サイズを基本としながらもポケットに入れて持ち運べるような設計としました。 結果としてA4を四つ折りし,某超整理手帳のように,4ヶ月分を1枚に記入するスタイルになりました。

構成要素を分解してみた図です。 レザークラフトといっても,四角にカットして穴2つ開けただけのシンプル構造です。 やったことといえばコバ・トコの処理ぐらい。 穴についても汎用的な2穴パンチで済むようにしました。

中身のリフィルも自作しています。 SysNo01ではエクセルとパワポで中身を作っていましたが, 今回は作りやすさを考慮して,latex + pythonで作成しました。

試作段階のもの。ペンホルダーがついています。 今までは手帳にペンホルダー欲しい派だったんですが, なくても事足りることに気づきました。

リフィル作成

						
\documentclass[a4j,landscape]{ujarticle}
\usepackage{layout}
\usepackage[a4paper,left=22truemm,top=5truemm,bottom=5truemm, right=5truemm, landscape]{geometry}
\usepackage{tabularx}
\pagestyle{empty}


\begin{document}
\renewcommand{\arraystretch}{1.18}

\input{2019_1.tex}
\input{2019_2.tex}
\input{2019_3.tex}
\end{document}
						
					

全体の枠組みとなるtexファイルです。 余白の設定と必要となるパッケージの読み込みのみ。 ここにpythonで出力した各シート(2019_1.tex等)を読み込みます。 左以外の余白はプリンターの余白設定ギリギリの5mmにしました。 ちなみにセブンイレブンのプリント印刷も余白は5mmが限界らしいですね。 左の余白は2穴パンチの寸法を考慮して22mmにしています。

						
\begin{table}[h]
\begin{tabularx}{270mm}{|c|c|X|p{10mm}|c|c|X|p{10mm}|c|c|X|p{10mm}|c|c|X|}
\multicolumn{4}{l}{01月} & \multicolumn{4}{l}{02月} & \multicolumn{4}{l}{03月} & \multicolumn{3}{l}{04月} \\
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
01&祝&&&01&金&&&01&金&&&01&月& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
02&水&&&02&土&&&02&土&&&02&火& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
03&木&&&03&日&&&03&日&&&03&水& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
04&金&&&04&月&&&04&月&&&04&木& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
05&土&&&05&火&&&05&火&&&05&金& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
06&日&&&06&水&&&06&水&&&06&土& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
07&月&&&07&木&&&07&木&&&07&日& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
08&火&&&08&金&&&08&金&&&08&月& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
09&水&&&09&土&&&09&土&&&09&火& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
10&木&&&10&日&&&10&日&&&10&水& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
11&金&&&11&祝&&&11&月&&&11&木& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
12&土&&&12&火&&&12&火&&&12&金& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
13&日&&&13&水&&&13&水&&&13&土& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
14&祝&&&14&木&&&14&木&&&14&日& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
15&火&&&15&金&&&15&金&&&15&月& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
16&水&&&16&土&&&16&土&&&16&火& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
17&木&&&17&日&&&17&日&&&17&水& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
18&金&&&18&月&&&18&月&&&18&木& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
19&土&&&19&火&&&19&火&&&19&金& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
20&日&&&20&水&&&20&水&&&20&土& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
21&月&&&21&木&&&21&祝&&&21&祝& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
22&火&&&22&金&&&22&金&&&22&月& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
23&水&&&23&土&&&23&土&&&23&火& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
24&木&&&24&日&&&24&日&&&24&水& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
25&金&&&25&月&&&25&月&&&25&木& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
26&土&&&26&火&&&26&火&&&26&金& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
27&日&&&27&水&&&27&水&&&27&土& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
28&月&&&28&木&&&28&木&&&28&日& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
29&火&&&&&&&29&金&&&29&月& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
30&水&&&&&&&30&土&&&30&火& \\ 
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
31&木&&&&&&&31&日&&&&& \\
\cline{1-3} \cline{5-7} \cline{9-11} \cline{13-15}
\end{tabularx}
\end{table}
						
					

こちらが2019_1.texの中身です。 表の幅と余白を実数で設定し,残りは自動調整に任せています。 各月の長さ,曜日,祝日についてはいちいち設定するとミスなりなんなり発生しそうなので, pythonで自動生成するようにしています。

						
# coding: utf-8 -*-
import calendar
import datetime
import pandas
import codecs

Tyear = 2018
Tmonth = 9
FileName = '2018_1.tex'
FileCSV = 'holiday_list.csv'

WeekNumber = [0,0,0,0]
LastDay = [0,0,0,0]
Yobi = ["月","火","水","木","金","土","日","祝"]


OtFile = open(FileName,'w') #書き込みモードでファイルを開く
InFile = codecs.open(FileCSV,'r','shift_jis','ignore') 
for i_clmn in range(4):
    _, LastDay[i_clmn] = calendar.monthrange(Tyear, Tmonth + i_clmn)

HoliDayList = pandas.read_csv('./holiday_list.csv')

#ヘッダー部分入力
OtFile.write('\\begin{table}[h]' + '\n')
OtFile.write('\\begin{tabularx}{270mm}{|c|c|X|p{10mm}|c|c|X|p{10mm}|c|c|X|p{10mm}|c|c|X|}' + '\n')

OtString = '\\multicolumn{4}{l}{' + str(Tmonth).zfill(2) +'月} '
OtString += '& \\multicolumn{4}{l}{'+str(Tmonth+1).zfill(2)+'月} '
OtString += '& \\multicolumn{4}{l}{'+str(Tmonth+2).zfill(2)+'月} '
OtString += '& \\multicolumn{3}{l}{'+str(Tmonth+3).zfill(2)+'月} \\\\' 
OtFile.write(OtString + '\n')

#メイン部分入力
for TDay in range(1,32):
    OtFile.write('\\cline{1-3} \\cline{5-7} \\cline{9-11} \\cline{13-15}' + '\n')
    for i_clmn in range(3):
        if TDay > LastDay[i_clmn]:
            OtString =  '&&&&'
            OtFile.write(OtString)
        else:
            if str(Tyear)+"-"+str(Tmonth+i_clmn).zfill(2)+"-"+str(TDay).zfill(2) in str(HoliDayList['国民の祝日・休日月日']):
                TYobi = 7
            else:
                TYobi = datetime.date(Tyear,Tmonth + i_clmn,TDay).weekday()
            OtString = str(TDay).zfill(2) + '&' + str(Yobi[TYobi]) + '&&&'
            OtFile.write(OtString)
    if TDay > LastDay[3]:
            OtString =  '&& \\\\'
            OtFile.write(OtString + '\n')
    else:
            if str(Tyear)+"-"+str(Tmonth+i_clmn).zfill(2)+"-"+str(TDay).zfill(2) in str(HoliDayList['国民の祝日・休日月日']):
                TYobi = 7
            else:
                TYobi = datetime.date(Tyear,Tmonth + 3,TDay).weekday()
            OtString = str(TDay).zfill(2) + '&' + str(Yobi[TYobi]) + '& \\\\'
            OtFile.write(OtString + ' \n')

#終わり部分入力
OtFile.write('\\cline{1-3} \\cline{5-7} \\cline{9-11} \\cline{13-15}' + '\n')
OtFile.write('\\end{tabularx}' + '\n')
OtFile.write('\\end{table}' + '\n')

InFile.close()
OtFile.close() #ファイルを閉じる。
						
					

2019_1.texを生成するpythonのコードです。 python3系です。ネットに挙がっている祝日リストのcsvファイルを読み込んで, latexのファイルに一行ずつ書き込む流れです。 csvを読み込むのにpandas,月の最終日を計算するのにcalendarといったライブラリを読み込んでいます。 「texファイルに「\」を入力させるときは「\\」としなければならない」みたいなルールに気づかず, 数時間悩みました。

To Be Continued

HOMEへ戻る