扩展 \csdef 定义的宏以通过 \tikzset 定义样式

扩展 \csdef 定义的宏以通过 \tikzset 定义样式

我需要将tikz选项存储在\csdef{}

\csdef{My Node Option}{draw=red, thick, fill=yellow}

我如何使用这个定义来定义样式\tikzset?我尝试.expand once按照如何使用 xkeyval 命令定义 tikz 样式?

\tikzset{Node Options/.style/.expand once=\csuse{My Node Option}}

但这导致

软件包 pgfkeys 错误:我不知道密钥 '/tikz/draw=red, thick, fill=yellow',我将忽略它。也许您拼错了。

期望的结果是修改仅有的\tikzset平均能量损失并得到:

在此处输入图片描述

笔记:

  • 正如 egreg 所评论的,命令名称中应避免使用空格。但是,在我的实际使用案例中,定义的命令名称以csdef{}路径中包含空格、斜杠、数字、句点的文件名命名。

代码:

\documentclass{article}

\usepackage{tikz}
\usepackage{etoolbox}

\begin{document}


\csdef{My Node Option}{draw=red, thick, fill=yellow}

\noindent
\begin{tikzpicture}
    \tikzset{Node Options/.style/.expand once=\csuse{My Node Option}}%% ????

    \node [Node Options] at (0,0) {Node Text};
\end{tikzpicture}%
\end{document}

答案1

您可以在 MWE 中expanded使用:expand once

\tikzset{Node Options/.style/.expanded=\csuse{My Node Option}}%% ????

答案2

\csuse{...}与以下不太一样\csname...\endcsname

% etoolbox.sty, line 883:
\newcommand*{\csuse}[1]{%
  \ifcsname#1\endcsname
    \csname#1\expandafter\endcsname
  \fi}

如果你在你的上下文中扩展一次你就会得到

\ifcsname My Node Option\endcsname\csname My Node Option\endcsname\fi

进一步的扩展步骤将删除条件,剩下

\csname My Node Option\endcsname\fi

这需要扩张步骤,以实现

draw=red, thick, fill=yellow\fi

但随后它就\fi开始发挥作用,因为它被移动到了错误的地方。

你可以做

\tikzset{Node Options/.style/.expand twice=\csname My Node Option\endcsname}

从而避免了悬垂问题\if

然而,我认为最好的策略是全面使用风格:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\tikzset{My Node Option/.style={draw=red, thick, fill=yellow}}

\begin{tikzpicture}
\tikzset{Node Options/.style=My Node Option}

\node [Node Options] at (0,0) {Node Text};
\end{tikzpicture} 

\end{document}

答案3

您可以使用\begingroup\edef\x{\endgroup <stuff to expand>}\x扩展技巧:

\documentclass{article}

\usepackage{tikz}
\usepackage{etoolbox}

\begin{document}

\csdef{My Node Option}{draw=red, thick, fill=yellow}

\noindent
\begin{tikzpicture}
  \begingroup\edef\x{\endgroup
    \noexpand\tikzset{Node Options/.style={\csuse{My Node Option}}}}%
  \x

  \node [Node Options] at (0,0) {Node Text};
\end{tikzpicture}%

\end{document}

请注意 周围的额外括号\csuse

相关内容