我该如何绘制残缺的棋盘,即缺少两个对角的角方块?使用该chessboard
包,我只能绘制完整的棋盘……
答案1
PSTricks 解决方案:
\documentclass{article}
\usepackage{multido}
\usepackage{pstricks}
\def\boardsize{8 } % a space after the number is required
\begin{document}
\begin{pspicture}(\boardsize,\boardsize)
\psset{dimen = middel}
\multido{\iA = 0+1}{\numexpr\boardsize-1}{%
\multido{\iB = 0+1}{\numexpr\boardsize-1}{\psframe(\iB,\iA)(!\iB\space 1 add \iA\space 1 add)}}
\multido{\iC = 1+1}{\numexpr\boardsize-1}{\psframe(!\iC\space \boardsize 1 sub)(!\iC\space 1 add \boardsize)}
\multido{\iD = 1+1}{\numexpr\boardsize-2}{\psframe(!\boardsize 1 sub \iD)(!\boardsize \iD\space 1 add)}
\end{pspicture}
\end{document}
您所要做的就是选择的值\boardsize
。
更新
如果您想绘制线条而不是正方形,可以使用以下命令:
\documentclass{article}
\usepackage{multido}
\usepackage{pstricks}
\def\boardsize{8 } % a space after the number is required
\begin{document}
\begin{pspicture}(\boardsize,\boardsize)
\psset{linecap = 2}
\multido{\iA = 1+1}{\numexpr\boardsize-1}{\psline(\iA,0)(\iA,\boardsize)}
\multido{\iB = 1+1}{\numexpr\boardsize-1}{\psline(0,\iB)(\boardsize,\iB)}
\psline(0,0)(!0 \boardsize 1 sub)
\psline(\boardsize,1)(\boardsize,\boardsize)
\psline(0,0)(!\boardsize 1 sub 0)
\psline(1,\boardsize)(\boardsize,\boardsize)
\end{pspicture}
\end{document}
答案2
这很容易做到\foreach
;请参阅 TikZ/PGF 手册第 56 节。
关于效率的评论
绘制棋盘的方格(如图所示Svend Tveskæg 的第一个方法 和<guy-whose-name-always-changes>
的回答) 的效率相当低,对应的算法复杂度为 Θ(n^2),其中 n 是行数。相比之下,绘制棋盘的线条所需的工作量较少,对应的算法复杂度仅为 Θ(n)。因此,绘制棋盘的线条比绘制方格要好。
对于一次性的、小型的棋盘来说,这种考虑可能并不重要,但是如果您想在文档中多次绘制这种类型的图表,和/或如果您想绘制具有异常大量方格的棋盘(n×n,n 很大),您可能需要绘制线条而不是方格以减少编译时间。
\documentclass{article}
\usepackage{tikz}
\tikzset{chessboard/.style={thick}}%
\begin{document}
\begin{tikzpicture}
\newif\iffirstdiag % Switch to control which corners are ommitted.
\firstdiagtrue % (flip the switch here)
%
\pgfmathtruncatemacro\N{8} % number of rows/columns
\pgfmathtruncatemacro\Nmone{\N-1}
%
% draw internal lines
\foreach \i in {1,2,...,\Nmone}
{
\draw[chessboard] (0,\i) -- (\N,\i); % We control the horizontals...
\draw[chessboard] (\i,0) -- (\i,\N); % ...and the verticals.
% We can deluge you with a thousand
% channels or expand one single
% image to crystal clarity and
% beyond...
}
%
% draw external lines
\iffirstdiag
\draw[chessboard] (0,0) -- (\Nmone,0); % bottom
\draw[chessboard] (1,\N) -- (\N,\N); % top
\draw[chessboard] (0,0) -- (0,\Nmone); % left
\draw[chessboard] (\N,1) -- (\N,\N); % right
\else
\draw[chessboard] (1,0) -- (\N,0); % bottom
\draw[chessboard] (0,\N) -- (\Nmone,\N); % top
\draw[chessboard] (0,1) -- (0,\N); % left
\draw[chessboard] (\N,0) -- (\N,\Nmone); % right
\fi
\end{tikzpicture}
\end{document}
答案3
另一个解决方案是使用 PSTricks。只是为了减少其他现有答案中使用的击键次数。
特征:
- 只需将数字更改
4
为任意正整数即可更改单元格的数量。 - 代码使用最少的击键次数来节省更多字节。绿色环保!
- 所使用的算法很容易理解,但对于“相对较少”的数量来说它不会对您造成伤害
\N
。
PSTricks 解决方案(推荐)
\documentclass[pstricks,border=12pt]{standalone}
\def\N{5}
\def\M{\numexpr\N-1}
\def\A{\multips(0,1){\M}{\multips(1,0){\M}{\psframe(1,1)}}}
\begin{document}
\begin{pspicture}[dimen=m](\N,\N)
\A\rput(1,1){\A}
\end{pspicture}
\end{document}
TikZ 解决方案
\documentclass[tikz,border=12pt]{standalone}
\def\N{5}
\def\M{\numexpr\N-1}
\def\A{\tikz{\foreach \j in {1,...,\M}{\foreach \i in {1,...,\M}{\draw (\i,\j) rectangle +(1,1);}}}}
\begin{document}
\tikz \draw (0,0) node {\A} (1,1) node {\A};
\end{document}