我正在尝试使用 4 种颜色重新创建下面的图像,该图像是 10×13 的棋盘。我还附上了代码。Latex 一直抱怨“非法测量单位(插入 pt)”,然后指示“}”有问题。我希望有人能帮我找出错误,谢谢。
\documentclass{article}
\usepackage{tikz}
\usepackage{xcolor}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\def\m{10}
\def\n{13}
% Define the custom colors
\definecolor{color0}{named}{black}
\definecolor{color1}{named}{gray}
\definecolor{color2}{named}{red}
\definecolor{color3}{named}{green}
\definecolor{color4}{named}{black}
% Draw and fill the colored squares
\foreach \i in {0,1,...,\m-1} {
\foreach \j in {0,1,...,\n-1} {
\pgfmathtruncatemacro\colorindex{mod(int(\i*\n+\j), 5)}
\fill[draw=black, line width=0.7pt, fill=color\colorindex] (\j, \i) rectangle (\j+1, \i+1);
}
}
% Draw the outline of the rectangle
\draw[line width=1pt] (0, 0) rectangle (\n, \m);
\end{tikzpicture}
\caption{A colored rectangle with a repeating pattern.}
\end{figure}
\end{document}
答案1
...
在循环之后不能有表达式\foreach
。
你可以先让它解析它:
\foreach[parse=true] \i in {0,1,...,\m-1} {
\foreach \j in {0,1,...,\n-1} {
\pgfmathtruncatemacro\colorindex{mod(int(\i*\n+\j), 5)}
\fill[draw=black, line width=0.7pt, fill=color\colorindex] (\j, \i) rectangle (\j+1, \i+1);
}
}
(它仍然适用于内循环,这就是为什么它在那里不需要。)
您还可以使用\inteval
(使用最新的 TeX 发行版,如果没有它,您需要加载xfp
包或使用\pgfinteval
相同但由 PGF 提供的包)。
这使得\foreach
唯一“看到”的是该评估的结果。
\foreach \i in {0,1,...,\inteval{\m-1}} {
\foreach \j in {0,1,...,\inteval{\n-1}} {
\pgfmathtruncatemacro\colorindex{mod(int(\i*\n+\j), 5)}
\fill[draw=black, line width=0.7pt, fill=color\colorindex] (\j, \i) rectangle (\j+1, \i+1);
}
}
请注意,在这两种情况下,生成的 TikZ 图片对于标准线宽来说太宽,我建议使用
x = \linewidth/\n, y = \linewidth/\n
和
trim left = 0pt, trim right = \linewidth
使图像适合线宽(页面的线宽)并忽略图片左侧和右侧的线宽(TikZ 中的线宽)。
该样式scale xy
可确保图表不会生成大于 1 cm × 1 cm 的正方形。但它不会对 进行相同的检查trim right
。
我已经添加了geometry
包来显示文本区域。
如果您使用其他类或\linewidth
,这当然可能没有必要。
代码
\documentclass{article}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage[showframe,pass]{geometry}
\tikzset{
scale xy/.style={% only scale down, don't scale up
x={min(1cm,\linewidth/(#1))},
y={min(1cm,\linewidth/(#1))}}}
\begin{document}
\begin{figure}
\centering
\begin{tikzpicture}
\def\m{10}
\def\n{13}
\tikzset{scale xy=\n, trim left=0pt, trim right=\linewidth}
% Define the custom colors
\definecolor{color0}{named}{black}
\definecolor{color1}{named}{gray}
\definecolor{color2}{named}{red}
\definecolor{color3}{named}{green}
\definecolor{color4}{named}{black}
% Draw and fill the colored squares
\foreach \i in {0,1,...,\inteval{\m-1}} {
\foreach \j in {0,1,...,\inteval{\n-1}} {
\pgfmathtruncatemacro\colorindex{mod(int(\i*\n+\j), 5)}
\fill[draw=black, line width=0.7pt, fill=color\colorindex] (\j, \i) rectangle (\j+1, \i+1);
}
}
% Draw the outline of the rectangle
\draw[line width=1pt] (0, 0) rectangle (\n, \m);
\end{tikzpicture}
\caption{A colored rectangle with a repeating pattern.}
\end{figure}
\end{document}