我正在尝试排版一个图表,其中有两个方框和一个箭头。我希望方框上标有某些文本(数学文本,例如\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}