我想画一些重叠的矩形,例如:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,backgrounds}
\begin{document}
\begin{tikzpicture}
\draw [fill=blue,ultra thick] (0.4,0.5) rectangle (0,1);
\draw [fill=red,ultra thick] (0,0.3) rectangle (1,1);
\draw [fill=green,ultra thick] (0,0) rectangle (0.5,0.5);
\end{tikzpicture}
\end{document}
但我希望(在本例中)绿色矩形位于红色下方,红色矩形位于蓝色下方。这可能吗(不改变命令顺序)?
更多解释:latex 命令由 C++ 程序生成,该程序计算一些矩形的坐标。我想绘制它们,它们可以重叠。该程序按某种顺序计算矩形,我想以相反的顺序显示它们。(在我看来,以相反的顺序将 C++ 输出的行写入文件很困难。)
以下是我所拥有的和我想要的:
答案1
TeX 还可以还原简单的命令序列\draw
。在下面的例子中,宏位于应还原的命令\reversedraws
序列之前。它以相反的顺序将它们存储在宏中。在最后一个之后,输出现在已还原的列表:\draw
\collect@draws
\draw
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes,backgrounds}
\usepackage{etoolbox}% provides \preto
\makeatletter
\newcommand*{\collect@draws}{}
\newcommand*{\reversedraws}{%
\renewcommand*{\collect@draws}{}% initialize
\look@for@draw
}
\newcommand*{\look@for@draw}{%
\@ifnextchar\draw{%
\catch@draw
}{%
\collect@draws % output the result
}%
}
\def\catch@draw\draw#1;{%
\preto\collect@draws{\draw#1;}%
\look@for@draw
}
\makeatother
\begin{document}
\begin{tikzpicture}
\reversedraws
\draw [fill=blue,ultra thick] (0.4,0.5) rectangle (0,1);
\draw [fill=red,ultra thick] (0,0.3) rectangle (1,1);
\draw [fill=green,ultra thick] (0,0) rectangle (0.5,0.5);
\end{tikzpicture}
\end{document}
当然,修复 C++ 工具程序以输出正确的顺序是更好的方法,并且可以在线性时间内更高效地完成。在上面的例子中,运行时行为是二次的。