排版已知最大总空间的纤维束链

排版已知最大总空间的纤维束链

我想排版一个描述纤维束投影链的图表。我尝试了以下代码:

\begin{tikzcd}
        & V_1(\C^1) \arrow[d, hook]
        &
        & V_1(\C^n) \arrow[d, hook]
        & \\
    \GL_n(\C) =
        & V_n(\C^n) \arrow[r, two heads]
        & \dots \arrow[r, two heads]
        & V_1(\C^n) \arrow[r, two heads]
        & V_0(\C^n) = \{ \pt \}.
\end{tikzcd}

然后我得到了这个结果:

在此处输入图片描述

有没有办法使线性群的名称GL_n(C)和它的替代描述之间没有空格V_n(C^n)保持垂直箭头 V_1(C^1) -> V_n(C^n) 处于当前地位?

答案1

这基本上是同一个问题这一个forest

可能的解决方案(除了手动摆弄之外)如下:

  1. 消除柱分离,使得两柱直接在一起。

    但是,将设置column sep为零是不够的,因为节点inner xsep周围有填充。(不过,我们可以将设置inner xsep为零,将设置outer xsep为其值……)

    因此,

    • 必须column sep设置为负数的两倍inner xsep(通过no csep接受\foreach列表的样式)或
    • no_csep与宏一起使用的函数(&只能在第一行完成)。
  2. \mathllap\mathrlapmathtools包裹中。

    这些类似于文本模式\llap\rlap宏,它们不会更新底层 TikZ 图片的边界框,并且内容不会在节点内。

    对于位于图左侧或右侧且可能位于其自身线的中心的节点(未填充、未绘制),这并不是最糟糕的事情 - 但它确实改变了图的水平位置。

    \mllap实际上,可以通过使用和\mrlap(仅在 TikZ-CD 图内定义)再次向图中添加该宽度的路径来解决此问题。

  3. 在同一列中使用第二个节点。

    这是通过带有额外锚点的标签完成的text right(请查看forest相关答案这解释了它的作用。我之前在一个答案中使用过它在 TikZ-CD 答案中基本上是出于同样的原因。

  4. 由多部分组成的“非中心矩形”,其中心锚点(用于放置节点以及将其连接到线的锚点)不是真正的中心,而是节点主要部分(此处为部分V_…)的中心。

    很遗憾,由于 TikZ 的一个错误我们需要修复一些问题,以禁用具有多个部分的节点的数学模式。(修复代码直接取自手册。)

= {pt}在所有示例中,尽管您仅使用水平箭头并且这绝对不是必要的,但我对该部分也使用了相同的解决方案。

顺便说一句,也可以将两个节点放入一个单元,首先放置主节点,然后再放置另一个节点,但我们需要再次手动命名主节点才能与 TikZ-CD 一起使用,而这只是label第二个节点!

代码

\documentclass{article}
\usepackage{amsmath, amssymb}
\usepackage{tikz-cd}
\DeclareMathOperator{\GL}{GL}
\newcommand*\pt{\mathrm{pt}}
\newcommand*\C{\mathbb{C}}

%%% 1. no column sep
\tikzset{declare function={% for &[no csep]
    no_csep=-\pgfmatrixcolumnsep-2*(\pgfkeysvalueof{/pgf/inner xsep});}}
\tikzcdset{% for use in the options of the environment
  no csep/.style={/utils/temp/.style={/tikz/column ##1/.append style={
    column sep=-2*(\pgfkeysvalueof{/pgf/inner xsep})}},/utils/temp/.list={#1}}}

%%% 2. \mathllap and \mathrlap
\usepackage{mathtools}
\tikzcdset{
  every diagram/.append code=%
    \def\mllap##1{\mathllap{##1}\arrow[path only,start anchor=west,
      /utils/exec=\pgfmathwidth{"$##1$"},
      to path={--++(left:\pgfmathresult pt)}]}%
    \def\mrlap##1{\mathrlap{##1}\arrow[path only,start anchor=east,
      /utils/exec=\pgfmathwidth{"$##1$"},
      to path={--++(right:\pgfmathresult pt)}]}}

%%% 3. label with extra anchor
\makeatletter
\pgfdeclaregenericanchor{text right}{%
  \pgf@sh@reanchor{#1}{base}%
  \multiply\pgf@x by 2 }
\makeatother
\tikzset{
  llap/.style={label={[anchor=text right]text:#1{}}},
  rlap/.style={label={[anchor=text]text right:{}#1}}}

%%% 4. uncentered rectangle
\usetikzlibrary{ext.shapes.uncenteredrectangle}
\makeatletter
\tikzcdset{every diagram/.append style={/pgf/uncentered rectangle center=text,
  /tikz/math align/.style={shape=uncentered rectangle,
    /pgf/uncentered rectangle center yshift=axis_height,
    commutative diagrams/math mode=false,
    /utils/exec={\def\maleft####1=####2;{$####2$\nodepart{left}$####1={}$},
                \def\maright####1=####2;{$####1$\nodepart{right}${}=####2$}}},
    /tikz/matrix of math nodes/.style={matrix of nodes,nodes={
      execute at begin node=\iftikzcd@mathmode$\fi,
      execute at end node =\iftikzcd@mathmode$\fi}}}}
\makeatother


\begin{document}
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis
facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet
\[ % 1. Eliminating the column seperation.
\begin{tikzcd}[no csep=5]
  &[no_csep] % or this but not both at the same column
    V_1(\C^1) \arrow[d, hook]
  &
  & V_1(\C^n)          \arrow[d, hook] \\
  \GL_n(\C)={}
  & V_n(\C^n)          \arrow[r, two heads]
  & \cdots             \arrow[r, two heads]
  & V_1(\C^n)          \arrow[r, two heads]
  & V_0(\C^n)
  & {}= \{ \pt \}
\end{tikzcd}
\]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis
facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet
\[ % 2. mathllap and mathrlap from mathtools with an extra invisible arrow
\begin{tikzcd}
    V_1(\C^1)          \arrow[d, hook]
  &
  & V_1(\C^n)          \arrow[d, hook] \\
    \mllap{\GL_n(\C)={}} V_n(\C^n)
                       \arrow[r, two heads]
  & \cdots             \arrow[r, two heads]
  & V_1(\C^n)          \arrow[r, two heads]
  & V_0(\C^n) \mrlap{{}= \{ \pt \}}
\end{tikzcd}
\]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis
facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet
\[% 3. Second node inside the same column.
\begin{tikzcd}
    V_1(\C^1)          \arrow[d, hook]
  &
  & V_1(\C^n)          \arrow[d, hook] \\
    |[llap={\GL_n(\C)=}]| V_n(\C^n)
                       \arrow[r, two heads]
  & \cdots             \arrow[r, two heads]
  & V_1(\C^n)          \arrow[r, two heads]
  & |[rlap={= \{ \pt \}}]| V_0(\C^n)
\end{tikzcd}
\]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis
facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet
\[% 4. Uncentered rectangle shape.
\begin{tikzcd}
          V_1(\C^1)    \arrow[d, hook]
        &
        & V_1(\C^n)    \arrow[d, hook] \\
          |[math align]|  \maleft \GL_n(\C) = V_n(\C^n);
                       \arrow[r, two heads]
        & \cdots       \arrow[r, two heads]
        & V_1(\C^n)    \arrow[r, two heads]
        & |[math align]| \maright V_0(\C^n) = \{ \pt \};
\end{tikzcd}
\]
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Etiam lobortis
facilisis sem. Nullam nec mi et neque pharetra sollicitudin. Praesent imperdiet
\end{document}

输出

在此处输入图片描述

答案2

删除第一列和最后一列(添加的)之间的列间距。

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz-cd}

\DeclareMathOperator{\GL}{GL}
\newcommand{\numberset}[1]{\mathbb{#1}}
\newcommand{\C}{\numberset{C}}
\newcommand{\pt}{\mathrm{pt}}

\begin{document}

\[
\begin{tikzcd}
  &[-3em]
    V_1(\C^1) \arrow[d, hook]
  &
  & V_1(\C^n) \arrow[d, hook]
  &
  &[-3em]
\\
\GL_n(\C) =
  &  V_n(\C^n) \arrow[r, two heads]
  & \dots \arrow[r, two heads]
  & V_1(\C^n) \arrow[r, two heads]
  & V_0(\C^n)
  & = \{ \pt \}.
\end{tikzcd}
\]

\end{document}

在此处输入图片描述

无需猜测宽度:

\documentclass{article}
\usepackage{amsmath,amssymb}
\usepackage{tikz-cd}

\DeclareMathOperator{\GL}{GL}
\newcommand{\numberset}[1]{\mathbb{#1}}
\newcommand{\C}{\numberset{C}}
\newcommand{\pt}{\mathrm{pt}}

\begin{document}

\[
\hphantom{\GL_n(\C)={}}
\begin{tikzcd}
  V_1(\C^1) \arrow[d, hook] &&
  V_1(\C^n) \arrow[d, hook]
\\
\makebox[0pt][r]{$\GL_n(\C)={}$}
  V_n(\C^n) \arrow[r, two heads] &
  \dots \arrow[r, two heads] &
  V_1(\C^n) \arrow[r, two heads] &
  V_0(\C^n) = \{ \pt \}.
\end{tikzcd}
\]

\end{document}

答案3

3.2em$\mathrm{GL}_n(\mathbb{C})=$用一个包\usepackage{adjustbox}就获得了想要的结果。

\documentclass[a4paper,12pt]{article}
\usepackage{amsmath,amssymb}
\usepackage{adjustbox}
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
        & V_1(\mathbb{C}^1) \arrow[d, hook]
        &
        & V_1(\mathbb{C}^n) \arrow[d, hook]
        & \\
   \adjustbox{lap={\width}{3.2em}}{$\mathrm{GL}_n(\mathbb{C})=$ }
        & V_n(\mathbb{C}^n) \arrow[r, two heads]
        & \dots \arrow[r, two heads]
        & V_1(\mathbb{C}^n) \arrow[r, two heads]
        & V_0(\mathbb{C}^n) = \{ \mathrm{pt} \}.
\end{tikzcd}
\end{document}

在此处输入图片描述

相关内容