![键值通过属性列表 getter 函数错误地传递](https://linux22.com/image/262556/%E9%94%AE%E5%80%BC%E9%80%9A%E8%BF%87%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8%20getter%20%E5%87%BD%E6%95%B0%E9%94%99%E8%AF%AF%E5%9C%B0%E4%BC%A0%E9%80%92.png)
我正在创建相当复杂的图表,并希望将所有控件都放在一个易于查找的位置,而不是分散在整个文档中。为此,我创建了二传手和吸气剂LaTeX3 属性列表的函数。代码如下:
\documentclass{article}
\usepackage{pstricks,pst-node}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g__sunset_plist
\NewDocumentCommand{\setattr}{ mm }
{
\prop_gput:Nnn \g__sunset_plist {#1} {#2}
}
\DeclareExpandableDocumentCommand{\gettr}{ m }
{
\prop_get:Nn \g__sunset_plist { #1 }
}
\ExplSyntaxOff
\setattr{my_linestyle}{linestyle=dashed,linecolor=blue}
\setattr{my_line}{\psline[linestyle=dashed,linecolor=blue](A)(B)}
\pagestyle{empty}
\begin{document}
\begin{pspicture}(10,10)
\pnode(0,0){A}
\pnode(10,10){B}
\pnode(10,0){C}
\pnode(0,10){D}
\gettr{my_line} %% <-- works as expected
\psline[\gettr{my_linestyle}](C)(D) %% <-- not working
\end{pspicture}
\end{document}
线路
\gettr{my_line} %% <-- works as expected
有效,但我不想用这种方式解决问题。我更喜欢写
\psline[\gettr{my_linestyle}](C)(D) %% <-- not working
因为这条线准确地向我展示了我正在做的事情:从点 C 到点 D 画一条线。隐是该行的属性。我更喜欢这种方法。但似乎发生的情况是,当\gettr{my_linestyle}
展开时,LaTeX 会看到:
\psline[{linestyle=dashed,linecolor=blue}](C)(D) %% <-- not working
我如何获得我的吸气剂功能可以在没有周围环境的情况下扩展{...}
吗?
编辑
这是错误信息
! Package xkeyval Error: `linestyle=dashed,linecolor=blue' undefined in familie
s `,pstricks,pst-node'.
See the xkeyval package documentation for explanation.
Type H <return> for immediate help.
xkeyval
因此,看起来在获得钥匙之前发生了某种扩展。
答案1
您可以定义一个“前缀”宏:
\documentclass{article}
\usepackage{pstricks,pst-node}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g__ellett_sunset_plist
\NewDocumentCommand{\setattr}{ mm }
{
\prop_gput:Nnn \g__ellett_sunset_plist {#1} {#2}
}
\NewDocumentCommand{\gettr}{ m }
{
\prop_get:Nn \g__ellett_sunset_plist { #1 }
}
\NewDocumentCommand{\expandoptions}{mO{}}
{
\use:x { \exp_not:N #1 [ #2 ] }
}
\ExplSyntaxOff
\setattr{my_linestyle}{linestyle=dashed,linecolor=blue}
\setattr{my_line}{\psline[linestyle=dashed,linecolor=blue](A)(B)}
\pagestyle{empty}
\begin{document}
\begin{pspicture}(10,10)
\pnode(0,0){A}
\pnode(10,10){B}
\pnode(10,0){C}
\pnode(0,10){D}
\gettr{my_line} %% <-- works as expected
\expandoptions\psline[\gettr{my_linestyle}](C)(D) %% <-- not working
\end{pspicture}
\end{document}
使用\use:x
是“最后的手段”,但四次扩展\gettr
仍然远非最终结果。请注意其他包含危险标记的选项;文本和长度是安全的。