![如何在宏中“打开”花括号?](https://linux22.com/image/247717/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%AE%8F%E4%B8%AD%E2%80%9C%E6%89%93%E5%BC%80%E2%80%9D%E8%8A%B1%E6%8B%AC%E5%8F%B7%EF%BC%9F.png)
在 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