如何比较两个列表?

如何比较两个列表?

如下所示,当颜色为白色时,代码无法重新定义颜色(例如rgb(1,1,1))。

\documentclass{standalone}
\usepackage{tikz}
\usepackage{xcolor}
\begin{document}
   \foreach \code/\col in {%
   {1,1,1}/white,
   {1,1,0}/yellow,
   {1,0,1}/pink
   }{

   \ifx {\code} {1,1,1}
   \definecolor{tempcolor}{rgb}{1,0,0}
   \else
   \definecolor{tempcolor}{rgb}{\code}
   \fi
   \textcolor{tempcolor}{\col};
   }

\end{document}

在此处输入图片描述

为什么我的病情恶化了?

答案1

修订:您最初的尝试几乎完全成功。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
   \edef\speciallist{1,1,1}
   \foreach \code/\col in {%
   {1,1,1}/white,
   {1,1,0}/yellow,
   {1,0,1}/pink
   }{

   \ifx\code\speciallist
    \definecolor{tempcolor}{rgb}{1,0,0}
   \else
    \definecolor{tempcolor}{rgb}{\code}
   \fi
    \textcolor{tempcolor}{\col};
   }

\end{document}

在此处输入图片描述

旧答案:钛Z 附带了比较这些列表的所有工具,您无需加载其他软件包。(顺便说一句,您也不必加载xcolor。)更详细地说,TiZ 允许您解析列表(或数组),这允许您定义一个数量,如果所有条目都与您的目标列表一致,则为 0,否则为 1。更详细地说,我计算一个数量

\pgfmathtruncatemacro{\myx}{sign(abs({\code}[0]-{\speciallist}[0])+abs({\code}[1]-{\speciallist}[1])+abs({\code}[2]-{\speciallist}[2]))}

在哪里

  • \pgfmathtruncatemacro确保得到一个整数,使得\ifnum(仅适用于整数)有效。
  • 论点是|first entry of \code - first entry of \speciallist|+|second entry of \code - second entry of \speciallist|+|third entry of \code - third entry of \speciallist|

显然,只有当列表中的所有条目都一致时,这个数量才为 0。此处,{\code}[0]计算为列表的第一个条目\code,依此类推。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
   \edef\speciallist{1,1,1}
   \foreach \code/\col in {%
   {1,1,1}/white,
   {1,1,0}/yellow,
   {1,0,1}/pink
   }{
   \pgfmathtruncatemacro{\myx}{sign(abs({\code}[0]-{\speciallist}[0])+abs({\code}[1]-{\speciallist}[1])+abs({\code}[2]-{\speciallist}[2]))}
   \ifnum\myx=0
    \definecolor{tempcolor}{rgb}{1,0,0}
   \else
    \definecolor{tempcolor}{rgb}{\code}
   \fi
    \textcolor{tempcolor}{\col};
   }

\end{document}

答案2

从技术上讲,您希望看到是否\code等于1,1,1文本字符串。您可以使用它。如果小于/等于/大于(按字典顺序),\pdfstrcmp{<strA>}{<strB>}则返回 -1/0/1 :<strA><strB>

在此处输入图片描述

\documentclass{article}

\usepackage{tikz}

\begin{document}

\foreach \code/\col in {%
    {1,1,1}/white,%
    {1,1,0}/yellow,%
    {1,0,1}/pink%
  }{

  \ifnum\pdfstrcmp{\code}{1,1,1}=0
    \definecolor{tempcolor}{rgb}{1,0,0}%
  \else
    \definecolor{tempcolor}{rgb}{\code}%
  \fi
  \textcolor{tempcolor}{\col};
}

\end{document}

相关内容