这个问题类似于这个。我还想在水平线旁边写一些文字。不同之处在于单元格的内容是交换图。David Carlisle 提供的解决方案实际上可以解决我的问题。但对我来说效率很低,因为我必须手动添加一些测量值:
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\begin{tabular}{c}
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd}
\smash{\raisebox{-6pt}{\rlap{\qquad\qquad justification}}}\\
\hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd}
\smash{\raisebox{-26pt}{\rlap{\qquad\qquad another justification}}}\\
\hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}
\end{tabular}
\end{document}
我曾尝试NiceTabular
过nicematrix
:
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz-cd}
\begin{document}
\begin{NiceTabular}{c}
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd}\\
\Hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd}\\
\Hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}
\CodeAfter
\begin{tikzpicture}
\node at (2-|2) {justification};
\node at (3-|2) {another justification};
\end{tikzpicture}
\end{NiceTabular}
\end{document}
但文本与水平线重叠,且对齐不对齐。我还尝试过bussproofs
\documentclass{article}
\usepackage{bussproofs}
\usepackage{tikz-cd}
\begin{document}
\begin{prooftree}
\AxiomC{
$\begin{tikzcd}[ampersand replacement = \&]
A\ar{r} \& B
\end{tikzcd}$
}
\RightLabel{justification}
\UnaryInfC{
$\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd}$
}
\RightLabel{another justification}
\UnaryInfC{
$\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}$
}
\end{prooftree}
\end{document}
但在这种情况下,水平线的长度不同,并且对齐不对齐。
有没有办法获得上图的结果而不必手动添加测量值raisebox
?(线和文本之间的水平间距也可能是一个问题)
答案1
类似于什么cfr 评论在排版世界中,您可以并且需要进行一些调整。以下是使大部分工作自动化的方法。键:
tikzcd
从表格等中“释放”环境。\tikz{}
用一些内联代码将 hrule 替换为凸起的文本- 将
tikzcd
环境放入 makebox 中 - 选择 makebox 的宽度和绘制的线的长度为相同的长度
- 两者合起来形成了相对于水平线的中心
为了进一步重构此代码,您可以:
- 将和
5
中的值替换为常数(或)5cm
+(5,0)
\def
\newcommand
- 放入
\tikz{\draw (0,0) -- +(5,0) node[anchor=west,xshift=5mm]{#1};}
一个\newcommand
带 1 个参数的文本 - 添加
text width
到节点以自动中断文本,请参阅 pgfmanual
\documentclass{article}
\usepackage{tikz-cd}
\begin{document}
\makebox[5cm]{\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd}}
\tikz{\draw (0,0) -- +(5,0) node[anchor=west,xshift=5mm]{put some text here};}
\makebox[5cm]{\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd}}
\tikz{\draw (0,0) -- +(5,0) node[anchor=west,xshift=5mm]{put some other text here};}
\makebox[5cm]{\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}}
\end{document}
答案2
和tabularray
:
\documentclass{article}
\usepackage{tikz-cd}
\usepackage{tabularray}
\begin{document}
A first example:
\begin{center}
\begin{tblr}{
colspec={X[c]X},
row{1}={belowsep=0pt},
row{2-Y}={rowsep=0pt},
row{Z}={abovesep=0pt},
}
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd} &\\
&\SetCell[r=2]{l} justification\\\cline{1-1}
&\\
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd} &\\
&\SetCell[r=2]{l} another justification\\\cline{1-1}
&\\
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}\\
\end{tblr}
\end{center}
Another example:
\begin{center}
\begin{tblr}{
colspec={cl},
row{1}={belowsep=0pt},
row{2-Y}={rowsep=0pt},
row{Z}={abovesep=0pt},
}
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd} &\\
&\SetCell[r=2]{l} justification\\\cline{1-1}
&\\
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd} &\\
&\SetCell[r=2]{l} another justification\\\cline{1-1}
&\\
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}\\
\end{tblr}
\end{center}
\end{document}
诀窍是创建 2 个带有多行描述的空行。
如果您不喜欢我使用的行分隔或列宽,它们是高度可定制的。
答案3
请注意,此答案使用了这样一个事实:它tikzcd
是 a 的包装器tikzpicture
,并且您可以在可选参数中提供任意 pgf/tikz 键。特别是,您可以使用execute at end picture={<code>}
在图片末尾绘制任意内容。此外,如果您使用remember picture
,则可以使用在一张图片末尾构建的节点作为下一张图片中的参考点。
结果是 Ti钾Z 将您的图表放入一个框中,并找到绘制线条和放置标签的位置。使用overlay
,标签不占用空间,因此图表保持居中。您也不需要,ampersand replacement
因为这里没有表格。
唯一明确设置的长度是对齐与线条之间的距离。该距离无法自动计算,因为这只是个人喜好(和空间)问题。
该解决方案定义了两种风格。
tikz fit=<name>
用于命名您的tikzcd
图表。它会围绕图表构建一个节点,并根据您的喜好命名。tikz postscript={<list of named nodes in parentheses>}{<comma-separated list of triples>}
通常,其中<list of named nodes in parentheses>
应为图表使用的名称tikz fit
,并且<comma-separated list of triples>
应为以逗号分隔的三元组列表,每个三元组应为以下形式<name of upper node>/<name of lower node>/<justification>
。请注意,第一个参数要求节点名称周围有括号,而第二个参数要求没有括号。
例如,您可能使用tikz fit=pica
和tikz fit=picb
来表示两个图表。然后,您可以将其添加到第二个图表中,tikz postscript={(pica) (picb)}{pica/picb/because reason}
如下所示(非图形化):
\documentclass{article}
% ateb: https://tex.stackexchange.com/a/714837/ addaswyd o gwestiwn Luis Turcio: https://tex.stackexchange.com/q/714830/
\usepackage{tikz-cd}
\usetikzlibrary{fit,calc}
\tikzset{%
tikzcd fit/.style={remember picture,execute at end picture={\node (pic#1) [fit=(current bounding box),remember picture]{};}},
tikzcd postscript/.style 2 args={execute at end picture={%
\begin{scope} [overlay]
\node (a) [fit=#1,inner sep=0pt] {} ;
\foreach [expand list=true] \i/\j/\k in {#2}
\draw (a.west |- {$(\i.south)!1/2!(\j.north)$}) coordinate (b) -- (b -| a.east) ++(10pt,0pt) node [anchor=west] {\k};
\end{scope}%
},
},
}
\begin{document}
\begin{center}
\begin{tikzcd}[tikzcd fit=a]
A\ar{r}{f} & B
\end{tikzcd}
\begin{tikzcd}[tikzcd fit = b]
A\ar{r}\ar{d} & B\ar{d}\\
C\ar{r} & D
\end{tikzcd}
\begin{tikzcd}[tikzcd fit = c,tikzcd postscript={(pica) (picb) (picc)}{pica/picb/justification,picb/picc/another justification}]
A\ar{r}\ar{dr} &[4em] B\ar{d}\\
& C
\end{tikzcd}
\end{center}
\end{document}
抱歉没有图片。Okular 有一个 bug,所以你需要一定的想象力才能阅读我的帖子。
来自社区:
答案4
和nicematrix
。
\documentclass{article}
\usepackage{nicematrix}
\usepackage{tikz-cd}
\begin{document}
\begin{NiceTabular}{c}[cell-space-limits=2mm]
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}{f} \& B
\end{tikzcd}\\
\Hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{d} \& B\ar{d}\\
C\ar{r} \& D
\end{tikzcd}\\
\Hline
\begin{tikzcd}[ampersand replacement = \&]
A\ar{r}\ar{dr} \&[4em] B\ar{d}\\
\& C
\end{tikzcd}
\CodeAfter
\begin{tikzpicture}
\node at (2-|2) [right] {justification};
\node at (3-|2) [right] {another justification};
\end{tikzpicture}
\end{NiceTabular}
\end{document}