First index is not integer using foreach loop from 0












7















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



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}


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.

























    7















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



    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}


    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.























      7












      7








      7








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



      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}


      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:



      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}


      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






      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 9 hours ago









      landingslandings

      413




      413




      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.






















          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
            9 hours 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
            8 hours ago



















          5














          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
            5 hours ago











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

            – Kpym
            3 hours 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
            9 hours 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
            8 hours 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
            9 hours 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
            8 hours 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 9 hours ago

























          answered 9 hours ago









          marmotmarmot

          112k5141268




          112k5141268













          • 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
            9 hours 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
            8 hours 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
            9 hours 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
            8 hours 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
          9 hours 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
          9 hours 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
          8 hours 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
          8 hours ago











          5














          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
            5 hours ago











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

            – Kpym
            3 hours ago
















          5














          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
            5 hours ago











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

            – Kpym
            3 hours ago














          5












          5








          5







          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 hours ago

























          answered 6 hours ago









          KpymKpym

          17.1k24090




          17.1k24090








          • 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
            5 hours ago











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

            – Kpym
            3 hours 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
            5 hours ago











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

            – Kpym
            3 hours 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
          5 hours 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
          5 hours ago













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

          – Kpym
          3 hours ago





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

          – Kpym
          3 hours 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

          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