我这里有一段 TikZ 代码,由于我才刚刚开始学习如何使用它,所以我想问一下这段代码是否可以接受或者完全无法阅读,以及我可以做些什么来改进它。
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{patterns}
\tikzset{
every picture/.prefix style={
execute at begin picture=\shorthandoff{"}
}
}
\begin{document}
\begin{tikzpicture}
\newdimen\field
\def\white{white}
\foreach \x in {0, ..., 7}
\foreach \y in {0, ..., 7} {
\pgfmathparse{mod(\x+\y,2) ? "white" : "black"}
\edef\color{\pgfmathresult}
\pgfmathparse{int(round(56+\x-8*\y))}
\edef\field{\pgfmathresult}
\edef\textcolor{\ifx\color\white black\else white\fi}
\path[fill=\color] (\x, \y) rectangle ++ (1, 1) node[color=\textcolor, pos=.5] {
\Large
\ifnum \field < 8
\pgfmathparse{2^(\field)}
\pgfmathprintnumber\pgfmathresult
\else
\dots
\fi
};
}
\draw (0, 0) -- (0, 8) -- (8, 8) -- (8, 0) -- cycle;
\end{tikzpicture}
\end{document}
代码输出演示小麦和棋盘问题。
答案1
我会避免使用\color
和,它们是和包\textcolor
中的重要宏:在排版节点文本时,您最终可能会使用它们,而它们被埋在其他宏中。color
xcolor
一些结构也可以简化:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0, ..., 7}
\foreach \y in {0, ..., 7} {
\ifodd\numexpr\x+\y\relax
\def\bgcolor{white}\def\fgcolor{black}
\else
\def\bgcolor{black}\def\fgcolor{white}
\fi
\pgfmathtruncatemacro\field{int(round(56+\x-8*\y))}
\path[fill=\bgcolor] (\x, \y) rectangle ++ (1, 1) node[color=\fgcolor, pos=.5] {
\Large
\ifnum \field < 8
\pgfmathparse{2^(\field)}%
\pgfmathprintnumber\pgfmathresult
\else
\dots
\fi
};
}
\draw (0, 0) -- (0, 8) -- (8, 8) -- (8, 0) -- cycle;
\end{tikzpicture}
\end{document}
\newdimen\field
有两种声明是错误的:
声明必须生效外部循环,否则你会在每个循环中都这样做,每次都会浪费一个寄存器;
然后使用
\edef\field
,这样就覆盖了刚刚赋予它的寄存器名称的含义。
答案2
这是一个非常简单的 TikZ 版本(我使用命名样式在黑色或白色之间进行选择):
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
square/.style={draw,minimum size=1cm,inner sep=0},
square 0/.style={square,fill=black},
square 1/.style={square,fill=white},
%
label/.style={font=\large,align=center,text depth=.3cm,text height=.7cm},
label 0/.style={label,text=white},
label 1/.style={label,text=black},
}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0, ..., 7} {
\foreach \y in {0, ..., 7} {
% black or white square
\pgfmathtruncatemacro\square{mod(\x+\y,2)}
\node[square \square] at (\x,\y) {};
% label
\pgfmathtruncatemacro\field{int(56+\x-8*\y)}
\ifnum \field < 8
\pgfmathtruncatemacro\power{2^(\field)}
\else%
\def\power{\dots}%
\fi%
\node[label \square] at (\x,\y) {\power};
}
}
\end{tikzpicture}
\end{document}
答案3
一些数字打印的乐趣 :) 因为数字很大,让我们fpu
来处理它们。我使用了截断的 [.] 亿分之一
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{fpu,babel}%TikZ 3 has a babel library that takes care of active chars
\pgfkeys{
/pgf/number format/mynum/.style={1000 sep={},std=0:3,sci precision=0,
sci generic={mantissa sep={\!\cdot},exponent={\scriptstyle {10}^{##1}}}
}
}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0, ..., 7} {
\foreach \y in {0, ..., 7} {
\pgfmathsetmacro\mycolor{mod(\x+\y,2) ? 100 : 0}
\pgfmathtruncatemacro\field{56+\x-8*\y}
\path[fill=black!\mycolor] (\x, \y) rectangle ++ (1, 1)
\pgfextra{\pgfkeys{/pgf/fpu}\pgfmathparse{2^(\field)}\pgfkeys{/pgf/fpu=false}}
node[text=white!\mycolor!black, midway] {
\pgfmathprintnumber[mynum]{\pgfmathresult}
};
}
}
\draw (0, 0) rectangle (8, 8);
\end{tikzpicture}
\end{document}