![当“黄色”是 \ifthenelse 命令的结果时,为什么它不适合用作 \fill 的可选参数?](https://linux22.com/image/460803/%E5%BD%93%E2%80%9C%E9%BB%84%E8%89%B2%E2%80%9D%E6%98%AF%20%5Cifthenelse%20%E5%91%BD%E4%BB%A4%E7%9A%84%E7%BB%93%E6%9E%9C%E6%97%B6%EF%BC%8C%E4%B8%BA%E4%BB%80%E4%B9%88%E5%AE%83%E4%B8%8D%E9%80%82%E5%90%88%E7%94%A8%E4%BD%9C%20%5Cfill%20%E7%9A%84%E5%8F%AF%E9%80%89%E5%8F%82%E6%95%B0%EF%BC%9F.png)
有人能帮帮我吗?为什么第 1、2 和 5 个代码都很好,但第 3 和第 4 个代码却停止并出现警告。
第一个代码正确
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\newcommand\col[1]{\ifthenelse{\equal{#1}{Y}}{yellow}{red}}
\col{Y}
\col{R}
\end{document}
第二个代码正确
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[yellow](0,0)rectangle(1,1);\fill[red](1,1)rectangle(2,2);
\end{tikzpicture}
\end{document}
第三段代码以 ! 结束,未定义控制序列。\equal {Y}{Y} l.7 \fill[\col{Y}] (0,0)rectangle(1,1);\fill\col{R}rectangle(2,2); ? 消息
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\newcommand\col[1]{\ifthenelse{\equal{#1}{Y}}{yellow}{red}}
\begin{tikzpicture}
\fill[\col{Y}](0,0)rectangle(1,1);\fill[\col{R}](1,1)rectangle(2,2);
\end{tikzpicture}
\end{document}
第四段代码以 ! 结束,未定义控制序列。\equal {Y}{Y} l.7 \def\COL{\col{Y}}\fill[\COL] (0,0)rectangle(1,1);\def\COL{\col{R}}\fill[...
? 信息
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\newcommand\col[1]{\ifthenelse{\equal{#1}{Y}}{yellow}{red}}
\begin{tikzpicture}
\def\COL{\col{Y}}\fill[\COL](0,0)rectangle(1,1);\def\COL{\col{R}}\fill[\COL](1,1)rectangle(2,2);
\end{tikzpicture}
\end{document}
第五个代码正确
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\begin{document}
\newcommand\col[1]{\ifthenelse{\equal{#1}{Y}}{\def\COL{yellow}}{\def\COL{red}}}
\begin{tikzpicture}
\col{Y}\fill[\COL](0,0)rectangle(1,1);\col{R}\fill[\COL](1,1)rectangle(2,2);
\end{tikzpicture}
\end{document}
有人知道这取决于什么吗?
答案1
路径的可选参数被传递给 PGFKeys,它需要完全可扩展的键名。(不,每种颜色不是其自己的键,PGFKeys 在命名空间中做了很多工作/tikz
来整理颜色和箭头提示,而无需使用实际的键color
或arrows
。)
宏\ifthenelse
不是ifthen
完全可展开的。
虽然 PGFMath 有自己的ifthenelse
函数,但它不能很好地处理文本/字符串,您可能希望继续使用熟悉的功能,\ifthenelse
使用允许类似用途的特殊键。
\pgfkeys{/utils/ifthenelse/.code n args={3}{%
\ifthenelse{#1}{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}}}
这定义了一个/utils/ifthenelse
接受三个参数的键:
- 考试
ifthen
, - 当测试结果为真时应应用的键,以及
- 否则应该应用的密钥。
根据您的整体使用情况,我在下面添加了一些替代解决方案,这些解决方案都不需要ifthen
/\ifthenelse
但只使用 PGFKey 系统。
如果您想要的只是快捷方式,那么您也可以只定义键Y
和R
甚至定义颜色Y
和R
。
代码
\documentclass{article}
\usepackage{ifthen}
\usepackage{tikz}
\pgfkeys{/utils/ifthenelse/.code n args={3}{%
\ifthenelse{#1}{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}}}
\begin{document}
\begin{tikzpicture}[
col/.style={
/utils/ifthenelse={\equal{#1}{Y}}{yellow}{red}}]
\fill[col = Y](0,0)rectangle(1,1);
\fill[col = R](1,1)rectangle(2,2);
\end{tikzpicture}
\begin{tikzpicture}[
col/.is choice, col/Y/.style = yellow, col/R/.style = red]
\fill[col = Y](0,0)rectangle(1,1);
\fill[col = R](1,1)rectangle(2,2);
\end{tikzpicture}
\begin{tikzpicture}[
Y/.style=yellow,
R/.style = red]
\fill[Y](0,0)rectangle(1,1);
\fill[R](1,1)rectangle(2,2);
\end{tikzpicture}
\colorlet{Y}{yellow}
\colorlet{R}{red}
\begin{tikzpicture}
\fill[Y](0,0)rectangle(1,1);
\fill[R](1,1)rectangle(2,2);
\end{tikzpicture}
\end{document}