14

I refer to this question and particularly to this answer. I defined \set by

\usepackage{mathtools}
...
\DeclarePairedDelimiterX\set[2]{\{}{\}}{#1 \mathrel{\delimsize|} #2}

where \mathrel{\delimsize|} imitates \mid, which itself is of math relation type but not scaleable.

Although \set[\big]{...}{...}, \set[\Big]{...}{...} etc. work fine, the starred-form \set*{...}{...} does not. The problem is that, in this case, \delimsize expands to \middle and \mathrel{\middle|} leads to an error, which can easily be reproduced:

\left\{x \mathrel{\middle|} y\right\}

I could define \set alternatively like

\DeclarePairedDelimiterX\setnew[2]{\{}{\}}{#1 \;\delimsize|\; #2}

which should produce in most cases the same spaces around | as the version above. However, there is a difference if a set is in scriptstyle:

A_{\set{x}{y}}

puts no spaces around |, whereas

A_{\setnew{x}{y}}

still prints \;|\;.

Do you know a way to make \mathrel and \middle compatible?

1

2 Answers 2

17

No space is inserted in script or scriptscript styles if you precede \; with \nonscript:

\DeclarePairedDelimiterX\setnew[2]{\{}{\}}{%
  #1 \mathclose{}\nonscript\;\delimsize|\nonscript\;\mathopen{} #2%
}

Another solution that avoids \nonscript is

\DeclarePairedDelimiterX\set[2]{\{}{\}}
  {#1 \mathrel{}\mathclose{}\delimsize|\mathopen{}\mathrel{} #2}
8
  • Thanks, this solved my problem :-) In addition, if anyone knows a solution for the other version, \set, I would be glad if you posted it, too.
    – aulste
    Aug 10, 2011 at 18:18
  • 3
    \left, \right and \middle must be at the same brace level.
    – egreg
    Aug 10, 2011 at 21:32
  • See edited answer.
    – egreg
    Aug 10, 2011 at 21:53
  • Great! Your second solution is exactly what I wanted. Thank you!
    – aulste
    Aug 11, 2011 at 13:40
  • 1
    @pglpm see the mathtools manual for the one arg \Set macro, it adds \mathopen for that very reason.
    – daleif
    Jan 20, 2019 at 11:22
2

If you are comfortable in using the alternative spacing you suggest:

\DeclarePairedDelimiterX\setnew[2]{\{}{\}}{#1 \;\delimsize|\; #2}

rather than

\DeclarePairedDelimiterX\set[2]{\{}{\}}{#1 \mathrel{\delimsize|} #2}

then try adding

\usepackage{etex}

in your document preamble. \middle is part of an etex extension.

1
  • Thanks for your suggestion. I would prefer \set to \setnew. Unfortunately, adding \usepackage{etex} didn't have an effect on both versions. The problem is not that the \middle command doesn't work but that it causes an error if I put \mathrel{...} around it.
    – aulste
    Aug 10, 2011 at 14:38

You must log in to answer this question.

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