1

Following the lead of this answer and the interface of mathtools.sty's \DeclarePairedDelimiter macro, I've made a \setof<*|[<size>]|>#1#2 that uses setbuilder notation for a set. But I cannot for the life of me understand why the third setbuilder lines up with the first one rather than the second one.

\documentclass[12pt]{article}
\usepackage{amsmath}
\makeatletter
\def\mathcrel#1{\mathrel{}#1\mathrel{}}
\def\midrel#1{\mathcrel{\middle#1}}
\let\setbuilder|
\def\setof{%
  \@ifstar
    \setof@S
    {\@ifnextchar[%]
      \setof@B
      \setof@N}}
\def\setof@S#1#2{\left\lbrace #1 \midrel\setbuilder #2 \right\rbrace}
\def\setof@B[#1]#2#3{\mathopen #1\lbrace #2 \mathcrel{#1\setbuilder} #3 \mathclose #1\rbrace}
\def\setof@N#1#2{\lbrace #1 \mathcrel\setbuilder #2\rbrace}
\makeatother

\def\CC{\mathbf C}\def\NN{\mathbf N}
\begin{document}
\begin{align*}
\ell^\infty &= \setof{(x_n) \in \CC^\NN}{\sup_{n\in\NN} |x_n| < \infty}. \\
\ell^\infty &= \setof[\bigg]{(x_n) \in \CC^\NN}{\sup_{n\in\NN} |x_n| < \infty}. \\
\ell^\infty &= \setof*{(x_n) \in \CC^\NN}{\sup_{n\in\NN} |x_n| < \infty}.
\end{align*}
\end{document}
6
  • The spacing is excessive: \def\mathcrel#1{\mathrel{#1}} and \def\midrel#1{\nonscript\;\middle#1\nonscript\;} are sufficient.
    – egreg
    May 2 '12 at 11:36
  • Just change \mathcrel to \def\mathcrel#1{\mathrel{}\mathclose{}#1\mathopen{}\mathrel{}}. That's necessary because, with your code, #1 might not be a relation so you must kill the spacing using mathopen/mathclose. @egreg: what you propose will not always give the same spacing as a mathrel. May 2 '12 at 12:02
  • @PhilippeGoutet Why not? It is a \mathrel no matter what #1 is.
    – egreg
    May 2 '12 at 12:14
  • @egreg: \mathcrel yes, but not \midrel. May 2 '12 at 13:04
  • @PhilippeGoutet It depends on which contexts it's used. The vertical bar in the set notation should always be surrounded by thick spaces (in text or display style), so it's not really a relation in TeXnical sense.
    – egreg
    May 2 '12 at 13:21
5

the second two lines line up if you change the definition to

 \def\midrel#1{\mathcrel{{}\middle#1{}}}
2

What is wrong with

\usepackage{mathtools}
\DeclarePairedDelimiterX\setof[2]\lbrace\rbrace{#1\,\delimsize\vert\,#2}

or similar spacing around the \vert

4
  • As much as I like \DeclarePairedDelimiter I'm trying to move away from it because it does "wrong" things such as this: \DeclarePairedDelimiter\abs\lvert\rvert \def\amsabs#1{\left\lvert#1\right\rvert} \[ \sup_{x \in X} |f(x)| \text{ versus } \sup_{y\in Y} \abs{f(y)} \text{ versus } \sup_{z \in Z} \amsabs{f(z)} \] - it kills the spacing between the modulus and the "sup".
    – kahen
    May 2 '12 at 10:46
  • 1
    As it should, the space produced by \sub\bigl( and \sub\left( should be the same for consistency. Besides |...| is wrong anyways \lvert-1\rvert \neq |-1|
    – daleif
    May 2 '12 at 10:59
  • I agree that |...| is wrong, but it's still the case that $\sup_{z\in Z} \left\lvert f(z)\right\rvert$ produces a small space between the modulus and the "sup" and the same thing made with \DeclarePairedDelimiter doesn't and that just looks wrong to me
    – kahen
    May 3 '12 at 6:01
  • That is not \DeclarePairedDelimiters fault, it is \left not producing an opening fence. In \DeclarePairedDelimiter we make sure it does produce something that validates as an opening fence.
    – daleif
    May 3 '12 at 11:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.