10

I have to typeset certain formulas, and the notation involves stretchable boxes, pretty much like \boxed{X} makes, but occasionally I need to add a hat below and/or above, as the picture shows:

A fancy box

(Symbols in this fancy box should be on the baseline.)

I usually find anything I want in "The Comprehensive LaTeX Symbol List", but this time I think it's too special. Any ideas how I can implement this?

Thank you for suggestions!

8

A solution using tikz with lots of configuration options:

  • above: draw hat above box
  • below: draw hat below box
  • rule: line thickness
  • sep: distance between contents and frame (inner sep/\fboxsep)
  • height: height of the hat
  • drawcolor: color of the lines/frame/hat
  • textcolor: color of the text/math inside the frame
  • mathstyle: math style, default is \displaystyle as in \boxed of amsmath
  • bold: make math bold (\boldmath)
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{kvoptions}
\usepackage{kvsetkeys}

\makeatletter
\SetupKeyvalOptions{
  family=boxedhat,
  prefix=boxedhat@,
  setkeys=\kvsetkeys,
}
\newcommand*{\boxedhatsetup}{\kvsetkeys{boxedhat}}
\DeclareBoolOption[true]{above}
\DeclareBoolOption[true]{below}
\DeclareBoolOption[false]{bold}
\DeclareStringOption[\fboxsep]{sep}
\DeclareStringOption[\fboxrule]{rule}
\DeclareStringOption[1ex]{height}
\DeclareStringOption[\displaystyle]{mathstyle}
\DeclareStringOption[]{drawcolor}
\DeclareStringOption[.]{textcolor}

\newsavebox\boxedhat@box
\newcommand*{\boxedhat}[2][]{%
  \begingroup
    \boxedhatsetup{#1}%
    \tikz[baseline=(X.base)]
      \draw[draw={\boxedhat@drawcolor}]
        let
          \n{sep}={\boxedhat@sep},
          \n{rule}={\boxedhat@rule}
        in
          [line width=\n{rule}]
          node[
            rectangle,
            draw,
            inner sep=\n{sep},
            text={\boxedhat@textcolor},
          ] (X) {%
            \global\setbox\boxedhat@box=\hbox{%
              \begingroup % because of \boldmath and color
                \m@th
                \ifboxedhat@bold
                  \boldmath
                \fi
                $\boxedhat@mathstyle#2$%
              \endgroup
            }%
            \copy\boxedhat@box
          }
        \pgfextra{%
          \def\width{\wd\boxedhat@box}%
          \def\height{\ht\boxedhat@box}%
          \def\depth{\dp\boxedhat@box}%
          \def\totalheight{\dimexpr\ht\boxedhat@box+\dp\boxedhat@box\relax}%
        }%
        let
          \n{hatheight}={\boxedhat@height},
          \p{ul}=($(X.north west) + (.5*\n{rule},0)$),
          \p{uc}=(X.north),
          \p{ur}=($(X.north east) + (-.5*\n{rule},0)$),
          \p{top}=(\x{uc}, \y{uc} + \n{hatheight}),
          \p{ll}=($(X.south west) + (.5*\n{rule},0)$),
          \p{lc}=(X.south),
          \p{lr}=($(X.south east) + (-.5*\n{rule},0)$),
          \p{bottom}=(\x{lc}, \y{lc} - \n{hatheight})
        in
          \ifboxedhat@above
            (\p{ll}) -- (\p{ul}) -- (\p{top}) -- (\p{ur}) -- (\p{lr})
          \fi
          \ifboxedhat@below
            (\p{ul}) -- (\p{ll}) -- (\p{bottom}) -- (\p{lr}) -- (\p{ur})
          \fi
      ;%
  \endgroup
}
\makeatother

\boxedhatsetup{sep=.75\fboxsep}

\begin{document}
\[
  \boxedhat[above=false, drawcolor=blue]{x}
  < \boxedhat[rule=1pt,sep=1ex,bold,height=.5\height+1ex]{y'}
  = \boxedhat[textcolor=red]{\sum_{i=1}^{\infty}\frac{1}{n^2}}
  < \boxedhat[below=false, drawcolor=blue]{z}
\]
\end{document}

Result

  • Thank you very much! This looks great and that's what I had in mind. I used to draw everything in MetaPost, so I am not familiar with TikZ. – user45435 Feb 5 '14 at 10:28
12

Here's an option with tcolorbox; each one of the three commands \Hatup, \Hatdown, and \Hatupdown has an optional argument allowing you to use the features provided by the package to control the attributes:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tcolorbox}
\tcbuselibrary{most}
\usetikzlibrary{calc}

\makeatletter
\tcbset{
  up/.style={
    enhanced,
    boxrule=0.4pt,
    arc=0pt,
    outer arc=0pt,
    colframe=black,
    colback=white,
    boxsep=0pt,
    left=\fboxsep,
    right=\fboxsep,
    top=\fboxsep,
    bottom=\fboxsep,
    overlay={\draw[\kvtcb@colframe,line width=\kvtcb@left@rule] (frame.north west) -- ([yshift=1ex]$ (frame.north west)!0.5!(frame.north east) $ ) -- (frame.north east);}
  },
  down/.style={
    enhanced,
    boxrule=0.4pt,
    arc=0pt,
    outer arc=0pt,
    colframe=black,
    colback=white,
    boxsep=0pt,
    left=\fboxsep,
    right=\fboxsep,
    top=\fboxsep,
    bottom=\fboxsep,
    overlay={\draw[\kvtcb@colframe,line width=\kvtcb@left@rule] (frame.south west) -- ([yshift=-1ex]$ (frame.south west)!0.5!(frame.south east) $ ) -- (frame.south east);}
  },
  updown/.style={
    enhanced,
    boxrule=0.4pt,
    arc=0pt,
    outer arc=0pt,
    colframe=black,
    colback=white,
    boxsep=0pt,
    left=\fboxsep,
    right=\fboxsep,
    top=\fboxsep,
    bottom=\fboxsep,
    overlay={
      \draw[\kvtcb@colframe,line width=\kvtcb@left@rule] (frame.south west) -- ([yshift=-1ex]$ (frame.south west)!0.5!(frame.south east) $ ) -- (frame.south east);
      \draw[\kvtcb@colframe,line width=\kvtcb@left@rule] (frame.north west) -- ([yshift=1ex]$ (frame.north west)!0.5!(frame.north east) $ ) -- (frame.north east);}
  }
}
\makeatother

\newcommand\Hatup[2][]{\tcbhighmath[up,#1]{#2}}
\newcommand\Hatdown[2][]{\tcbhighmath[down,#1]{#2}}
\newcommand\Hatupdown[2][]{\tcbhighmath[updown,#1]{#2}}

\begin{document}

\[
a = \Hatup{b + c^{2}}\quad 
a = \Hatdown{b + c^{2}}\quad
a = \Hatupdown{b + c^{2}}
\]

\begin{align*}
\Hatup[colframe=red!80!black,boxrule=1pt]{\int x^{2}\,\textrm{d}x = \frac{1}{3} x^{3} + c} &= \Hatup{\sum_{i=i}^{n}a_{i}} 
\\[1ex]
\Hatupdown[coltext=orange]{\int x^{2}\,\textrm{d}x = \frac{1}{3} x^{3} + c} &= \Hatdown[colframe=cyan,boxrule=1pt]{\sum_{i=i}^{n}a_{i}}
\end{align*}

\end{document}

enter image description here

4

With PSTricks just for fun as usual.

\documentclass[preview,border=12pt]{standalone}
\usepackage{pst-node}

\psset{linewidth=\fboxrule}
\newcommand\mybox[2][4pt]{%
    \psDefBoxNodes{A}{\fbox{#2}}%
    \pspolygon(A:tl)([offset=#1]A:tC)(A:tr)(A:br)([offset=-#1]A:bC)(A:bl)}

\begin{document}
\mybox{Weirdstress Function}
\end{document}

enter image description here

Miscellaneous

Anything can be boxed.

\documentclass[preview,border=12pt]{standalone}
\usepackage{pst-node}

\psset{linewidth=\fboxrule}
\newcommand\mybox[2][4pt]{%
    \psDefBoxNodes{A}{\fbox{#2}}%
    \pspolygon(A:tl)([offset=#1]A:tC)(A:tr)(A:br)([offset=-#1]A:bC)(A:bl)}

\begin{document}
\mybox[6pt]{\parbox{4cm}{The Weirdstress function, \[\sum_{k=0}^\infty a^k \tan (b^k \pi x)\] in action.}}
\end{document}

enter image description here

  • +1 Is it possible to add math equations/symbols inside box like above examples – texenthusiast Feb 5 '14 at 4:38
  • @texenthusiast: yes of course, anything can be boxed. – kiss my armpit Feb 5 '14 at 4:39
  • In my opinion the requested top or bottom hat does not look aesthetically good no matter who creates the box. Sorry for this opinion and thank you for your cooperation. – kiss my armpit Feb 5 '14 at 7:00
3

I use stackengine to place the "hats" (I actually use triangles) above and below the item. I use \scalerel to stretch them. The length \trihite determines the height of the triangle hats.

\documentclass{article}
\usepackage{scalerel}
\usepackage{stackengine}
\stackMath
\renewcommand\useanchorwidth{T}
\usepackage{cmll}
\newlength\trihite
\setlength\trihite{8.8889pt}
\newsavebox\mybox
\newlength\boxwidth
\newcommand\underhat[1]{%
  \fboxrule .5pt%
  \sbox\mybox{\framebox{$#1$}}%
  \setlength\boxwidth{\wd\mybox}%
  \mathop{\stackunder[-2.2pt]{\framebox{$#1$}}{%
    \stretchto{\scaleto{\bigtriangledown}{1.15\boxwidth}}{\the\trihite}}}%
}
\newcommand\overhat[1]{%
  \fboxrule .5pt%
  \sbox\mybox{\framebox{$#1$}}%
  \setlength\boxwidth{\wd\mybox}%
  \mathop{\stackon[-2.3pt]{\framebox{$#1$}}{%
    \stretchto{\scaleto{\bigtriangleup}{1.15\boxwidth}}{\the\trihite}}}%
}
\newcommand\overunderhat[1]{%
  \fboxrule .5pt%
  \sbox\mybox{\framebox{$#1$}}%
  \setlength\boxwidth{\wd\mybox}%
  \mathop{\stackunder[-2.2pt]{%
    \stackon[-2.3pt]{\framebox{$#1$}}{%
      \stretchto{\scaleto{\bigtriangleup}{1.15\boxwidth}}{\the\trihite}}%
  }{%
      \stretchto{\scaleto{\bigtriangledown}{1.15\boxwidth}}{\the\trihite}}}%
}
\begin{document}
$\underhat{xxx} x \overhat{xxxxx} y \overunderhat{x}$
\end{document}

enter image description here

Your Answer

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