1

I'd like to set up a macro able to add parenthesis if the argument has already one superscript. It similar to this question, unfortunately the compilation of the following MWE doesn't end…

\documentclass[11pt]{article}

\usepackage{xparse}
\RequirePackage{unicode-math}
\usepackage{listofitems}
\NewDocumentCommand{\dans}{mG{\BbbR}e{^}}{%
    \ensuremath{#1\in\IfValueTF{#3}{{\left(#2\right)}^{#3}}{#2}}%
    }
\NewDocumentCommand{\Dans}{mG{\BbbR}e{^}}{%
    \setsepchar{_||^}%
    \readlist\mymat{#2}%
    \ensuremath{#1\in\IfValueTF{#3}{\ifnum\mymatlen>1\left(#2\right)^{#3}\else#2^{#3}\fi}{#2}}%
    }


\begin{document}
    \dans{x}, \dans{(x, y)}{\BbbC^2}, \dans{(x, y)}{\BbbC}^2, \dans{(x, y)}{\BbbC^\star}^2

    %\Dans{x}, \Dans{(x, y)}{\BbbC^2}, \Dans{(x, y)}{\BbbC}^2, \Dans{(x, y)}{\BbbC^\star}^2
\end{document}

Problem arises when uncommenting the line.

enter image description here

NBur
  • 4,326
  • 10
  • 27
  • Do you plan to use also subscripts in the optional argument to \dans? – egreg Oct 19 '18 at 20:40
  • This may occur… At least within the G argument. – NBur Oct 19 '18 at 20:41
  • And what should happen with \dans{(x,y)}{\BbbR_+}^2? Do you want parentheses or not? – egreg Oct 19 '18 at 20:42
  • Actually I won't have this problem since I choose to denote \BbbR^+ and \BbbR^{+\star}! But \BbbR_+^2 is readable without parenthesis, isn't it? – NBur Oct 19 '18 at 20:47

1 Answers1

1

Using expl3 to check for an ^ inside of the second argument with \tl_if_in:nnTF, one could add the braces based on this test:

\documentclass[11pt]{article}

\usepackage{unicode-math}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \NBur_superscript:n #1
  {
    \tl_if_in:nnTF { #1 } { ^ }
      { \left( #1 \right) }
      { #1 }
  }
\NewDocumentCommand{\dans}{mG{\BbbC}e{^}}
  {%
    \ensuremath
      {%
        #1\in\IfValueTF{#3}{\NBur_superscript:n{#2}^{#3}}{#2}%
      }%
  }
\ExplSyntaxOff

\begin{document}
\dans{x}^2,
\dans{x}{A}^2,
\dans{x}{A^*}^2
\end{document}

enter image description here

If you hide the superscript inside a macro above test won't find it. A possible solution would be to fully expand the argument, in order to look for superscript chars then:

\documentclass[11pt]{article}

\usepackage{unicode-math}
\usepackage{xparse}
\newcommand\Test{A^*}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_if_in:nnTF { xnTF }
\cs_new:Npn \NBur_superscript:n #1
  {
    \tl_if_in:xnTF { #1 } { ^ }
      { \left( #1 \right) }
      { #1 }
  }
\NewDocumentCommand{\dans}{mG{\BbbC}e{^}}
  {%
    \ensuremath
      {%
        #1\in\IfValueTF{#3}{\NBur_superscript:n{#2}^{#3}}{#2}%
      }%
  }
\ExplSyntaxOff

\begin{document}
\dans{x}^2,
\dans{x}{A}^2,
\dans{x}{A^*}^2
\dans{x}{\Test}^2
\end{document}

enter image description here

The above still might fail, e.g. if the superscript is hidden inside something unexpandable or if something shouldn't be expanded there (the former leading to wrong behaviour, the latter possibly to an error or really bad behaviour). The latter should be rare with normal use cases (I hope).

Skillmon
  • 60,462