我尝试在 beamer 演示文稿中将巨大的数字显示为点。由于我对 foreach 不太熟悉,因此遇到了几个问题。
首先我尝试的代码:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\foreach \x in {0,1,...,96}
\foreach \y in {0,1,...,95}
{
\draw (\x,\y) circle (0.2cm);
\fill (\x,\y) circle (0.1cm);
}
\end{tikzpicture}
\end{document}
这样就得到了一个有 9120 个点的正方形。不幸的是,我试图显示的数字只有 9050,所以最后一行应该只包含 26 个点。
我还想实现的是,一些点的颜色不同。例如,点 2036 至 2148 应为红色。
这个问题可以用 foreach 解决吗?还是我走错了方向?你知道一个优雅的解决方案吗?
答案1
我在这个例子中减少了点的数量,但效果是一样的。最难的部分是你使用的是纯填充形状,它们没有名称,因此无法引用。
所以我切换到节点,并添加了自定义计数器。因此现在每个节点都分配了一个数字,从0
到 最大数字。我认为在我的情况下有702
100 个。
要停止绘制其中任何一个节点(如您的情况),您可以告诉 Tikz 仅绘制特定数字以下的节点。至于节点的颜色,您可以使用布尔值pgfmath
它允许您验证两个条件,以便这两个参数之间的所有内容都会有不同的颜色,等等。
输出
代码
\documentclass[tikz, margin=5mm]{standalone}
\newcounter{nonu}
\setcounter{nonu}{0}
\begin{document}
\begin{tikzpicture}
\foreach \y in {0,1,...,26}{
\foreach \x in {0,1,...,25}{
% don't draw more than this
\ifnum\thenonu>689\relax
\else
\node[fill, circle, inner sep=1mm] (\thenonu) at (\x,\y) {\stepcounter{nonu}};
\fi
% Fill between two numbers
\pgfmathsetmacro\param{\thenonu>80 && \thenonu<142 ?int(1):int(0)}
\ifnum\param=1\relax
\node[fill=red, circle, inner sep=1mm] at (\x,\y) {};
\fi
}
}
\end{tikzpicture}
\end{document}
答案2
圆圈确实很多,因此如果您需要更改几个圆圈的样式,虽然可以检查当前的迭代次数并相应地设置样式,但效率并不高。但过度绘制圆圈可以节省大量编译时间。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[]
\def\mytotaldots{9050}
\def\mycolno{95}
\pgfmathsetmacro\myresidue{Mod(\mytotaldots,\mycolno)}
\pgfmathparse{\myresidue ==0 ? int(1) : int(0)}
\ifnum\pgfmathresult>0\relax%
\pgfmathtruncatemacro\myrows{\mytotaldots/\mycolno}%
\else
\pgfmathtruncatemacro\myrows{\mytotaldots/\mycolno + 1}%
\fi
\foreach \x in {0,1,...,\myrows}{
\ifnum\x<\myrows\relax\else\let\mycolno\myresidue\fi
\foreach \y in {0,1,...,\mycolno}{
\fill[] (\y pt,-\x pt) circle (0.1pt);
}
}
\end{tikzpicture}
\end{document}
第二种方法速度快几个数量级,因为它使用虚线而不是绘制明确的圆圈。诀窍是使点与路径对齐。第一个例子需要 LuaTeX,但下面的方法基本上无论如何都可以工作。
因此您有更好的套印选择。
\documentclass[margin=5pt,tikz]{standalone}
\begin{document}
\begin{tikzpicture}[
aligned dots/.style={line width=#1, line cap=round,
dash pattern=on 0pt off 2\pgflinewidth
},
aligned dots/.default=3pt
]
\draw [aligned dots]
(0,0) -- (6*95 pt,0)
\foreach \x in {0,...,95}{
--++ (0,-6 pt) -- ++({ifthenelse(Mod(\x,2)==1,94,-94)*6pt},0)}
++ (-95*6pt,-6 pt) -- ++(48pt,0pt)
;
\draw [aligned dots,draw=yellow] (45*6pt,-15*6pt) -- ++(6*40 pt,0) ;
\draw [aligned dots,draw=red] (30*6pt,-15*6pt) -- ++(0,-6*40 pt) ;
\end{tikzpicture}
\end{document}