如何在宏中“打开”花括号?

如何在宏中“打开”花括号?

在 tikz 中,宏\draw接受用逗号分隔的参数的光学参数,例如

\draw[->, red] (0, 0) -- (1, 1)

我有一个自定义的宏,我想在其中传递一个宏作为这个可选参数,即类似

\def\p{->, red}
\draw[\p] (0, 0) -- (1, 1)

但是,我得到了一个ERROR: Package pgf Error: Arrow end type ``>, red'' unknown.

\draw[{{->, red}}] (0, 0) -- (1, 1)

我认为这是因为该参数作为单个参数传递character并且无法分离。

有没有办法正确地做到这一点?(即在将花括号传递给宏之前“取消引用”花括号\draw。)

在我的特定情况下,我使用 xkeyval 包来定义我的宏根据这个。因此我必须通过宏传递参数。

(任何针对 tikz 的具体解决方法也很有帮助。谢谢)

答案1

您应该使用\tikzset{MyStyle/.style={->, red}}而不是来\def定义要应用的自己的自定义样式:

\documentclass{article}
\usepackage{tikz}

\tikzset{MyStyle/.style={->, red}}

\begin{document}
\begin{tikzpicture}
    \draw[MyStyle] (0, 0) -- (1, 1);
\end{tikzpicture}
\end{document}

答案2

\documentclass[11pt]{scrartcl}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}

 \def\p{->, red}
\draw\expandafter[\p] (0, 0) -- (1, 1);

\end{tikzpicture}
\end{document} 

或使用 etex

\begin{tikzpicture} 
   \def\p{->, red}   
   \makeatletter
 \protected@edef\tmp{%
   \noexpand \draw[\p] (0, 0) -- (1, 1);}\tmp  
\end{tikzpicture} 

答案3

解决您问题的一个直接方法是

\expandafter\draw\expandafter[\p] 

但如果想系统地使用它,就会变得很尴尬。

无论如何,无论您做什么,您都需要确保在执行[]之前扩展其内容。\draw

相关内容