非线性变换的后期后果

非线性变换的后期后果

我对非线性变换的影响或副作用感到十分困惑。考虑 MWE

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{arrows.meta}
\usepgfmodule{nonlineartransformations}
\makeatletter
\def\polartransformation{% from the pgfmanual section 103.4.2
\pgfmathsincos@{\pgf@sys@tonumber\pgf@x}%
\pgf@x=\pgfmathresultx\pgf@y% 
\pgf@y=\pgfmathresulty\pgf@y%
} 
\makeatother
\begin{document}

\begin{tikzpicture} % if you comment this out the arrow heads below will disappear
\draw[-{Latex}] (0,0) -- (1,0);
\end{tikzpicture}

\begin{tikzpicture}
\begin{scope} % p. 234 of the pgf manual
\pgftransformnonlinear{\polartransformation}
\draw[-{Latex}] (0,0) coordinate (r1) -- (3,1) coordinate (r2);
\end{scope}
\end{tikzpicture}

\begin{tikzpicture}
\draw[-{Latex}] (0,0) -- (1,0); 
\draw[-{Stealth}] (2,0) -- (3,0); % a different arrow head is not affected
\end{tikzpicture}

\end{document}

正如人们所预料的那样,它产生了

在此处输入图片描述

然而,如果注释掉第一张图片,就会得到

在此处输入图片描述

类型箭头Latex完全乱了。不仅在使用非线性变换的图中,而且在下一张图中也是如此!另一方面,类型箭头Stealth不受此影响。

笔记:此问题版本与原始版本有很大不同。@cfr 是问题的回答者,他发现有两个独立的问题。我删除了 @cfr 的精彩回答未涉及的部分,如果得到她的或他的许可,我想重新提问。

答案1

第二个问题(?)涉及箭头缓存的效果。当第一次使用箭头时,它会被缓存。这是一个特定的提示,例如 Stealth,具有如此这般的长度和如此这般的宽度等。当再次使用相同的提示时,将使用缓存的提示。这节省了编译资源。

[感谢 percusse 指出,这是一个“协议化”的例子,如 Ti 第 116 节所述Z 手册。我使用“缓存”是因为箭头代码的代码在命名相关键时使用“缓存”,而我不知道底层的东西被称为“协议”。

因此,如果第一次使用尖端时,它超出了变换范围,则该尖端永远不会被变换。

如果第一次是在变换范围内,则该尖端总是被变换。

定义箭头提示时可以阻止缓存,但似乎无法阻止设计为缓存的箭头提示被缓存。也就是说,您可以关闭一组箭头提示的缓存(通过重新定义Stealth或定义新的提示StealthX),但您无法关闭特定提示的缓存(例如,Stealth具有某某长度等),更不用说提示的特定实例了(例如 Stealth具有如此这般的长度等等)。

如果您根本不想转换笔尖,并且第一次使用是在转换范围内,那么一个简单的解决方法是先将箭头排版在框中,而不排版框。这将缓存未转换的版本,并且此笔尖的所有后续实例都将不转换。

\newsavebox\untransformedtip
\sbox\untransformedtip{\tikz{\draw [-Latex] (0,0) -- (0,1);}

请注意,您必须对要以这种方式处理的每个特定提示执行此操作 - 而不仅仅是每种提示。因此,如果您也希望这样做-Latex[length=7mm],则也需要将其添加到您的框中,因为这是与不同的提示-Latex

如果您希望提示仅在转换范围内进行转换,则可以用Stealth新名称(例如)复制所需的提示类型(例如StealthX),然后仅更改定义,使其不被缓存。然后,您可以Stealth在转换范围之外和StealthX内部使用。

理想情况下,我猜想nonlineartransformationsand/orarrows.meta库应该可以自动处理这个问题。例如,我猜想应该可以提供一个开关来关闭提示缓存的使用,该开关可以为转换范围安装并在其末端删除。

相关内容