为了在\foreach
循环中使用,我希望将矩形的样式属性存储在宏中。样式属性将包括填充颜色、不透明度等(但每次出现的属性每次都不一样)。然后我想使用该命令,在 Ti 中展开钾Z\draw
命令。
我尝试了几种方法让它工作(将命令包装\draw
在宏中,使用\edef
and/or \expandafter
),并尝试在谷歌上搜索这个问题的解决方案,但到目前为止都没有成功。我把这个问题归结为以下最小的工作示例。有人能帮我访问宏中的样式属性并将它们传输到 Ti 吗?钾Z 绘图命令?
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
% this works
\draw[fill=blue,opacity=0.8] (0,0) rectangle (1,1);
\end{tikzpicture}
\begin{tikzpicture}
% this doesn't work, but I want it to
\def\styleattributes{fill=blue,opacity=0.8}
\draw[\styleattributes] (0,0) rectangle (1,1);
\end{tikzpicture}
\end{document}
答案1
谢谢CarLaTeX 的评论指向这个问题,我找到了以下解决方案:
\documentclass{minimal}
\usepackage{tikz}
\tikzset{apply style/.code={\tikzset{#1}}}
\begin{document}
\begin{tikzpicture}
\def\styleattributes{fill=blue,opacity=0.8}
\draw[apply style/.expand once=\styleattributes] (0,0) rectangle (1,1);
\end{tikzpicture}
\end{document}
答案2
关于使用 TeX 宏或 LaTeX 新命令设置 TikZ 样式。
使用 foreach 循环时经常会出现包含样式键的宏,但问题并不是由 你提到的问题。
Loop Space 在回答这个问题时解释说,编译错误产生的原因是,当 pgfkeys 处理样式键时,它会先将其拆分为样式键列表,然后再扩展 TeX 宏。另一个原因是,pgfkeys 在扩展 TeX 宏之前会确定每个样式键是否被分配了一个值。
Loop Space 建议的补救措施是定义一个样式键来扩展其参数值在使用之前风格钥匙。确实,有时一次扩展是不够的,我建议使用执行完整扩展的键样式。它expand style
在以下代码中调用。
该代码expand style
与其他样式键(称为expand style once
和 )进行了比较expand style twice
。它用八个尽可能简单的示例(例如,在嵌套 foreach 循环以测试各种样式时可能会出现)说明了这些事实。在此代码中,前两个节点样式需要扩展,第三和第四个节点样式需要扩展多次,后四个节点样式需要扩展两次以上。结论:
每个包含逗号分隔列表或键值分配的宏(键参数前面带有等号)都需要一次扩展,
每个包含此类宏的宏在递归时都需要在每个递归步骤中进行一次扩展,
每个此类宏列表都需要对列表中的每个项目进行一次扩展。
\documentclass{article}
\usepackage{tikz}
\tikzset{%
set style/.style={#1},
expand style/.style={%completely expands the <value> of its argument (using \edef) before processing the result as a <key>
set style/.expanded={#1}% needs braces around the argument
},
expand style once/.style={%expands the <value> of its argument once before processing the result as a <key>
set style/.expand once={#1}% needs braces around the argument
},
expand style twice/.style={%expands the <value> of its argument twice before processing the result as a <key>
set style/.expand twice={#1}% needs braces around the argument
}
}
\begin{document}
\def\mystylearg{fill=yellow}
\def\mystyleargelse{text=red}
\def\mystylelist{draw,circle}
\def\mystylemacroarg{\mystylearg} % minimal macro example needing more than once
\def\mystylemacrolist{\mystylelist} % minimal macro example needing more than once
\def\mystylemacromacroarg{\mystylemacroarg} % minimal macro example needing more than twice
\def\mystylemacromacrolist{\mystylemacrolist} % minimal macro example needing more than twice
%\tikz\node[\mystylearg] {B}; % fails
\tikz\node[expand style once=\mystylearg] {B}; % needs expansion
%\tikz\node[expand style=\mystylearg] {B}; % ok (more than enough is ok)
% \tikz\node[\mystylelist] {B}; % fails
\tikz\node[expand style once=\mystylelist] {B}; % needs expansion
%
%\tikz\node[expand style once=\mystylemacroarg] {B};% fails
\tikz\node[expand style twice=\mystylemacroarg] {B}; % needs more than once
%\tikz\node[expand style once=\mystylemacrolist] {B}; % fails
\tikz\node[expand style twice=\mystylemacrolist] {B}; % needs more than once
%
%\tikz\node[expand style twice={\mystylearg,\mystyleargelse}] {B}; % fails
\tikz\node[expand style={\mystylearg,\mystyleargelse}] {B}; % needs more than twice
%\tikz\node[expand style twice={\mystylearg,\mystylelist}] {B}; % fails
\tikz\node[expand style={\mystylearg,\mystylelist}] {B}; % needs more than twice
%\tikz\node[expand style twice={\mystylelist,\mystylearg}] {B}; % fails, the same (commutes)
%\tikz\node[expand style={\mystylelist,\mystylearg}] {B}; % ok, the same (commutes)
%\tikz\node[expand style twice=\mystylemacromacroarg] {B}; % fails
\tikz\node[expand style=\mystylemacromacroarg] {B}; % needs more than twice
%\tikz\node[expand style twice=\mystylemacromacrolist] {B}; % fails
\tikz\node[expand style=\mystylemacromacrolist] {B}; % needs more than twice
\end{document}