5

I need to write some equations that contain something like (A | B).

I could write \left( A \middle| \right), but this changes spacing around external parentheses, as expained in many topics like this.

There is a nice working solution with \DeclarePairedLimiterX as explained in this answer. However, for many reasons I would like to use \middle| and fix the spacing around it (so that it is the same as around \mid), in the same way as \left and \right are fixed in this answer or by the package mleftright (see this answer). In other words, I would like | to stretch like \middle| and to have the same spacing as \mid. Is it possible? I'm using mathtools.

Thank you!

1
  • Honestly, I've always just used the lazy solution: \,\middle|\,. May 16, 2018 at 8:57

3 Answers 3

7

An engine-independent solution (albeit one I still have a murky feeling about...)

\documentclass[12pt]{article}

\let\originalmiddle=\middle
\def\middle#1{\mathrel{}\originalmiddle#1\mathrel{}}

\begin{document}

\[
(A \mid B)
\left(A \middle| B\right)
\left(\frac{A}{B} \middle\Vert C_{(A \mid B) \left( A \middle| B \right)} \right)
\]

\end{document}

enter image description here

5
  • +1. And it works with LuaLaTeX too, not just pdfLaTeX...
    – Mico
    May 16, 2018 at 7:37
  • 1
    @Mico Well, yes, I meant that Henri's solution depends on lua code while this one doesn't. I'll rephrase.
    – campa
    May 16, 2018 at 7:39
  • Thank you, very simple and also similar to the fixes I used for left and right May 16, 2018 at 13:23
  • 1
    @Taekwondavide Maybe instead of redefining \middle (I'm always cautious about redefining TeX primitives) you might want to define something like \mmiddle (like \mleft/\mright).
    – campa
    May 16, 2018 at 15:26
  • 1
    Thank you. I'm considering that, I'm still in doubt about using redefined \middle and \originalmiddle or \mmiddle and original \middle. I guess I have to check whether any package is using \middle or not May 16, 2018 at 16:05
5

You can use some Lua magic.

The three snippets below are one file. They are only split up because Stack Exchange does not support mixed highlighting.

\documentclass{article}
\usepackage{luacode}

\begin{luacode*}
local noad_id = node.id("noad")
local fence_id = node.id("fence")
local inner_subtype = 9 -- see texnodes.w
local middle_subtype = 2 -- see texnodes.w

local function is_vert(delim)
    return delim.small_fam == 2
        and delim.small_char == 106
        and delim.large_fam == 3
        and delim.large_char == 12
end

local kern = node.new("kern",99) -- 99 = math kern
kern.kern = 5 * 2^16 -- 5 pt (TODO: load this value from the font)

local function adjust_mid_spacing(head)
    for n in node.traverse(head) do
        if n and n.nucleus and n.nucleus.head then
            adjust_mid_spacing(n.nucleus.head)
        elseif n.id == fence_id and n.subtype == middle_subtype then
            if is_vert(n.delim) then
                node.insert_before(head,n,node.copy(kern))
                node.insert_after(head,n,node.copy(kern))
            end
        end
    end
    return head
end

luatexbase.add_to_callback("mlist_to_hlist",
                           function(head, display_type, need_penalties)
                               head = adjust_mid_spacing(head)
                               return node.mlist_to_hlist(head, display_type, need_penalties)
                           end,
                           "adjust spacing around mid")  
\end{luacode*}

\begin{document}

$\left( A \middle| B \right)_{\left( A \middle| B \right)_{\left( A \middle| B \right)}}$

$(A \mid B)_{(A \mid B)_{(A \mid B)}}$

\end{document}

enter image description here

1
  • I think it's simpler in luatex (Umiddle class 2) May 16, 2018 at 8:18
5

luatex allows the mathclass to be specified on delimiters and you want 2 (mathbin) here.

enter image description here

\documentclass{article}

\begin{document}


$\left( A \middle| B \right)$



$\Uleft( A \Umiddle class 2 | B \Uright)$



\end{document}
5
  • the spacing looks off to me and if you omit the B you get a "this can't happen" error and no output, but I expect those issues will get fixed, luatex is under very active development. May 16, 2018 at 8:41
  • Cool. Wouldn't mathrel be more appropriate here though? I think \mid has class 3. May 16, 2018 at 8:43
  • @Circumscribe possibly (I think spacing is a bit wrong for that as well so it's not too important at the moment which you pick:-) May 16, 2018 at 8:46
  • Thank you! I don't know luatex, is it 100% compatible with latex and texlive/miktex? May 16, 2018 at 15:59
  • 1
    luatex is included in both texlive and miktex as an alternative to pdftex, it is not 100% compatible. Like xetex it uses (mostly) Unicode fonts installed in the system rather than specific tex-encoded fonts, however most latex documents can be used with xelatex or lualatex with small changes, we have answers on this site giving the differences @Taekwondavide May 16, 2018 at 16:02

You must log in to answer this question.

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