How to define a macro with multiple optional parameters?xparse: Define new command with multiple optional...

Counting monomials in skew-symmetric+diagonal matrices

For Loop and Sum

Find the number of ways to express 1050 as sum of consecutive integers

Why does the DC-9-80 have this cusp in its fuselage?

How to approximate rolls for potions of healing using only d6's?

Called into a meeting and told we are being made redundant (laid off) and "not to share outside". Can I tell my partner?

Yeshiva University RIETS Semicha Yorei and Yadin

What's a good word to describe a public place that looks like it wouldn't be rough?

Do commercial flights continue with an engine out?

How much time does it take for a broken magnet to recover its poles?

Criticizing long fiction. How is it different from short?

Using AWS Fargate as web server

Sometimes a banana is just a banana

Am I a Rude Number?

Can a hotel cancel a confirmed reservation?

Inventor that creates machine that grabs man from future

What is Crew Dragon approaching in this picture?

Quenching swords in dragon blood; why?

Avoiding morning and evening handshakes

Do my Windows system binaries contain sensitive information?

Where is this triangular-shaped space station from?

How do we edit a novel that's written by several people?

If I delete my router's history can my ISP still provide it to my parents?

Could quantum mechanics be necessary to analyze some biology scenarios?



How to define a macro with multiple optional parameters?


xparse: Define new command with multiple optional parametersPassing parameters to g@addto@macrodefine a macro with two parameters delimited by optional spacesCan you interpret macro parameters as verbatim?Define a new command with parameters inside newcommandCommand calls with multiple parametersdef macro with multiple parametersRedefine macro in macro with parameternew environment with multiple parametersDefine macro as wrapper for parameters of a command













3















After I had a macro that worked, I tried to improve it by making some parameters optional.
Unfortunately the macro no longer works. Instead I'm getting errors I do not understand, for example:



LaTeX Warning: Label `####5' multiply defined.
LaTeX Warning: Label `####5' multiply defined.
! LaTeX Error: fLab undefined.
! Illegal parameter number in definition of fLab.
! Illegal parameter number in definition of reserved@a.
! LaTeX Error: fCap undefined.


...and so on.
The last code I tried looked like this:



%% Graphics figure with caption and label
% [1:placement,] 2:relative width, 3:file name[, 4:caption[, 5:label]]
newcommand{figCapLab}[5][htbp]{%
ifthenelse{equal{#5}{}}%
{renewcommand{fLab}{}}%
{renewcommand{fLab}{label{##5}}}%
ifthenelse{equal{#4}{}}%
{renewcommand{fCap}{fLab}}%
{renewcommand{fCap}{caption{fLab{small{}##4}}}}%
begin{figure}[#1]%
centering%
begin{minipage}[t]{#2textwidth}%
includegraphics[width=textwidth]{#3}% is width of surrounding minipage
fCap%
end{minipage}%
end{figure}
}
%% Graphics figure with caption
% [1:placement,] 2:relative width, 3:file name, 4:caption
newcommand{figCap}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{#4}{}}%
{figCapLab[#1]{#2}{#3}{#4}{}}%
}
%% Graphics figure with label
% [1:placement,] 2:relative width, 3:file name, 4:label
newcommand{figLab}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{}{#4}}%
{figCapLab[#1]{#2}{#3}{}{#4}}%
}


Who can explain what went wrong?



People who like complete examples should add this prolog:



documentclass[a4paper,twoside]{report}
usepackage{german}
usepackage[latin1]{inputenc}
usepackage{a4}
usepackage{amsmath}
usepackage{url}
usepackage{graphicx}
usepackage{ifthen}


...and this epilog:



begin{document}
See ref{foo}.
figCapLab{0.9}{whatever.pdf}{Caption}{foo}
end{document}









share|improve this question









New contributor




U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 3





    Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

    – Werner
    3 hours ago











  • please extend your code fragment to complete but small document!

    – Zarko
    2 hours ago











  • @Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

    – U. Windl
    2 hours ago











  • pgfkeys allow you to have multiple keys, which you could call optional arguments.

    – marmot
    2 hours ago
















3















After I had a macro that worked, I tried to improve it by making some parameters optional.
Unfortunately the macro no longer works. Instead I'm getting errors I do not understand, for example:



LaTeX Warning: Label `####5' multiply defined.
LaTeX Warning: Label `####5' multiply defined.
! LaTeX Error: fLab undefined.
! Illegal parameter number in definition of fLab.
! Illegal parameter number in definition of reserved@a.
! LaTeX Error: fCap undefined.


...and so on.
The last code I tried looked like this:



%% Graphics figure with caption and label
% [1:placement,] 2:relative width, 3:file name[, 4:caption[, 5:label]]
newcommand{figCapLab}[5][htbp]{%
ifthenelse{equal{#5}{}}%
{renewcommand{fLab}{}}%
{renewcommand{fLab}{label{##5}}}%
ifthenelse{equal{#4}{}}%
{renewcommand{fCap}{fLab}}%
{renewcommand{fCap}{caption{fLab{small{}##4}}}}%
begin{figure}[#1]%
centering%
begin{minipage}[t]{#2textwidth}%
includegraphics[width=textwidth]{#3}% is width of surrounding minipage
fCap%
end{minipage}%
end{figure}
}
%% Graphics figure with caption
% [1:placement,] 2:relative width, 3:file name, 4:caption
newcommand{figCap}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{#4}{}}%
{figCapLab[#1]{#2}{#3}{#4}{}}%
}
%% Graphics figure with label
% [1:placement,] 2:relative width, 3:file name, 4:label
newcommand{figLab}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{}{#4}}%
{figCapLab[#1]{#2}{#3}{}{#4}}%
}


Who can explain what went wrong?



People who like complete examples should add this prolog:



documentclass[a4paper,twoside]{report}
usepackage{german}
usepackage[latin1]{inputenc}
usepackage{a4}
usepackage{amsmath}
usepackage{url}
usepackage{graphicx}
usepackage{ifthen}


...and this epilog:



begin{document}
See ref{foo}.
figCapLab{0.9}{whatever.pdf}{Caption}{foo}
end{document}









share|improve this question









New contributor




U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 3





    Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

    – Werner
    3 hours ago











  • please extend your code fragment to complete but small document!

    – Zarko
    2 hours ago











  • @Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

    – U. Windl
    2 hours ago











  • pgfkeys allow you to have multiple keys, which you could call optional arguments.

    – marmot
    2 hours ago














3












3








3








After I had a macro that worked, I tried to improve it by making some parameters optional.
Unfortunately the macro no longer works. Instead I'm getting errors I do not understand, for example:



LaTeX Warning: Label `####5' multiply defined.
LaTeX Warning: Label `####5' multiply defined.
! LaTeX Error: fLab undefined.
! Illegal parameter number in definition of fLab.
! Illegal parameter number in definition of reserved@a.
! LaTeX Error: fCap undefined.


...and so on.
The last code I tried looked like this:



%% Graphics figure with caption and label
% [1:placement,] 2:relative width, 3:file name[, 4:caption[, 5:label]]
newcommand{figCapLab}[5][htbp]{%
ifthenelse{equal{#5}{}}%
{renewcommand{fLab}{}}%
{renewcommand{fLab}{label{##5}}}%
ifthenelse{equal{#4}{}}%
{renewcommand{fCap}{fLab}}%
{renewcommand{fCap}{caption{fLab{small{}##4}}}}%
begin{figure}[#1]%
centering%
begin{minipage}[t]{#2textwidth}%
includegraphics[width=textwidth]{#3}% is width of surrounding minipage
fCap%
end{minipage}%
end{figure}
}
%% Graphics figure with caption
% [1:placement,] 2:relative width, 3:file name, 4:caption
newcommand{figCap}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{#4}{}}%
{figCapLab[#1]{#2}{#3}{#4}{}}%
}
%% Graphics figure with label
% [1:placement,] 2:relative width, 3:file name, 4:label
newcommand{figLab}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{}{#4}}%
{figCapLab[#1]{#2}{#3}{}{#4}}%
}


Who can explain what went wrong?



People who like complete examples should add this prolog:



documentclass[a4paper,twoside]{report}
usepackage{german}
usepackage[latin1]{inputenc}
usepackage{a4}
usepackage{amsmath}
usepackage{url}
usepackage{graphicx}
usepackage{ifthen}


...and this epilog:



begin{document}
See ref{foo}.
figCapLab{0.9}{whatever.pdf}{Caption}{foo}
end{document}









share|improve this question









New contributor




U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.












After I had a macro that worked, I tried to improve it by making some parameters optional.
Unfortunately the macro no longer works. Instead I'm getting errors I do not understand, for example:



LaTeX Warning: Label `####5' multiply defined.
LaTeX Warning: Label `####5' multiply defined.
! LaTeX Error: fLab undefined.
! Illegal parameter number in definition of fLab.
! Illegal parameter number in definition of reserved@a.
! LaTeX Error: fCap undefined.


...and so on.
The last code I tried looked like this:



%% Graphics figure with caption and label
% [1:placement,] 2:relative width, 3:file name[, 4:caption[, 5:label]]
newcommand{figCapLab}[5][htbp]{%
ifthenelse{equal{#5}{}}%
{renewcommand{fLab}{}}%
{renewcommand{fLab}{label{##5}}}%
ifthenelse{equal{#4}{}}%
{renewcommand{fCap}{fLab}}%
{renewcommand{fCap}{caption{fLab{small{}##4}}}}%
begin{figure}[#1]%
centering%
begin{minipage}[t]{#2textwidth}%
includegraphics[width=textwidth]{#3}% is width of surrounding minipage
fCap%
end{minipage}%
end{figure}
}
%% Graphics figure with caption
% [1:placement,] 2:relative width, 3:file name, 4:caption
newcommand{figCap}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{#4}{}}%
{figCapLab[#1]{#2}{#3}{#4}{}}%
}
%% Graphics figure with label
% [1:placement,] 2:relative width, 3:file name, 4:label
newcommand{figLab}[4]{%
ifthenelse{equal{#1}{}}%
{figCapLab{#2}{#3}{}{#4}}%
{figCapLab[#1]{#2}{#3}{}{#4}}%
}


Who can explain what went wrong?



People who like complete examples should add this prolog:



documentclass[a4paper,twoside]{report}
usepackage{german}
usepackage[latin1]{inputenc}
usepackage{a4}
usepackage{amsmath}
usepackage{url}
usepackage{graphicx}
usepackage{ifthen}


...and this epilog:



begin{document}
See ref{foo}.
figCapLab{0.9}{whatever.pdf}{Caption}{foo}
end{document}






macros parameters






share|improve this question









New contributor




U. Windl 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




U. Windl 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








edited 2 hours ago







U. Windl













New contributor




U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 3 hours ago









U. WindlU. Windl

1183




1183




New contributor




U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






U. Windl is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 3





    Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

    – Werner
    3 hours ago











  • please extend your code fragment to complete but small document!

    – Zarko
    2 hours ago











  • @Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

    – U. Windl
    2 hours ago











  • pgfkeys allow you to have multiple keys, which you could call optional arguments.

    – marmot
    2 hours ago














  • 3





    Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

    – Werner
    3 hours ago











  • please extend your code fragment to complete but small document!

    – Zarko
    2 hours ago











  • @Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

    – U. Windl
    2 hours ago











  • pgfkeys allow you to have multiple keys, which you could call optional arguments.

    – marmot
    2 hours ago








3




3





Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

– Werner
3 hours ago





Instead of identifying mistakes in your code without much context, can you provide information on what you want to achieve ultimately? Perhaps there are better ways of achieving it.

– Werner
3 hours ago













please extend your code fragment to complete but small document!

– Zarko
2 hours ago





please extend your code fragment to complete but small document!

– Zarko
2 hours ago













@Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

– U. Windl
2 hours ago





@Werner: There are always different ways to reach a goal, but if you change the way too frequently, you'll never make it. So I'd prefer a fix for my "solution" over a completely new attempt (like xparse).

– U. Windl
2 hours ago













pgfkeys allow you to have multiple keys, which you could call optional arguments.

– marmot
2 hours ago





pgfkeys allow you to have multiple keys, which you could call optional arguments.

– marmot
2 hours ago










1 Answer
1






active

oldest

votes


















3














documentclass{article}
usepackage{graphicx}
newcommandaddtofigtoks[1]{expandafterfigtoksexpandafter
{thefigtoks#1}}
newtoksfigtoks
newcommandfigCapLab[3][htbp]{%
figtoks{begin{figure}[#1]}
addtofigtoks{centering}
addtofigtoks{includegraphics[width=#2textwidth]{#3}}
optcap
}
newcommandoptcap[1][relax]{%
ifxrelax#1relax
addtofigtoks{end{figure}}
thefigtoks
else
addtofigtoks{caption{#1}}%
expandafterlabelopt
fi
}
newcommandlabelopt[1][relax]{%
ifxrelax#1relaxelseaddtofigtoks{label{#1}}fi
addtofigtoks{end{figure}}
thefigtoks
}
begin{document}
figCapLab{.2}{example-image-a}
figCapLab{.2}{example-image-b}[My caption]
figCapLab{.2}{example-image-c}[My caption][fg:label1]
figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

In figures ref{fg:label1} and ref{fg:label2}...
end{document}


enter image description here



Ack-shu-ally, the more I think of it, tokens are not even needed:



documentclass{article}
usepackage{graphicx}
newcommandfigCapLab[3][htbp]{%
begin{figure}[#1]
centering
includegraphics[width=#2textwidth]{#3}
optcap
}
newcommandoptcap[1][relax]{%
ifxrelax#1relax
end{figure}
else
caption{#1}%
expandafterlabelopt
fi
}
newcommandlabelopt[1][relax]{%
ifxrelax#1relaxelselabel{#1}fi
end{figure}
}
begin{document}
figCapLab{.2}{example-image-a}
figCapLab{.2}{example-image-b}[My caption]
figCapLab{.2}{example-image-c}[My caption][fg:label1]
figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

In figures ref{fg:label1} and ref{fg:label2}...
end{document}





share|improve this answer

























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


    }
    });






    U. Windl 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%2f477627%2fhow-to-define-a-macro-with-multiple-optional-parameters%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    documentclass{article}
    usepackage{graphicx}
    newcommandaddtofigtoks[1]{expandafterfigtoksexpandafter
    {thefigtoks#1}}
    newtoksfigtoks
    newcommandfigCapLab[3][htbp]{%
    figtoks{begin{figure}[#1]}
    addtofigtoks{centering}
    addtofigtoks{includegraphics[width=#2textwidth]{#3}}
    optcap
    }
    newcommandoptcap[1][relax]{%
    ifxrelax#1relax
    addtofigtoks{end{figure}}
    thefigtoks
    else
    addtofigtoks{caption{#1}}%
    expandafterlabelopt
    fi
    }
    newcommandlabelopt[1][relax]{%
    ifxrelax#1relaxelseaddtofigtoks{label{#1}}fi
    addtofigtoks{end{figure}}
    thefigtoks
    }
    begin{document}
    figCapLab{.2}{example-image-a}
    figCapLab{.2}{example-image-b}[My caption]
    figCapLab{.2}{example-image-c}[My caption][fg:label1]
    figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

    In figures ref{fg:label1} and ref{fg:label2}...
    end{document}


    enter image description here



    Ack-shu-ally, the more I think of it, tokens are not even needed:



    documentclass{article}
    usepackage{graphicx}
    newcommandfigCapLab[3][htbp]{%
    begin{figure}[#1]
    centering
    includegraphics[width=#2textwidth]{#3}
    optcap
    }
    newcommandoptcap[1][relax]{%
    ifxrelax#1relax
    end{figure}
    else
    caption{#1}%
    expandafterlabelopt
    fi
    }
    newcommandlabelopt[1][relax]{%
    ifxrelax#1relaxelselabel{#1}fi
    end{figure}
    }
    begin{document}
    figCapLab{.2}{example-image-a}
    figCapLab{.2}{example-image-b}[My caption]
    figCapLab{.2}{example-image-c}[My caption][fg:label1]
    figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

    In figures ref{fg:label1} and ref{fg:label2}...
    end{document}





    share|improve this answer






























      3














      documentclass{article}
      usepackage{graphicx}
      newcommandaddtofigtoks[1]{expandafterfigtoksexpandafter
      {thefigtoks#1}}
      newtoksfigtoks
      newcommandfigCapLab[3][htbp]{%
      figtoks{begin{figure}[#1]}
      addtofigtoks{centering}
      addtofigtoks{includegraphics[width=#2textwidth]{#3}}
      optcap
      }
      newcommandoptcap[1][relax]{%
      ifxrelax#1relax
      addtofigtoks{end{figure}}
      thefigtoks
      else
      addtofigtoks{caption{#1}}%
      expandafterlabelopt
      fi
      }
      newcommandlabelopt[1][relax]{%
      ifxrelax#1relaxelseaddtofigtoks{label{#1}}fi
      addtofigtoks{end{figure}}
      thefigtoks
      }
      begin{document}
      figCapLab{.2}{example-image-a}
      figCapLab{.2}{example-image-b}[My caption]
      figCapLab{.2}{example-image-c}[My caption][fg:label1]
      figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

      In figures ref{fg:label1} and ref{fg:label2}...
      end{document}


      enter image description here



      Ack-shu-ally, the more I think of it, tokens are not even needed:



      documentclass{article}
      usepackage{graphicx}
      newcommandfigCapLab[3][htbp]{%
      begin{figure}[#1]
      centering
      includegraphics[width=#2textwidth]{#3}
      optcap
      }
      newcommandoptcap[1][relax]{%
      ifxrelax#1relax
      end{figure}
      else
      caption{#1}%
      expandafterlabelopt
      fi
      }
      newcommandlabelopt[1][relax]{%
      ifxrelax#1relaxelselabel{#1}fi
      end{figure}
      }
      begin{document}
      figCapLab{.2}{example-image-a}
      figCapLab{.2}{example-image-b}[My caption]
      figCapLab{.2}{example-image-c}[My caption][fg:label1]
      figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

      In figures ref{fg:label1} and ref{fg:label2}...
      end{document}





      share|improve this answer




























        3












        3








        3







        documentclass{article}
        usepackage{graphicx}
        newcommandaddtofigtoks[1]{expandafterfigtoksexpandafter
        {thefigtoks#1}}
        newtoksfigtoks
        newcommandfigCapLab[3][htbp]{%
        figtoks{begin{figure}[#1]}
        addtofigtoks{centering}
        addtofigtoks{includegraphics[width=#2textwidth]{#3}}
        optcap
        }
        newcommandoptcap[1][relax]{%
        ifxrelax#1relax
        addtofigtoks{end{figure}}
        thefigtoks
        else
        addtofigtoks{caption{#1}}%
        expandafterlabelopt
        fi
        }
        newcommandlabelopt[1][relax]{%
        ifxrelax#1relaxelseaddtofigtoks{label{#1}}fi
        addtofigtoks{end{figure}}
        thefigtoks
        }
        begin{document}
        figCapLab{.2}{example-image-a}
        figCapLab{.2}{example-image-b}[My caption]
        figCapLab{.2}{example-image-c}[My caption][fg:label1]
        figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

        In figures ref{fg:label1} and ref{fg:label2}...
        end{document}


        enter image description here



        Ack-shu-ally, the more I think of it, tokens are not even needed:



        documentclass{article}
        usepackage{graphicx}
        newcommandfigCapLab[3][htbp]{%
        begin{figure}[#1]
        centering
        includegraphics[width=#2textwidth]{#3}
        optcap
        }
        newcommandoptcap[1][relax]{%
        ifxrelax#1relax
        end{figure}
        else
        caption{#1}%
        expandafterlabelopt
        fi
        }
        newcommandlabelopt[1][relax]{%
        ifxrelax#1relaxelselabel{#1}fi
        end{figure}
        }
        begin{document}
        figCapLab{.2}{example-image-a}
        figCapLab{.2}{example-image-b}[My caption]
        figCapLab{.2}{example-image-c}[My caption][fg:label1]
        figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

        In figures ref{fg:label1} and ref{fg:label2}...
        end{document}





        share|improve this answer















        documentclass{article}
        usepackage{graphicx}
        newcommandaddtofigtoks[1]{expandafterfigtoksexpandafter
        {thefigtoks#1}}
        newtoksfigtoks
        newcommandfigCapLab[3][htbp]{%
        figtoks{begin{figure}[#1]}
        addtofigtoks{centering}
        addtofigtoks{includegraphics[width=#2textwidth]{#3}}
        optcap
        }
        newcommandoptcap[1][relax]{%
        ifxrelax#1relax
        addtofigtoks{end{figure}}
        thefigtoks
        else
        addtofigtoks{caption{#1}}%
        expandafterlabelopt
        fi
        }
        newcommandlabelopt[1][relax]{%
        ifxrelax#1relaxelseaddtofigtoks{label{#1}}fi
        addtofigtoks{end{figure}}
        thefigtoks
        }
        begin{document}
        figCapLab{.2}{example-image-a}
        figCapLab{.2}{example-image-b}[My caption]
        figCapLab{.2}{example-image-c}[My caption][fg:label1]
        figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

        In figures ref{fg:label1} and ref{fg:label2}...
        end{document}


        enter image description here



        Ack-shu-ally, the more I think of it, tokens are not even needed:



        documentclass{article}
        usepackage{graphicx}
        newcommandfigCapLab[3][htbp]{%
        begin{figure}[#1]
        centering
        includegraphics[width=#2textwidth]{#3}
        optcap
        }
        newcommandoptcap[1][relax]{%
        ifxrelax#1relax
        end{figure}
        else
        caption{#1}%
        expandafterlabelopt
        fi
        }
        newcommandlabelopt[1][relax]{%
        ifxrelax#1relaxelselabel{#1}fi
        end{figure}
        }
        begin{document}
        figCapLab{.2}{example-image-a}
        figCapLab{.2}{example-image-b}[My caption]
        figCapLab{.2}{example-image-c}[My caption][fg:label1]
        figCapLab[p]{.2}{example-image}[Other caption][fg:label2]

        In figures ref{fg:label1} and ref{fg:label2}...
        end{document}






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 1 hour ago

























        answered 2 hours ago









        Steven B. SegletesSteven B. Segletes

        157k9202411




        157k9202411






















            U. Windl is a new contributor. Be nice, and check out our Code of Conduct.










            draft saved

            draft discarded


















            U. Windl is a new contributor. Be nice, and check out our Code of Conduct.













            U. Windl is a new contributor. Be nice, and check out our Code of Conduct.












            U. Windl 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%2f477627%2fhow-to-define-a-macro-with-multiple-optional-parameters%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

            Fairchild Swearingen Metro Inhaltsverzeichnis Geschichte | Innenausstattung | Nutzung | Zwischenfälle...

            Pilgersdorf Inhaltsverzeichnis Geografie | Geschichte | Bevölkerungsentwicklung | Politik | Kultur...

            Marineschifffahrtleitung Inhaltsverzeichnis Geschichte | Heutige Organisation der NATO | Nationale und...