使用 pgfmath 命名 TikZ 节点的不完整 \iffalse

使用 pgfmath 命名 TikZ 节点的不完整 \iffalse

在尝试回答是否可以使用宏来命名 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

节点名称需要可扩展,因为它们在 内使用\edefpgf数学处理器不可扩展,因此构造时无法工作。您需要先评估结果。但是,还有第二个问题,因为计算结果是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

总的来说,这向我表明标签确实需要手动控制。

相关内容