What command should I use to be warned of this collision beforehand?












4














After a hunt through several subfiles, I've narrowed down what I thought was a bug down to this MWE



documentclass{article}
usepackage{amsmath, amssymb}
newcommand{R}{mathbb{R}}
begin{document}
$R$
newdimenR
R=.4cm
$R$
end{document}


Clearly user error. Although this is what I get for copy and pasting code without paying too close attention to the variables they use. What commands should I use to be warned of this collision in compiling instead of getting the error ! Missing number... and having to scour several files for what this could be?



I feel like this is along the lines of def versus newcommand.










share|improve this question


















  • 1




    Use LaTeX's newlength instead of newdimen.
    – Henri Menke
    Dec 19 '18 at 5:30










  • by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
    – jfbu
    Dec 19 '18 at 8:06
















4














After a hunt through several subfiles, I've narrowed down what I thought was a bug down to this MWE



documentclass{article}
usepackage{amsmath, amssymb}
newcommand{R}{mathbb{R}}
begin{document}
$R$
newdimenR
R=.4cm
$R$
end{document}


Clearly user error. Although this is what I get for copy and pasting code without paying too close attention to the variables they use. What commands should I use to be warned of this collision in compiling instead of getting the error ! Missing number... and having to scour several files for what this could be?



I feel like this is along the lines of def versus newcommand.










share|improve this question


















  • 1




    Use LaTeX's newlength instead of newdimen.
    – Henri Menke
    Dec 19 '18 at 5:30










  • by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
    – jfbu
    Dec 19 '18 at 8:06














4












4








4







After a hunt through several subfiles, I've narrowed down what I thought was a bug down to this MWE



documentclass{article}
usepackage{amsmath, amssymb}
newcommand{R}{mathbb{R}}
begin{document}
$R$
newdimenR
R=.4cm
$R$
end{document}


Clearly user error. Although this is what I get for copy and pasting code without paying too close attention to the variables they use. What commands should I use to be warned of this collision in compiling instead of getting the error ! Missing number... and having to scour several files for what this could be?



I feel like this is along the lines of def versus newcommand.










share|improve this question













After a hunt through several subfiles, I've narrowed down what I thought was a bug down to this MWE



documentclass{article}
usepackage{amsmath, amssymb}
newcommand{R}{mathbb{R}}
begin{document}
$R$
newdimenR
R=.4cm
$R$
end{document}


Clearly user error. Although this is what I get for copy and pasting code without paying too close attention to the variables they use. What commands should I use to be warned of this collision in compiling instead of getting the error ! Missing number... and having to scour several files for what this could be?



I feel like this is along the lines of def versus newcommand.







tex-core






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Dec 19 '18 at 5:08









Robert Wolfe

12410




12410








  • 1




    Use LaTeX's newlength instead of newdimen.
    – Henri Menke
    Dec 19 '18 at 5:30










  • by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
    – jfbu
    Dec 19 '18 at 8:06














  • 1




    Use LaTeX's newlength instead of newdimen.
    – Henri Menke
    Dec 19 '18 at 5:30










  • by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
    – jfbu
    Dec 19 '18 at 8:06








1




1




Use LaTeX's newlength instead of newdimen.
– Henri Menke
Dec 19 '18 at 5:30




Use LaTeX's newlength instead of newdimen.
– Henri Menke
Dec 19 '18 at 5:30












by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
– jfbu
Dec 19 '18 at 8:06




by the way, use theR instead of R if it is a dimen register and you want to typeset its value (in pt units)
– jfbu
Dec 19 '18 at 8:06










3 Answers
3






active

oldest

votes


















6














You should use LaTeX's newlength and setlength instead of newdimen and = assignment.



documentclass{article}
usepackage{amsmath, amssymb}
newcommand{R}{mathbb{R}}
begin{document}
$R$
newlengthR
setlengthR{.4cm}
$R$
end{document}





share|improve this answer





























    6














    Yes, it's the same as the problem with def.



    The newdimen macro comes from plain TeX and it's in LaTeX for historical reasons: in order to ease transition from plain TeX, LaTeX was loaded with a copy of plain TeX, barring a few commands that were reused (line, for instance).



    The only difference between plain TeX's and LaTeX's newdimen is that the former is outer and the latter isn't.



    outerdefnewdimen{alloc@1dimendimendefinsc@unt}  %% <-- plain TeX

    defnewdimen{alloc@1dimendimendefinsc@unt} %% <--- LaTeX (up to 2015)


    The LaTeX definition has slightly changed in 2015, because a different set of allocation macros was introduced to cope with the extended range of registers afforded by e-TeX.



    The alloc@ macro in LaTeX was (and its current variant is) essentially the same as in plain; the dimendef primitive (the ultimate responsible for assigning the desired meaning to foo in newdimenfoo) does no check for definedness of the control sequence.



    The LaTeX commands that do definitions and allocations and are documented in the manual all do a check.



    Users who know about newdimen may exploit it, if they so wish, with the caveat that they should know what they're doing. And, much more important, they should not hand a preamble filled with newdimen and def to their mates or colleagues who aren't supposed to be TeX gurus and will be thoroughly confused by weird error messages such as Missing $ when trying to print *façon• (just because their friend's preamble had defc{gamma}, this actually happened).



    Is there a difference between newdimen and newlength, apart from the check? Yes, but minor: newlength is a wrapper around plain TeX's newskip, so it allocates a skip register rather than a dimen one. This difference may bite if one doesn't use LaTeX syntax for setting lengths, that is setlength.






    share|improve this answer





























      1














      You can create a wrapper around newdimen that gives you an error in that case.



      documentclass{article}
      usepackage{etoolbox}
      usepackage{amsmath, amssymb}
      newcommand{R}{mathbb{R}}
      newcommand{newdimension}[1]{%
      ifundef{#1}
      {newdimen#1}
      {errmessage{command expandafterstring#1 already defined - can't create dimension}}}

      begin{document}
      $R$
      newdimension{R}
      R=.4cm
      $R$

      newdimension{mydim}
      mydim=.4cm
      showthemydim
      end{document}





      share|improve this answer





















      • That'll work. If there's not a native command, I'll accept this.
        – Robert Wolfe
        Dec 19 '18 at 5:25










      • As far as I know there is none, sorry...
        – AndiW
        Dec 19 '18 at 5:28










      • @AndiW Yes, there is, see my answer.
        – Henri Menke
        Dec 19 '18 at 5:34










      • Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
        – AndiW
        Dec 19 '18 at 5:36











      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%2f466483%2fwhat-command-should-i-use-to-be-warned-of-this-collision-beforehand%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      6














      You should use LaTeX's newlength and setlength instead of newdimen and = assignment.



      documentclass{article}
      usepackage{amsmath, amssymb}
      newcommand{R}{mathbb{R}}
      begin{document}
      $R$
      newlengthR
      setlengthR{.4cm}
      $R$
      end{document}





      share|improve this answer


























        6














        You should use LaTeX's newlength and setlength instead of newdimen and = assignment.



        documentclass{article}
        usepackage{amsmath, amssymb}
        newcommand{R}{mathbb{R}}
        begin{document}
        $R$
        newlengthR
        setlengthR{.4cm}
        $R$
        end{document}





        share|improve this answer
























          6












          6








          6






          You should use LaTeX's newlength and setlength instead of newdimen and = assignment.



          documentclass{article}
          usepackage{amsmath, amssymb}
          newcommand{R}{mathbb{R}}
          begin{document}
          $R$
          newlengthR
          setlengthR{.4cm}
          $R$
          end{document}





          share|improve this answer












          You should use LaTeX's newlength and setlength instead of newdimen and = assignment.



          documentclass{article}
          usepackage{amsmath, amssymb}
          newcommand{R}{mathbb{R}}
          begin{document}
          $R$
          newlengthR
          setlengthR{.4cm}
          $R$
          end{document}






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Dec 19 '18 at 5:31









          Henri Menke

          69.9k8156260




          69.9k8156260























              6














              Yes, it's the same as the problem with def.



              The newdimen macro comes from plain TeX and it's in LaTeX for historical reasons: in order to ease transition from plain TeX, LaTeX was loaded with a copy of plain TeX, barring a few commands that were reused (line, for instance).



              The only difference between plain TeX's and LaTeX's newdimen is that the former is outer and the latter isn't.



              outerdefnewdimen{alloc@1dimendimendefinsc@unt}  %% <-- plain TeX

              defnewdimen{alloc@1dimendimendefinsc@unt} %% <--- LaTeX (up to 2015)


              The LaTeX definition has slightly changed in 2015, because a different set of allocation macros was introduced to cope with the extended range of registers afforded by e-TeX.



              The alloc@ macro in LaTeX was (and its current variant is) essentially the same as in plain; the dimendef primitive (the ultimate responsible for assigning the desired meaning to foo in newdimenfoo) does no check for definedness of the control sequence.



              The LaTeX commands that do definitions and allocations and are documented in the manual all do a check.



              Users who know about newdimen may exploit it, if they so wish, with the caveat that they should know what they're doing. And, much more important, they should not hand a preamble filled with newdimen and def to their mates or colleagues who aren't supposed to be TeX gurus and will be thoroughly confused by weird error messages such as Missing $ when trying to print *façon• (just because their friend's preamble had defc{gamma}, this actually happened).



              Is there a difference between newdimen and newlength, apart from the check? Yes, but minor: newlength is a wrapper around plain TeX's newskip, so it allocates a skip register rather than a dimen one. This difference may bite if one doesn't use LaTeX syntax for setting lengths, that is setlength.






              share|improve this answer


























                6














                Yes, it's the same as the problem with def.



                The newdimen macro comes from plain TeX and it's in LaTeX for historical reasons: in order to ease transition from plain TeX, LaTeX was loaded with a copy of plain TeX, barring a few commands that were reused (line, for instance).



                The only difference between plain TeX's and LaTeX's newdimen is that the former is outer and the latter isn't.



                outerdefnewdimen{alloc@1dimendimendefinsc@unt}  %% <-- plain TeX

                defnewdimen{alloc@1dimendimendefinsc@unt} %% <--- LaTeX (up to 2015)


                The LaTeX definition has slightly changed in 2015, because a different set of allocation macros was introduced to cope with the extended range of registers afforded by e-TeX.



                The alloc@ macro in LaTeX was (and its current variant is) essentially the same as in plain; the dimendef primitive (the ultimate responsible for assigning the desired meaning to foo in newdimenfoo) does no check for definedness of the control sequence.



                The LaTeX commands that do definitions and allocations and are documented in the manual all do a check.



                Users who know about newdimen may exploit it, if they so wish, with the caveat that they should know what they're doing. And, much more important, they should not hand a preamble filled with newdimen and def to their mates or colleagues who aren't supposed to be TeX gurus and will be thoroughly confused by weird error messages such as Missing $ when trying to print *façon• (just because their friend's preamble had defc{gamma}, this actually happened).



                Is there a difference between newdimen and newlength, apart from the check? Yes, but minor: newlength is a wrapper around plain TeX's newskip, so it allocates a skip register rather than a dimen one. This difference may bite if one doesn't use LaTeX syntax for setting lengths, that is setlength.






                share|improve this answer
























                  6












                  6








                  6






                  Yes, it's the same as the problem with def.



                  The newdimen macro comes from plain TeX and it's in LaTeX for historical reasons: in order to ease transition from plain TeX, LaTeX was loaded with a copy of plain TeX, barring a few commands that were reused (line, for instance).



                  The only difference between plain TeX's and LaTeX's newdimen is that the former is outer and the latter isn't.



                  outerdefnewdimen{alloc@1dimendimendefinsc@unt}  %% <-- plain TeX

                  defnewdimen{alloc@1dimendimendefinsc@unt} %% <--- LaTeX (up to 2015)


                  The LaTeX definition has slightly changed in 2015, because a different set of allocation macros was introduced to cope with the extended range of registers afforded by e-TeX.



                  The alloc@ macro in LaTeX was (and its current variant is) essentially the same as in plain; the dimendef primitive (the ultimate responsible for assigning the desired meaning to foo in newdimenfoo) does no check for definedness of the control sequence.



                  The LaTeX commands that do definitions and allocations and are documented in the manual all do a check.



                  Users who know about newdimen may exploit it, if they so wish, with the caveat that they should know what they're doing. And, much more important, they should not hand a preamble filled with newdimen and def to their mates or colleagues who aren't supposed to be TeX gurus and will be thoroughly confused by weird error messages such as Missing $ when trying to print *façon• (just because their friend's preamble had defc{gamma}, this actually happened).



                  Is there a difference between newdimen and newlength, apart from the check? Yes, but minor: newlength is a wrapper around plain TeX's newskip, so it allocates a skip register rather than a dimen one. This difference may bite if one doesn't use LaTeX syntax for setting lengths, that is setlength.






                  share|improve this answer












                  Yes, it's the same as the problem with def.



                  The newdimen macro comes from plain TeX and it's in LaTeX for historical reasons: in order to ease transition from plain TeX, LaTeX was loaded with a copy of plain TeX, barring a few commands that were reused (line, for instance).



                  The only difference between plain TeX's and LaTeX's newdimen is that the former is outer and the latter isn't.



                  outerdefnewdimen{alloc@1dimendimendefinsc@unt}  %% <-- plain TeX

                  defnewdimen{alloc@1dimendimendefinsc@unt} %% <--- LaTeX (up to 2015)


                  The LaTeX definition has slightly changed in 2015, because a different set of allocation macros was introduced to cope with the extended range of registers afforded by e-TeX.



                  The alloc@ macro in LaTeX was (and its current variant is) essentially the same as in plain; the dimendef primitive (the ultimate responsible for assigning the desired meaning to foo in newdimenfoo) does no check for definedness of the control sequence.



                  The LaTeX commands that do definitions and allocations and are documented in the manual all do a check.



                  Users who know about newdimen may exploit it, if they so wish, with the caveat that they should know what they're doing. And, much more important, they should not hand a preamble filled with newdimen and def to their mates or colleagues who aren't supposed to be TeX gurus and will be thoroughly confused by weird error messages such as Missing $ when trying to print *façon• (just because their friend's preamble had defc{gamma}, this actually happened).



                  Is there a difference between newdimen and newlength, apart from the check? Yes, but minor: newlength is a wrapper around plain TeX's newskip, so it allocates a skip register rather than a dimen one. This difference may bite if one doesn't use LaTeX syntax for setting lengths, that is setlength.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 19 '18 at 8:59









                  egreg

                  709k8618823165




                  709k8618823165























                      1














                      You can create a wrapper around newdimen that gives you an error in that case.



                      documentclass{article}
                      usepackage{etoolbox}
                      usepackage{amsmath, amssymb}
                      newcommand{R}{mathbb{R}}
                      newcommand{newdimension}[1]{%
                      ifundef{#1}
                      {newdimen#1}
                      {errmessage{command expandafterstring#1 already defined - can't create dimension}}}

                      begin{document}
                      $R$
                      newdimension{R}
                      R=.4cm
                      $R$

                      newdimension{mydim}
                      mydim=.4cm
                      showthemydim
                      end{document}





                      share|improve this answer





















                      • That'll work. If there's not a native command, I'll accept this.
                        – Robert Wolfe
                        Dec 19 '18 at 5:25










                      • As far as I know there is none, sorry...
                        – AndiW
                        Dec 19 '18 at 5:28










                      • @AndiW Yes, there is, see my answer.
                        – Henri Menke
                        Dec 19 '18 at 5:34










                      • Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                        – AndiW
                        Dec 19 '18 at 5:36
















                      1














                      You can create a wrapper around newdimen that gives you an error in that case.



                      documentclass{article}
                      usepackage{etoolbox}
                      usepackage{amsmath, amssymb}
                      newcommand{R}{mathbb{R}}
                      newcommand{newdimension}[1]{%
                      ifundef{#1}
                      {newdimen#1}
                      {errmessage{command expandafterstring#1 already defined - can't create dimension}}}

                      begin{document}
                      $R$
                      newdimension{R}
                      R=.4cm
                      $R$

                      newdimension{mydim}
                      mydim=.4cm
                      showthemydim
                      end{document}





                      share|improve this answer





















                      • That'll work. If there's not a native command, I'll accept this.
                        – Robert Wolfe
                        Dec 19 '18 at 5:25










                      • As far as I know there is none, sorry...
                        – AndiW
                        Dec 19 '18 at 5:28










                      • @AndiW Yes, there is, see my answer.
                        – Henri Menke
                        Dec 19 '18 at 5:34










                      • Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                        – AndiW
                        Dec 19 '18 at 5:36














                      1












                      1








                      1






                      You can create a wrapper around newdimen that gives you an error in that case.



                      documentclass{article}
                      usepackage{etoolbox}
                      usepackage{amsmath, amssymb}
                      newcommand{R}{mathbb{R}}
                      newcommand{newdimension}[1]{%
                      ifundef{#1}
                      {newdimen#1}
                      {errmessage{command expandafterstring#1 already defined - can't create dimension}}}

                      begin{document}
                      $R$
                      newdimension{R}
                      R=.4cm
                      $R$

                      newdimension{mydim}
                      mydim=.4cm
                      showthemydim
                      end{document}





                      share|improve this answer












                      You can create a wrapper around newdimen that gives you an error in that case.



                      documentclass{article}
                      usepackage{etoolbox}
                      usepackage{amsmath, amssymb}
                      newcommand{R}{mathbb{R}}
                      newcommand{newdimension}[1]{%
                      ifundef{#1}
                      {newdimen#1}
                      {errmessage{command expandafterstring#1 already defined - can't create dimension}}}

                      begin{document}
                      $R$
                      newdimension{R}
                      R=.4cm
                      $R$

                      newdimension{mydim}
                      mydim=.4cm
                      showthemydim
                      end{document}






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered Dec 19 '18 at 5:21









                      AndiW

                      233211




                      233211












                      • That'll work. If there's not a native command, I'll accept this.
                        – Robert Wolfe
                        Dec 19 '18 at 5:25










                      • As far as I know there is none, sorry...
                        – AndiW
                        Dec 19 '18 at 5:28










                      • @AndiW Yes, there is, see my answer.
                        – Henri Menke
                        Dec 19 '18 at 5:34










                      • Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                        – AndiW
                        Dec 19 '18 at 5:36


















                      • That'll work. If there's not a native command, I'll accept this.
                        – Robert Wolfe
                        Dec 19 '18 at 5:25










                      • As far as I know there is none, sorry...
                        – AndiW
                        Dec 19 '18 at 5:28










                      • @AndiW Yes, there is, see my answer.
                        – Henri Menke
                        Dec 19 '18 at 5:34










                      • Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                        – AndiW
                        Dec 19 '18 at 5:36
















                      That'll work. If there's not a native command, I'll accept this.
                      – Robert Wolfe
                      Dec 19 '18 at 5:25




                      That'll work. If there's not a native command, I'll accept this.
                      – Robert Wolfe
                      Dec 19 '18 at 5:25












                      As far as I know there is none, sorry...
                      – AndiW
                      Dec 19 '18 at 5:28




                      As far as I know there is none, sorry...
                      – AndiW
                      Dec 19 '18 at 5:28












                      @AndiW Yes, there is, see my answer.
                      – Henri Menke
                      Dec 19 '18 at 5:34




                      @AndiW Yes, there is, see my answer.
                      – Henri Menke
                      Dec 19 '18 at 5:34












                      Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                      – AndiW
                      Dec 19 '18 at 5:36




                      Arrgghh... sometimes you don't think about the most basic things... I'll take the blame...
                      – AndiW
                      Dec 19 '18 at 5:36


















                      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.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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%2f466483%2fwhat-command-should-i-use-to-be-warned-of-this-collision-beforehand%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

                      Morgemoulin

                      Scott Moir

                      Souastre