一位朋友正在尝试制作一些自动生成的宾果游戏板,而 LaTeX 似乎是个显而易见的选择 - 没什么特别的,只是一个 5x5 的表格,带有方形单元格、居中文本和必要时的换行。经过一番搜索,我对设置单元格的垂直高度有点不知所措。我该怎么做?
考虑到要放入方格的术语的长度(例如“语言病理学家”),我认为除了一整张信纸之外,没有其他选择。(它们将被打印出来,特殊纸张会很麻烦,而且一张纸上放两张也太小了。)除此之外,实际上没有任何硬性格式要求 - 清晰易读的大小,只要你有,也可以填满整个页面。无论如何,我相信我可以调整细节。
答案1
随机生成节点:
pgf
这是一个使用算法内置的随机数生成器随机生成节点的版本:
- 列
B
包含数字 1 - 15 - 列
I
包含数字 16 - 30 - 列
N
包含数字 31 - 45 - 列
G
包含数字 46 - 60 - 列
O
包含数字 61 - 75
进一步增强:
- 不确定一列中是否允许重复的数字,如果不允许,则可以增强为循环,如果生成了以前使用的数字
- 添加精美的边框并标记列:
B
,,,,,I
N
G
O
代码:
\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calc}
% Column B contains numbers 1 - 15
% Column I contains numbers 16 - 30
% Column N contains numbers 31 - 45
% Column G contains numbers 46 - 60
% Column O contains numbers 61 - 75
\def\NumOfColumns{5}%
\def\Sequence{1/A/1/15, 2/B/16/30, 3/C/31/45, 4/D/46/60, 5/E/61/71}%
\newcommand{\Size}{2.5cm}
\tikzset{Square/.style={
inner sep=0pt,
text width=\Size,
minimum size=\Size,
draw=black,
fill=yellow!20,
align=center,
}
}
\begin{document}
\begin{tikzpicture}[draw=black, ultra thick, x=\Size,y=\Size]
\foreach \row/\rowLetter/\MinNumber/\MaxNumber in \Sequence{%
\foreach \col/\colLetter/\MinNumber/\MaxNumber in \Sequence {%
\pgfmathtruncatemacro{\value}{\col+\NumOfColumns*(\row-1)}
\def\NodeText{\pgfmathparse{random(\MinNumber,\MaxNumber)}\pgfmathresult}
\pgfmathsetmacro{\ColRowProduce}{\col*\row}
\IfEq{\ColRowProduce}{9}{% If is center square
\node [Square] at ($(\col,-\row)-(0.5,0.5)$) {\Huge Free Space};
}{
\node [Square] at ($(\col,-\row)-(0.5,0.5)$) {\Huge \NodeText};
}
}
}
\end{tikzpicture}
\end{document}
手动指定节点:
我不确定您想如何设置要指定的每个单元格的内容,因此我提供了\Node<col><row>
您可以填写的单独宏。如果有一个选择这些的算法,那么它也可以自动化。
以下使用 TikZ 节点。您可以更改的设置\Size
来指定正方形边的长度。
代码:
\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand{\Size}{2.5cm}% Adjust size of square as desired
\def\NumOfColumns{5}%
\def\Sequence{1/A, 2/B, 3/C, 4/D, 5/E}% This needs to match \NumOfColumns
\tikzset{Square/.style={
inner sep=0pt,
text width=\Size,
minimum size=\Size,
draw=black,
fill=yellow!20,
align=center
}
}
% Define the contents of the cells here.
\newcommand{\NodeAA}{Node $(1,1)$}%
\newcommand{\NodeAB}{Node $(1,2)$}%
\newcommand{\NodeAC}{Node $(1,3)$}%
\newcommand{\NodeAD}{Node $(1,4)$}%
\newcommand{\NodeAE}{Node $(1,5)$}%
\newcommand{\NodeBA}{Node $(2,1)$}%
\newcommand{\NodeBB}{Node $(2,2)$}%
\newcommand{\NodeBC}{Node $(2,3)$}%
\newcommand{\NodeBD}{Node $(2,4)$}%
\newcommand{\NodeBE}{Node $(2,5)$}%
\newcommand{\NodeCA}{Node $(3,1)$}%
\newcommand{\NodeCB}{Node $(3,2)$}%
\newcommand{\NodeCC}{Node $(3,3)$}%
\newcommand{\NodeCD}{Node $(3,4)$}%
\newcommand{\NodeCE}{Node $(3,5)$}%
\newcommand{\NodeDA}{Node $(4,1)$}%
\newcommand{\NodeDB}{Node $(5,2)$}%
\newcommand{\NodeDC}{Node $(5,3)$}%
\newcommand{\NodeDD}{Node $(5,4)$}%
\newcommand{\NodeDE}{Node $(5,5)$}%
\newcommand{\NodeEA}{Node $(5,1)$}%
\newcommand{\NodeEB}{Node $(5,2)$}%
\newcommand{\NodeEC}{Node $(5,3)$}%
\newcommand{\NodeED}{Node $(5,4)$}%
\newcommand{\NodeEE}{Node $(5,5)$}%
\begin{document}
\begin{tikzpicture}[draw=black, ultra thick, x=\Size,y=\Size]
\foreach \col/\colLetter in \Sequence {%
\foreach \row/\rowLetter in \Sequence{%
\pgfmathtruncatemacro{\value}{\col+\NumOfColumns*(\row-1)}
\def\NodeText{\expandafter\csname Node\rowLetter\colLetter\endcsname}
\node [Square] at ($(\col,-\row)-(0.5,0.5)$) {\NodeText};
}
}
\end{tikzpicture}
\end{document}
答案2
\documentclass[border=20pt]{standalone}
\usepackage[thinlines]{easytable}
\begin{document}
\huge
\begin{TAB}(e,2cm,2cm){|c:c:c:c:c|}{|c:c:c:c:c|}
1 & 2 & 3 & 4 & 5 \\
6 & 7 & & & \\
& & & & \\
& & & & \\
& & & &
\end{TAB}
\end{document}
答案3
以下非常好的文章来自威尔·罗伯逊发表在PracTeX 期刊描述如何使用基本数组技术创建方形单元格环境。我没有包含任何用于输入单元格的特定代码;根据单元格的生成方式,我可能倾向于使用该datatool
包并从 CSV 文件中读取板。这很容易适应这种表格样式。
以下是一个例子:
% This code written by Will Robertson and published in PracTeX Journal 2005-2
% "Square cells: an array cooking lesson"
% Modified for line wrapping
\documentclass{article}
\usepackage{array}
\usepackage{calc}
\newlength\celldim
\newlength\fontheight
\newlength\extraheight
\newcounter{sqcolumns}
\newcolumntype{S}{
@{}
>{\centering \rule[-0.5\extraheight]{0pt}{\fontheight + \extraheight}%
\begin{minipage}{\celldim}\centering}
p{\celldim}
<{\end{minipage}}
@{} }
\newcolumntype{Z}{ @{} >{\centering} p{\celldim} @{} }
\newenvironment{squarecells}[1]
{\setlength\celldim{4.5em}%
\settoheight\fontheight{A}%
\setlength\extraheight{\celldim - \fontheight}%
\setcounter{sqcolumns}{#1 - 1}%
\begin{tabular}{|S|*{\value{sqcolumns}}{Z|}}\hline}
% squarecells tabular goes here
{\end{tabular}}
\newcommand\nl{\tabularnewline\hline}
\begin{document}
\Huge
\begin{squarecells}{4}
This is a long line & 3 & 2 & 13 \nl
5 & 10 & 11 & 8 \nl
9 & 6 & 7 & 12 \nl
4 & 15 & 14 & 1 \nl
\end{squarecells}
\end{document}
答案4
使用tabstackengine
在根据最宽的列编写具有等间距列的表格\fboxsep
,我们有以下 MWE。您可以使用、\fboxrule
、\mystrutwidth
和的定义来控制框的大小和规则厚度\mystrutdepth
。
\documentclass{article}
\usepackage{tabstackengine}
\usepackage{fixltx2e}
% YOU CONTROL THE NEXT FOUR LINES
\fboxsep=3pt
\fboxrule=.8pt
\def\mystrutwidth{2.5\baselineskip}
\def\mystrutdepth{1\baselineskip}
%
\def\mystrut{\rule[-\mystrutdepth]{0ex}{\mystrutwidth}}
\newcommand\bngo[1]{\kern-\fboxrule\fbox{\mystrut\makebox[\mystrutwidth]{#1}}}%
\setstackgap{L}{\mystrutwidth+2\fboxsep+\fboxrule}
\begin{document}
\tabbedLongstack{
\bngo{8} & \bngo{29} & \bngo{45} & \bngo{54} & \bngo{68}\\
\bngo{9} & \bngo{19} & \bngo{40} & \bngo{49} & \bngo{67}\\
\bngo{15} & \bngo{24} & \stackanchor{Free}{Space} & \bngo{46} & \bngo{71}\\
\bngo{7} & \bngo{26} & \bngo{32} & \bngo{60} & \bngo{64}\\
\bngo{14} & \bngo{28} & \bngo{37} & \bngo{46} & \bngo{66}
}
\end{document}