What is wrong with the use of `isodd` of `xifthen`?
I'd suggest using TeX's \ifodd
(or etoolbox
); xifthen
-and-friends may be considered obsolete:
\documentclass{article}
\usepackage{xfp,tikz}
\begin{document}
\begin{tikzpicture}[every node/.style = {draw, circle, minimum size = 10pt}]
\foreach \r in {1, ..., 4} {
\foreach \c in {1, ..., 5} {
\ifodd\inteval{\r+\c}
\node (\r\c) [fill = lightgray] at (\c, \r) {};
\else
\node (\r\c) at (\c, \r) {};
\fi
}
}
\end{tikzpicture}
\end{document}
I use xfp
since it is convenient and provides an expandable \inteval
for int
eger eval
uation that can be used in conditioning options like \ifodd
. You can also do it without xfp
:
\ifodd\numexpr\r+\c\relax
%...
You are implicitly assuming that isodd does calculations. But this is not what happens, it actually simply takes the begin of the argument until it hits something that is no longer a number. So you would need to do the addition first and then fed the result to isodd. Or use the tools of pgf:
\documentclass{article}
\usepackage{tikz}
\usepackage{xifthen}
\begin{document}
\ifthenelse{\isodd{124blub}}{odd}{even}
\ifthenelse{\isodd{123blub}}{odd}{even}
\ifthenelse{\isodd{2+3}}{odd}{even}
\ifthenelse{\isodd{3+2}}{odd}{even}
\bigskip
\begin{tikzpicture}[every node/.style = {draw, circle, minimum size = 10pt}]
\foreach \r in {1, ..., 4} {
\foreach \c in {1, ..., 5} {
\pgfmathsetmacro\mycolor{isodd{\numexpr\r+\c}?"lightgray":"white"}
\node (\r\c) [fill =\mycolor ] at (\c, \r){};
}
}
\end{tikzpicture}
\end{document}
\isodd
doesn't compute; you might do
\expandafter\ifthenelse\expandafter{\expandafter\NOT\expandafter\isodd\expandafter{\the\numexpr\r+\c}}
but it's not something I'd use myself. ;-)
Here's a (partial) reimplementation of xifthen
allowing expressions; the syntax is different, though: for parentheses you use (
and )
rather than \(
and \)
. For the connectives, \AND
, \OR
and \NOT
are replaced respectively by &&
, ||
and !
.
\documentclass{article}
\usepackage{xparse}
\usepackage{tikz} % for the application
\ExplSyntaxOn
\NewExpandableDocumentCommand{\xifthenelse}{mmm}
{
\bool_if:nTF { #1 } { #2 } { #3 }
}
\cs_new_eq:NN \numtest \int_compare_p:n
\cs_new_eq:NN \oddtest \int_if_odd_p:n
\cs_new_eq:NN \fptest \fp_compare_p:n
\cs_new_eq:NN \dimtest \dim_compare_p:n
\cs_new_eq:NN \deftest \cs_if_exist_p:N
\cs_new_eq:NN \namedeftest \cs_if_exist_p:c
\cs_new_eq:NN \eqdeftest \token_if_eq_meaning_p:NN
\cs_new_eq:NN \streqtest \str_if_eq_p:ee
\cs_new_eq:NN \emptytest \tl_if_blank_p:n
\prg_new_conditional:Nnn \xxifthen_legacy_conditional:n { p,T,F,TF }
{
\use:c { if#1 } \prg_return_true: \else: \prg_return_false: \fi:
}
\cs_new_eq:NN \boolean \xxifthen_legacy_conditional_p:n
\ExplSyntaxOff
\begin{document}
\xifthenelse{\emptytest{}}{true}{false} true
\xifthenelse{\emptytest{ }}{true}{false} true
\xifthenelse{\emptytest{ foo }}{true}{false} false
\xifthenelse{\numtest{10 * 10 + 1 > 100}}{true}{false} true
\xifthenelse{\numtest{10 * 10 + 1 > 100 * 100}}{true}{false} false
\xifthenelse{\eqdeftest{\usepackage}{\RequirePackage}}{true}{false} true
\xifthenelse{\eqdeftest{\usepackage}{\textit}}{true}{false} false
\xifthenelse{\namedeftest{@foo}}{true}{false} false
\xifthenelse{\namedeftest{@for}}{true}{false} true
\xifthenelse{\namedeftest{@for} || \numtest{1>2}}{true}{false} true
\xifthenelse{\namedeftest{@for} && \numtest{1>2}}{true}{false} false
\xifthenelse{\namedeftest{@for} && !\numtest{1>2}}{true}{false} true
\xifthenelse{!\oddtest{1+3}}{true}{false} true
\xifthenelse{\boolean{mmode}}{true}{false} false
$\xifthenelse{\boolean{mmode}}{true}{false}$ true
\xifthenelse{\fptest{22/7 = pi}}{true}{false} false
\bigskip
\begin{tikzpicture}[every node/.style = {draw, circle, minimum size = 10pt}]
\foreach \r in {1, ..., 4} {
\foreach \c in {1, ..., 5} {
\xifthenelse{!\oddtest{\r+\c}}
{\node (\r\c) [fill = lightgray] at (\c, \r){}}
{\node (\r\c) at (\c, \r){}};
}
}
\end{tikzpicture}
\end{document}
Of course, using PGF methods for the picture case is much easier.