summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/litetable/tex/litetable.cls
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/litetable/tex/litetable.cls')
-rw-r--r--macros/latex/contrib/litetable/tex/litetable.cls196
1 files changed, 91 insertions, 105 deletions
diff --git a/macros/latex/contrib/litetable/tex/litetable.cls b/macros/latex/contrib/litetable/tex/litetable.cls
index 10d6882ff4..f965a8a69c 100644
--- a/macros/latex/contrib/litetable/tex/litetable.cls
+++ b/macros/latex/contrib/litetable/tex/litetable.cls
@@ -14,17 +14,13 @@
\NeedsTeXFormat{LaTeX2e}
\PassOptionsToPackage{quiet}{xeCJK}
\PassOptionsToPackage{no-math}{fontspec}
-\ProvidesClass{litetable}[2024/02/24/ v2.4a LiteTable document class]
+\ProvidesClass{litetable}[2024/02/24/ v2.4b LiteTable document class]
% ---------- 全局选项 ---------- %
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\SetupKeyvalOptions{family=LITE, prefix=LITE@, setkeys=\kvsetkeys}
-\DeclareStringOption[sharp]{style}
-\DeclareVoidOption{round}{\kvsetkeys{LITE}{style=round}}
-\DeclareVoidOption{sharp}{\kvsetkeys{LITE}{style=sharp}}
-
\DeclareStringOption[portiait]{direction}
\DeclareVoidOption{portiait}{\kvsetkeys{LITE}{direction=portiait}}
\DeclareVoidOption{landscape}{\kvsetkeys{LITE}{direction=landscape}}
@@ -73,9 +69,7 @@
\definecolor{darkergray}{HTML}{F1F3F5} % 深色块
\definecolor{lightergray}{HTML}{FCFDFE} % 浅色块
\definecolor{blackgray}{HTML}{1A1D21} % 序号颜色
-
\pagecolor{lightergray}
-
\definecolor{H1}{HTML}{74A7A2} % 深绿
\definecolor{H1*}{HTML}{E9EEED}
\definecolor{H1**}{HTML}{009787}
@@ -103,7 +97,6 @@
\definecolor{H9}{HTML}{D09966} % 棕色
\definecolor{H9*}{HTML}{F2E0D0}
\definecolor{H9**}{HTML}{C96F1C}
-
\definecolor{W1}{HTML}{CCAD52}
\definecolor{W2}{HTML}{8FCC52}
\definecolor{W3}{HTML}{52CC70}
@@ -125,6 +118,7 @@
\def\pageheight{-11 in}
}
}{\relax}
+
\ifdefstring{\LITE@direction}{landscape}{
\def\pagewidth{11 in}
\def\pageheight{-8.5 in}
@@ -138,96 +132,84 @@
}
}{\relax}
-\ifdefstring{\LITE@style}{round}{\def\corners{rounded corners}}{\relax}
-\ifdefstring{\LITE@style}{sharp}{\def\corners{}}{\relax}
-
\ExplSyntaxOn % 数组
-\cs_set:Npn \timelist #1 {
- \gdef\@timelist{#1}
- \seq_set_split:Nnn \l_node_row_seq {;} {#1}
- \int_step_inline:nn{\seq_count:N \l_node_row_seq}
- {
- \seq_if_exist:cF {l_node_row_##1_seq}
- {
- \seq_new:c {l_node_row_##1_seq}
- }
- \exp_args:Ncx\seq_set_from_clist:Nn {l_node_row_##1_seq} {\seq_item:Nn \l_node_row_seq{##1}}
- }
-}
+% 1. Set up arrays
+\def\definearray#1#2
+ {
+ \seq_clear_new:c { l__litetable_array_#1_seq }
+ \seq_set_split:cnn { l__litetable_array_#1_seq } { ; } { #2 }
+ }
-\cs_set:Npn \PrintTime [#1][#2] {
- \tl_if_empty:nTF { #1 }
- {
- \tl_if_empty:nTF { #2 }
- {
- \seq_use:Nn \l_node_row_seq {,}
- }
- {
- \int_step_inline:nn{\seq_count:N \l_node_row_seq}
- {
- \seq_put_right:Nn \l_node_tmp_seq {\seq_item:cn {l_node_row_##1_seq}{#2}}
- }
- \seq_use:Nn \l_node_tmp_seq {,}
- }
- }
- {
- \tl_if_empty:nTF {#2}
- {
- \seq_use:cn {l_node_row_#1_seq}{,}
- }
- {
- \seq_item:cn {l_node_row_#1_seq}{#2}
- }
- }
-}
+\cs_generate_variant:Nn \seq_set_split:Nnn { c }
-\cs_set:Npn \weeklist #1 {
- \gdef\@weeklist{#1}
- \gdef\@weeknum{\clist_count:n {#1}} % 计数模块
- \seq_set_split:Nnn \r_node_row_seq {;} {#1}
- \int_step_inline:nn{\seq_count:N \r_node_row_seq}
- {
- \exp_args:Ncx\seq_set_from_clist:Nn {r_node_row_##1_seq} {\seq_item:Nn \r_node_row_seq{##1}}
- }
-}
+% 2. Define commands to work with arrays
+\NewExpandableDocumentCommand{\arraycount}{ o m }
+ {
+ \IfNoValueTF { #1 }
+ {
+ \litetable_array_count_full:n { #2 }
+ }
+ {
+ \litetable_array_count_item:nn { #2 } { #1 }
+ }
+ }
+
+\cs_new:Nn \litetable_array_count_item:nn
+ {
+ \clist_count:e { \seq_item:cn { l__litetable_array_#1_seq } { #2 } }
+ }
+
+\NewExpandableDocumentCommand{\arrayitem}{ m m m }
+ {
+ \clist_item:en { \seq_item:cn { l__litetable_array_#1_seq } { #2 } } { #3 }
+ }
-\cs_set:Npn \PrintWeek [#1] {
- \tl_if_empty:nTF {#1}
- {
- \seq_use:cn {r_node_row_1_seq}{,}
- }
- {
- \seq_item:cn {r_node_row_1_seq}{#1}
- }
-}
\ExplSyntaxOff
-\def\classnum#1{\gdef\@classnum{#1}}
-\ifcsname @classnum\endcsname % 判断`\@classnum'由`\timelist'计数赋值还是`\classnum'直接赋值
- \relax
- \else
- \ifcsname @timelist\endcsname
- \gdef\@classnum{\int_div_round:nn {\clist_count:n {\@timelist}}{2}} % 计数模块
+\NewDocumentCommand{\timelist}{ o m }
+{
+ \gdef\@timelist{#2}
+ \definearray{timelist}{#2}
+ \IfNoValueTF{#1}{
+ \ifnum \arraycount[2]{timelist}<\arraycount[1]{timelist}
+ \def\@classnum{\arraycount[1]{timelist}}
\else
- \def\@classnum{12}
+ \def\@classnum{\arraycount[2]{timelist}}
\fi
+ }{\def\@classnum{#1}}
+}
+\ifcsname @timelist\endcsname
+ \relax
+ \else
+ \def\@classnum{12}
\fi
+\def\weeklist#1{
+ \gdef\@weeklist{#1}
+ \definearray{weeklist}{#1}
+}
+\gdef\@weeknum{\arraycount[1]{weeklist}}
\RequirePackage{fontawesome5}
\newcounter{number}
\def\sticker#1{\gdef\@sticker{#1}}
+\def\corner#1{\gdef\@corner{#1}}
\def\makeframe#1{
+ \ifcsname @corner\endcsname
+ \tikzset{corner/.style={rounded corners=\@corner}}
+ \else
+ \tikzset{corner/.style={}}
+ \fi
\draw [darkergray] (0,0) rectangle (\pagewidth,\pageheight);
- \fill [fill=darkergray,\corners] (0,0) rectangle (\pagewidth,{1.5*\pageheight/(2*\@classnum+3.5)});% 顶部深灰色块
+ \fill [fill=darkergray,corner] (0,0) rectangle (\pagewidth,{1.5*\pageheight/(2*\@classnum+3.5)});% 顶部深灰色块
\node at (.5*\pagewidth,{.75*\pageheight/(2*\@classnum+3.5)}) {\huge\bfseries\sffamily #1}; % 标题
\ifodd\@classnum
\foreach \a in {2,4,...,\@classnum,\@classnum+2}
- \fill [fill=darkergray,yshift=(2*\a-1.5)*\pageheight/(2*\@classnum+3.5),\corners] (0,0) rectangle (\pagewidth,{2*\pageheight/(2*\@classnum+3.5)}); % 中间深灰色块(循环)
+ \fill [fill=darkergray,yshift=(2*\a-1.5)*\pageheight/(2*\@classnum+3.5),corner] (0,0) rectangle (\pagewidth,{2*\pageheight/(2*\@classnum+3.5)}); % 中间深灰色块(循环)
\else
\foreach \a in {2,4,...,\@classnum}
- \fill [fill=darkergray,yshift=(2*\a-1.5)*\pageheight/(2*\@classnum+3.5),\corners] (0,0) rectangle (\pagewidth,{2*\pageheight/(2*\@classnum+3.5)}); % 中间深灰色块(循环)
- \fill [fill=darkergray,yshift=(2.5+2*\@classnum)*\pageheight/(2*\@classnum+3.5),\corners] (0,0) rectangle (\pagewidth,{\pageheight/(2*\@classnum+3.5)}); % 底部深灰色块
+ \fill [fill=darkergray,yshift=(2*\a-1.5)*\pageheight/(2*\@classnum+3.5),corner] (0,0) rectangle (\pagewidth,{2*\pageheight/(2*\@classnum+3.5)}); % 中间深灰色块(循环)
+ \fill [fill=darkergray,yshift=(2.5+2*\@classnum)*\pageheight/(2*\@classnum+3.5),corner] (0,0) rectangle (\pagewidth,{\pageheight/(2*\@classnum+3.5)}); % 底部深灰色块
\fi
\foreach \a in {0,1,2,...,\@classnum}
@@ -235,27 +217,29 @@
% 时间标注
\setcounter{number}{0}
- \ifcsname @timelist\endcsname % 若 `\@timelist == empty', 跳过该函数
- \foreach \x in {1,2,...,\@classnum}
+ \ifcsempty{@timelist}{
+ \foreach \a in {1,2,...,\@classnum}
+ {
+ \node [yshift=(1.5+2*\a)*\pageheight/(2*\@classnum+3.5)] at(\pagewidth/32,0)
+ {\bfseries\large\color{blackgray}\texttt{\refstepcounter{number}\thenumber}};
+ }
+ }{
+ \foreach \x in {1,2,...,\@classnum}
{
\node [yshift=(2*\x+.9)*\pageheight/(2*\@classnum+3.5)] at (\pagewidth/32,0)
{\bfseries\color{blackgray}\texttt{\refstepcounter{number}\thenumber}};
\node[yshift=(2*\x+1.55)*\pageheight/(2*\@classnum+3.5)] at (\pagewidth/32,0)
- {\color{darkgray}\texttt{\PrintTime[1][\x]}};
+ {\color{darkgray}\texttt{\arrayitem{timelist}{1}{\x}}};
\node[yshift=(2*\x+2.1)*\pageheight/(2*\@classnum+3.5)] at (\pagewidth/32,0)
- {\color{darkgray}\texttt{\PrintTime[2][\x]}};
+ {\color{darkgray}\texttt{\arrayitem{timelist}{2}{\x}}};
}
- \else
- \foreach \a in {1,2,...,\@classnum}
- {
- \node [yshift=(1.5+2*\a)*\pageheight/(2*\@classnum+3.5)] at(\pagewidth/32,0)
- {\bfseries\large\color{blackgray}\texttt{\refstepcounter{number}\thenumber}};
}
- \fi
+
% 星期标注
\foreach \a in {1,2,...,\@weeknum}
- \node [xshift=3*\a*\pagewidth/16] at ({\pagewidth/16-\a*(15*\pagewidth/16*(1/5-1/\@weeknum))-7.5*\pagewidth/(16*\@weeknum)},{2*\pageheight/(2*\@classnum+3.5)})
- {\PrintWeek[\a]};
+ \node [xshift=\pagewidth/16] at ({.5*(\arrayitem{weeklist}{2}{\a}+\arrayitem{weeklist}{2}{\a+1})*15*\pagewidth/16},{2*\pageheight/(2*\@classnum+3.5)})
+ {\arrayitem{weeklist}{1}{\a}};
+
\ifcsname @sticker\endcsname
\node [opacity=.3,above left,yshift=(1.5+2*\@classnum)*\pageheight/(2*\@classnum+3.5),inner sep=0pt,outer sep=auto,scale=15] at (\pagewidth,{\pageheight/(2*\@classnum+3.5)}) {\includegraphics[width=\dimeval{\pagewidth/16/\@weeknum}]{\@sticker}};\fi
}
@@ -273,39 +257,41 @@
\NewDocumentCommand{\course}{O{H1} m m m m m O{\@weeks}}
{
- \fill [#1,\corners,
+ \fill [#1,corner,
yshift=(2*(#2-1))*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16]
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))},{2.5*\pageheight/(2*\@classnum+3.5)}) rectangle ++
- ({15*\pagewidth/(16*\@weeknum)},{(2+2*(#3-#2))*\pageheight/(2*\@classnum+3.5)}); % frame
+ xshift=\pagewidth/16]
+ ({\arrayitem{weeklist}{2}{\theweekday+1}*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)}) rectangle ++
+ ({(\arrayitem{weeklist}{2}{\theweekday+2}-\arrayitem{weeklist}{2}{\theweekday+1})*15*\pagewidth/16},{(2+2*(#3-#2))*\pageheight/(2*\@classnum+3.5)}); % frame
- \fill [#1*,\corners,
+ \fill [#1*,
yshift=(2*(#2-1)+.5)*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16]
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))},{2.5*\pageheight/(2*\@classnum+3.5)}) rectangle ++
- ({15*\pagewidth/(16*\@weeknum)},{(1.5+2*(#3-#2))*\pageheight/(2*\@classnum+3.5)}); % content
+ xshift=\pagewidth/16]
+ ({\arrayitem{weeklist}{2}{\theweekday+1}*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)}) --++
+ ({(\arrayitem{weeklist}{2}{\theweekday+2}-\arrayitem{weeklist}{2}{\theweekday+1})*15*\pagewidth/16},0)
+ { [corner] --++ (0,{(1.5+2*(#3-#2))*\pageheight/(2*\@classnum+3.5)}) --++
+ ({(-\arrayitem{weeklist}{2}{\theweekday+2}+\arrayitem{weeklist}{2}{\theweekday+1})*15*\pagewidth/16},0)} -- cycle; % content
\node [#1**,yshift=(#2+#3-1.25)*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16] at
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))+7.5*\pagewidth/(16*\@weeknum)},{2.5*\pageheight/(2*\@classnum+3.5)})
+ xshift=\pagewidth/16] at
+ ({.5*(\arrayitem{weeklist}{2}{\theweekday+1}+\arrayitem{weeklist}{2}{\theweekday+2})*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)})
{\heiti\large\bfseries #4}; % course
\node [#1**,above,
yshift=(#2+#3-.2)*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16] at
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))+7.5*\pagewidth/(16*\@weeknum)},{2.5*\pageheight/(2*\@classnum+3.5)})
+ xshift=\pagewidth/16] at
+ ({.5*(\arrayitem{weeklist}{2}{\theweekday+1}+\arrayitem{weeklist}{2}{\theweekday+2})*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)})
{\heiti\bfseries\small #5}; % location
\node [#1**,below,
yshift=(#2+#3-.2)*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16] at
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))+7.5*\pagewidth/(16*\@weeknum)},{2.5*\pageheight/(2*\@classnum+3.5)})
+ xshift=\pagewidth/16] at
+ ({.5*(\arrayitem{weeklist}{2}{\theweekday+1}+\arrayitem{weeklist}{2}{\theweekday+2})*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)})
{\heiti\bfseries\small #6}; % teacher
\node [#1**,above left,
yshift=2*#3*\pageheight/(2*\@classnum+3.5),
- xshift=3*\theweekday*\pagewidth/16] at
- ({\pagewidth/16-\theweekday*(15*\pagewidth/16*(1/5-1/\@weeknum))+15*\pagewidth/(16*\@weeknum)},{2.5*\pageheight/(2*\@classnum+3.5)})
+ xshift=\pagewidth/16] at
+ ({\arrayitem{weeklist}{2}{\theweekday+2}*15*\pagewidth/16},{2.5*\pageheight/(2*\@classnum+3.5)})
{\heiti\footnotesize #7}; % weeks
}