First index is not integer using foreach loop from 0 The Next CEO of Stack OverflowRotate 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
Return the Closest Prime Number
Why here is plural "We went to the movies last night."
Can a single photon have an energy density?
Would this house-rule that treats advantage as a +1 to the roll instead (and disadvantage as -1) and allows them to stack be balanced?
What happens if you roll doubles 3 times then land on "Go to jail?"
Whats the best way to handle refactoring a big file?
Visit to the USA with ESTA approved before trip to Iran
If I blow insulation everywhere in my attic except the door trap, will heat escape through it?
Horror movie/show or scene where a horse creature opens its mouth really wide and devours a man in a stables
Why do remote companies require working in the US?
How to make a software documentation "officially" citable?
Customer Requests (Sometimes) Drive Me Bonkers!
Is it okay to store user locations?
Describing a person. What needs to be mentioned?
Only print output after finding pattern
How to write the block matrix in LaTex?
Trouble understanding the speech of overseas colleagues
Why do professional authors make "consistency" mistakes? And how to avoid them?
Is a stroke of luck acceptable after a series of unfavorable events?
Why does C# sound extremely flat when saxophone is tuned to G?
How can I quit an app using Terminal?
Why didn't Khan get resurrected in the Genesis Explosion?
Implement the Thanos sorting algorithm
How to Reset Passwords on Multiple Websites Easily?
First index is not integer using foreach loop from 0
The Next CEO of Stack OverflowRotate 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
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.
tikz-pgf foreach
New contributor
add a comment |
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.
tikz-pgf foreach
New contributor
1
Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts withdocumentclass
, includes all relevantusepackage
commands, ends withenddocument
and compiles without errors, even if it does not produce your desired output.
– Sandy G
yesterday
add a comment |
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.
tikz-pgf foreach
New contributor
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.
tikz-pgf foreach
tikz-pgf foreach
New contributor
New contributor
edited yesterday
landings
New contributor
asked 2 days ago
landingslandings
414
414
New contributor
New contributor
1
Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts withdocumentclass
, includes all relevantusepackage
commands, ends withenddocument
and compiles without errors, even if it does not produce your desired output.
– Sandy G
yesterday
add a comment |
1
Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts withdocumentclass
, includes all relevantusepackage
commands, ends withenddocument
and compiles without errors, even if it does not produce your desired output.
– Sandy G
yesterday
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
yesterday
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
yesterday
add a comment |
2 Answers
2
active
oldest
votes
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
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
Thanks a lot. I finally get where the problem starts. Why1 - floor(nnodes / 2) - 1
can be non-integer? Even1 - int(nnodes / 2) - 1
is problematic.
– landings
2 days ago
1
@landings It is due to the wayforeach
is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression intoint
.
– marmot
2 days ago
add a comment |
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 doint()
afterward. - As
nnodes
is odd you do not need separaterightnum
andleftnum
asrightnum = - 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 useisibling
asx
. And in the same wayy
can be replaced byilayer
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
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
yesterday
2
Don't worry, even some experts don't know how to usetikzmath
;)
– Kpym
yesterday
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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
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
Thanks a lot. I finally get where the problem starts. Why1 - floor(nnodes / 2) - 1
can be non-integer? Even1 - int(nnodes / 2) - 1
is problematic.
– landings
2 days ago
1
@landings It is due to the wayforeach
is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression intoint
.
– marmot
2 days ago
add a comment |
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
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
Thanks a lot. I finally get where the problem starts. Why1 - floor(nnodes / 2) - 1
can be non-integer? Even1 - int(nnodes / 2) - 1
is problematic.
– landings
2 days ago
1
@landings It is due to the wayforeach
is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression intoint
.
– marmot
2 days ago
add a comment |
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
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
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
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
edited 2 days ago
answered 2 days ago
marmotmarmot
112k5144271
112k5144271
Thanks a lot. I finally get where the problem starts. Why1 - floor(nnodes / 2) - 1
can be non-integer? Even1 - int(nnodes / 2) - 1
is problematic.
– landings
2 days ago
1
@landings It is due to the wayforeach
is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression intoint
.
– marmot
2 days ago
add a comment |
Thanks a lot. I finally get where the problem starts. Why1 - floor(nnodes / 2) - 1
can be non-integer? Even1 - int(nnodes / 2) - 1
is problematic.
– landings
2 days ago
1
@landings It is due to the wayforeach
is implemented, internally TikZ computes with dimensions and this can lead to slight inconsistencies. So it is better to wrap the full expression intoint
.
– 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
add a comment |
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 doint()
afterward. - As
nnodes
is odd you do not need separaterightnum
andleftnum
asrightnum = - 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 useisibling
asx
. And in the same wayy
can be replaced byilayer
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
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
yesterday
2
Don't worry, even some experts don't know how to usetikzmath
;)
– Kpym
yesterday
add a comment |
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 doint()
afterward. - As
nnodes
is odd you do not need separaterightnum
andleftnum
asrightnum = - 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 useisibling
asx
. And in the same wayy
can be replaced byilayer
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
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
yesterday
2
Don't worry, even some experts don't know how to usetikzmath
;)
– Kpym
yesterday
add a comment |
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 doint()
afterward. - As
nnodes
is odd you do not need separaterightnum
andleftnum
asrightnum = - 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 useisibling
asx
. And in the same wayy
can be replaced byilayer
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
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 doint()
afterward. - As
nnodes
is odd you do not need separaterightnum
andleftnum
asrightnum = - 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 useisibling
asx
. And in the same wayy
can be replaced byilayer
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
edited yesterday
answered yesterday
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
yesterday
2
Don't worry, even some experts don't know how to usetikzmath
;)
– Kpym
yesterday
add a comment |
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
yesterday
2
Don't worry, even some experts don't know how to usetikzmath
;)
– Kpym
yesterday
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
yesterday
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
yesterday
2
2
Don't worry, even some experts don't know how to use
tikzmath
;)– Kpym
yesterday
Don't worry, even some experts don't know how to use
tikzmath
;)– Kpym
yesterday
add a comment |
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.
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
1
Welcome to TeX.SX. When you post a question, please provide a "Minimal Working Example" (MWE) that starts with
documentclass
, includes all relevantusepackage
commands, ends withenddocument
and compiles without errors, even if it does not produce your desired output.– Sandy G
yesterday