循环和表格

循环和表格

我正在尝试使用 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

您可以使用xparseexpl3重复该任务:

\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 日星期一开始。

可选参数指定要生成多少周(默认一周)。

在此处输入图片描述

相关内容