如何在 \fbox 角外显示标签?

如何在 \fbox 角外显示标签?

我正在尝试排版一个图表,其中有两个方框和一个箭头。我希望方框上标有某些文本(数学文本,例如\mathsf{C}),但我发现这样做的唯一方法并不令人满意(使用\underset,文本太小,位置也不理想)。

这是我现在的情况:

前

这就是我想要实现的目标(可能比我的绘画技巧更好):

后

这是工作代码:

\[
    \underset{\cat{J}}{
        \fbox{
            \begin{tikzcd}
                \& \& \bullet \arrow{dl}\\
                \bullet \arrow[shift left]{r} \arrow[shift right]{r} \& \bullet \arrow{dr}\\
                \& \& \bullet
            \end{tikzcd}
        }
    }
    \begin{tikzcd}
        \phantom{.} \arrow[mapsto]{r}{F} \& \phantom{.}
    \end{tikzcd}
    \underset{\cat{C}}{
        \fbox{
            \begin{tikzcd}
                \& \& X \arrow{dl}{f}\\
                A \arrow[shift left]{r}{j} \arrow[shift right, swap]{r}{k} \& B \arrow{dr}{g}\\
                \& \& Y
            \end{tikzcd}
        }
    }
\]

答案1

你可以使用 TikZ 绘制方框并添加标签,方法是execute at end picture:定义如下样式

\tikzset{
  frame and label/.style={
    execute at end picture={
      % if you want some extra padding, like \fbox does, you can use shift like this
      \draw ([shift={(2pt,-2pt)}]current bounding box.south east) rectangle
            ([shift={(-2pt,2pt)}]current bounding box.north west) 
            % the overlay option means that the node is not taken into account when the bounding box is set
            node[below left, overlay] {$\mathsf{#1}$};
    }   
  }
}

像这样使用它:

\begin{tikzcd}[frame and label=J]

一些注意事项:正如代码中的注释中提到的,overlay选项表示如果 ,则节点包含在边界框中tikzpicture。这意味着例如标签不会影响中间箭头和右图框架之间的空间。

一个\fbox会添加一点填充(由于某些行没有以 结尾,因此您还会获得一些额外的水平空间%),坐标中的会执行类似的工作。当然,您可以根据需要[shift=..]移除或调整。2pt

在此处输入图片描述

\documentclass{article}    
\usepackage{tikz-cd,amsmath}
\tikzcdset{ampersand replacement=\&}
\tikzset{
  frame and label/.style={
    execute at end picture={
      % if you want some extra padding, like \fbox does, you can use shift like this
      \draw ([shift={(2pt,-2pt)}]current bounding box.south east) rectangle
            ([shift={(-2pt,2pt)}]current bounding box.north west) 
            % the overlay option means that the node is not taken into account when the bounding box is set
            node[below left, overlay] {$\mathsf{#1}$};
    }   
  }
}
\begin{document}
\[
  \begin{tikzcd}[frame and label=J]
      \& \& \bullet \arrow{dl}\\
      \bullet \arrow[shift left]{r} \arrow[shift right]{r} \& \bullet \arrow{dr}\\
      \& \& \bullet
  \end{tikzcd}
  \begin{tikzcd}
      \phantom{.} \arrow[mapsto]{r}{F} \& \phantom{.}
  \end{tikzcd}
  \begin{tikzcd}[frame and label=C]
      \& \& X \arrow{dl}{f}\\
      A \arrow[shift left]{r}{j} \arrow[shift right, swap]{r}{k} \& B \arrow{dr}{g}\\
      \& \& Y
  \end{tikzcd}
\]
\end{document}

相关内容