![使用 pgfmath 命名 TikZ 节点的不完整 \iffalse](https://linux22.com/image/240361/%E4%BD%BF%E7%94%A8%20pgfmath%20%E5%91%BD%E5%90%8D%20TikZ%20%E8%8A%82%E7%82%B9%E7%9A%84%E4%B8%8D%E5%AE%8C%E6%95%B4%20%5Ciffalse.png)
在尝试回答是否可以使用宏来命名 TikZ 节点?,我尝试使用提供的解决方案pgfmath 扩展 - 从 pgfmath 环境中调用命令,但这产生了错误消息
Incomplete \iffalse; all text was ignored after line 67.
<inserted text>
\fi
从例子中
\documentclass{article}
\usepackage{tikz}
\newcommand{\mathresult}[1]{%
\pgfmathparse{#1}\pgfmathsetmacro\mymathresult{\pgfmathresult}%
}
\newcommand{\mymacro}[2]{%
\mathresult{#1}%
\pgfmathparse{#2 + \mymathresult}%
\pgfmathsetmacro\mymathresult{\pgfmathresult}\mathresult%
}%
\begin{document}
\begin{tikzpicture}
\node (0) at (0,0) {X};
\node (\mymacro{2}{3}) at (1,2) {Y};
\draw (\mymacro{2}{3}) -- (0);
\draw (5) -- +(3,0) {Z};
\end{tikzpicture}
\end{document}
答案1
问题在于pgfmath 扩展 - 从 pgfmath 环境中调用命令与此处相同:一个\pgfmathparse
不可扩展的命令正在某个需要扩展的地方使用。在这种情况下,它在另一个 中\pgfmathparse
。在这种情况下,真正的问题在于节点名称本身。解决方案通过首先在“扩展上下文”之外处理宏(不确定这是否是正确的术语!我的意思是它在 TeX 的正常运行中而不是在 中\edef
)然后在扩展位置使用它的结果来避免扩展问题。因此:
\edef\result{\SomethingNotExpandable}
失败,但解决方案是:
\SaveResultOfNonExpandable
\edef\result{\ResultOfNonExpandable}
这个解决方案在这里也适用,但是它的实现方式如下:
\def\mymacro#1#2{%
\pgfmathtruncatemacro{\nodename}{#1+#2}}
% You wait. Time passes. Thorin sits down and starts singing about gold.
\mymacro{2}{3}
\node (\nodename) at (1,2) {Y};
这里的要点是,我们必须避免在括号中放入任何不可扩展的内容。因此,\pgfmathparse
在到达该点之前,必须执行所有例程。无论您如何修饰它,都会在设置节点名称的中\node (\mymacro{2}{3})
执行,因此的所有工作都会在该点进行评估。\mymacro
\edef
\mymacro
要一步完成所有操作,需要可扩展版本\pgfmathparse
。对于特殊情况,例如原始问题中的情况,可以使用 LaTeX3 中的整数例程(texdoc source3
)。
答案2
节点名称需要可扩展,因为它们在 内使用\edef
。pgf
数学处理器不可扩展,因此构造时无法工作。您需要先评估结果。但是,还有第二个问题,因为计算结果是5.0
。例如,尝试
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (0) at (0,0) {X};
\node (5.0) at (1,2) {Y};
\draw (5.0) -- (0);
\end{tikzpicture}
\end{document}
\draw
这条线路因寻找不存在的标签而失败5
。
总的来说,这向我表明标签确实需要手动控制。