当“黄色”是 \ifthenelse 命令的结果时,为什么它不适合用作 \fill 的可选参数?

当“黄色”是 \ifthenelse 命令的结果时,为什么它不适合用作 \fill 的可选参数?

有人能帮帮我吗?为什么第 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来整理颜色和箭头提示,而无需使用实际的键colorarrows。)

\ifthenelse不是ifthen完全可展开的。

虽然 PGFMath 有自己的ifthenelse函数,但它不能很好地处理文本/字符串,您可能希望继续使用熟悉的功能,\ifthenelse使用允许类似用途的特殊键。

\pgfkeys{/utils/ifthenelse/.code n args={3}{%
  \ifthenelse{#1}{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}}}

这定义了一个/utils/ifthenelse接受三个参数的键:

  1. 考试ifthen
  2. 当测试结果为真时应应用的键,以及
  3. 否则应该应用的密钥。

根据您的整体使用情况,我在下面添加了一些替代解决方案,这些解决方案都不需要ifthen/\ifthenelse但只使用 PGFKey 系统。

如果您想要的只是快捷方式,那么您也可以只定义键YR甚至定义颜色YR

代码

\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}

相关内容