![`\def\foo{{a,b}}` 是什么对象?](https://linux22.com/image/446691/%60%5Cdef%5Cfoo%7B%7Ba%2Cb%7D%7D%60%20%E6%98%AF%E4%BB%80%E4%B9%88%E5%AF%B9%E8%B1%A1%EF%BC%9F.png)
在我的生活中的某一天,我使用来自互联网随机部分的一些技巧创建了一个 tikz 对象,并且发现了以下内容:
\def\foo{{a,b}}
我没有任何例子,但我很确定这是方法。它像矢量一样工作,但我找不到该结构的任何信息。我在工作中使用xparse
包创建了一个宏,我真的很想在这些定义中使用它,但一些严重的错误阻碍了它。
那是什么物体?我只要搜索一下就可以了。另外,如果有人可以的话,有没有办法定义类似下面的内容?
\def\foo{{a,b}}
\usepackage{xparse}
\NewDocumentCommand{\mezzocommand}{m O{0}}{
${#1} + \foo[#2]$
}
那么\mezzocommand{x}[1]
得到 $x+b$ 吗?抱歉没有例子,但我就是想知道如何去搜索它。
答案1
\def\foo{{a,b}}
与 tikz 无关,并且不创建对象,它是一个原始的 tex 宏定义,并定义\foo
为扩展到 5 个标记的宏{
a
,
b
}
目前还不清楚你想实施什么规则
\mezzocommand{x}[1]
生产$x+b$
?
我猜你想让 1 从列表中取出第 2 项(从 0 开始计数)a,b
?
\documentclass{article}
% use an expl3 clist below\def\foo{{a,b}}
% only needed in old latex \usepackage{xparse}
\ExplSyntaxOn
\clist_const:Nn\l_list{a,b}
\NewDocumentCommand{\mezzocommand}{m O{0}}{
$#1 + \clist_item:Nn\l_list{#2+1}$
}
\ExplSyntaxOff
\begin{document}
\mezzocommand{x}[1]
\end{document}
答案2
当然,您可以使用pgfmath
(包括在内tikz
)。另一方面,您真正想要的是什么并不十分清楚。
\documentclass{article}
\usepackage{pgfmath}
\NewDocumentCommand{\mezzocommand}{m O{0}}{%
${#1} + \pgfmathparse{\foo[#2]}\pgfmathresult$%
}
\def\foo{{"a","b"}}
\begin{document}
\mezzocommand{x}
\mezzocommand{x}[1]
\end{document}
或者:
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\definepseudoarray}{mm}
{
\clist_new:c { l__mezzo_ \cs_to_str:N #1 _clist }
\clist_set:cn { l__mezzo_ \cs_to_str:N #1 _clist } { #2 }
\NewDocumentCommand{#1}{O{0}}
{
\clist_item:cn { l__mezzo_ \cs_to_str:N #1 _clist } { ##1 + 1 }
}
}
\ExplSyntaxOff
\NewDocumentCommand{\mezzocommand}{m O{0}}{%
$#1 + \foo[#2]$%
}
\definepseudoarray\foo{a,b}
\begin{document}
\mezzocommand{x}
\mezzocommand{x}[1]
\end{document}
\foo
如果对命令使用强制参数而不是可选参数,则可以使命令可扩展。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\definepseudoarray}{mm}
{
\clist_new:c { l__mezzo_ \cs_to_str:N #1 _clist }
\clist_set:cn { l__mezzo_ \cs_to_str:N #1 _clist } { #2 }
\NewExpandableDocumentCommand{#1}{m}
{
\clist_item:cn { l__mezzo_ \cs_to_str:N #1 _clist } { ##1 + 1 }
}
}
\ExplSyntaxOff
\NewDocumentCommand{\mezzocommand}{m O{0}}{%
$#1 + \foo{#2}$%
}
\definepseudoarray\foo{a,b}
\begin{document}
\mezzocommand{x}
\mezzocommand{x}[1]
\end{document}