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]\&\\ar[dl]\\
\
\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}
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 figure
Umgebung) 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_height
mit 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 sep
gesetzt werden .0pt
.5\pgflinewidth
Anmerkungen:
Ich habe einen gebogenen (aber abgerundeten) Pfeil hinzugefügt
overlay
, der die Messung der Klammern nicht beeinträchtigt.Die
matrix
Bibliothek stelltleft delimiter
und bereit. Da /right delimiter
jedoch 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]\&\\ar[dl] \ar[ll, bend right, overlay]\\
\
\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
Antwort2
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]\&\\ar[dl]\\
\
\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]\&\\ar[dl]\\
\
\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}
Antwort4
Sie können \vcenter{\hbox{...}}
rundherum hinzufügen tikzcd
.
\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]\&\\ar[dl]\\
\
\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}