TikzCd:对角线中间的标签

TikzCd:对角线中间的标签

我有以下问题。我想用字母 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选项。

输出 2

\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

既然您用 标记了您的问题tikz-cd,为什么不使用它呢?

\documentclass{article}

\usepackage{tikz-cd}

\begin{document}
\[
\begin{tikzcd}
&B\\
A\ar[ur, "f"]\\
\end{tikzcd}
\]
\end{document}

在此处输入图片描述

答案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 labels 时,这是自动的。不同之处在于,在样式中,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}

在此处输入图片描述

相关内容