Tikz:如何改变重叠对象的顺序?

Tikz:如何改变重叠对象的顺序?

我想画一些重叠的矩形,例如:

\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++ 工具程序以输出正确的顺序是更好的方法,并且可以在线性时间内更高效地完成。在上面的例子中,运行时行为是二次的。

相关内容