如何以类似方式在 LaTeX 中重新创建下表?

如何以类似方式在 LaTeX 中重新创建下表?

以下为原表

原来的

我有以下代码

\begin{table}
\caption{February}
\begin{center}
\begin{tabular}{c|c|c|c|c|c|c}

\hline
M & T & W & Th & F & S & Su\\
\hline
 & C & &&C&C&\\
 \hline
 & C & &C&C&& \\
 \hline
 & C&&&C&C&C \\
 \hline
 & C & & &C & C & \\
 \hline
\end{tabular}
\end{center}
\end{table}


\begin{table}
\caption{March}
\begin{center}
\begin{tabular}{c|c|c|c|c|c|c}

\hline
M & T & W & Th & F & S & Su\\
\hline
 & C & C&C&C&C&\\
 \hline
 & C & &C&&& \\
 \hline
 & C&C&&C&C& \\
 \hline
 & C &C & &C & C & \\
 \hline
 & C& &\\
 \hline
\end{tabular}
\end{center}
\end{table}

其结果如下:

在此处输入图片描述

你如何做到

  1. 桌子是并排的吗?
  2. 标题是彩色的
  3. 并且游行队伍最后一排只有三个格子有边框?

答案1

要为某一行着色,可以使用\rowcolor,要为前 3 个单元格划线,可以使用\cline{1-3}

如果您不需要浮点数,我可以这样做。

\documentclass{article}
\usepackage{xcolor,colortbl}

\begin{document}
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
\rowcolor{gray!40} 
M & T & W & Th & F & S & Su \\ \hline
 & C & & & C & C &          \\ \hline
 & C & & C & C & &          \\ \hline
 & C & & & C & C & C        \\ \hline
 & C & & & C & C &          \\ \hline
\end{tabular}
\hspace{2em} %space between tables
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
\rowcolor{gray!40} 
M & T & W & Th & F & S & Su \\ \hline
 & C & C & C & C & C &      \\ \hline
 & C & & C & & &            \\ \hline
 & C & C & & C & C &        \\ \hline
 & C & C & & C & C &        \\ \hline
 & C &                      \\ \cline{1-3}
\end{tabular}
\end{document}

导致

图像

答案2

这是具有 LaTeX3 功能的实现;您只需提供月份、月份的初始日期(缩写形式)和特殊日子的列表。

\documentclass{article}
\usepackage{xparse}
\usepackage{xcolor,colortbl}

\ExplSyntaxOn
% #1 = month name, #2 = initial day of week, #3 = list of days
\NewDocumentCommand{\monthtable}{ m m m }
 {
  \alby_monthtable:nnn { #1 } { #2 } { #3 }
 }

\cs_new_protected:Npn \alby_monthtable:nnn #1 #2 #3
 {
  %% compute the number of days from the month name
  \int_set:Nn \l_alby_days_int
   {
    \str_case:nnn { #1 }
     {
      {January}{31}
      {February}{28}
      {Februaryleap}{29}
      {March}{31}
      {April}{30}
      {May}{31}
      {June}{30}
      {July}{31}
      {August}{31}
      {September}{30}
      {October}{31}
      {November}{30}
      {December}{31}
     }
     {OOPS}
   }
  %% compute the initial shift
  \int_set:Nn \l_alby_initial_int
   {
    \str_case:nnn { #2 }
     {
      {Mo}{0}
      {Tu}{1}
      {We}{2}
      {Th}{3}
      {Fr}{4}
      {Sa}{5}
      {Su}{6}
     }
     {OOPS}
   }
  %% the table body is stored in \l_alby_table_tl
  %% compose the first table row
  \tl_set:Nn \l_alby_table_tl
   {
    \rowcolor{gray!40}
    \makebox[1.5em]{Mo} &
    \makebox[1.5em]{Tu} &
    \makebox[1.5em]{We} &
    \makebox[1.5em]{Th} &
    \makebox[1.5em]{Fr} &
    \makebox[1.5em]{Sa} &
    \makebox[1.5em]{Su} \\ \hline }
  %% if the initial shift is non zero, we add a \multicolumn
  \int_compare:nT { \l_alby_initial_int > 0 }
   { \tl_put_right:Nn \l_alby_table_tl { \multicolumn{\l_alby_initial_int}{c|}{} & } }
  %% store in \l_alby_cdays_seq the list of special days
  \seq_set_split:Nnn \l_alby_cdays_seq { , } { #3 }
  %% loop through the days to add cells
  \int_step_inline:nnnn { 1 } { 1 } { \l_alby_days_int}
   {
    %% if the day is special, add a C
    \seq_if_in:NxT \l_alby_cdays_seq { \int_to_arabic:n { ##1 } }
     { \tl_put_right:Nn \l_alby_table_tl { C } }
    %% if the day is not the last, add & or \\\hline, according
    %% if we are at the end of a row or not
    \int_compare:nF { ##1 == \l_alby_days_int }
     {
      \int_compare:nTF
       {\int_mod:nn { ##1 + \l_alby_initial_int } { 7 } == 0 }
       {\tl_put_right:Nn \l_alby_table_tl { \\ \hline } }
       {\tl_put_right:Nn \l_alby_table_tl { & } }
     }
   }
  %% finally, add \\\hline if the month ends with Sunday, or add
  %% a suitable \\\cline{1-x} command
  \int_compare:nTF { \int_mod:nn { \l_alby_initial_int + \l_alby_days_int } { 7 } == 0 }
   {
    \tl_put_right:Nn \l_alby_table_tl { \\ \hline }
   }
   {
    \tl_put_right:Nx \l_alby_table_tl
     {
      \exp_not:n { \\ \cline }
      { 1 - \int_to_arabic:n { \int_mod:nn { \l_alby_initial_int + \l_alby_days_int } { 7 } } }
     }
   }
  %% print the table
  \begin{tabular}{|c|c|c|c|c|c|c|}
  \hline
  \l_alby_table_tl
  \end{tabular}
 }

%% the needed variables
\int_new:N \l_alby_days_int
\int_new:N \l_alby_initial_int
\tl_new:N \l_alby_table_tl
\seq_new:N \l_alby_cdays_seq
\ExplSyntaxOff

\begin{document}
\monthtable{February}{Fr}{1,3,5,7,9,11,13,15,17,19,21,23,25,28}

\bigskip

\monthtable{April}{Mo}{1,30}
\end{document}

对于闰年,用作Februaryleap月份名称。

初始日期可以根据年份计算出来,但这需要更多的工作。

在此处输入图片描述

答案3

还有一些一般性评论:

  1. Excel 转 LaTeX非常擅长为带有水平和垂直边框、合并单元格等的表格创建 LaTeX 代码。(免责声明:我贡献了部分相关代码。)

  2. 有一个专门的蒂克兹图书馆,日历,这有助于创建自定义日历——还有不少问题我已经在 TeX.SX 上讨论过这个话题了。不过我不太清楚边界问题。

相关内容