使用变换形状缩放 arrows.meta

使用变换形状缩放 arrows.meta

考虑以下 MWE:

\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\tikzset{myarr/.style={
        -{Triangle[width=6pt, length=9pt]},
}}
\begin{document}
\begin{tikzpicture}
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}

\bigskip

\begin{tikzpicture}[scale=0.5, transform shape]
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}
\end{document}

生成结果:

在此处输入图片描述

是否可以定义样式,以便当给出键myarr时箭头会缩放?transform shapescale

请注意,在实际情况下,箭头将绘制在代码深处,因此我希望找到一种解决方案,只需更改 的定义myarr,而不触及其余代码。例如定义 ,\scaledpt以便能够执行

\tikzset{myarr/.style={
        -{Triangle[width=6\scaledpt, length=9\scaledpt]},
}}

答案1

一种选择是使用\pgflowlevelsynccm。但是,必须非常小心地使用。

\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\tikzset{myarr/.style={
        -{Triangle[width=6pt, length=9pt]},
}}
\begin{document}
\begin{tikzpicture}
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}

\bigskip

\begin{tikzpicture}[scale=0.5, transform shape]
    \pgflowlevelsynccm
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}
\end{document}

在此处输入图片描述

一个更复杂但危险性更低的解决方案是读出\pgfgettransformentries并相应地缩放箭头尺寸。根据评论中的要求,这里进行了详细说明。

\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\tikzset{myarr/.style={%
/utils/exec=\pgfgettransformentries{\tmpa}{\tmpb}{\tmpc}{\tmpd}{\tmp}{\tmp}%
\pgfmathsetmacro{\mydet}{\tmpa*\tmpd-\tmpb*\tmpc},
        -{Triangle[width=6pt, length=9pt,scale={sqrt(abs(\mydet))}]},
}}
\begin{document}
\begin{tikzpicture}
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}

\bigskip

\begin{tikzpicture}[scale=0.5, transform shape]
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}
\end{document}

在此处输入图片描述

对背景的一些评论。二维的欧几里得变换由变换矩阵(包含条目 、 和 )和一个平移(即二维向量)给出ab如pgfmanual v3.1.4 第 1142 页所述,它们可以用 推断出来。键设置和,c但一般来说,二维体积会通过行列式缩放(使得在正交变换下它是不变的),比例因子是它的平方根。(行列式只是d\pgfgettransformentriesscale=<factor>a=<factor>d=<factor>a*d-b*c雅可比矩阵,并且之前曾被使用过这个帖子这个帖子有人敦促我提及这些早期的帖子,我很乐意这样做,但应该在哪里停止呢?)也就是说,第二个提议不是倾斜箭头,但第一个这样做yet 更“危险”。第三个选项是\pgflowlevelsynccm只应用于箭头,但这会很不妥。

我还要提一下,pgf 手册非常清楚地说明了线宽不是scale=<factor>不管你是否添加 ,都会被 变换transform shape。并且(标准)箭头会随线宽缩放。由此显然transform shape不应该改变箭头的大小。如果你想要一张完全重新缩放的图片,你还需要缩放线宽。这也可以输入到箭头中。

答案2

怎么样transform canvas

在此处输入图片描述

\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\tikzset{myarr/.style={
        -{Triangle[width=6pt, length=9pt]},
}}
\begin{document}
\begin{tikzpicture}
\draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}

\bigskip

\begin{tikzpicture}[transform canvas={scale=0.5}]
\draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}
\end{document}

答案3

箭头有scalescale lengthscale width选项(参见 TikZ 3.1.4b 手册第 193 页)。我改变了你的风格,让这个因素成为你风格的一个参数。

\tikzset{myarr/.style={
        -{Triangle[width=6pt, length=9pt,scale=#1]},
        myarr/.default=1
}}

截屏

\documentclass[]{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}

\tikzset{myarr/.style={
        -{Triangle[width=6pt, length=9pt,scale=#1]},
        myarr/.default=1
}}
\begin{document}
\begin{tikzpicture}
    \draw[myarr] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}

\bigskip

\begin{tikzpicture}[scale=0.5,transform shape]
    \draw[myarr=.5] (0,0) -- (3,0) node[draw, anchor=west]{A};
\end{tikzpicture}
\end{document}

相关内容