\clist_item 和 \pgfmathsetmacro 导致错误

\clist_item 和 \pgfmathsetmacro 导致错误

我的主要目标是能够在定义新命令时使用超过 9 个参数。因此我使用以下代码:

\documentclass[12pt]{article}

\usepackage{pgfmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}{
\pgfmathsetmacro{\ma}{\clist_item:nn{#2}{3}}
\ma
}
\ExplSyntaxOff

\begin{document}

\test{1,2,3}{4,5,6}{7,8,9}{10,11,12}

\end{document}

这段代码可以工作。但是当我执行以下操作时,

\documentclass[12pt]{article}

\usepackage{pgfmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}{
\pgfmathsetmacro{\ma}{\clist_item:nn{#2}{3}}
\ma
}
\ExplSyntaxOff

\begin{document}

\pgfmathsetmacro{\mb}{6}
\test{1,2,3}{4,5,\mb}{7,8,9}{10,11,12}

\end{document}

,然后我收到一个错误。

(!包 PGF Math 错误:未知运算符6' or6@'(在'6'中)。请参阅 PGF Math 包文档以获取解释。输入 H 可立即获得帮助。)

有人能帮助我吗?

如果有比 \clist_item 更好的东西可用,那么我很好奇想知道它。


编辑 1:首先,非常感谢。两种解决方案都有效。我仍然不确定哪种解决方案更可取,以及为什么。但是,我发布的问题得到了回答。但是,我又遇到了另一个错误。我正在尝试执行以下操作:

\documentclass[12pt]{article}

\usepackage{pgfmath}

\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}{
\exp_args:Nne\expandafter\pgfmathsetmacro\csname\clist_item:nn{#1}{1}x\endcsname{
\clist_item:nn{#2}{1}%Here some calculation is done, e. g.: cos(\clist_item:nn{#3}{2})*(\clist_item:nn{#4}{3}) (Therefore, i am using pgfmathsetmacro)
}
\csname\clist_item:nn{#1}{1}x\endcsname
}
\ExplSyntaxOff

\begin{document}

\test{pa}{1,2,3}{4,5,6}{7,8,9}

\end{document}

我想使用此代码定义点,然后将其用于 tikz 绘图。我想使用第一个逗号分隔列表的参数 pa(表示点 a)为 pgfmath 宏指定名称 \pax(表示点 ax 坐标)。下面是我尝试使用 \newcommand 对旧(工作)代码执行的操作的示例:

\documentclass[12pt]{article}

\usepackage{adjustbox}
\usepackage{float}
\usepackage{pgfmath}
\usepackage{tikz}
\usepackage{tikz-3dplot}

\newcommand{\testb}[4]{
\expandafter\pgfmathsetmacro\csname#1x\endcsname{
#2
}
\expandafter\pgfmathsetmacro\csname#1y\endcsname{
#3
}
\expandafter\pgfmathsetmacro\csname#1z\endcsname{
#4
}
\coordinate (#1) at (\csname#1x\endcsname,\csname#1y\endcsname,\csname#1z\endcsname);
\node at (#1) {\(#1\)};
}

\begin{document}

\begin{figure}[H]
\centering
\begin{adjustbox}{width=1\linewidth}
\tdplotsetmaincoords{0}{0}
\begin{tikzpicture}[tdplot_main_coords]
\testb{pa}{1}{1}{0}
\draw[tdplot_main_coords] (0,0,0) -- (pa);
\draw[tdplot_main_coords] (0,0,0) -- ++(\pax,0,0) -- ++(0,\pay,0);
\end{tikzpicture}
\end{adjustbox}
\end{figure}

\end{document}

使用 \clist_item: 为 pgfmath 宏命名的正确方法是什么?

答案1

在此处输入图片描述

这里根本不需要 pgf,但也许在实际文档中需要它。您只需要clist_item:n在将参数传递给 pgf 之前进行扩展即可。

\documentclass[12pt]{article}

\usepackage{pgfmath}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}{
\exp_args:Nne\pgfmathsetmacro{\ma}{\clist_item:nn{#2}{3}}
\ma
}
\ExplSyntaxOff

\begin{document}

\pgfmathsetmacro{\mb}{6}
\test{1,2,3}{4,5,\mb}{7,8,9}{10,11,12}

\end{document}

答案2

我不确定是什么原因造成的\pgfmathsetmacro

无论如何,为了使其发挥作用,您必须进一步扩展结果。

\documentclass[12pt]{article}

\usepackage{pgfmath}
%\usepackage{xparse} % no longer necessary

\ExplSyntaxOn
\NewDocumentCommand{\test}{mmmm}
 {
  \pgfmathsetmacro{\ma}{\use:e{\clist_item:nn{#2}{3}}}
  \ma
 }
\ExplSyntaxOff

\begin{document}

\pgfmathsetmacro{\mb}{6}
\test{1,2,3}{4,5,\mb}{7,8,9}{10,11,12}
\test{1,2,3}{4,5,6}{7,8,9}{10,11,12}

\end{document}

答案3

使用我的新包,

\documentclass[12pt]{article}

\usepackage{pgfmath}
\usepackage{xparse}
\usepackage{pythonimmediate}


\begin{document}

\begin{pycode}
from pythonimmediate import newcommand, get_arg_str, print_TeX
@newcommand
def test():
  arg1 = get_arg_str()
  arg2 = get_arg_str()
  arg3 = get_arg_str()
  arg4 = get_arg_str()
  print_TeX(r"\pgfmathsetmacro{\ma}{" + str(arg2.split(',')[2]) + "}")
\end{pycode}

\pgfmathsetmacro{\mb}{6}
\test{1,2,3}{4,5,\mb}{7,8,9}{10,11,12}

\ma


\end{document}

为了调试,你可以在源代码中添加类似下面的内容

print()
print()
print()
print(r"we're going to execute the following: ======== \pgfmathsetmacro{\ma}{" + str(arg2.split(',')[2]) + "}")
print()
print()
print()

打印出来

we're going to execute the following: ======== \pgfmathsetmacro{\ma}{\mb }

希望应该是不言自明的。

相关内容