水平线旁边的文字

水平线旁边的文字

这个问题类似于这个。我还想在水平线旁边写一些文字。不同之处在于单元格的内容是交换图。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}

在此处输入图片描述

我曾尝试NiceTabularnicematrix

\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,则可以使用在一张图片末尾构建的节点作为下一张图片中的参考点。

结果是 TiZ 将您的图表放入一个框中,并找到绘制线条和放置标签的位置。使用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=picatikz 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}

上述代码的输出

相关内容