代码
考虑以下代码:
\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}}% ❶
- 看起来 expl3 没有提供像 那样方便使用的东西
\@namedef
,尽管我很乐意对此进行纠正。 - 因为我们使用的是私有命令,所以假设我们被包裹在
\makeatletter
……中\makeatother
。