我想排版一个描述纤维束投影链的图表。我尝试了以下代码:
\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
。
可能的解决方案(除了手动摆弄之外)如下:
消除柱分离,使得两柱直接在一起。
但是,将设置
column sep
为零是不够的,因为节点inner xsep
周围有填充。(不过,我们可以将设置inner xsep
为零,将设置outer xsep
为其值……)因此,
- 必须
column sep
设置为负数的两倍inner xsep
(通过no csep
接受\foreach
列表的样式)或 no_csep
与宏一起使用的函数(&
只能在第一行完成)。
- 必须
\mathllap
并\mathrlap
从mathtools
包裹中。这些类似于文本模式
\llap
和\rlap
宏,它们不会更新底层 TikZ 图片的边界框,并且内容不会在节点内。对于位于图左侧或右侧且可能位于其自身线的中心的节点(未填充、未绘制),这并不是最糟糕的事情 - 但它确实改变了图的水平位置。
\mllap
实际上,可以通过使用和\mrlap
(仅在 TikZ-CD 图内定义)再次向图中添加该宽度的路径来解决此问题。在同一列中使用第二个节点。
这是通过带有额外锚点的标签完成的
text right
(请查看forest
相关答案这解释了它的作用。我之前在一个答案中使用过它在 TikZ-CD 答案中基本上是出于同样的原因。由多部分组成的“非中心矩形”,其中心锚点(用于放置节点以及将其连接到线的锚点)不是真正的中心,而是节点主要部分(此处为部分
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}