Eu estava tentando responderuma perguntamas o TikZcd que eu gostaria de compor não está bem posicionado verticalmente entre as chaves (as linhas vermelhas são desenhadas para mostrar melhor o problema):
\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}
Responder1
Quando uma imagem TikZ for criada, ela será apenas uma caixa com o ponto mais baixo da caixa delimitadora na linha de base.
TikZ-CD substitui esse padrão. Para um diagrama de 1 linha, ele será colocado de forma que a linha de base dos nós fique na linha de base do texto circundante.
Para qualquer outro diagrama, sua linha de base será o centro da matriz (não a imagem inteira), que também ésim= 0 pt por padrão.
Geralmente, essa é uma boa escolha porque o diagrama está em sua própria linha (por exemplo, no figure
ambiente) ou é o único elemento de um ambiente de exibição matemática.
Para diagramas embutidos, a caixa precisa ser deslocada para cima, de modo que o centro da matriz fique na altura do nó da chave. O TikZ-CD traz consigo uma função PGFMath axis_height
que permite usar essa distância dentro do PGF/TikZ.
Assim, você precisará
baseline={([yshift=-axis_height]\tikzcdmatrixname)}
% or, if no vertical shifting of the matrix has been applied, just
baseline=-axis_height
para seus diagramas embutidos.
Tomei a liberdade de ajustar algumas divisões internas e externas para que os nós e a matriz fiquem bem compactados, mas os nós ainda tenham um pouco de preenchimento para as setas restantes. Se os rótulos, ou seja, os nós ao longo das setas, puderem ser usados, eles outer sep
deverão ser definidos como 0pt
ou o padrão .5\pgflinewidth
novamente.
Notas:
Eu adicionei uma
overlay
seta dobrada (mas ed) que não interfere na forma como os colchetes são medidos.A
matrix
biblioteca forneceleft delimiter
eright delimiter
. No entanto, como\left
/\right
não produz comprimentos exatos para os delimitadores e a biblioteca coloca os delimitadores de forma um tanto azarada, eles não podem ser usados aqui sem ajustar como o TikZ os posiciona.A solução com os delimitadores do TikZ está comentada no código abaixo.
Código
\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}
Saída
Responder2
você veria o mesmo com \left\{\begin{array}[t]...
o X alinhado na linha de base, de modo que a construção tenha grande profundidade, mas \{
centralizada verticalmente. Desloque a linha de base do 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}
Responder3
Usar 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}
Responder4
Você pode adicionar \vcenter{\hbox{...}}
em torno do 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}