![TikZ 中的教室座位表?](https://linux22.com/image/296498/TikZ%20%E4%B8%AD%E7%9A%84%E6%95%99%E5%AE%A4%E5%BA%A7%E4%BD%8D%E8%A1%A8%EF%BC%9F.png)
我想根据学生的编号列表制作一个随机教室座位表。我还想指定每排座位数(因为我的教室里座位数各不相同)和每张桌子的座位数(在我的情况下是 2 个,否则是 1 个)。
我的教室有 22 个座位,具体配置如下(其中 S = 一个座位):
SSSSSSSS ← 一排 8 个座位 SSSSSSSS ← 一排 8 个座位 SSSSSS ← 排 6 个座位 教室前面
我将如何用 TikZ 解决这个问题,我只需要向它传递一个从房间前面开始每排座位数的数组(在我的具体情况下为 {6,8,8})、学生名单 {“Albert”、“Bob”、“Chris”、…,“Zach”},以及每张桌子的座位数(在我的具体情况下,为 2,否则为 1)?
谢谢
答案1
这里有两个版本,第一个版本在某些地方看起来不太友好,但大多数参数(桌子和座位的数量)都是从子列表中自动得出的。
它也不会轻易推广到其他表格布局,并且如果改变尺寸,可能需要进行一些“调整”。
\documentclass[tikz,border=5]{standalone}
\def\countitemsinmacro#1{\foreach \i [count=\itemcount, remember=\itemcount] in #1{}}
\tikzset{%
every seat/.style={
shape=rectangle,
draw,
font=\footnotesize,
minimum width=1.5cm,
minimum height=1cm,
},
}
\begin{document}
\begin{tikzpicture}
\foreach \childrenrow [count=\rownumber]
in {%
{Alphie,{Bert,Carl},{Dennis,Eon},{Frank,George},{Harry}},%
{{Alice,Beth},{Carrie,Doris},{Ellie,Felicity},{Gina,Hetty}},%
{{Zoe,Ziyad},{Yafa,Yaden},{Xana,Xander}}%
}{
\countitemsinmacro{\childrenrow}%
\let\tabletotal=\itemcount%
\foreach \children [count=\tablenumber] in \childrenrow {
\countitemsinmacro{\children}%
\let\seatcount=\itemcount%
\foreach \child [count=\seatnumber] in \children{
\node [every seat/.try, seat \rownumber-\tablenumber-\seatnumber/.try]
at (-\tabletotal/2*4+\tablenumber*4+\seatnumber*1.5-\seatcount/2*1.5,-\rownumber*2) (seat-\rownumber-\tablenumber-\seatnumber) {\child};
}}}
\end{tikzpicture}
\end{document}
其次,需要指定更多内容(即每排的桌子数量和每张桌子的座位数量),但儿童姓名列表是自动随机的。
\documentclass[tikz,border=5]{standalone}
\makeatletter
\def\globalnamelet#1#2{%
\def\marshal{\expandafter\global\expandafter\let\csname#1\endcsname}%
\expandafter\marshal\csname#2\endcsname%
}
\def\setchildnames#1{\foreach\childname[count=\i@,remember=\i@]in{#1}{%
\globalnamelet{childlist@\i@}{childname}%
}\let\childlistcount=\i@}
\def\shufflechildnames#1{%
\foreach\i@ in{1,...,#1}{%
\foreach\j@ in{1,...,\childlistcount}{%
\pgfutil@namelet{tmpchild}{childlist@\j@}%
\pgfmathrandominteger\k@{1}{\childlistcount}%
\globalnamelet{childlist@\j@}{childlist@\k@}%
\globalnamelet{childlist@\k@}{tmpchild}%
}}}
\def\getchildname#1{\csname childlist@#1\endcsname}
\begin{document}
\setchildnames{Alfie,Ben,Carol,Dalia,Ellie,Felicty,George,%
Hetty,Ian,Jamil,Katrin,Luke,Madia,Niri,Ollie,Peta,%
Qaniah,Rohana,Samita,Thomas,Ute,Vera}
\shufflechildnames{10}
\begin{tikzpicture}
\def\c{0}
\foreach \tables/\tableseats [count=\rowcount, remember=\c] in
%
{5/{1,2,2,2,1},4/{2,2,2,2},3/{2,2,2}}
%
\foreach \seats [count=\tablecount, remember=\c] in \tableseats
\foreach \seat [evaluate={\c=int(\c+1);}, remember=\c] in {1,...,\seats}
\node [draw, minimum width=1.5cm, minimum height=1cm, anchor=base]
at (\tablecount*4-\tables/2*4+\seat*1.5-\seats/2*1.5,-\rowcount*2)
{\strut\getchildname{\c}};
\end{tikzpicture}
\end{document}