如何用箭头连接两个TikZ图形并展示旋转?Minipage方案可行吗?
关于用箭头连接两个TikZ图形展示旋转效果的方案
首先给出结论:你的minipage布局方案是可行的,但直接在minipage之间画箭头会比较棘手——因为每个minipage是独立的LaTeX盒子,TikZ没法直接跨盒子绘制元素。不过我们可以通过一些技巧来解决,或者换更高效的绘制方式。
方案1:改进minipage布局,用tikzmark添加箭头
你可以借助tikzmark宏包,在两个TikZ图形里标记对应点,然后在文档的某个位置(比如两个minipage之后)用TikZ画出跨盒子的箭头。
示例代码:
\documentclass{article} \usepackage{tikz} \usetikzlibrary{tikzmark} \begin{document} \begin{minipage}{0.5\textwidth} \begin{center} \begin{tikzpicture} \draw (0,2)--(0,-2); \draw (-2,0)--(2,0); \newdimen\R \R=1.5cm \draw (36:\R) \foreach \x in {36,108,180,252,324} { -- (\x:\R) } -- cycle; \node[right] at (36:\R) {4}; \node[above] at (108:\R) {5}; \node[left] at (180:\R) {1}; % 修正原代码的位置错误,正五边形180度位置应该是左侧而非下方 \node[below] at (252:\R) {2}; \node[right] at (324:\R) {3}; \tikzmark{start} (108:\R) % 标记旋转起始点,比如数字5的位置 \end{tikzpicture} \end{center} \end{minipage}% 注意这里加%消除空格,避免两个minipage总宽度超出\textwidth \begin{minipage}{0.5\textwidth} \begin{center} \begin{tikzpicture} \draw (0,2)--(0,-2); \draw (-2,0)--(2,0); \newdimen\R \R=1.5cm \draw (36:\R) \foreach \x in {36,108,180,252,324} { -- (\x:\R) } -- cycle; \node[right] at (36:\R) {3}; \node[above] at (108:\R) {4}; \node[left] at (180:\R) {5}; \node[below] at (252:\R) {1}; \node[right] at (324:\R) {2}; \tikzmark{end} (180:\R) % 标记旋转后的对应点,比如数字5的新位置 \end{tikzpicture} \end{center} \end{minipage} % 绘制跨minipage的箭头 \begin{tikzpicture}[overlay,remember picture] \draw[->,thick,red] (pic cs:start) to[bend right] (pic cs:end); \end{tikzpicture} \end{document}
关键注意点:
- 两个minipage之间必须加
%消除默认空格,防止总宽度超过页面宽度 overlay和remember picture选项是核心,让TikZ能识别跨盒子的标记点- 可以自由调整箭头的颜色、粗细、弯曲度,让旋转方向更直观
方案2:将两个图形放在同一个TikZ环境中(更推荐)
如果你的核心需求是展示旋转关系,把两个图形放在同一个tikzpicture里,用scope环境定位并旋转生成第二个图形会更简洁,而且画箭头完全没有障碍——因为所有元素都在同一个坐标系统里。
示例代码:
\documentclass{article} \usepackage{tikz} \begin{document} \begin{tikzpicture} % 第一个图形:左侧 \begin{scope}[xshift=0cm] \draw (0,2)--(0,-2); \draw (-2,0)--(2,0); \newdimen\R \R=1.5cm \draw (36:\R) \foreach \x in {36,108,180,252,324} { -- (\x:\R) } -- cycle; \node[right] at (36:\R) {4}; \node[above] at (108:\R) {5}; \node[left] at (180:\R) {1}; \node[below] at (252:\R) {2}; \node[right] at (324:\R) {3}; \node[circle,fill,inner sep=2pt] (s) at (108:\R) {}; % 标记旋转起点 \end{scope} % 绘制旋转箭头 \draw[->,thick,red] (s) to[bend right=20] (s)+(5cm,0); % 第二个图形:右侧,通过旋转生成(减少代码冗余) \begin{scope}[xshift=5cm,rotate=-72] % 正五边形旋转72度对应一个顶点的位移 \draw (0,2)--(0,-2); \draw (-2,0)--(2,0); \newdimen\R \R=1.5cm \draw (36:\R) \foreach \x in {36,108,180,252,324} { -- (\x:\R) } -- cycle; % 节点文字手动反向旋转,避免跟着图形旋转 \node[right,rotate=72] at (36:\R) {3}; \node[above,rotate=72] at (108:\R) {4}; \node[left,rotate=72] at (180:\R) {5}; \node[below,rotate=72] at (252:\R) {1}; \node[right,rotate=72] at (324:\R) {2}; \node[circle,fill,inner sep=2pt] (e) at (180:\R) {}; % 标记旋转终点 \end{scope} % 也可以直接画连接对应点的直线箭头 % \draw[->,thick,blue] (s) -- (e); \end{tikzpicture} \end{document}
这个方案的核心优势:
- 不需要处理跨盒子的复杂逻辑,箭头可以直接连接两个图形的对应点
- 第二个图形通过
rotate命令生成,不用重复写绘图代码,减少冗余 - 坐标系统统一,调整箭头位置、样式或图形间距都更灵活
总结
- 如果你想保留minipage布局(比如需要在图形周围添加独立的文字说明),可以用方案1的tikzmark方法实现箭头连接
- 如果只是为了清晰展示旋转效果,方案2的同一TikZ环境+scope的方式更简洁高效,是更推荐的选择
内容的提问来源于stack exchange,提问作者JaniH
相关产品推荐
相关产品推荐

