newcommand: Combine (optional) star and optional parameterUse column-separator & (ampersand) inside newenvironmentPass key option inside a macro to a TikZ drawing commandTwo independent optional arguments for new commandsXparse macro with optional parameter breaks value for PGF foreachMoving the optional argumentamsmath, vec and if not working togetherDefining a LaTeX macro with optional arguments as keywords inside square bracketsOptional parameter in newcommandOptional Parameters in xparse: IfBooleanTF vs IfNoValueTFOptional arguments in “families”… When and how?

Min function accepting varying number of arguments in C++17

AG Cluster db upgrade by vendor

Happy pi day, everyone!

How to terminate ping <dest> &

Who is flying the vertibirds?

What exactly is this small puffer fish doing and how did it manage to accomplish such a feat?

How to create the Curved texte?

Does Mathematica reuse previous computations?

Professor being mistaken for a grad student

What's the difference between /ɪ/ and /i(ː)/?

Are ETF trackers fundamentally better than individual stocks?

How do I hide Chekhov's Gun?

How Could an Airship Be Repaired Mid-Flight

A sequence that has integer values for prime indexes only:

Declaring defaulted assignment operator as constexpr: which compiler is right?

Opacity of an object in 2.8

Could the Saturn V actually have launched astronauts around Venus?

Time travel from stationary position?

Is it normal that my co-workers at a fitness company criticize my food choices?

Hacking a Safe Lock after 3 tries

Are there other languages, besides English, where the indefinite (or definite) article varies based on sound?

Instead of Universal Basic Income, why not Universal Basic NEEDS?

What is the significance behind "40 days" that often appears in the Bible?

What is this large pipe coming out of my roof?



newcommand: Combine (optional) star and optional parameter


Use column-separator & (ampersand) inside newenvironmentPass key option inside a macro to a TikZ drawing commandTwo independent optional arguments for new commandsXparse macro with optional parameter breaks value for PGF foreachMoving the optional argumentamsmath, vec and if not working togetherDefining a LaTeX macro with optional arguments as keywords inside square bracketsOptional parameter in newcommandOptional Parameters in xparse: IfBooleanTF vs IfNoValueTFOptional arguments in “families”… When and how?













5















How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?



I tried the following:



documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%


makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument


But this gives:




The non-starred variant with parameter: 1

The starred variant with parameter: 1

The non-starred variant with parameter: 2

The starred variant with parameter: 1[2]




Yet, one can write MyCommand[2]* to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.










share|improve this question



















  • 2





    Please, avoid using the minimal class; it is not meant for minimal examples.

    – egreg
    8 hours ago











  • I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

    – Bruno
    7 hours ago















5















How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?



I tried the following:



documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%


makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument


But this gives:




The non-starred variant with parameter: 1

The starred variant with parameter: 1

The non-starred variant with parameter: 2

The starred variant with parameter: 1[2]




Yet, one can write MyCommand[2]* to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.










share|improve this question



















  • 2





    Please, avoid using the minimal class; it is not meant for minimal examples.

    – egreg
    8 hours ago











  • I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

    – Bruno
    7 hours ago













5












5








5








How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?



I tried the following:



documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%


makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument


But this gives:




The non-starred variant with parameter: 1

The starred variant with parameter: 1

The non-starred variant with parameter: 2

The starred variant with parameter: 1[2]




Yet, one can write MyCommand[2]* to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.










share|improve this question
















How may I define a new command that admits starred and non-starred variants, and that also admits an optional argument?



I tried the following:



documentclassminimal
makeatletter
newcommandMyCommand[1][1]%
@ifstar%
The starred variant with parameter: #1%
%
The non-starred variant with parameter: #1%


makeatother
begindocument
MyCommand \
MyCommand* \
MyCommand[2] \
MyCommand*[2]
enddocument


But this gives:




The non-starred variant with parameter: 1

The starred variant with parameter: 1

The non-starred variant with parameter: 2

The starred variant with parameter: 1[2]




Yet, one can write MyCommand[2]* to obtain "The starred variant with parameter: 2" but somehow I'd like the above version to work.







macros






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 8 hours ago







Bruno

















asked 8 hours ago









BrunoBruno

1,0921822




1,0921822







  • 2





    Please, avoid using the minimal class; it is not meant for minimal examples.

    – egreg
    8 hours ago











  • I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

    – Bruno
    7 hours ago












  • 2





    Please, avoid using the minimal class; it is not meant for minimal examples.

    – egreg
    8 hours ago











  • I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

    – Bruno
    7 hours ago







2




2





Please, avoid using the minimal class; it is not meant for minimal examples.

– egreg
8 hours ago





Please, avoid using the minimal class; it is not meant for minimal examples.

– egreg
8 hours ago













I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

– Bruno
7 hours ago





I learned many things with this question, including the fact that the minimal class is not made for minimal examples!

– Bruno
7 hours ago










2 Answers
2






active

oldest

votes


















7














With xparse it's very easy to play around with optional arguments and starred variants:



documentclassarticle
usepackagexparse
NewDocumentCommandMyCommand

s % optional *
O1 % first optional argument (default = 1)

%
IfBooleanTF#1
The starred variant with parameter: #2
The non-starred variant with parameter: #2

begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument


With LaTeX's newcommand it a little trickier. The @ifstar macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the * and only then look for the optional argument:



documentclassarticle
makeatletter
newcommandMyCommand
%
@ifstar
MyCommand@star
MyCommand@nostar%

newcommandMyCommand@star[1][1]%
The starred variant with parameter: #1%

newcommandMyCommand@nostar[1][1]%
The non-starred variant with parameter: #1%

makeatother
begindocument
noindent
MyCommand \
MyCommand* \
MyCommand[2]\
MyCommand*[2]
enddocument


Both versions print:




enter image description here




Your code works, but not as you expect it to. The MyCommand[1][1] looks for an optional argument “while expanding” MyCommand, which then gives you:



@ifstar%
The starred variant with parameter: <optional argument or default>%
%
The non-starred variant with parameter: <optional argument or default>%



and only after that the @ifstar test will be expanded to look for the optional * and choose the text accordingly, so the actual syntax for the command you defined is:



MyCommand[optional argument]<optional star>





share|improve this answer
































    3














    Make MyCommand take no parameters, but just figure out the star. Then fork from there.



    documentclassminimal
    makeatletter
    newcommandMyCommand%
    @ifstarmycommandstarmycommandnostar

    newcommandmycommandstar[1][1]The starred variant with parameter: #1
    newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
    makeatother
    begindocument
    MyCommand \
    MyCommand* \
    MyCommand[2] \
    MyCommand*[2]
    enddocument


    enter image description here






    share|improve this answer


















    • 2





      I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

      – Phelype Oleinik
      7 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
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f479632%2fnewcommand-combine-optional-star-and-optional-parameter%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









    7














    With xparse it's very easy to play around with optional arguments and starred variants:



    documentclassarticle
    usepackagexparse
    NewDocumentCommandMyCommand

    s % optional *
    O1 % first optional argument (default = 1)

    %
    IfBooleanTF#1
    The starred variant with parameter: #2
    The non-starred variant with parameter: #2

    begindocument
    noindent
    MyCommand \
    MyCommand* \
    MyCommand[2]\
    MyCommand*[2]
    enddocument


    With LaTeX's newcommand it a little trickier. The @ifstar macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the * and only then look for the optional argument:



    documentclassarticle
    makeatletter
    newcommandMyCommand
    %
    @ifstar
    MyCommand@star
    MyCommand@nostar%

    newcommandMyCommand@star[1][1]%
    The starred variant with parameter: #1%

    newcommandMyCommand@nostar[1][1]%
    The non-starred variant with parameter: #1%

    makeatother
    begindocument
    noindent
    MyCommand \
    MyCommand* \
    MyCommand[2]\
    MyCommand*[2]
    enddocument


    Both versions print:




    enter image description here




    Your code works, but not as you expect it to. The MyCommand[1][1] looks for an optional argument “while expanding” MyCommand, which then gives you:



    @ifstar%
    The starred variant with parameter: <optional argument or default>%
    %
    The non-starred variant with parameter: <optional argument or default>%



    and only after that the @ifstar test will be expanded to look for the optional * and choose the text accordingly, so the actual syntax for the command you defined is:



    MyCommand[optional argument]<optional star>





    share|improve this answer





























      7














      With xparse it's very easy to play around with optional arguments and starred variants:



      documentclassarticle
      usepackagexparse
      NewDocumentCommandMyCommand

      s % optional *
      O1 % first optional argument (default = 1)

      %
      IfBooleanTF#1
      The starred variant with parameter: #2
      The non-starred variant with parameter: #2

      begindocument
      noindent
      MyCommand \
      MyCommand* \
      MyCommand[2]\
      MyCommand*[2]
      enddocument


      With LaTeX's newcommand it a little trickier. The @ifstar macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the * and only then look for the optional argument:



      documentclassarticle
      makeatletter
      newcommandMyCommand
      %
      @ifstar
      MyCommand@star
      MyCommand@nostar%

      newcommandMyCommand@star[1][1]%
      The starred variant with parameter: #1%

      newcommandMyCommand@nostar[1][1]%
      The non-starred variant with parameter: #1%

      makeatother
      begindocument
      noindent
      MyCommand \
      MyCommand* \
      MyCommand[2]\
      MyCommand*[2]
      enddocument


      Both versions print:




      enter image description here




      Your code works, but not as you expect it to. The MyCommand[1][1] looks for an optional argument “while expanding” MyCommand, which then gives you:



      @ifstar%
      The starred variant with parameter: <optional argument or default>%
      %
      The non-starred variant with parameter: <optional argument or default>%



      and only after that the @ifstar test will be expanded to look for the optional * and choose the text accordingly, so the actual syntax for the command you defined is:



      MyCommand[optional argument]<optional star>





      share|improve this answer



























        7












        7








        7







        With xparse it's very easy to play around with optional arguments and starred variants:



        documentclassarticle
        usepackagexparse
        NewDocumentCommandMyCommand

        s % optional *
        O1 % first optional argument (default = 1)

        %
        IfBooleanTF#1
        The starred variant with parameter: #2
        The non-starred variant with parameter: #2

        begindocument
        noindent
        MyCommand \
        MyCommand* \
        MyCommand[2]\
        MyCommand*[2]
        enddocument


        With LaTeX's newcommand it a little trickier. The @ifstar macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the * and only then look for the optional argument:



        documentclassarticle
        makeatletter
        newcommandMyCommand
        %
        @ifstar
        MyCommand@star
        MyCommand@nostar%

        newcommandMyCommand@star[1][1]%
        The starred variant with parameter: #1%

        newcommandMyCommand@nostar[1][1]%
        The non-starred variant with parameter: #1%

        makeatother
        begindocument
        noindent
        MyCommand \
        MyCommand* \
        MyCommand[2]\
        MyCommand*[2]
        enddocument


        Both versions print:




        enter image description here




        Your code works, but not as you expect it to. The MyCommand[1][1] looks for an optional argument “while expanding” MyCommand, which then gives you:



        @ifstar%
        The starred variant with parameter: <optional argument or default>%
        %
        The non-starred variant with parameter: <optional argument or default>%



        and only after that the @ifstar test will be expanded to look for the optional * and choose the text accordingly, so the actual syntax for the command you defined is:



        MyCommand[optional argument]<optional star>





        share|improve this answer















        With xparse it's very easy to play around with optional arguments and starred variants:



        documentclassarticle
        usepackagexparse
        NewDocumentCommandMyCommand

        s % optional *
        O1 % first optional argument (default = 1)

        %
        IfBooleanTF#1
        The starred variant with parameter: #2
        The non-starred variant with parameter: #2

        begindocument
        noindent
        MyCommand \
        MyCommand* \
        MyCommand[2]\
        MyCommand*[2]
        enddocument


        With LaTeX's newcommand it a little trickier. The @ifstar macro looks at the next token after the macro is expanded and has absorbed its arguments, so you need to first check for the * and only then look for the optional argument:



        documentclassarticle
        makeatletter
        newcommandMyCommand
        %
        @ifstar
        MyCommand@star
        MyCommand@nostar%

        newcommandMyCommand@star[1][1]%
        The starred variant with parameter: #1%

        newcommandMyCommand@nostar[1][1]%
        The non-starred variant with parameter: #1%

        makeatother
        begindocument
        noindent
        MyCommand \
        MyCommand* \
        MyCommand[2]\
        MyCommand*[2]
        enddocument


        Both versions print:




        enter image description here




        Your code works, but not as you expect it to. The MyCommand[1][1] looks for an optional argument “while expanding” MyCommand, which then gives you:



        @ifstar%
        The starred variant with parameter: <optional argument or default>%
        %
        The non-starred variant with parameter: <optional argument or default>%



        and only after that the @ifstar test will be expanded to look for the optional * and choose the text accordingly, so the actual syntax for the command you defined is:



        MyCommand[optional argument]<optional star>






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 7 hours ago

























        answered 8 hours ago









        Phelype OleinikPhelype Oleinik

        24.2k54688




        24.2k54688





















            3














            Make MyCommand take no parameters, but just figure out the star. Then fork from there.



            documentclassminimal
            makeatletter
            newcommandMyCommand%
            @ifstarmycommandstarmycommandnostar

            newcommandmycommandstar[1][1]The starred variant with parameter: #1
            newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
            makeatother
            begindocument
            MyCommand \
            MyCommand* \
            MyCommand[2] \
            MyCommand*[2]
            enddocument


            enter image description here






            share|improve this answer


















            • 2





              I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

              – Phelype Oleinik
              7 hours ago















            3














            Make MyCommand take no parameters, but just figure out the star. Then fork from there.



            documentclassminimal
            makeatletter
            newcommandMyCommand%
            @ifstarmycommandstarmycommandnostar

            newcommandmycommandstar[1][1]The starred variant with parameter: #1
            newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
            makeatother
            begindocument
            MyCommand \
            MyCommand* \
            MyCommand[2] \
            MyCommand*[2]
            enddocument


            enter image description here






            share|improve this answer


















            • 2





              I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

              – Phelype Oleinik
              7 hours ago













            3












            3








            3







            Make MyCommand take no parameters, but just figure out the star. Then fork from there.



            documentclassminimal
            makeatletter
            newcommandMyCommand%
            @ifstarmycommandstarmycommandnostar

            newcommandmycommandstar[1][1]The starred variant with parameter: #1
            newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
            makeatother
            begindocument
            MyCommand \
            MyCommand* \
            MyCommand[2] \
            MyCommand*[2]
            enddocument


            enter image description here






            share|improve this answer













            Make MyCommand take no parameters, but just figure out the star. Then fork from there.



            documentclassminimal
            makeatletter
            newcommandMyCommand%
            @ifstarmycommandstarmycommandnostar

            newcommandmycommandstar[1][1]The starred variant with parameter: #1
            newcommandmycommandnostar[1][1]The non-starred variant with parameter: #1
            makeatother
            begindocument
            MyCommand \
            MyCommand* \
            MyCommand[2] \
            MyCommand*[2]
            enddocument


            enter image description here







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 8 hours ago









            Steven B. SegletesSteven B. Segletes

            158k9204411




            158k9204411







            • 2





              I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

              – Phelype Oleinik
              7 hours ago












            • 2





              I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

              – Phelype Oleinik
              7 hours ago







            2




            2





            I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

            – Phelype Oleinik
            7 hours ago





            I'd add a % at the end of the definition of MyCommand. It works without that because the definition of @ifstar ignores space tokens by design, but... :)

            – Phelype Oleinik
            7 hours ago

















            draft saved

            draft discarded
















































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


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

            But avoid


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

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

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




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f479632%2fnewcommand-combine-optional-star-and-optional-parameter%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

            acmart: Multiple authors: all with same affiliation, one author an additional affiliationHow to Write Names of Multiple Authors with Shared Affiliation in ACM 2017 Template?Multiple authors with different primary affiliation, but same additional affiliationSame affiliation for all authors without extra packagesIOS-Book-Article.cls: one author with multiple affiliationacmart: Shared Author AffiliationMultiple authors with different primary affiliation, but same additional affiliationAuthor affiliation with only 1 authorAdding Multiple Authors with Different Affiliation in LaTeX ArticleLaTeX: Multiple authors stays on same lineHow to Label Multiple Authors with Same DescriptionHow to make two authors use the same affiliationTwo authors with same affiliation on finished front page

            How to write “ä” and other umlauts and accented letters in bibliography?Accents in BibTeXSorting references with special characters alphabeticallyUse ae ligature in bibliographyEastern European nameInverted circumflex in BibTexBibTex, non-ascii initials and nameptr fproblems with accent in LatexHow to add a Ø to my bibliography from Jabref?References without accentsTroubles when trying to cite St“omer-Verlet in ”title" field of a bib entryComprehensive list of accented charactersHow to type the letter “i” with two dots (diaeresis) in math mode?Problem with glossary text and accented lettersSpecial character in bibliographyAccented letters, Unicode and LaTeX accentsHow to stop natbib from modifying bibliography styleCitation of a paper with non-standard characters by BibtexWrite accented characters to file using writeHow to group the bibliography alphabetically, if some surnames start with “accented” characters?How can I automatically capitalize significant words in my bibliography?

            How to remove border form elements in the last row?Targeting flex items on the last rowHow to vertically wrap content with flexbox?Remove border from IFrameCSS3's border-radius property and border-collapse:collapse don't mix. How can I use border-radius to create a collapsed table with rounded corners?Div width 100% minus fixed amount of pixelsBorder around specific rows in a table?How to remove border (outline) around text/input boxes? (Chrome)How do I remove the space between inline-block elements?Flex-box: Align last row to gridRemove blue border from css custom-styled button in ChromeFill remaining vertical space with CSS using display:flexhow style elements in the last row of flexbox row layout with pure css without js