我正在尝试使用 LaTex 制作我们明年的家庭日记。每周一页,每个人一栏。
我已经完成了基本布局:
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[a5paper, top=1cm, bottom=1cm, left=2cm, right=1cm]{geometry}
\usepackage{advdate} % Advancing/saving dates
\usepackage[dayofweek]{datetime} % Dates formatting
\usepackage{datenumber} % Counters for dates
\usepackage{tabularx}
\pagestyle{empty}
\newdateformat{mydate}{\shortdayofweekname{\day}{\month}{\year} \twodigit\THEDAY{} \shortmonthname[\THEMONTH]}
\newcommand{\headerrow}{\hline & Me & My Wife & Son & Daughter\\ \hline}
\newcommand{\dayrow}[1]{\AdvanceDate[#1] \mydate\today & & & &\\[2.2cm] \hline}
\newcommand{\weektable}{
\newpage
\begin{tabularx}{\textwidth}{|X|X|X|X|X|}
\headerrow{}
\dayrow{0}
\dayrow{1}
\dayrow{2}
\dayrow{3}
\dayrow{4}
\dayrow{5}
\dayrow{6}
\end{tabularx}
}
\SetDate[05/01/2015]
\begin{document}
\weektable{}
\end{document}
但它很丑!!
我曾尝试使用循环来避免 \weektable 中的重复,但是我遇到了表格内的循环而无法使其正常工作。
我也尝试向 \weektable 添加一个参数,以便可以一次生成数周数据,但我无法弄清楚如何将计算结果传递到命令中。
我知道这些问题与其他问题类似,但是,尽管我阅读了在这里找到的所有信息,我仍然陷入困境并希望得到一些帮助!
提前谢谢了。
答案1
对于工作版本来说,这是一个快速的改进,但它确实没有地址一些问题(例如表格设计等)
例如使用该forloop
包来制作全年表......
但是,由于OP\AdvanceDate
在表格单元格(一个组)中使用,所以在完成周表后,实际的日期并没有提前,所以这必须在环境之后进行tabularx
。
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[a5paper, top=1cm, bottom=1cm, left=2cm, right=1cm]{geometry}
\usepackage{advdate} % Advancing/saving dates
\usepackage[dayofweek]{datetime} % Dates formatting
\usepackage{datenumber} % Counters for dates
\usepackage{tabularx}
\usepackage{forloop}
\pagestyle{empty}
\newdateformat{mydate}{\shortdayofweekname{\day}{\month}{\year} \twodigit\THEDAY{} \shortmonthname[\THEMONTH]}
\newcommand{\headerrow}{\hline & Me & My Wife & Son & Daughter\\ \hline}
\newcommand{\dayrow}[1]{\AdvanceDate[#1] \mydate\today & & & &\\[2.2cm] \hline}
\newcommand{\weektable}{
\newpage
\begin{tabularx}{\textwidth}{|X|X|X|X|X|}
\headerrow{}
\dayrow{0}
\dayrow{1}
\dayrow{2}
\dayrow{3}
\dayrow{4}
\dayrow{5}
\dayrow{6}
\end{tabularx}
\AdvanceDate[7]%
}
\SetDate[05/01/2015]
\newcounter{weeks}%
\begin{document}
\forloop{weeks}{1}{\value{weeks} < 53}{%
\weektable{}
}%
\end{document}
答案2
您可以使用xparse
和expl3
重复该任务:
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[a5paper, top=1cm, bottom=1cm, left=2cm, right=1cm]{geometry}
\usepackage{xparse}
\usepackage{advdate} % Advancing/saving dates
\usepackage[dayofweek]{datetime} % Dates formatting
\usepackage{datenumber} % Counters for dates
\usepackage{tabularx}
\newdateformat{mydate}{%
\shortdayofweekname{\day}{\month}{\year} % space
\twodigit\THEDAY{} % space
\shortmonthname[\THEMONTH]% no space
}
\newcommand{\headerrow}{\hline & Me & My Wife & Son & Daughter\\ \hline}
\newcommand{\dayrow}[1]{\AdvanceDate[#1] \mydate\today & & & &\\[2.2cm] \hline}
\newcommand{\printweektable}{%
\newpage\noindent
\begin{tabularx}{\textwidth}{|X|X|X|X|X|}
\headerrow
\dayrow{0}
\dayrow{1}
\dayrow{2}
\dayrow{3}
\dayrow{4}
\dayrow{5}
\dayrow{6}
\end{tabularx}%
}
\ExplSyntaxOn
\NewDocumentCommand{\weektable}{O{1}m}
{
\SetDate[#2]
\computedayofweek{\day}{\month}{\year}
% always start on Monday
\AdvanceDate[
\int_eval:n { 2 - \dayofweek \int_compare:nT { \dayofweek == 1 } { -7 } }
]
\prg_replicate:nn { #1 } { \printweektable }
}
\ExplSyntaxOff
\pagestyle{empty}
\begin{document}
\weektable[4]{04/01/2015}
\end{document}
日期可以是任意的,但一周总是从星期一开始,这样就包含了“开始”日。
例如,2015 年 1 月 4 日是星期日,因此第一页将从 12 月 29 日星期一开始。
可选参数指定要生成多少周(默认一周)。