此主题正在关注我之前的问题,昨天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}
我已经研究过etoolbox
可以提供帮助的东西,并且找到了一种测试字符串是否相等的方法:\expandafter\ifstrequal\expandafter{\l}{A}{\nodeone}{nodetwo}
,但还没有找到一种测试 string1 是否劣于 string2 的方法。
答案1
\pdf@strcmp
您可以使用包中的进行此类比较pdftexcmds
。我已经使用 pdfTeX、XeTeX 和 LuaTeX 测试了以下代码——所有这些都支持该命令。\pdf@strcmp
扩展为-1
,0
或1
取决于第一个字符串是否严格小于、等于或严格大于第二个字符串(当然支持 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}