我有以下问题。我想用字母 f 标记 A 和 B 的边缘。问题是,如果我使用
\draw [->] (v1) -- node[midway]{$f$} (v2);
我明白了:
如果我用
\draw [->] (v1) -- node[midway,above]{$f$} (v2);
我明白了:
我希望“f”位于星号的位置 * - 垂直于 A、B 中心的某个正距离。但是“中间”会让我在线中间找到 f,而“中间,上方”会让我找到稍微偏右的 f。同样,“中间,左侧”会让我找到位于星号下方的 f。
有没有简单的方法可以用 f 代替 * ?
编辑:我的代码:
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzpicture}
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw [->] (v1) -- node[midway,above]{$f$} (v2);
\node at (-2,1.4) {*};
\end{tikzpicture}
\end{document}
编辑2:删除红叉。
答案1
欢迎!有两种解决方案。第一种是,您可以简单地使用该fill=white
选项确保文本周围涂成白色,然后文本以黑色绘制。唯一的警告是,如果您有多种颜色的背景(即带有渐变的东西),它看起来就不那么好看了。
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzpicture}
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw [->] (v1) -- node[midway,fill=white]{$f$} (v2);
\node at (-2,1.4) {*};
\end{tikzpicture}
\end{document}
另一个解决方案是使用xshift=-1em, yshift=1em
选项。
\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzpicture}
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw [->] (v1) -- node[midway, xshift=-1em, yshift=1em]{$f$} (v2);
%\node at (-2,1.4) {*};
\end{tikzpicture}
\end{document}
答案2
答案3
我对这个问题的解释是,您希望标签沿着连接的正交线移动。这就是内置edge label
为您提供的功能。否则,可以通过用眼睛确定斜率或编写测量斜率的样式来实现。由于本例中的斜率为 45 度,因此锚点必须位于45-90=-45
。在 上方,它将位于-90
(模数上下翻转)。在 的情况下,edge label
这是自动的。尽管如此,重新计算 以说服我们自己确实如此可能是值得的calc
。
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}[Midlabel/.style={to path={
let \p1=($(\tikztotarget)-(\tikztostart)$),
\n1={atan2(\y1,\x1)}
in (\tikztostart) -- (\tikztotarget) node[midway,circle,anchor=\n1-90]{#1}
}}]
\begin{scope}[local bounding box=L]
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw [->] (v1) -- node[midway,above]{$f$} (v2);
\node at (-2,1.4) {*};
\end{scope}
\begin{scope}[local bounding box=M,xshift=4cm]
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw [->] (v1) -- node[midway,anchor=-45]{$f$} (v2);
\node at (-2,1.4) {*};
\end{scope}
\begin{scope}[local bounding box=R,xshift=8cm]
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw[->,Midlabel={$f$}] (v1) to (v2);
\node at (-2,1.4) {*};
\end{scope}
\begin{scope}[local bounding box=E,xshift=12cm]
\node (v2) at (-1,2) {$B$};
\node (v1) at (-2.5,0.5) {$A$};
\draw[->] (v1) to[edge label={$f$}] (v2);
\node at (-2,1.4) {*};
\end{scope}
\path[font=\sffamily] (L.north) node[above]{original}
(M.north) node[above]{node anchor adjusted by hand}
(R.north) node[above]{with \texttt{Midlabel} style}
(E.north) node[above]{with \texttt{edge label}};
\end{tikzpicture}
\end{document}
在tikz-cd
使用edge label
s 时,这是自动的。不同之处在于,在样式中,Midlabel
节点形状采用圆形,并均匀分布角锚。
\documentclass{article}
\usepackage{tikz-cd}
\usetikzlibrary{calc}
\begin{document}
\tikzset{Midlabel/.style={to path={
let \p1=($(\tikztotarget)-(\tikztostart)$),
\n1={atan2(\y1,\x1)}
in (\tikztostart) -- (\tikztotarget) node[midway,circle,anchor=\n1-90]{#1}
}}}
\begin{tikzcd}
& A \\
B\arrow[ur,"f"] &
\end{tikzcd}
\begin{tikzcd}
& A \\
B\arrow[ur,"f"]\arrow[ur,Midlabel={$\scriptstyle f$}] &
\end{tikzcd}
\end{document}