How to make a plus sign with arrowheads on each of the four endpoints?
Simple overlapping
The overlapping of the symbols \leftrightarrow
and \updownarrow
can be done with
\ooalign
:
\ooalign{$\leftrightarrow$\cr\hfil$\updownarrow$\hfil}
Some additional work is needed:
- Adapting to different math styles. The formula above would always use
\textstyle
. - If
\mathsurround
is set, then the additional space would be added above to the left and right. This can be cured by\m@th
that sets\mathsurround
to zero. - The symbol is used as binary operator, putting it in
\mathbin
notifies TeX to put additinal space for binary operators.
File:
\documentclass{article}
% \usepackage{txfonts} % similar \usepacakge{pxfonts}
% \usepackage{mathabx}
% \usepackage{MnSymbol}
\makeatletter
\newcommand*{\extendadd}{%
\mathbin{%
\mathpalette\extend@add{}%
}%
}
\newcommand*{\extend@add}[2]{%
\ooalign{%
$\m@th#1\leftrightarrow$%
\vphantom{$\m@th#1\updownarrow$}% fix the height
\cr
\hfil$\m@th#1\updownarrow$\hfil
}%
}
\makeatother
% for testing the bounding box of the symbol
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.2pt}
\begin{document}
\[
\mathcal{F}_\mathbf{i} =
\mathcal{F}_\mathbf{i}^0
\extendadd
\mathcal{U}_{\mathbf{c}_1}
\extendadd
\mathcal{U}_{\mathbf{c}_2}
\qquad
\fbox{$\extendadd$}^{\extendadd^{\extendadd}}
\]
\end{document}
Result for CM fonts:
Result for package txfonts
:
Result for package mathabx
:
Result for package MnSymbol
:
Observations:
- The arrow heads are too large.
- Depending on the font and size
\updownarrow
might have a smaller total height than the width of\leftrightarrow
.
Overlapping with resizing
The idea is to resize \longleftrightarrow
to the width of \leftrightarrow
to get
smaller arrow heads. However, this will also make the lines thinner.
The tricky part is that scaling also changes the vertical position of the symbol.
Because of the arrows the height of the character bounding box \leftrightarrow
is not too helpful. But we can assume the symbol is vertically centered respective to the mathematical axis. Therefore the code below puts \leftrightarrow
to the base line, resizes it and moves it back to the mathematical axis.
to the mathematical axis.
The vertical double arrow cannot generated the same way. First the symbol \longupdownarrow
is missing. Also we have seen above, that the symbol might be
too small in comparison with the \leftrightarrow
. Therefore the symbol is generated by rotating the horizontal double arrow.
\documentclass{article}
% \usepackage{txfonts}
% \usepackage{pxfonts}
% \usepackage{mathabx}
% \usepackage{MnSymbol}
\usepackage{graphicx}% (only graphics is needed)
\makeatletter
\newdimen\extend@width
\newdimen\extend@mathaxis
\newcommand*{\extendadd}{%
\mathbin{%
\mathpalette\extend@add{}%
}%
}
\newcommand{\extend@add}[2]{%
\m@th
\sbox0{$#1\vcenter{}\smash{\leftrightarrow}$}%
\extend@width=\wd0 %
\extend@mathaxis=\ht0 %
\sbox0{%
\resizebox{\extend@width}{!}{%
\raisebox{-\extend@mathaxis}{$#1\longleftrightarrow$}%
}%
}%
\rlap{%
\raisebox{\extend@mathaxis}{%
\copy0 %
}%
}%
\dp0=0pt %
\ht0=0pt %
\hbox to\extend@width{%
\hfil
$#1%
\vcenter{%
\hbox{%
\rotatebox{90}{\copy0}%
}%
}%
$%
\hfil
}%
}
\makeatother
% for testing the bounding box of the symbol
\setlength{\fboxsep}{0pt}
\setlength{\fboxrule}{.2pt}
\begin{document}
\[
\mathcal{F}_\mathbf{i} =
\mathcal{F}_\mathbf{i}^0
\extendadd
\mathcal{U}_{\mathbf{c}_1}
\extendadd
\mathcal{U}_{\mathbf{c}_2}
\qquad
\fbox{$\extendadd$}^{\extendadd^{\extendadd}}
\]
\end{document}
Result for CM fonts:
Result for package txfonts
:
Result for package mathabx
:
Result for package MnSymbol
:
It is also possible to have something in between, less scaling, by composing
a smaller \longleftrightarrow
from \leftarrow
and \rightarrow
as base for the resized double arrow.
TikZ solutions
Same sized
Code
\documentclass{article}
\usepackage{amsmath}
\usepackage{graphicx,calc}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\makeatletter
%% internal macros
\newlength\jack@depth
\def\jack@factor{0.2} % adjust this for the size of arrows
\def\jack@arrow{to}
\def\jack@arrowshorten{3}
% external macro
\newcommand*\extendadd{\mathbin{\mskip1mu\mathpalette\jack@extendadd{}\mskip1mu}}
\def\jack@extendadd#1{\ifx#1\scriptstyle\def\jack@linewidth{.6pt/\jack@factor}
\else\ifx#1\scriptscriptstyle\def\jack@linewidth{.62pt/\jack@factor}
\else \def\jack@linewidth{.54pt/\jack@factor}
\fi\fi
\setlength{\jack@depth}{\depthof{$#1+$}}
\raisebox{-\jack@depth}{\resizebox{!}{\heightof{$#1+$}+\depthof{$#1+$}}{\jack@plusarrow}}
}
\def\jack@plusarrow{%
\begin{tikzpicture}
\begin{scope}[
\jack@arrow-\jack@arrow,
shorten >=-\jack@arrowshorten\pgflinewidth,
shorten <=-\jack@arrowshorten\pgflinewidth
]
\draw[line width=\jack@linewidth] (1ex/\jack@factor,0) -- (-1ex/\jack@factor,0);
\draw[line width=\jack@linewidth] (0,1ex/\jack@factor) -- (0,-1ex/\jack@factor);
\end{scope}
\end{tikzpicture}%
}
\makeatother
\setlength\fboxsep{0pt}\setlength\fboxrule{.2pt}
\begin{document}\noindent
$ \fbox{+}\fbox{$\extendadd$}_{+\extendadd_{+\extendadd}} $\\
\makeatletter
\foreach \arrow in {to,stealth',angle 90} {+%
\foreach \factor in {.1,.2,...,1.01} {%
\renewcommand*\jack@factor{\factor}%
\renewcommand*\jack@arrow{\arrow}%
\renewcommand*\jack@arrowshorten{3/\factor*.2}%
${\extendadd}$%
}\\}
\makeatother
\end{document}
Output
Bigger than normal plus sign
Code
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\plusarrowlength{2.5pt}
\newcommand{\plusarrow}{\mathbin{\text{$
\begin{tikzpicture}[
baseline,
% opacity=.7 % debugging (doesn't have any effect when \phantom is used)
]
\node[
inner xsep=-1pt,
inner ysep=-.5pt,
outer sep=0pt,
anchor=base
] (plus) {\phantom{+}};
\begin{scope}[to-to]
\draw ($(plus.west)+(-\plusarrowlength,0)$) -- ($(plus.east)+(\plusarrowlength,0)$);
\draw ($(plus.north)+(0,\plusarrowlength)$) -- ($(plus.south)+(0,-\plusarrowlength)$);
\end{scope}
\end{tikzpicture}$}}}
\begin{document}\noindent
$ \plusarrow_{\plusarrow_{\plusarrow}} $ \\
$ +_{+_+} $
\end{document}
Output
Extra arrow tip
Code
\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\newdimen\arrowsize
\pgfarrowsdeclare{arcs}{arcs}{
\arrowsize=0.2pt
\advance\arrowsize by .5\pgflinewidth
\pgfarrowsleftextend{-4\arrowsize-.5\pgflinewidth}
\pgfarrowsrightextend{.5\pgflinewidth}
}{
\arrowsize=2\pgflinewidth
\pgfsetdash{}{0pt}
\pgfsetroundjoin
\pgfsetroundcap
\pgfpathmoveto{\pgfpoint{-\arrowsize}{\arrowsize}}
\pgfpatharc{180}{270}{\arrowsize}
\pgfpatharc{90}{180}{\arrowsize}
\pgfusepathqstroke
}
\makeatletter
\newcommand\extendadd{\mathbin{\mskip1mu\mathpalette\plusarrow{}\mskip1mu}}
\newcommand{\plusarrow}[1]{
\ifx#1\displaystyle
\def\jack@innerxsep{-.55pt}
\def\jack@innerysep{0pt}
\def\jack@linewidth{.4pt}
\else\ifx#1\textstyle
\def\jack@innerxsep{-.55pt}
\def\jack@innerysep{0pt}
\def\jack@linewidth{.4pt}
\else\ifx#1\scriptstyle
\def\jack@innerxsep{-.5pt}
\def\jack@innerysep{0pt}
\def\jack@linewidth{.35pt}
\else
\def\jack@innerxsep{-.5pt}
\def\jack@innerysep{0pt}
\def\jack@linewidth{.3pt}
\fi
\fi
\fi
\begin{tikzpicture}[
baseline,
% opacity=.7 % debugging (doesn't have any effect when \phantom is used)
]
\node[
inner xsep=\jack@innerxsep,
inner ysep=\jack@innerysep,
outer sep=0pt,
anchor=base
] (plus) {\phantom{$#1+$}};
\begin{scope}[arcs-arcs]
\draw[line width=\jack@linewidth] (plus.west) -- (plus.east);
\draw[line width=\jack@linewidth] (plus.north) -- (plus.south);
\end{scope}
\end{tikzpicture}}
\makeatother
\begin{document}\noindent
$ \extendadd_{\extendadd_{\extendadd}} $ \\
$ +_{+_+} $
\end{document}
Output
Xe-/LuaLaTeX (without TikZ)
This solution works only for XeLaTeX and LuaLaTeX with the unicode-math
package and OpenType fonts that include the symbols \neswarrow
and \nwsearrow
. (This is my favorite output.)
Code
\documentclass{article}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{unicode-math}
\setmathfont{XITS Math}
\newcommand{\plusarrow}{\mathbin{\text{\rotatebox[]{45}{\ooalign{$\nwsearrow$\cr$\neswarrow$}}}}}
\begin{document}
$ 7 \plusarrow 8$ \quad $ \plusarrow_{\plusarrow_{\plusarrow}} $
\end{document}
Output
Another option; no TikZ required and the use of \mathchoice allows correct scaling according to the math style:
\documentclass{article}
\usepackage{graphicx}
\def\ArrPlus{%
\setbox0\hbox{$\longleftrightarrow$}%
\rlap{\hbox to \wd0{\hss\rotatebox[origin=top]{90}{\scalebox{.9}{$\longleftrightarrow$}}\hss}}\raise.15ex\box0}
\def\arrowplus{\mathbin{%
\mathchoice
{\scalebox{.7}{\ArrPlus}}
{\scalebox{.7}{\ArrPlus}}
{\scalebox{.35}{\raisebox{.2ex}{\ArrPlus}}}
{\scalebox{.25}{\raisebox{.35ex}{\ArrPlus}}}
}}
\begin{document}
$ A \arrowplus B\quad{\displaystyle A \arrowplus B}\quad M_{A \arrowplus B}\quad L_{M_{A \arrowplus B}}$
\end{document}