我需要将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
。