我需要定义一个 latex 宏,它取 tikz 图片中的两个点 p1、p2,并绘制一个框,其对角线由 p1 -- ({max(p1 的 hor 分量、p2 的 hor 分量)}, p2 的 ver 分量) 给出。
我没有正确理解要点的各个组成部分的语法。我的情况如下:
\makeatletter
\newcommand{\HOR}[1]{\pgf@x{#1}}
\newcommand{\VER}[1]{\pgf@y{#1}}
\makeatother
\newcommand{\TIKZBOX}[2]{
\draw (#1) rectangle ({max(\HOR{#1}, \HOR{#2})}, \VER{#2});
}
答案1
一种可能的解决方案是加载tkz-euclide
基于 TikZ 的包。它有各种命令来定义新形状,其中之一是正方形。我把它包装在一个中,\newcommand
这样你就不必再写一遍了。你只需要提供 2 个坐标,它会处理剩下的事情。
输出
代码
\documentclass[tikz, margin=10pt]{standalone}
\usepackage{tkz-euclide}
\newcommand\Squarify[3][]{%
\tkzDefPoint(#2){A} \tkzDefPoint(#3){B}
\tkzDefSquare(A,B)
\tkzDrawPolygon[#1](A,B,tkzFirstPointResult,%
tkzSecondPointResult)
}
\pgfmathsetseed{1234}% ensures same result in output for this example
\begin{document}
\begin{tikzpicture}
\Squarify{0,0}{1,0}% reference without color
\foreach \colors in {red,blue,yellow,orange,green,violet}{%
\pgfmathsetmacro{\Xa}{random(3)+random(2)}
\pgfmathsetmacro{\Ya}{random(3)+random(2)}
\pgfmathsetmacro{\Xb}{random(3)+random(2)}
\pgfmathsetmacro{\Yb}{random(3)+random(2)}
\Squarify[color=\colors]{\Xa,\Ya}{\Xb,\Yb}
}
\end{tikzpicture}
\end{document}
答案2
这是另一种仅使用 TikZ 而不加载其他包的解决方案。
输出
代码
\documentclass[tikz, margin=10pt]{standalone}
\newcommand\Squarify[3][]{%
\coordinate (A) at (#2);
\path (#2);
\pgfgetlastxy{\tempAx}{\tempAy}
\coordinate (B) at (#3);
\path (#3);
\pgfgetlastxy{\tempBx}{\tempBy}
\pgfmathtruncatemacro\XCoordA{\tempAx*1pt/1cm}
\pgfmathtruncatemacro\YCoordA{\tempAy*1pt/1cm}
\pgfmathtruncatemacro\XCoordB{\tempBx*1pt/1cm}
\pgfmathtruncatemacro\YCoordB{\tempBy*1pt/1cm}
\pgfmathtruncatemacro\XCoordC{\XCoordB-(\YCoordB-\YCoordA)}
\pgfmathtruncatemacro\YCoordC{\YCoordB+(\XCoordB-\XCoordA)}
\pgfmathtruncatemacro\XCoordD{\XCoordA-(\YCoordB-\YCoordA)}
\pgfmathtruncatemacro\YCoordD{\YCoordA+(\XCoordB-\XCoordA)}
\draw[#1] (A) -- (B) --
(\XCoordC,\YCoordC) coordinate (C) --
(\XCoordD,\YCoordD) coordinate (D) -- cycle;
%
}
\pgfmathsetseed{1234} % again to ensure same colored squares
\begin{document}
\begin{tikzpicture}
\Squarify{0,0}{1,0}
\foreach \colors in {red,blue,yellow,orange,green,violet}{%
\pgfmathsetmacro{\Xa}{random(3)+random(2)}
\pgfmathsetmacro{\Ya}{random(3)+random(2)}
\pgfmathsetmacro{\Xb}{random(3)+random(2)}
\pgfmathsetmacro{\Yb}{random(3)+random(2)}
\Squarify[color=\colors]{\Xa,\Ya}{\Xb,\Yb}
}
\end{tikzpicture}
\end{document}