3

I have a macro \lip defined with xparse which takes several arguments.

I would like to define some macro \slip which applies macro \eset after macro \lip.

Is there a way to define \slip without defining a new macro with as many arguments as \lip and passing them to this latter command?

\documentclass{article}

\usepackage{xparse}

\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}

\ExplSyntaxOn
\NewDocumentCommand \lip { D||{A} m D||{B} m } {
  #1^#2, #3^#4
}
\ExplSyntaxOff


% How can I define slip without the xparse boilerplate?
\ExplSyntaxOn
\NewDocumentCommand \slip {D||{A} m D||{B} m } {
  \eset{\lip |#1| {#2} |#3| {#4}}
}
\ExplSyntaxOff

\begin{document}

\[\lip |a| {1} |b| {2}\]

\[\slip |a| {1} |b| {2}\]

\end{document}
7
  • 1
    Why are you using \ExplSyntaxOn...\ExplSyntaxOff at all there?
    – user31729
    Commented Mar 24, 2017 at 13:57
  • Is there any reason why not \def\lip|#1|#2|#3|#4{#1^#2, #3^#4}, then \def\slip|#1|#2|#3|#4{\eset{#1^#2, #3^#4}}? Commented Mar 24, 2017 at 14:02
  • 1
    Well this is a MWE, the complete \lip command is way more complicated than that :p Commented Mar 24, 2017 at 14:05
  • @FabianPijcke: Are you open to \slip{ |a| {1} |b| {2}}\]?
    – user31729
    Commented Mar 24, 2017 at 14:09
  • @StevenB.Segletes, the \slip definition is fine except that the optional arguments (those between vertical bars) are no longer optional in slip. Commented Mar 24, 2017 at 14:10

1 Answer 1

3

Apart from the doubts about \eset (it's wrong to begin with, in my opinion), you can incorporate it in \lip:

\documentclass{article}

\usepackage{xparse}

\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}

\ExplSyntaxOn
\NewDocumentCommand \lip {s D||{A} m D||{B} m }
 {
  \IfBooleanTF{#1}
   { \eset{#2^#3, #4^#5} }
   { #2^#3, #4^#5 }
 }
\NewDocumentCommand \slip {} { \lip* }
\ExplSyntaxOff

\begin{document}

\[\lip |a| {1} |b| {2}\]

\[\slip |a| {1} |b| {2}\]

\end{document}

Avoid using a wealth of optional arguments: you'll lose yourself in trying to remember them.

In this particular case I see no connection between the syntax and the output, so a simpler

\NewDocumentCommand \lip {s O{A} m O{B} m }
 {
  \IfBooleanTF{#1}
   { \eset{#2^#3, #4^#5} }
   { #2^#3, #4^#5 }
 }

with calls \lip{x}{y}, \lip[u]{x}{y}, \lip{x}[v]{y} or \lip[u]{x}[v]{y} would do better.

Why is the definition of \eset wrong? Because it's generally wrong to apply \left and \right indiscriminately.

If you want to accommodate other variants, you can use a slightly different strategy:

\documentclass{article}

\usepackage{xparse}

\newcommand{\eset}[1]{\mathchoice{\left \{#1\right \}}{\{#1\}}{\{#1\}}{\{#1\}}}
\newcommand{\bset}[1]{[#1]}

\ExplSyntaxOn
\NewDocumentCommand \lip {o D||{A} m D||{B} m }
 {
  \IfNoValueTF{#1}
   { #2^#3, #4^#5 }
   { #1{#2^#3, #4^#5} }
 }
\NewDocumentCommand \slip {} { \lip[\eset] }
\NewDocumentCommand \blip {} { \lip[\bset] }
\ExplSyntaxOff

\begin{document}

\[\lip |a| {1} |b| {2}\]

\[\slip |a| {1} |b| {2}\]

\[\blip |a| {1} |b| {2}\]

\end{document}

enter image description here

1
  • In the lip definition, each argument between vertical bars is directly related to the mandatory argument it is followed by, so I don't think it is problematic (which is why I avoided the standard square brackets notation). Besides I had several variations in mind (slip, Slip, rlip, Rlip, etc.), so your star notation, which I happily agree on its usefulness, is not exactly what I want :-( Thank you for your suggestion anyway, it is relevant to the question and deserves upvotes! Commented Mar 24, 2017 at 15:07

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .