表格代码可能有所改进

表格代码可能有所改进

代码

考虑以下代码:

\documentclass[
  12pt,
  danish,
  landscape
]{article}

\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage[
  a3paper,
  hmargin = 0cm,
  vmargin = 4cm
]{geometry}
\usepackage{fancyhdr}
\usepackage{diagbox}
\usepackage{
  ragged2e,
  array
}
\usepackage{colortbl}
\usepackage{xcolor}
\usepackage{etoolbox}
\usepackage{xfp}


\def\mlr{2.5}
\newcommand*\mc[1]{
  \multicolumn{3}{c|}{\raisebox{\fpeval{-1/3*\mlr}ex}{\textbf{#1}}}
}
\newcommand*\saenk[1]{
  \raisebox{\fpeval{-5/9*\mlr}ex}{#1}%
}
\newcommand*\tid[2]{\saenk{#1\,--\,#2}}
\definecolor{morgen}{rgb}{0.7, 0.75, 0.7}
\definecolor{dansk}{rgb}{0.0, 0.0, 1.0}
\definecolor{matematik}{rgb}{0.89, 0.0, 0.13}
\definecolor{historie}{rgb}{1.0, 0.55, 0.0}
\definecolor{engelsk}{rgb}{0.6, 0.4, 0.8}
\definecolor{tysk}{rgb}{0.0, 0.5, 0.0}
\definecolor{krist}{rgb}{0.33, 0.33, 0.33}
\definecolor{samfund}{rgb}{0.5, 0.0, 0.5}
\definecolor{biologi}{rgb}{0.55, 0.71, 0.0}
\definecolor{geografi}{rgb}{0.68, 0.85, 0.9}
\definecolor{fysik}{rgb}{0.99, 0.99, 0.59}
\definecolor{idraet}{rgb}{0.96, 0.76, 0.76}
\definecolor{valgfag}{rgb}{1.0, 1.0, 0.0}
\definecolor{understoet}{rgb}{1.0, 1.0, 1.0}
\newcommand*\laerer[2]{%
  \cellcolor{#2}%
  \ifstrequal{#2}{krist}%
    {\textcolor{white}{\saenk{\MakeUppercase{\textbf{#1}}}}}%
    {\ifstrequal{#2}{dansk}%
      {\textcolor{white}{\saenk{\MakeUppercase{\textbf{#1}}}}}%
      {\ifstrequal{#2}{matematik}%
        {\textcolor{white}{\saenk{\MakeUppercase{\textbf{#1}}}}}%
        {\ifstrequal{#2}{tysk}%
          {\textcolor{white}{\saenk{\MakeUppercase{\textbf{#1}}}}}%
          {\ifstrequal{#2}{samfund}%
            {\textcolor{white}{\saenk{\MakeUppercase{\textbf{#1}}}}}%
            {\textcolor{black}{\saenk{\MakeUppercase{#1}}}}}}}}}
\newcommand*\lokale[2]{%
  \cellcolor{#2}%
  \ifstrequal{#2}{krist}%
    {\textcolor{white}{\saenk{\textbf{#1}}}}%
    {\ifstrequal{#2}{dansk}%
      {\textcolor{white}{\saenk{\textbf{#1}}}}%
      {\ifstrequal{#2}{matematik}%
        {\textcolor{white}{\saenk{\textbf{#1}}}}%
        {\ifstrequal{#2}{tysk}%
          {\textcolor{white}{\saenk{\textbf{#1}}}}%
          {\ifstrequal{#2}{samfund}%
            {\textcolor{white}{\saenk{\textbf{#1}}}}%
            {\textcolor{black}{\saenk{#1}}}}}}}}
\newcommand*\fag[2]{\laerer{#1}{#2}}

\makeatletter
\newcommand*\thickhline{%
    \noalign {\ifnum 0=`}\fi \hrule height 2pt
    \futurelet \reserved@a \@xhline
}
\newcolumntype{"}{@{\hskip\tabcolsep\vrule width 1pt\hskip\tabcolsep}}
\makeatother

\pagestyle{empty}


\begin{document}

\begin{center}
  \bfseries
  \fontsize{40}{48}\selectfont
  Skema for skoleåret~2021/2022
\end{center}
\vspace*{8ex}

\LARGE
\begin{center}
 \begin{tabular}{
        |>{\RaggedRight\arraybackslash}m{6.51cm}
   *{5}{|>{\RaggedRight\arraybackslash}m{1.85cm}
         >{\RaggedRight\arraybackslash}m{2.16cm}
         >{\RaggedRight\arraybackslash}m{0.95cm}}|
 }
  \hline
  {\bfseries\backslashbox{Tidsrum}{Ugedag}}
   & \mc{Mandag}
   & \mc{Tirsdag}
   & \mc{Onsdag}
   & \mc{Torsdag}
   & \mc{Fredag}  \\
  \hline
     \verb||\hphantom{1}%
     \tid{8:10}{8:25}
   & \laerer{AM}{morgen}     & \fag{MB}{morgen}     & \lokale{29}{morgen}
   & \laerer{KSP}{morgen}    & \fag{MB}{morgen}     & \lokale{29}{morgen}
   & \laerer{MAS}{morgen}    & \fag{MB}{morgen}     & \lokale{29}{morgen}
   & \laerer{MAS}{morgen}    & \fag{MB}{morgen}     & \lokale{29}{morgen}
   & \laerer{AM}{morgen}     & \fag{MB}{morgen}     & \lokale{29}{morgen} \\[\mlr ex]
  \hline
     \verb||\hphantom{1}%
     \tid{8:25}{9:10}
   & \laerer{AM}{valgfag}    & \fag{VALG}{valgfag}  & \lokale{29}{valgfag}
   & \laerer{KSP}{samfund}   & \fag{SAM}{samfund}   & \lokale{29}{samfund}
   & \laerer{MAS}{matematik} & \fag{MAT}{matematik} & \lokale{29}{matematik}
   & \laerer{MAS}{fysik}     & \fag{F/K}{fysik}     & \lokale{fys}{fysik}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk} \\[\mlr ex]
  \hline
     \verb||\hphantom{1}%
     \tid{9:10}{9:55}
   & \laerer{AM}{valgfag}    & \fag{VALG}{valgfag}  & \lokale{29}{valgfag}
   & \laerer{KSP}{samfund}   & \fag{SAM}{samfund}   & \lokale{29}{samfund}
   & \laerer{MAS}{matematik} & \fag{MAT}{matematik} & \lokale{29}{matematik}
   & \laerer{MAS}{fysik}     & \fag{F/K}{fysik}     & \lokale{fys}{fysik}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk} \\[\mlr ex]
  \thickhline
     \tid{10:25}{11:10}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk}
   & \laerer{AA}{tysk}       & \fag{TYS}{tysk}      & \lokale{29}{tysk}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk}
   & \laerer{MAS}{geografi}  & \fag{GEO}{geografi}  & \lokale{29}{geografi} \\[\mlr ex]
  \hline
     \tid{11:10}{11:55}
   & \laerer{AA}{tysk}       & \fag{TYS}{tysk}      & \lokale{29}{tysk}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk}
   & \laerer{DN}{engelsk}    & \fag{ENG}{engelsk}   & \lokale{29}{engelsk}
   & \laerer{AM}{dansk}      & \fag{DAN}{dansk}     & \lokale{29}{dansk}
   & \laerer{LL}{krist}      & \fag{KRI}{krist}     & \lokale{29}{krist} \\[\mlr ex]
  \thickhline
     \tid{12:40}{13:25}
   & \laerer{MAS}{matematik} & \fag{MAT}{matematik} & \lokale{29}{matematik}
   & \laerer{MAS}{biologi}   & \fag{BIO}{biologi}   & \lokale{bio}{biologi}
   & \laerer{KSP}{idraet}    & \fag{IDR}{idraet}    & \lokale{hal}{idraet}
   & \laerer{AA}{tysk}       & \fag{TYS}{tysk}      & \lokale{29}{tysk}
   & \laerer{KSP}{historie}  & \fag{HIS}{historie}  & \lokale{29}{historie} \\[\mlr ex]
  \hline
     \tid{13:25}{14:10}
   & \laerer{MAS}{matematik} & \fag{MAT}{matematik} & \lokale{29}{matematik}
   & \laerer{MAS}{biologi}   & \fag{BIO}{biologi}   & \lokale{bio}{biologi}
   & \laerer{KSP}{idraet}    & \fag{IDR}{idraet}    & \lokale{hal}{idraet}
   & \laerer{DN}{engelsk}    & \fag{ENG}{engelsk}   & \lokale{29}{engelsk}
   & \laerer{KSP}{historie}  & \fag{HIS}{historie}  & \lokale{29}{historie} \\[\mlr ex]
   \thickhline
     \tid{14:25}{15:10}
   & \laerer{DN}{engelsk}    & \fag{ENG}{engelsk}   & \lokale{29}{engelsk}
   &                         &                      & 
   & \laerer{KSP}{idraet}    & \fag{IDR}{idraet}    & \lokale{hal}{idraet}
   &                         &                      & 
   & \laerer{MAS}{matematik} & \fag{MAT}{matematik} & \lokale{29}{matematik} \\[\mlr ex]
  \hline
 \end{tabular}
\end{center}

\end{document}

输出

问题

我确实认为代码是可以接受的(输出也是我想要的)。我只是想知道它是否可以变得更“优雅”,因为埃格尔已经完成了这里带有类似的表格。我知道优雅是主观的,但如果有人愿意,请告诉我你将如何改进代码。

更新

我看到有人关闭了这个问题,因为它是基于个人观点的。我知道这个问题是这样的,但为什么它因为这个而被关闭了呢?关键是我想看到改进代码的不同方法。

答案1

无论使用哪种编程语言,如果我看到大量嵌套的 if,我就会开始考虑数组或哈希表。现在 LaTeX 实际上没有这些数据结构,但哈希表实际上很容易模拟。

我们希望能够在字符串(您的参数 #2)和命令之间建立映射。这是通过原始的\csname……\endcsname或私有的 LaTeX来实现的\@namedef。¹

现在我们可以定义我们想要执行的操作如下²:

\@namedef{skema@krist}#1{\textcolor{white}{\sank{#1}}}

对于每个选项,但我们也可以将所有这些都包装在一个新命令中以定义它们。

\NewDocumentCommand{\newskema}{m m}{
  \@namedef{skema@#1}##1{#2} % ⓿
}
\newskema{krist}{\textcolor{white}{\sank{#1}}}
\newskema{dansk}{...}
...

##1标有 ⓿ 的行告诉 LaTeX 我们正在使用纯 TeX 语法定义一个具有单个参数的宏。如果我们将其写为 而#1不是 ,##1它会将第一个参数的文本放在那里。)

然后为了访问所需的样式,我们可以这样写,例如,

\NewDocumentCommand{\laerer}{mm}{%
  \cellcolor{#2}%
  \@nameuse{skema@#2}{\MakeUppercase{\textbf{#1}}% ❶
}

不过,这需要对所有可能性进行明确定义。如果我们想要有默认值,则需要定义一个新命令来代替\@nameuse它,以检查我们是否为提供的值定义了命令,如果没有,它将使用默认值。

\NewDocumentCommand{\skemause}{m}{%
   \@ifdefined{skema@#1}{%
      \@nameuse{skema@#1}%
   }%
   {%
      \@nameuse{skema@DEFAULT}% or whatever you call your default
   }%
}

然后将标记为 ❶ 的行替换为

  \skemause{#2}{\MakeUppercase{\textbf{#1}}% ❶

  1. 看起来 expl3 没有提供像 那样方便使用的东西\@namedef,尽管我很乐意对此进行纠正。
  2. 因为我们使用的是私有命令,所以假设我们被包裹在\makeatletter……中\makeatother

相关内容