Problem mit einem TikZcd zwischen geschweiften Klammern

Problem mit einem TikZcd zwischen geschweiften Klammern

Ich habe versucht zu antworteneine Frageaber das TikZcd, das ich setzen möchte, ist vertikal zwischen den geschweiften Klammern nicht richtig positioniert (die roten Linien dienen zur besseren Veranschaulichung des Problems):

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \begin{tikzcd}[
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

Bildbeschreibung hier eingeben

Antwort1

Wenn ein TikZ-Bild erstellt wurde, besteht es lediglich aus einer Box, deren tiefster Punkt des Begrenzungsrahmens auf der Grundlinie liegt.

TikZ-CD überschreibt diese Vorgabe. Bei einem 1-zeiligen Diagramm wird es so platziert, dass die Grundlinie der Knoten auf der Grundlinie des umgebenden Textes liegt.
Bei jedem anderen Diagramm ist die Grundlinie die Mitte der Matrix (nicht des gesamten Bildes), die ebenfallsj= 0 pt standardmäßig.

Dies ist normalerweise eine gute Wahl, da sich das Diagramm entweder in einer eigenen Zeile befindet (z. B. in der figureUmgebung) oder das einzige Element einer Display-Math-Umgebung ist.

Für Inline-Diagramme muss die Box nach oben verschoben werden, sodass sich die Mitte der Matrix auf der Höhe des Knotens dieser Klammer befindet. TikZ-CD bringt eine PGFMath-Funktion mit, axis_heightmit der Sie diesen Abstand innerhalb von PGF/TikZ verwenden können.

Sie benötigen also

baseline={([yshift=-axis_height]\tikzcdmatrixname)}
% or, if no vertical shifting of the matrix has been applied, just
baseline=-axis_height

für Ihre Inline-Diagramme.


Ich habe mir erlaubt, einige innere und äußere Seps so anzupassen, dass die Knoten und die Matrix dicht gepackt sind, die Knoten aber noch etwas Polsterung für die Pfeile haben. Wenn Labels, also Knoten entlang der Pfeile, verwendet werden können sollen, muss deren Wert wieder auf oder auf den Standardwert outer sepgesetzt werden .0pt.5\pgflinewidth

Anmerkungen:

  • Ich habe einen gebogenen (aber abgerundeten) Pfeil hinzugefügt overlay, der die Messung der Klammern nicht beeinträchtigt.

  • Die matrixBibliothek stellt left delimiterund bereit. Da / right delimiterjedoch keine genauen Längen für die Trennzeichen ausgibt und die Bibliothek die Trennzeichen etwas unglücklich platziert, können diese hier nicht verwendet werden, ohne die Platzierung von TikZ anzupassen.\left\right

    Die Lösung mit den Trennzeichen von TikZ ist im folgenden Code kommentiert.

Code

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}
%\makeatletter
%\tikzset{better delimiters/.style={
%  /tikz/every left delimiter/.append style={at=(\tikz@last@[email protected]),anchor=east},
%  /tikz/every right delimiter/.append style={at=(\tikz@last@[email protected]),anchor=west}}}
%\makeatother
\newcommand{\tricd}[3]{%
  \begin{tikzcd}[
    baseline={([yshift=-axis_height]\tikzcdmatrixname)},
    ampersand replacement=\&,
%    /tikz/better delimiters,
    every matrix/.append style={% https://tex.stackexchange.com/a/653533/16595
%      left delimiter=\{, right delimiter=\},
      every outer matrix/.append style={inner sep=+0pt, outer sep=+0pt},
      cells={nodes={inner sep=+0pt, outer sep=+.15em, draw=red}},
      draw=red},
    row sep=0pt, column sep=10pt]
    #1\ar[rr]\ar[dr]\&\&#2\ar[dl] \ar[ll, bend right, overlay]\\
    \&#3
  \end{tikzcd}}
\begin{document}
Why is the Ti\emph{k}Zcd not well vertically aligned between braces?
\( \left\{ \tricd{X}{Y}{Z} \right\} \)
\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Antwort2

Bildbeschreibung hier eingeben

Sie würden dasselbe sehen mit „ \left\{\begin{array}[t]... Die X sind an der Grundlinie ausgerichtet, sodass die Konstruktion eine große Tiefe hat, aber \{vertikal zentriert ist.“ Verschieben Sie die Grundlinie des Tikz:

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \begin{tikzcd}[
baseline=-2pt,
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

Antwort3

Verwenden gathered.

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{tikz-cd}

\newcommand{\tricd}[3]{%
  \begin{gathered}%
    \begin{tikzcd}[
        ampersand replacement=\&,
        every matrix/.append style={nodes={inner sep=0pt}},
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}%
  \end{gathered}%
}

\begin{document}

The Ti\emph{k}Zcd is well
vertically aligned between braces! \(
\left\{\tricd{X}{Y}{Z}\right\}
\)

\end{document}

Bildbeschreibung hier eingeben

Antwort4

Sie können \vcenter{\hbox{...}}rundherum hinzufügen tikzcd.

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{geometry}
\usepackage{amsmath}

\usepackage{tikz-cd}
\newcommand{\tricd}[3]{%
    \vcenter{\hbox{\begin{tikzcd}[
        ampersand replacement=\&, 
        every matrix/.append style={nodes={inner sep=0pt, draw=red}, draw=red}, 
        row sep=0pt,
        column sep=10pt,
        ]
        #1\ar[rr]\ar[dr]\&\&#2\ar[dl]\\
        \&#3
    \end{tikzcd}}}%
    }
    
\begin{document}
Why is the Ti\emph{k}Zcd not well
vertically aligned between braces? \(
\left\{\tricd{X}{Y}{Z}\right\}
\)
\end{document}

verwandte Informationen