我的主要目标是能够在定义新命令时使用超过 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' or
6@'(在'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 }
希望应该是不言自明的。