TikZ 编码风格

TikZ 编码风格

我这里有一段 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中的重要宏:在排版节点文本时,您最终可能会使用它们,而它们被埋在其他宏中。colorxcolor

一些结构也可以简化:

\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有两种声明是错误的:

  1. 声明必须生效外部循环,否则你会在每个循环中都这样做,每次都会浪费一个寄存器;

  2. 然后使用\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}

在此处输入图片描述

相关内容