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

4
  • Do you plan to use also subscripts in the optional argument to \dans?
    – egreg
    Oct 19, 2018 at 20:40
  • This may occur… At least within the G argument.
    – NBur
    Oct 19, 2018 at 20:41
  • And what should happen with \dans{(x,y)}{\BbbR_+}^2? Do you want parentheses or not?
    – egreg
    Oct 19, 2018 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, 2018 at 20:47

1 Answer 1

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).

0

You must log in to answer this question.

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