TikZ 节点中的宏扩展

TikZ 节点中的宏扩展

我在 TikZ 节点的宏扩展方面遇到了一些问题。下面的 MWE 应该在指定的坐标处绘制节点并显示它们的坐标(四舍五入到最接近的数字),但它显示了这两个节点的最后一个节点的坐标。

\documentclass[]{article}

\usepackage{pgfplots}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \x
\tl_new:N \x_round

\NewDocumentCommand \mynode { m } {
    \tl_set:Nn \x { 
        \fp_eval:n { #1 } 
    }

    \tl_set:Nn \x_round { 
       \fp_eval:n { round ( \x ) } 
    }

    \addplot [style={mark=none}] coordinates { ( \x , \x ) } node { \x_round } ;
}

\ExplSyntaxOff

\begin{document}
    \begin{tikzpicture}
        \begin{axis}            
            \mynode{1.1}
            \mynode{2.2}
        \end{axis}
    \end{tikzpicture}
\end{document}

我认为问题在于\x_round直到环境结束时节点中才展开。我如何确保\x_round立即展开?

我注意到用以下命令替换

\NewDocumentCommand \mynode { m } {
    \addplot [style={mark=none}] coordinates { ( #1 , #1 ) } node { \fp_eval:n { round ( #1 ) }  } ;
}

确实解决了这个问题,但是对于我的实际代码来说,它是不够的,因为代码更复杂。

答案1

您应该使用\tl_set:Nx,但无论如何它都是毫无意义的:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{xparse}

\ExplSyntaxOn

\NewDocumentCommand \mynode { m }
 {
  \addplot [style={mark=none}]
    coordinates { ( \fp_eval:n { #1 } , \fp_eval:n { #1 } ) }
    node { \fp_eval:n { round(#1) } } ;
 }

\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \mynode{1.1}
    \mynode{2.2}
  \end{axis}
\end{tikzpicture}

\end{document}

避免使用诸如\x和之类的名称\x_round,使用适当的命名约定。

在此处输入图片描述

您可以使用变量(这里我使用fp变量,但tl只要您使用 设置它们,也可以很好\tl_set:Nx)。但是,在将节点中的文本传递给 PGF 之前,必须对其进行扩展:

\documentclass{article}

\usepackage{pgfplots}
\usepackage{xparse}

\ExplSyntaxOn

\fp_new:N \l_slo_coord_x_fp
\fp_new:N \l_slo_coord_x_round_fp

\NewDocumentCommand \mynode { m }
 {
  \fp_set:Nn \l_slo_coord_x_fp { #1 }
  \fp_set:Nn \l_slo_coord_x_round_fp { round ( \l_slo_coord_x_fp ) }
  \use:x
   {
    \exp_not:N \addplot [style={mark=none}]
      coordinates { ( \fp_use:N \l_slo_coord_x_fp , \fp_use:N \l_slo_coord_x_fp ) }
      node { \fp_use:N \l_slo_coord_x_round_fp } ;
   }
 }

\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}
  \begin{axis}
    \mynode{1.1}
    \mynode{2.2}
  \end{axis}
\end{tikzpicture}

\end{document}

相关内容