我正在尝试编写一个命令来渲染 Tikz 图片,其中有一个正方形,其边界上被许多较小的正方形包围。第一个参数定义图片的大小,第二个参数定义周围较小正方形的数量,第三个和第四个参数定义正方形的颜色。
例如,此命令:
\gtile{0.8\textheight}{10}{white!60!orange}{white!60!red}
应该给我这个图像:(请原谅由于在绘画中缩放图像而导致的粗线条)
我已经实现了这个功能,但我希望能够通过提供二进制数字字符串作为参数来选择渲染周围的红色方块(如果有的话)。例如,如果我提供了二进制数字 1001101101,我希望方块的渲染方式如下:
下面提供了我渲染第一个字符串的命令。我应该如何修改代码以实现此行为?我尝试使用xparse 包中的\ifthenelse
来\StrMid
测试字符串中的字符是否与 1 相等;但是,Tikz 似乎不喜欢这样,并引发了一系列有关额外\fi
和缺失控制序列的错误,我认为这意味着环境不兼容。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfmath}
\newcommand{\gtile}[4]{
\begin{tikzpicture}[x=#1, y=#1]
\pgfmathsetmacro{\VA}{1 / (#2 + 2)}
\pgfmathsetmacro{\VB}{1 - \VA}
\filldraw[fill=#3] (\VA,\VA) -- (\VA,\VB) -- (\VB,\VB) -- (\VB,\VA) -- (\VA,\VA);
\foreach \x in {1,...,#2}
{
\filldraw[fill=#4] (\VA*\x,0) -- (\VA*\x,\VA) -- (\VA*\x+\VA,\VA) -- (\VA*\x+\VA,0) -- (\VA*\x,0);
\filldraw[fill=#4] (\VA*\x,\VB) -- (\VA*\x,1) -- (\VA*\x+\VA,1) -- (\VA*\x+\VA,\VB) -- (\VA*\x,\VB);
\filldraw[fill=#4] (0,\VA*\x) -- (0,\VA*\x+\VA) -- (\VA,\VA*\x+\VA) -- (\VA,\VA*\x) -- (0,\VA*\x);
\filldraw[fill=#4] (\VB,\VA*\x) -- (\VB,\VA*\x+\VA) -- (1,\VA*\x+\VA) -- (1,\VA*\x) -- (\VB,\VA*\x);
}
\end{tikzpicture}
}
\begin{document}
\gtile{0.8\textheight}{10}{white!60!orange}{white!60!red}
\end{document}
答案1
有一个名为 bitset 的包可以完成这个任务。
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfmath}
\usepackage{bitset}
\usepackage{ifthen}
\newcommand{\gtile}[5]{
\begin{tikzpicture}[x=#1, y=#1]
\pgfmathsetmacro{\VA}{1 / (#2 + 2)}
\pgfmathsetmacro{\VB}{1 - \VA}
\filldraw[fill=#3] (\VA,\VA) -- (\VA,\VB) -- (\VB,\VB) -- (\VB,\VA) -- (\VA,\VA);
\bitsetSetBin{mybitset}{#5}
\foreach \x in {1,...,#2}
{
\ifthenelse{\bitsetGet{mybitset}{\x-1}=1}{
\filldraw[fill=#4] (\VA*\x,0) -- (\VA*\x,\VA) -- (\VA*\x+\VA,\VA) -- (\VA*\x+\VA,0) -- (\VA*\x,0);
\filldraw[fill=#4] (\VA*\x,\VB) -- (\VA*\x,1) -- (\VA*\x+\VA,1) -- (\VA*\x+\VA,\VB) -- (\VA*\x,\VB);
\filldraw[fill=#4] (0,\VA*\x) -- (0,\VA*\x+\VA) -- (\VA,\VA*\x+\VA) -- (\VA,\VA*\x) -- (0,\VA*\x);
\filldraw[fill=#4] (\VB,\VA*\x) -- (\VB,\VA*\x+\VA) -- (1,\VA*\x+\VA) -- (1,\VA*\x) -- (\VB,\VA*\x);
}{}
}
\end{tikzpicture}
}
\begin{document}
\gtile{0.8\textheight}{10}{white!60!orange}{white!60!red}{1001101101}
\end{document}