Ifthenelse - 比较字符串(一个字符串小于另一个字符串)

Ifthenelse - 比较字符串(一个字符串小于另一个字符串)

此主题正在关注我之前的问题,昨天BambOo给出了精彩的解答。

现在我们进一步深入这个项目。

我承认我想把一串字母(或单词)放在一个 6 列的网格上,然后根据它们的内容对它们进行样式化。

在下面的例子中,我显示了一个简单的字母表和一个[count=\i]进入循环,但我希望能够直接比较节点内容,即类似的东西ifthenelse(\l<"J", nodeone, nodetwo)。 有什么简单的方法可以做到这一点吗?

\documentclass[a4paper, 11pt]{article}

\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{shapes}

\usepackage{ifthen}


\begin{document}


\begin{center}
\begin{tikzpicture}


\tikzstyle{nodeone}=[circle, fill=cyan!50!yellow,text=purple,opacity=1,minimum height=30]
\tikzstyle{nodetwo}=[regular polygon,regular polygon sides=5, fill=orange!50!red,text=cyan,opacity=1,minimum height=30]
\tikzstyle{nodethree}=[star,star points=7,star point ratio=0.8, fill=red!50!blue,text=orange,opacity=1,minimum height=30]



\def\LX{2} \def\LY{3} \def\ncol{6} % dimensions of the grid
\def\firstlim{8} \def\secondlim{17}

\foreach \l [count=\i from 0] in {A,...,Z}
    {
    \pgfmathsetmacro{\nodestyl}
        {
        ifthenelse(\i<\firstlim,"nodeone",
            ifthenelse(\i<\secondlim,"nodetwo","nodethree")
        }%

    \pgfmathtruncatemacro\result{\i/\ncol}
    \node[\nodestyl] at ({Mod(\i,\ncol)*\LX},-\result*\LY) {\sf \Large \textbf{\l}};
    }


\end{tikzpicture}
\end{center}

\end{document}

6 列网格

我已经研究过etoolbox可以提供帮助的东西,并且找到了一种测试字符串是否相等的方法:\expandafter\ifstrequal\expandafter{\l}{A}{\nodeone}{nodetwo},但还没有找到一种测试 string1 是否劣于 string2 的方法。

答案1

\pdf@strcmp您可以使用包中的进行此类比较pdftexcmds。我已经使用 pdfTeX、XeTeX 和 LuaTeX 测试了以下代码——所有这些都支持该命令。\pdf@strcmp扩展为-101取决于第一个字符串是否严格小于、等于或严格大于第二个字符串(当然支持 ASCII;对于其余的,我不知道——这可能取决于引擎)。

不要使用\tikzstyle,它已经过时了;相反,使用\tikzset或 的可选参数tikzpicture(见下文)。最好使用font选项来定义要在 Ti 中使用的字体Z 节点,切勿\sf与 LaTeX 一起使用:它是纯 TeX 字体命令,而不是 LaTeX。最好使用\sffamily\textsf— 这些是 LaTeX 字体选择命令。

\documentclass[tikz, border=1mm]{standalone}
\usetikzlibrary{shapes}
\usepackage{pdftexcmds}

\makeatletter
% Expand #1 once before comparing it to #2
\newcommand*{\mystrcmp}[2]{%
  \expandafter\pdf@strcmp\expandafter{#1}{#2}%
}
\makeatother

\begin{document}
\begin{tikzpicture}[
  nodeone/.style={circle, fill=cyan!50!yellow,text=purple,opacity=1,
                  minimum height=30},
  nodetwo/.style={regular polygon,regular polygon sides=5,
                  fill=orange!50!red,text=cyan,opacity=1,minimum height=30},
  nodethree/.style={star,star points=7,star point ratio=0.8,
                    fill=red!50!blue,text=orange,opacity=1,minimum height=30},
  ]

% Dimensions of the grid
\newcommand*{\LX}{2} \newcommand*{\LY}{3} \newcommand*{\ncol}{6}

\foreach \l [count=\i from 0] in {A,...,Z}
  {
    \edef\myNodestyle{%
      \ifnum\mystrcmp{\l}{I}=-1   % space intended
        nodeone%
      \else
        \ifnum\mystrcmp{\l}{R}=-1 % space intended
          nodetwo%
        \else
          nodethree%
        \fi
      \fi
    }

    \pgfmathtruncatemacro{\result}{\i/\ncol}
    \node[\myNodestyle, font=\sffamily\Large\bfseries]
      at ({Mod(\i,\ncol)*\LX}, -\result*\LY) {\l};
  }
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容