TikZ,绘制一个边框上有尖刺的矩形

TikZ,绘制一个边框上有尖刺的矩形

这个问题导致了一个新的方案的出现:
Scrabble

我想画一个拼字游戏板。在我漫长的旅程中,我想在板周围设置可用的节点。我可以做的网格。现在我正在研究“三重单词分数”、“双字母分数”等的编码。

模型在这里在此处输入图片描述

我的 MWE 在这里:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}

\tikzstyle{mtr} =[draw=black, fill=red, opacity=1, rectangle, decorate, decoration={snake,amplitude=1,segment length=3}, minimum width=0.98cm, minimum height=0.98cm, text width=0.8cm, inner ysep=0cm, inner xsep=0cm, text centered, execute at begin node=\setlength{\baselineskip}{8pt}]

\begin{document}
\begin{tikzpicture}
\node[mtr]  at(1,1) (mtr1) {\tiny{Triple word score}};
\end{tikzpicture}
\end{document}

我怎样才能使尖刺部分看起来像我的模型?每条边框中心只有 3 个尖刺?

答案1

不幸的是,它不计算分数。需要最新版本的 PGF。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{shapes.geometric}
\def\lettertoscrabblescore#1{%
\def\tmp{#1}%
\expandafter\count\expandafter0\expandafter`#1\relax\advance\count0 by-65\relax%
\ifcase\count0\relax%
1\or3\or3\or2\or1\or4\or2\or4\or1\or8\or5\or1\or3\or1\or1\or3\or10\or1\or1\or1\or1\or4\or4\or8\or4\or10\else\fi}

\tikzset{%
every score/.style={
  font=\sffamily\bfseries\tiny,
  align=center,
  scale=0.75, 
  draw=none, fill=none,
},
pics/.cd,
spikes/.style args={#1#2#3}{
  code={
    \fill [#3,scale=0.5*(1-.1)] (-1,1) 
      \foreach \i in {0,1,2,3}{
        [rotate=-\i*90] -- (-#1*#2,1) 
        \foreach \j in {1,...,#1} {-- ++(#2,#2) -- ++(#2,-#2)}
       -- (1,1)} -- cycle; 
  }
},
triple word score/.style={
  code={
    \path pic {spikes={3}{.15}{red!75}};
    \node [every score/.try] {TRIPLE\\WORD\\SCORE};
  }
},
double word score/.style={
  code={
    \path pic {spikes={2}{.15}{red!25}};
    \node [every score/.try] {DOUBLE\\WORD\\SCORE};
  }
},
triple letter score/.style={
  code={
    \path pic {spikes={3}{.15}{blue!50!cyan!75}};
    \node [every score/.try] {TRIPLE\\LETTER\\SCORE};
  }
},
double letter score/.style={
  code={
    \path pic {spikes={2}{.15}{blue!50!cyan!50}};
    \node [every score/.try] {DOUBLE\\LETTER\\SCORE};
  }
},
center/.style={
  code={  
    \path pic {spikes={0}{0}{red!25}};
    \node [star,fill, star point ratio=2]{};
  }
},
tile/.style={
  code={
    \node [fill=yellow!40, minimum size=0.9cm, rounded corners=0.2cm, font=\sffamily\bfseries] (@) {#1};
    \node [font=\sffamily\tiny, anchor=south east] at (@.south east) {\lettertoscrabblescore{#1}};
  }
},
word across/.style={
  code={
    \foreach \l [count=\x from 0] in {#1}
      \path (\x,0) pic {tile={\l}};
  }
},
word down/.style={
  code={
    \foreach \l [count=\y from 0] in {#1}
      \path (0,-\y) pic {tile={\l}};
  }
}
}
\begin{document}

\begin{tikzpicture}

\fill[gray!25] (-.5,-.5) rectangle ++(15,15);
\draw[white,line width=.1cm, shift={(-.5,-.5)}] grid (15,15);

\foreach \p in{(\x,\y),(\y, 14-\x),(14-\x, 14-\y),(14-\y, \x)}{ 
  \foreach \x/\y in {0/0,7/0} 
    \path \p pic {triple word score};
  \foreach \x/\y in {1/1,2/2,3/3,4/4}
    \path \p pic {double word score};
  \foreach \x/\y in {1/5,5/1,5/5}
    \path \p pic {triple letter score};
  \foreach \x/\y in {3/0,0/3,2/6,6/2,6/6}
    \path \p pic {double letter score};
}
\path (7,7) pic {center};

\path (0,14) pic {word across={T,I,K,Z}};
\path (1,14) pic {word down={I,N,K,S,C,A,P,E}};
\path (0,11) pic {word across={A,S,Y,M,P,T,O,T,E}};
\path (3,11) pic {word down={M,E,T,A,P,O,S,T}};
\path (7,13) pic {word down={P,S,T,R,I,C,K,S}};
\path (1,4) pic {word across={M,E,T,A,F,U,N}};
\path (6,6) pic {word across={E,S,O,P,I,C}};
\path (5,14) pic {word down={S,K,E,T,C,H}};

% \path (3,8) pic {word across={T,I,K,Z}};
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

这是 Metapost 中的另一种选择,纯粹是为了娱乐和说明

  • 制作带有侧面尖刺的盒子路径的方法
  • 并使用一长串后缀来绘制重复的模式

在此处输入图片描述

prologues := 3;
outputtemplate := "%j%c.eps";

spike_size = 2;
tile_size = 24;

vardef spiked_square(expr n) = 
  save t, side; path side;
  % length of the straight bits
  t = (tile_size-n*spike_size)/2;
  % path for one side
  side = (0,0) -- (t,0) 
    for i=0 upto n-1: -- (t+i*spike_size,0)+((spike_size,0) rotated 60)
                      -- (t+i*spike_size,0)+ (spike_size,0) 
                      endfor -- (tile_size,0);
  % path for whole square consists of 4 sides                    
  side rotated 90 ..
  side shifted (tile_size*up) ..
  side rotatedabout((tile_size,0),-90)..
  side rotated 180 shifted (tile_size,0) .. cycle
enddef;

beginfig(1);

  color dws, tws, dls, tls, plain;
  plain = (198/255, 193/255, 156/255);
  dls = (165/255,205/255, 205/255);
  tls = (104/255,175/255, 168/255);
  dws = (228/255,176/255, 162/255);
  tws = (228/255, 85/255,  62/255);

  picture t[];
  defaultfont := "phvb8r"; defaultscale := .4;
  t0 = image( fill unitsquare scaled tile_size withcolor plain; );
  t1 = image( fill spiked_square(2) withcolor dls;
              label("DOUBLE",(1/2 tile_size, .7 tile_size));
              label("LETTER",(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t2 = image( fill spiked_square(3) withcolor tls;
              label("TRIPLE",(1/2 tile_size, .7 tile_size));
              label("LETTER",(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t3 = image( fill spiked_square(2) withcolor dws;
              label("DOUBLE",(1/2 tile_size, .7 tile_size));
              label("WORD"  ,(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t4 = image( fill spiked_square(3) withcolor tws;
              label("TRIPLE",(1/2 tile_size, .7 tile_size));
              label("WORD"  ,(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t5 = image( fill spiked_square(2) withcolor dws;
              fill (for t=0 step 72 until 359: up rotated t -- .44 up rotated (t+36) -- endfor cycle)
                   scaled 3/7 tile_size shifted (1/2 tile_size, 1/2 tile_size); );

  u = tile_size+spike_size;

  col = row = 0;
  forsuffixes $=4,0,0,1,0,0,0,4,0,0,0,1,0,0,4,
                0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,
                0,0,3,0,0,0,1,0,1,0,0,0,3,0,0,
                1,0,0,3,0,0,0,1,0,0,0,3,0,0,1,
                0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
                0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,
                0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,
                4,0,0,1,0,0,0,5,0,0,0,1,0,0,4,
                0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,
                0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,
                0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
                1,0,0,3,0,0,0,1,0,0,0,3,0,0,1,
                0,0,3,0,0,0,1,0,1,0,0,0,3,0,0,
                0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,
                4,0,0,1,0,0,0,4,0,0,0,1,0,0,4:

      draw t$ shifted (col*u,row*u);
      col := col + 1;
      if col>14: col := 0; row := row+1; fi
  endfor
  draw unitsquare scaled (15tile_size+18spike_size) 
       shifted (-2spike_size,-2spike_size)
       withpen pencircle scaled 1.2;

endfig;
end.

如果您的目的是说明您的文字游戏,那么您也可以定义图块,如下所示:

prologues := 3;
outputtemplate := "%j%c.eps";

verbatimtex
%&latex
\documentclass{minimal}
\def\dolet#1#2{$\mathsf{#1}_{\scriptscriptstyle\mathsf{#2}}$}
\begin{document}
etex

spike_size = 2;
tile_size = 24;

vardef spiked_square(expr n) = 
  save t, side; path side;
  % length of the straight bits
  t = (tile_size-n*spike_size)/2;
  % path for one side
  side = (0,0) -- (t,0) 
    for i=0 upto n-1: -- (t+i*spike_size,0)+((spike_size,0) rotated 60)
                      -- (t+i*spike_size,0)+ (spike_size,0) 
                      endfor -- (tile_size,0);
  % path for whole square consists of 4 sides                    
  side rotated 90 ..
  side shifted (tile_size*up) ..
  side rotatedabout((tile_size,0),-90)..
  side rotated 180 shifted (tile_size,0) .. cycle
enddef;

beginfig(1);

  color dws, tws, dls, tls, plain, tile;
  plain = (198/255, 193/255, 156/255);
  dls = (165/255,205/255, 205/255);
  tls = (104/255,175/255, 168/255);
  dws = (228/255,176/255, 162/255);
  tws = (228/255, 85/255,  62/255);
  tile = (237/255, 222/255, 189/255);

  picture t[];
  defaultfont := "phvb8r"; defaultscale := .4;
  t0 = image( fill unitsquare scaled tile_size withcolor plain; );
  t1 = image( fill spiked_square(2) withcolor dls;
              label("DOUBLE",(1/2 tile_size, .7 tile_size));
              label("LETTER",(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t2 = image( fill spiked_square(3) withcolor tls;
              label("TRIPLE",(1/2 tile_size, .7 tile_size));
              label("LETTER",(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t3 = image( fill spiked_square(2) withcolor dws;
              label("DOUBLE",(1/2 tile_size, .7 tile_size));
              label("WORD"  ,(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t4 = image( fill spiked_square(3) withcolor tws;
              label("TRIPLE",(1/2 tile_size, .7 tile_size));
              label("WORD"  ,(1/2 tile_size, .5 tile_size));
              label("SCORE" ,(1/2 tile_size, .3 tile_size)););
  t5 = image( fill spiked_square(2) withcolor dws;
              fill (for t=0 step 72 until 359: up rotated t -- .44 up rotated (t+36) -- endfor cycle)
                   scaled 3/7 tile_size shifted (1/2 tile_size, 1/2 tile_size); );
  u = tile_size+spike_size;

  col = 0; row = 14;
  forsuffixes $=4,0,0,1,0,0,0,4,0,0,0,1,0,0,4,
                0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,
                0,0,3,0,0,0,1,0,1,0,0,0,3,0,0,
                1,0,0,3,0,0,0,1,0,0,0,3,0,0,1,
                0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
                0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,
                0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,
                4,0,0,1,0,0,0,5,0,0,0,1,0,0,4,
                0,0,1,0,0,0,1,0,1,0,0,0,1,0,0,
                0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,
                0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
                1,0,0,3,0,0,0,1,0,0,0,3,0,0,1,
                0,0,3,0,0,0,1,0,1,0,0,0,3,0,0,
                0,3,0,0,0,2,0,0,0,2,0,0,0,3,0,
                4,0,0,1,0,0,0,4,0,0,0,1,0,0,4:

      draw t$ shifted (col*u,row*u);
      col := col + 1;
      if col>14: col := 0; row := row-1; fi
  endfor
  draw unitsquare scaled (15tile_size+18spike_size) 
       shifted (-2spike_size,-2spike_size)
       withpen pencircle scaled 1.2;

% now make some tiles 
def do_tile = fill unitsquare scaled tile_size withcolor tile;
              draw subpath (0,2) of unitsquare scaled tile_size withcolor .3 white;
              draw subpath (2,4) of unitsquare scaled tile_size withcolor .7 white; enddef;
picture t.A;t.A=image(do_tile; label(btex \dolet{A}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.B;t.B=image(do_tile; label(btex \dolet{B}{3} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.C;t.C=image(do_tile; label(btex \dolet{C}{3} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.D;t.D=image(do_tile; label(btex \dolet{D}{2} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.E;t.E=image(do_tile; label(btex \dolet{E}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.F;t.F=image(do_tile; label(btex \dolet{F}{4} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.G;t.G=image(do_tile; label(btex \dolet{G}{2} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.H;t.H=image(do_tile; label(btex \dolet{H}{4} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.I;t.I=image(do_tile; label(btex \dolet{I}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.J;t.J=image(do_tile; label(btex \dolet{J}{8} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.K;t.K=image(do_tile; label(btex \dolet{K}{5} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.L;t.L=image(do_tile; label(btex \dolet{L}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.M;t.M=image(do_tile; label(btex \dolet{M}{3} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.N;t.N=image(do_tile; label(btex \dolet{N}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.O;t.O=image(do_tile; label(btex \dolet{O}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.P;t.P=image(do_tile; label(btex \dolet{P}{3} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.Q;t.Q=image(do_tile; label(btex \dolet{Q}{10} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.R;t.R=image(do_tile; label(btex \dolet{R}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.S;t.S=image(do_tile; label(btex \dolet{S}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.T;t.T=image(do_tile; label(btex \dolet{T}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.U;t.U=image(do_tile; label(btex \dolet{U}{1} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.V;t.V=image(do_tile; label(btex \dolet{V}{4} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.W;t.W=image(do_tile; label(btex \dolet{W}{4} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.X;t.X=image(do_tile; label(btex \dolet{X}{8} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.Y;t.Y=image(do_tile; label(btex \dolet{Y}{4} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););
picture t.Z;t.Z=image(do_tile; label(btex \dolet{Z}{10} etex scaled 1.3,(1/2 tile_size, 1/2 tile_size)););

% and draw some of them on the board
col := 0; row := 7;
forsuffixes $=Q,U,I,X,O,T,I,C:
  draw t$ shifted (col*u,row*u);
  col := col+1;
endfor

endfig;
end.

生成如下内容:

在此处输入图片描述

答案3

LuaTeX + TikZ 解决方案。

\documentclass{article}

\usepackage{xcolor}
\usepackage{tikz}
\usepackage{luacode}
\usepackage[active, tightpage]{preview}

\definecolor{tilecolor}{HTML}{CDC6A9}
\definecolor{textcolor}{HTML}{463D3C}
\definecolor{dwscolor}{HTML}{E9BCAC}
\definecolor{twscolor}{HTML}{E5654F}
\definecolor{dlscolor}{HTML}{AAD2CE}
\definecolor{tlscolor}{HTML}{6EB0AA}

\usetikzlibrary{shapes}

\PreviewEnvironment{tikzpicture}
\setlength{\PreviewBorder}{1cm}

\tikzset{%
    tile/.style={%
        line width=0pt%
    },%
    tiletext/.style={%
        textcolor,%
        font=\scriptsize\bfseries\sffamily,%
        align=center,%
        anchor=center,%
        inner sep=0pt,%
        outer sep=0pt%
    },%
    centerstar/.style={%
        star,%
        textcolor,%
        fill,%
        textcolor,%
        align=center,%
        anchor=center,%
        outer sep=0pt%
    }%
}

\begin{luacode*}

    board = {{4, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 4},
        {0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 2, 0},
        {0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0},
        {1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 1},
        {0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
        {0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0},
        {0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0},
        {4, 0, 0, 1, 0, 0, 0, -1, 0, 0, 0, 1, 0, 0, 4},
        {0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0},
        {0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 3, 0},
        {0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0},
        {1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 1},
        {0, 0, 2, 0, 0, 0, 1, 0, 1, 0, 0, 0, 2, 0, 0},
        {0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 2, 0},
        {4, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 4}}

    function draw_tile(x, y, tile_side_length, measurement_unit, tile_type)

        local number_of_spikes = 0
        local color = "black"
        local text = ""

        if tile_type == -1 then
            number_of_spikes = 2
            color = "dwscolor"
        elseif tile_type == 0 then
            number_of_spikes = 0
            color = "tilecolor"
        elseif tile_type == 1 then
            color = "dlscolor"
            number_of_spikes = 2
            text = "DOUBLE\\\\LETTER\\\\SCORE"
        elseif tile_type == 2 then
            color = "dwscolor"
            number_of_spikes = 2
            text = "DOUBLE\\\\WORD\\\\SCORE"
        elseif tile_type == 3 then
            color = "tlscolor"
            number_of_spikes = 3
            text = "TRIPLE\\\\LETTER\\\\SCORE"
        elseif tile_type == 4 then
            color = "twscolor"
            number_of_spikes = 3
            text = "TRIPLE\\\\WORD\\\\SCORE"
        end

        local spike_side_length = (2 / math.sqrt(3)) * (tile_side_length * 0.10)
        local spiked_side_length = (tile_side_length - (number_of_spikes * spike_side_length)) / 2
        local tile = ""

        if number_of_spikes < 0 or number_of_spikes > 3 then
            number_of_spikes = 0
        end

        tile = tile .. "\\filldraw[" .. color .. ", tile] (" .. x ..
            measurement_unit .. ", " .. y ..
            measurement_unit .. ") ++(" .. -0.5 * tile_side_length .. measurement_unit ..
            ", " .. -0.5 * tile_side_length .. measurement_unit .. ")-- "

        -- bottom
        if number_of_spikes == 0 then
            tile = tile .. "++(" .. tile_side_length .. measurement_unit .. ", 0) -- "
        else
            tile = tile .. "++(" .. spiked_side_length .. measurement_unit .. ", 0) -- "
            for i = 0, number_of_spikes - 1, 1 do
                tile = tile .. "++(-60:" .. spike_side_length .. measurement_unit .. ") -- " ..
                    "++(60:" .. spike_side_length .. measurement_unit .. ") -- "
            end
            tile = tile .. "++(" .. spiked_side_length .. measurement_unit .. ", 0) -- "
        end

        -- right
        if number_of_spikes == 0 then
            tile = tile .. "++(0, " .. tile_side_length ..  measurement_unit .. ") -- "
        else
            tile = tile .. "++(0, " .. spiked_side_length .. measurement_unit .. ") -- "
            for i = 0, number_of_spikes - 1, 1 do
                tile = tile .. "++(30:" .. spike_side_length .. measurement_unit .. ") -- " ..
                    "++(150:" .. spike_side_length .. measurement_unit .. ") -- "
            end
            tile = tile .. "++(0, " .. spiked_side_length .. measurement_unit .. ") -- "
        end

        -- top
        if number_of_spikes == 0 then
            tile = tile .. "++(" .. -1 * tile_side_length .. measurement_unit .. ", 0) -- "
        else
            tile = tile .. "++(" .. -1 * spiked_side_length .. measurement_unit .. ", 0) -- "
            for i = 0, number_of_spikes - 1, 1 do
                tile = tile .. "++(120:" .. spike_side_length .. measurement_unit .. ") -- " ..
                    "++(240:" .. spike_side_length .. measurement_unit .. ") -- "
            end
            tile = tile .. "++(" .. -1 * spiked_side_length .. measurement_unit .. ", 0) -- "
        end

        -- left
        if number_of_spikes == 0 then
            tile = tile .. "++(0, " .. -1 * tile_side_length ..  measurement_unit .. ") -- "
        else
            tile = tile .. "++(0, " .. -1 * spiked_side_length .. measurement_unit .. ") -- "
            for i = 0, number_of_spikes - 1, 1 do
                tile = tile .. "++(210:" .. spike_side_length .. measurement_unit .. ") -- " ..
                    "++(330:" .. spike_side_length .. measurement_unit .. ") -- "
            end
        end
        tile = tile .. "cycle;"

        -- text
        if tile_type ~= -1 and tile_type ~= 0 then
            tile = tile .. "\\node[text width=" .. 0.8 * tile_side_length .. measurement_unit ..
                ", minimum width=" .. 0.8 * tile_side_length .. measurement_unit ..
                ", tiletext] at (" .. x .. measurement_unit ..  ", " .. y ..
                measurement_unit .. ") {" .. text .. "};"
        elseif tile_type == -1 then
            tile = tile .. "\\node[centerstar, star point ratio=2, inner sep=" ..
                0.125 * tile_side_length .. measurement_unit .. "] at (" .. x ..
                measurement_unit .. ", " .. y .. measurement_unit .. "){};"
        end

        tex.sprint(tile)
    end

    function draw_board(board, tile_side_length, measurement_unit)
        local board_height = #board
        local board_width = #board[1]

        tex.sprint("\\begin{tikzpicture}")

        for i = 1, board_height, 1 do
            for j = 1, board_width, 1 do
                draw_tile(j * tile_side_length * 1.11,
                    -1 * i * tile_side_length * 1.11,
                    tile_side_length,
                    measurement_unit,
                    board[i][j])
            end
        end

        tex.sprint("\\end{tikzpicture}")
    end
\end{luacode*}

\begin{document}

\luadirect{draw_board(board, 1.5, "cm")}

\end{document}

相关内容