有没有一种轻松的方法可以在数学符号上获得自循环装饰?

有没有一种轻松的方法可以在数学符号上获得自循环装饰?

在数学中,我们经常写

X \rightarrow Y

表示从 X 到 Y 的函数。现在我想通过在 X 的右上角添加一个循环箭头装饰来表示从 X 到 X 的函数。

有没有一种不痛苦的方法可以做到这一点?

答案1

这只是建立在 Pier 的答案之上,以防止它弄乱周围的格式。

\documentclass{article}
\usepackage{tikz}
\usepackage{stackengine}
\newcommand{\LoopFunction}[1]{%
  \renewcommand\stacktype{L}%
  \renewcommand\useanchorwidth{T}%
  \renewcommand\stackalignment{l}%
  \setbox0\hbox{$#1$}%
  \stackon[2pt]{\usebox0}{\hspace{\the\wd0}\hspace{-1.6ex}%
    \tikz \node {} edge [in=30,out=60,loop] node {} ();}%
}
\begin{document}
$x\LoopFunction{A}y\LoopFunction{BCD}z$
\end{document}

在此处输入图片描述

我认为,使用皮尔的暗示[in=60,out=30,loop]会给芭芭拉带来更多愉悦的感觉。

在此处输入图片描述

请注意,根据 percusse 的评论,装饰不会影响周围文本的水平间距,但会影响垂直间距。虽然我不推荐这样做,但可以\smash装饰tikz使其表观高度为零。


补充

根据评论者的要求,为了让它适用于上标和下标,我提供了以下内容。我添加了一个宏\uLoopfunction,专门用于下标,因为实际上不能在下标上方循环。

还需要能够捕捉\scriptstyle下标和上标的正确大小,我用scalerel\ThisStyle{...\SavedStyle...}

\documentclass{article}
\usepackage{tikz}
\usepackage{scalerel,stackengine}
\newcommand{\LoopFunction}[1]{\ThisStyle{%
  \setbox0\hbox{$\SavedStyle#1$}%
  \stackengine{\dimexpr8\LMpt-6pt}{\usebox0}{\hspace{\the\wd0}\hspace{-1.6ex}%
    \tikz \node {} edge [in=60,out=30,loop] node {} ();}{O}{l}{F}{T}{L}%
}}
\newcommand{\uLoopFunction}[1]{\ThisStyle{%
  \setbox0\hbox{$\SavedStyle#1$}%
  \rule[-\dp0]{0pt}{\dimexpr\dp0+\ht0}%
  \stackengine{\dimexpr\normalbaselineskip+2pt}{\usebox0}{\hspace{\the\wd0}\hspace{-1.6ex}%
    \tikz \node {} edge [in=-60,out=-30,loop] node {} ();}{U}{l}{F}{T}{L}%
}}
\begin{document}
$x^{\LoopFunction{A}}y_{\uLoopFunction{12}}\LoopFunction{BCD}z$
\end{document}

在此处输入图片描述

答案2

像这样吗?

\documentclass{standalone}
\usepackage{tikz}

\newcommand{\LoopFunction}[1]{ \tikz \node {${\displaystyle #1}$} edge [in=30,out=60,loop] node {} ();
}

\begin{document}

\LoopFunction{A}

\end{document}

在此处输入图片描述

编辑:请注意,接下来的做法一点也不优雅。我手动调整了行的进入/离开部分的角度,然后插入了负空格\!以改善字距外观。如果该\smash{}命令出现问题,请将其从命令定义中删除,\smash{\LoopFunction{<argument>}}然后改用。

\documentclass{article}
\usepackage{tikz}

\newcommand{\LoopFunction}[1]{\smash{\tikz \node [baseline=n.base,inner sep=0pt] (n) {${\displaystyle #1}$} edge [in=45,out=15,loop] node [inner sep=0pt] {} ();}$\!\!\!\!\!$
}

\begin{document}

This is a very long line to see what happens when the newly defined command, whose output is \LoopFunction{A}, is put in inline sentences.\\
Here is the second line to confirm a right behaviour.

\end{document}

答案3

tikz-cd

\documentclass{article}
\usepackage{tikz-cd}
\newcommand{\LoopFunction}[1]{\begin{tikzcd}
    #1\ar[in=30,out=60,loop]
    \end{tikzcd}}
\begin{document}
\LoopFunction{A}
\end{document}

在此处输入图片描述

相关内容