First index is not integer using foreach loop from 0Rotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?Numerical conditional within tikz keys?Why do I get an extra white page before my TikZ picture?Input/Output Nodes - Specification and Description LanguageTikZ: Drawing an arc from an intersection to an intersectionHow to prevent rounded and duplicated tick labels in pgfplots with fixed precision?Drawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingHow to draw a square and its diagonals with arrows?Compound Pathway Problem with holes

web3.py web3.isConnected() returns false always

Does holding a wand and speaking its command word count as V/S/M spell components?

Exchange,swap or switch

Why is it that the natural deduction method can't test for invalidity?

TIKZ - changing one block into parallel multiple blocks

Why do games have consumables?

Binary Numbers Magic Trick

How much cash can I safely carry into the USA and avoid civil forfeiture?

"The cow" OR "a cow" OR "cows" in this context

What is Niska's accent?

How did Captain America manage to do this?

Examples of non trivial equivalence relations , I mean equivalence relations without the expression " same ... as" in their definition?

What makes accurate emulation of old systems a difficult task?

Is there really no use for MD5 anymore?

How do I reattach a shelf to the wall when it ripped out of the wall?

How to have a sharp product image?

What's the polite way to say "I need to urinate"?

Was there a shared-world project before "Thieves World"?

What's causes the 'backspin' while sliding a pencil along a table?

Do I have to worry about players making “bad” choices on level up?

How can I place the product on a social media post better?

Why must Chinese maps be obfuscated?

Which big number is bigger?

How to verbalise code in Mathematica?



First index is not integer using foreach loop from 0


Rotate a node but not its content: the case of the ellipse decorationHow to define the default vertical distance between nodes?Numerical conditional within tikz keys?Why do I get an extra white page before my TikZ picture?Input/Output Nodes - Specification and Description LanguageTikZ: Drawing an arc from an intersection to an intersectionHow to prevent rounded and duplicated tick labels in pgfplots with fixed precision?Drawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingHow to draw a square and its diagonals with arrows?Compound Pathway Problem with holes













7















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



documentclassarticle
usepackagetikz
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;


endtikzpicture
enddocument


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



















  • 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 enddocument and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    Mar 27 at 14:32















7















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



documentclassarticle
usepackagetikz
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;


endtikzpicture
enddocument


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



















  • 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 enddocument and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    Mar 27 at 14:32













7












7








7


1






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



documentclassarticle
usepackagetikz
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;


endtikzpicture
enddocument


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
















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



documentclassarticle
usepackagetikz
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;


endtikzpicture
enddocument


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















share|improve this question













share|improve this question




share|improve this question








edited Mar 28 at 4:47







landings

















asked Mar 27 at 4:10









landingslandings

414




414







  • 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 enddocument and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    Mar 27 at 14:32












  • 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 enddocument and compiles without errors, even if it does not produce your desired output.

    – Sandy G
    Mar 27 at 14:32







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 enddocument and compiles without errors, even if it does not produce your desired output.

– Sandy G
Mar 27 at 14:32





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 enddocument and compiles without errors, even if it does not produce your desired output.

– Sandy G
Mar 27 at 14:32










2 Answers
2






active

oldest

votes


















10














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



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here



Or



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]standalone
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


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
    Mar 27 at 4:27






  • 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
    Mar 27 at 4:33


















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
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;
;

endtikzpicture
enddocument


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
    Mar 27 at 8:03






  • 2





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

    – Kpym
    Mar 27 at 9:34











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
);



);













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
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here



Or



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]standalone
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


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
    Mar 27 at 4:27






  • 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
    Mar 27 at 4:33















10














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



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here



Or



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]standalone
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


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
    Mar 27 at 4:27






  • 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
    Mar 27 at 4:33













10












10








10







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



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here



Or



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]standalone
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


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
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here



Or



documentclass[tikz,border=3.14mm]standalone
usetikzlibrarymath
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


In principle you do not need the math library here.



documentclass[tikz,border=3.14mm]standalone
begindocument
begintikzpicture
tikzsetmynode/.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;


endtikzpicture
enddocument


enter image description here







share|improve this answer














share|improve this answer



share|improve this answer








edited Mar 27 at 4:29

























answered Mar 27 at 4:16









marmotmarmot

122k6159297




122k6159297












  • 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
    Mar 27 at 4:27






  • 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
    Mar 27 at 4:33

















  • 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
    Mar 27 at 4:27






  • 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
    Mar 27 at 4:33
















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
Mar 27 at 4:27





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
Mar 27 at 4:27




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
Mar 27 at 4:33





@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
Mar 27 at 4:33











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
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;
;

endtikzpicture
enddocument


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
    Mar 27 at 8:03






  • 2





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

    – Kpym
    Mar 27 at 9:34















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
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;
;

endtikzpicture
enddocument


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
    Mar 27 at 8:03






  • 2





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

    – Kpym
    Mar 27 at 9:34













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
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;
;

endtikzpicture
enddocument


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
usetikzlibrarymath
begindocument
begintikzpicture
tikzstylenode=[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;
;

endtikzpicture
enddocument


enter image description here







share|improve this answer














share|improve this answer



share|improve this answer








edited Mar 27 at 10:51

























answered Mar 27 at 7:04









KpymKpym

17.9k24192




17.9k24192







  • 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
    Mar 27 at 8:03






  • 2





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

    – Kpym
    Mar 27 at 9:34












  • 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
    Mar 27 at 8:03






  • 2





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

    – Kpym
    Mar 27 at 9:34







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
Mar 27 at 8:03





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
Mar 27 at 8:03




2




2





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

– Kpym
Mar 27 at 9:34





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

– Kpym
Mar 27 at 9:34

















draft saved

draft discarded
















































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

He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

Bunad

Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum