钛钾Z 解决方案

钛钾Z 解决方案

有一个常见的操作稀疏直接文献(见第 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 字体的结果:

CM大

包结果txfonts

TX 大

包结果mathabx

mathabx 大

包结果MnSymbol

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 字体的结果:

CM 缩放

包结果txfonts

TX 缩放

包结果mathabx

mathabx 缩放

包结果MnSymbol

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(不含 TiZ)

此解决方案仅适用于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}

输出

XeLaTeX 解决方案

答案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}

在此处输入图片描述

相关内容