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}
David Carlisle
  • 757,742
kahen
  • 2,165
  • The spacing is excessive: \def\mathcrel#1{\mathrel{#1}} and \def\midrel#1{\nonscript\;\middle#1\nonscript\;} are sufficient. – egreg May 02 '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. – Philippe Goutet May 02 '12 at 12:02
  • @PhilippeGoutet Why not? It is a \mathrel no matter what #1 is. – egreg May 02 '12 at 12:14
  • @egreg: \mathcrel yes, but not \midrel. – Philippe Goutet May 02 '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 02 '12 at 13:21
  • @egreg: in that case, you should be using \def\mathcrel#1{\nonscript\;\mathclose{}#1\mathopen{}\nonscript\;} – Philippe Goutet May 02 '12 at 13:35

2 Answers2

5

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

 \def\midrel#1{\mathcrel{{}\middle#1{}}}
David Carlisle
  • 757,742
2

What is wrong with

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

or similar spacing around the \vert

daleif
  • 54,450
  • 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 02 '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 02 '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 03 '12 at 06: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 03 '12 at 11:19