在数学中,我们经常写
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}