键值通过属性列表 getter 函数错误地传递

键值通过属性列表 getter 函数错误地传递

我正在创建相当复杂的图表,并希望将所有控件都放在一个易于查找的位置,而不是分散在整个文档中。为此,我创建了二传手吸气剂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仍然远非最终结果。请注意其他包含危险标记的选项;文本和长度是安全的。

相关内容