First index is not integer using foreach loop from 0












7















I am trying to draw a tree using tikzpicture like this:



documentclass{article}
usepackage{tikz}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = 1 - floor(nnodes / 2) - 1; }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[node] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


I get the tree like the following picture. The texts are nodes' isibling within each layer. Most nodes are integers, but all leftmost nodes are not.



enter image description here










share|improve this question









New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1





    Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    2 days ago
















7















I am trying to draw a tree using tikzpicture like this:



documentclass{article}
usepackage{tikz}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = 1 - floor(nnodes / 2) - 1; }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[node] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


I get the tree like the following picture. The texts are nodes' isibling within each layer. Most nodes are integers, but all leftmost nodes are not.



enter image description here










share|improve this question









New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1





    Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    2 days ago














7












7








7


1






I am trying to draw a tree using tikzpicture like this:



documentclass{article}
usepackage{tikz}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = 1 - floor(nnodes / 2) - 1; }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[node] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


I get the tree like the following picture. The texts are nodes' isibling within each layer. Most nodes are integers, but all leftmost nodes are not.



enter image description here










share|improve this question









New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












I am trying to draw a tree using tikzpicture like this:



documentclass{article}
usepackage{tikz}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = 1 - floor(nnodes / 2) - 1; }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[node] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


I get the tree like the following picture. The texts are nodes' isibling within each layer. Most nodes are integers, but all leftmost nodes are not.



enter image description here







tikz-pgf foreach






share|improve this question









New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited yesterday







landings













New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 2 days ago









landingslandings

414




414




New contributor




landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






landings is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 1





    Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    2 days ago














  • 1





    Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    2 days ago








1




1





Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

– Sandy G
2 days ago





Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with documentclass, includes all relevant usepackage commands, ends with end{document} and compiles without errors, even if it does not produce your desired output.

– Sandy G
2 days ago










2 Answers
2






active

oldest

votes


















10














You could just tell TikZ explicitly that you want an integer.



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = int(1 - floor(nnodes / 2) - 1); }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


enter image description here



Or



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {int nnodes,leftnum,rightnum;
nnodes = 3 ^ ilayer;
leftnum = 1 - floor(nnodes / 2) - 1;
rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15;
x = isibling * d;
y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]{standalone}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer [evaluate=ilayer as nnodes using {int(3 ^ ilayer)},
evaluate=nnodes as leftnum using {int(1 - floor(nnodes / 2) - 1)},
evaluate=nnodes as rightnum using {int(nnodes - floor(nnodes / 2) - 1)}]
in {0,...,3} {
foreach isibling
[evaluate=ilayer as d using {3 ^ (- ilayer) * 15},
evaluate=isibling as x using {isibling * d},
evaluate=ilayer as y using {- ilayer * 2}]
in {leftnum,...,rightnum} {
node[mynode] (node_ilayer_isibling) at (x cm, y cm)
{isibling};
}
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

    – landings
    2 days ago






  • 1





    @landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

    – marmot
    2 days ago



















8














As @marmot said you do not need tikzmath here, but if you use it you can do it in more efficient way :




  • You can have a single tikzmath command with loops inside it.

  • You can declare your integer variables as int so you do not need to do int() afterward.

  • As nnodes is odd you do not need separate rightnum and leftnum as rightnum = - leftnum;

  • Why you use 1-floor(nnodes/2)-1 in place of -floor(nnodes/2) ?

  • The value d can be calculated in the outer loop.

  • Instead of using x=isibling*d you can say [x=d cm] and then use isibling asx. And in the same way y can be replaced by ilayer using [y=-2cm].


So here is my proposal :



documentclass[tikz,border=7pt]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
tikzmath{
int ilayer,nnodes,rightnum,isibling;
nnodes = 1;
for ilayer in {0,...,3}{
rightnum = (nnodes-1)/2;
d = 15/nnodes;
for isibling in {-rightnum,...,rightnum}{
{
path[x=d cm,y=-2cm]
node[node] (node_ilayer_isibling) at (isibling, ilayer) {isibling};
};
};
nnodes = 3*nnodes;
};
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer





















  • 1





    Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

    – landings
    2 days ago






  • 2





    Don't worry, even some experts don't know how to use tikzmath ;)

    – Kpym
    2 days ago












Your Answer








StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});






landings is a new contributor. Be nice, and check out our Code of Conduct.










draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481622%2ffirst-index-is-not-integer-using-foreach-loop-from-0%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























2 Answers
2






active

oldest

votes








2 Answers
2






active

oldest

votes









active

oldest

votes






active

oldest

votes









10














You could just tell TikZ explicitly that you want an integer.



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = int(1 - floor(nnodes / 2) - 1); }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


enter image description here



Or



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {int nnodes,leftnum,rightnum;
nnodes = 3 ^ ilayer;
leftnum = 1 - floor(nnodes / 2) - 1;
rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15;
x = isibling * d;
y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]{standalone}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer [evaluate=ilayer as nnodes using {int(3 ^ ilayer)},
evaluate=nnodes as leftnum using {int(1 - floor(nnodes / 2) - 1)},
evaluate=nnodes as rightnum using {int(nnodes - floor(nnodes / 2) - 1)}]
in {0,...,3} {
foreach isibling
[evaluate=ilayer as d using {3 ^ (- ilayer) * 15},
evaluate=isibling as x using {isibling * d},
evaluate=ilayer as y using {- ilayer * 2}]
in {leftnum,...,rightnum} {
node[mynode] (node_ilayer_isibling) at (x cm, y cm)
{isibling};
}
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

    – landings
    2 days ago






  • 1





    @landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

    – marmot
    2 days ago
















10














You could just tell TikZ explicitly that you want an integer.



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = int(1 - floor(nnodes / 2) - 1); }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


enter image description here



Or



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {int nnodes,leftnum,rightnum;
nnodes = 3 ^ ilayer;
leftnum = 1 - floor(nnodes / 2) - 1;
rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15;
x = isibling * d;
y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]{standalone}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer [evaluate=ilayer as nnodes using {int(3 ^ ilayer)},
evaluate=nnodes as leftnum using {int(1 - floor(nnodes / 2) - 1)},
evaluate=nnodes as rightnum using {int(nnodes - floor(nnodes / 2) - 1)}]
in {0,...,3} {
foreach isibling
[evaluate=ilayer as d using {3 ^ (- ilayer) * 15},
evaluate=isibling as x using {isibling * d},
evaluate=ilayer as y using {- ilayer * 2}]
in {leftnum,...,rightnum} {
node[mynode] (node_ilayer_isibling) at (x cm, y cm)
{isibling};
}
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer


























  • Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

    – landings
    2 days ago






  • 1





    @landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

    – marmot
    2 days ago














10












10








10







You could just tell TikZ explicitly that you want an integer.



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = int(1 - floor(nnodes / 2) - 1); }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


enter image description here



Or



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {int nnodes,leftnum,rightnum;
nnodes = 3 ^ ilayer;
leftnum = 1 - floor(nnodes / 2) - 1;
rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15;
x = isibling * d;
y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]{standalone}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer [evaluate=ilayer as nnodes using {int(3 ^ ilayer)},
evaluate=nnodes as leftnum using {int(1 - floor(nnodes / 2) - 1)},
evaluate=nnodes as rightnum using {int(nnodes - floor(nnodes / 2) - 1)}]
in {0,...,3} {
foreach isibling
[evaluate=ilayer as d using {3 ^ (- ilayer) * 15},
evaluate=isibling as x using {isibling * d},
evaluate=ilayer as y using {- ilayer * 2}]
in {leftnum,...,rightnum} {
node[mynode] (node_ilayer_isibling) at (x cm, y cm)
{isibling};
}
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer















You could just tell TikZ explicitly that you want an integer.



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {nnodes = 3 ^ ilayer; }
tikzmath {leftnum = int(1 - floor(nnodes / 2) - 1); }
tikzmath {rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15; }
tikzmath {x = isibling * d; }
tikzmath {y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


enter image description here



Or



documentclass[tikz,border=3.14mm]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer in {0,...,3} {
tikzmath {int nnodes,leftnum,rightnum;
nnodes = 3 ^ ilayer;
leftnum = 1 - floor(nnodes / 2) - 1;
rightnum = nnodes - floor(nnodes / 2) - 1; }
foreach isibling in {leftnum,...,rightnum} {
tikzmath {d = 3 ^ (- ilayer) * 15;
x = isibling * d;
y = - ilayer * 2; }
node[mynode] (node_ilayer_isibling) at (x cm, y cm) {isibling};
}
}
end{tikzpicture}
end{document}


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]{standalone}
begin{document}
begin{tikzpicture}
tikzset{mynode/.style={circle, fill=blue!25, minimum size=0.1 cm}}
foreach ilayer [evaluate=ilayer as nnodes using {int(3 ^ ilayer)},
evaluate=nnodes as leftnum using {int(1 - floor(nnodes / 2) - 1)},
evaluate=nnodes as rightnum using {int(nnodes - floor(nnodes / 2) - 1)}]
in {0,...,3} {
foreach isibling
[evaluate=ilayer as d using {3 ^ (- ilayer) * 15},
evaluate=isibling as x using {isibling * d},
evaluate=ilayer as y using {- ilayer * 2}]
in {leftnum,...,rightnum} {
node[mynode] (node_ilayer_isibling) at (x cm, y cm)
{isibling};
}
}
end{tikzpicture}
end{document}


enter image description here







share|improve this answer














share|improve this answer



share|improve this answer








edited 2 days ago

























answered 2 days ago









marmotmarmot

113k5144273




113k5144273













  • Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

    – landings
    2 days ago






  • 1





    @landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

    – marmot
    2 days ago



















  • Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

    – landings
    2 days ago






  • 1





    @landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

    – marmot
    2 days ago

















Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

– landings
2 days ago





Thanks a lot. I finally get where the problem starts. Why 1 - floor(nnodes / 2) - 1 can be non-integer? Even 1 - int(nnodes / 2) - 1 is problematic.

– landings
2 days ago




1




1





@landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

– marmot
2 days ago





@landings It is due to the way foreach is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression into int.

– marmot
2 days ago











8














As @marmot said you do not need tikzmath here, but if you use it you can do it in more efficient way :




  • You can have a single tikzmath command with loops inside it.

  • You can declare your integer variables as int so you do not need to do int() afterward.

  • As nnodes is odd you do not need separate rightnum and leftnum as rightnum = - leftnum;

  • Why you use 1-floor(nnodes/2)-1 in place of -floor(nnodes/2) ?

  • The value d can be calculated in the outer loop.

  • Instead of using x=isibling*d you can say [x=d cm] and then use isibling asx. And in the same way y can be replaced by ilayer using [y=-2cm].


So here is my proposal :



documentclass[tikz,border=7pt]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
tikzmath{
int ilayer,nnodes,rightnum,isibling;
nnodes = 1;
for ilayer in {0,...,3}{
rightnum = (nnodes-1)/2;
d = 15/nnodes;
for isibling in {-rightnum,...,rightnum}{
{
path[x=d cm,y=-2cm]
node[node] (node_ilayer_isibling) at (isibling, ilayer) {isibling};
};
};
nnodes = 3*nnodes;
};
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer





















  • 1





    Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

    – landings
    2 days ago






  • 2





    Don't worry, even some experts don't know how to use tikzmath ;)

    – Kpym
    2 days ago
















8














As @marmot said you do not need tikzmath here, but if you use it you can do it in more efficient way :




  • You can have a single tikzmath command with loops inside it.

  • You can declare your integer variables as int so you do not need to do int() afterward.

  • As nnodes is odd you do not need separate rightnum and leftnum as rightnum = - leftnum;

  • Why you use 1-floor(nnodes/2)-1 in place of -floor(nnodes/2) ?

  • The value d can be calculated in the outer loop.

  • Instead of using x=isibling*d you can say [x=d cm] and then use isibling asx. And in the same way y can be replaced by ilayer using [y=-2cm].


So here is my proposal :



documentclass[tikz,border=7pt]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
tikzmath{
int ilayer,nnodes,rightnum,isibling;
nnodes = 1;
for ilayer in {0,...,3}{
rightnum = (nnodes-1)/2;
d = 15/nnodes;
for isibling in {-rightnum,...,rightnum}{
{
path[x=d cm,y=-2cm]
node[node] (node_ilayer_isibling) at (isibling, ilayer) {isibling};
};
};
nnodes = 3*nnodes;
};
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer





















  • 1





    Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

    – landings
    2 days ago






  • 2





    Don't worry, even some experts don't know how to use tikzmath ;)

    – Kpym
    2 days ago














8












8








8







As @marmot said you do not need tikzmath here, but if you use it you can do it in more efficient way :




  • You can have a single tikzmath command with loops inside it.

  • You can declare your integer variables as int so you do not need to do int() afterward.

  • As nnodes is odd you do not need separate rightnum and leftnum as rightnum = - leftnum;

  • Why you use 1-floor(nnodes/2)-1 in place of -floor(nnodes/2) ?

  • The value d can be calculated in the outer loop.

  • Instead of using x=isibling*d you can say [x=d cm] and then use isibling asx. And in the same way y can be replaced by ilayer using [y=-2cm].


So here is my proposal :



documentclass[tikz,border=7pt]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
tikzmath{
int ilayer,nnodes,rightnum,isibling;
nnodes = 1;
for ilayer in {0,...,3}{
rightnum = (nnodes-1)/2;
d = 15/nnodes;
for isibling in {-rightnum,...,rightnum}{
{
path[x=d cm,y=-2cm]
node[node] (node_ilayer_isibling) at (isibling, ilayer) {isibling};
};
};
nnodes = 3*nnodes;
};
}
end{tikzpicture}
end{document}


enter image description here






share|improve this answer















As @marmot said you do not need tikzmath here, but if you use it you can do it in more efficient way :




  • You can have a single tikzmath command with loops inside it.

  • You can declare your integer variables as int so you do not need to do int() afterward.

  • As nnodes is odd you do not need separate rightnum and leftnum as rightnum = - leftnum;

  • Why you use 1-floor(nnodes/2)-1 in place of -floor(nnodes/2) ?

  • The value d can be calculated in the outer loop.

  • Instead of using x=isibling*d you can say [x=d cm] and then use isibling asx. And in the same way y can be replaced by ilayer using [y=-2cm].


So here is my proposal :



documentclass[tikz,border=7pt]{standalone}
usetikzlibrary{math}
begin{document}
begin{tikzpicture}
tikzstyle{node}=[circle, fill=blue!25, minimum size=0.1 cm];
tikzmath{
int ilayer,nnodes,rightnum,isibling;
nnodes = 1;
for ilayer in {0,...,3}{
rightnum = (nnodes-1)/2;
d = 15/nnodes;
for isibling in {-rightnum,...,rightnum}{
{
path[x=d cm,y=-2cm]
node[node] (node_ilayer_isibling) at (isibling, ilayer) {isibling};
};
};
nnodes = 3*nnodes;
};
}
end{tikzpicture}
end{document}


enter image description here







share|improve this answer














share|improve this answer



share|improve this answer








edited 2 days ago

























answered 2 days ago









KpymKpym

17.2k24090




17.2k24090








  • 1





    Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

    – landings
    2 days ago






  • 2





    Don't worry, even some experts don't know how to use tikzmath ;)

    – Kpym
    2 days ago














  • 1





    Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

    – landings
    2 days ago






  • 2





    Don't worry, even some experts don't know how to use tikzmath ;)

    – Kpym
    2 days ago








1




1





Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

– landings
2 days ago





Thanks for your help. I am new to LaTeX and need more practice. I didn't know I could loop and draw things just inside tikzmath code.

– landings
2 days ago




2




2





Don't worry, even some experts don't know how to use tikzmath ;)

– Kpym
2 days ago





Don't worry, even some experts don't know how to use tikzmath ;)

– Kpym
2 days ago










landings is a new contributor. Be nice, and check out our Code of Conduct.










draft saved

draft discarded


















landings is a new contributor. Be nice, and check out our Code of Conduct.













landings is a new contributor. Be nice, and check out our Code of Conduct.












landings is a new contributor. Be nice, and check out our Code of Conduct.
















Thanks for contributing an answer to TeX - LaTeX Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f481622%2ffirst-index-is-not-integer-using-foreach-loop-from-0%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

數位音樂下載

When can things happen in Etherscan, such as the picture below?

格利澤436b