有一个常见的操作稀疏直接文献(见第 7 页)称为“扩展添加”,通常用特定符号表示,该符号看起来像一个大加号,每个尖端都有箭头。
我错误地认为我可以简单地通过包和朋友进行$\updownarrow$
重叠,但结果却不令人满意(一切都太混乱了)。$\leftrightarrow$
mathtools
\mathllap
有没有更简单的方法来生成这样的符号?
答案1
简单重叠
符号的重叠\leftrightarrow
可以\updownarrow
通过以下方式实现
\ooalign
:
\ooalign{$\leftrightarrow$\cr\hfil$\updownarrow$\hfil}
还需要做一些额外的工作:
- 适应不同的数学风格。上面的公式总是使用
\textstyle
。 - 如果
\mathsurround
设置了,则在左上方和右上方会添加额外的空间。可以通过将\m@th
其设置\mathsurround
为零来解决此问题。 - 该符号用作二元运算符,将其放入
\mathbin
会通知 TeX 为二元运算符保留额外的空间。
文件:
\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}
CM 字体的结果:
包结果txfonts
:
包结果mathabx
:
包结果MnSymbol
:
观察结果:
- 箭头太大。
- 根据字体和大小,
\updownarrow
总高度可能比宽度小\leftrightarrow
。
与调整大小重叠
这个想法是将\longleftrightarrow
宽度调整为\leftrightarrow
以获得更小的箭头。然而,这也会使线条变细。
棘手的部分是缩放也会改变符号的垂直位置。由于箭头,字符边界框的高度\leftrightarrow
没有太大帮助。但我们可以假设符号相对于数学轴垂直居中。因此,下面的代码将其放到\leftrightarrow
基线,调整其大小并将其移回数学轴。到数学轴。
垂直双箭头无法以同样的方式生成。首先,符号\longupdownarrow
缺失。我们还在上面看到,符号可能与相比太小\leftrightarrow
。因此,符号是通过旋转水平双箭头生成的。
\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}
CM 字体的结果:
包结果txfonts
:
包结果mathabx
:
包结果MnSymbol
:
也可以通过组合一个较小的形式并作为调整大小的双箭头的基础,实现介于两者之间的\longleftrightarrow
较小\leftarrow
缩放\rightarrow
。
答案2
钛钾Z 解决方案
大小相同
代码
\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}
输出
比正常加号大
代码
\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}
输出
额外的箭头
代码
\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}
输出
Xe-/LuaLaTeX(不含 Ti钾Z)
此解决方案仅适用于unicode-math
带有软件包的 XeLaTeX 和 LuaLaTeX 以及包含符号\neswarrow
和 的OpenType 字体\nwsearrow
。(这是我最喜欢的输出。)
代码
\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}
输出
答案3
另一种选择;不需要 TikZ,并且使用 \mathchoice 可以根据数学样式进行正确的缩放:
\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}
答案4
应该有更好的方法来实现这一点。但这里有一些选择:
\documentclass[a4paper]{article}
\usepackage{mathtools}
\usepackage{tikz}
\newcommand{\arrowplus}{%
{\mathbin{\text{%
\ensuremath{\begin{tikzpicture}[baseline=-.3em]
\draw [<->,thin] (0,0) -- (1.1em,0);
\draw [<->,thin] (.55em,-.55em) -- (.55em,.55em);
\end{tikzpicture}
}}}}}
%
\newcommand{\arowplus}{%
\scalebox{.8}{\raisebox{.35em}{\ensuremath\longleftrightarrow\kern-1.05em\rotatebox[origin=c]{90}
{\ensuremath\longleftrightarrow}\kern.65em
}}}
\def\Arrowplus{\mathbin{%
\mathchoice
{\scalebox{.7}{\arowplus}}
{\scalebox{.7}{\arowplus}}
{\scalebox{.4}{\raisebox{.2ex}{\arowplus}}}
{\scalebox{.3}{\raisebox{.35ex}{\arowplus}}}
}}
\begin{document}
\[
\Arrowplus \qquad \arrowplus
\]
\[
A \arrowplus B\quad{\displaystyle A \arrowplus B}\quad M_{A \arrowplus B}\quad L_{M_{A \arrowplus B}}
\]
\[
A \Arrowplus B\quad{\displaystyle A \Arrowplus B}\quad M_{A \Arrowplus B}\quad L_{M_{A \Arrowplus B}}
\]
\end{document}