我在 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}