Проблема с TikZcd между фигурными скобками

Проблема с TikZcd между фигурными скобками

Я пытался ответитьвопросно TikZcd, который я хотел бы набрать, не очень удачно расположен по вертикали между фигурными скобками (красные линии нарисованы, чтобы лучше показать проблему):

\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}

введите описание изображения здесь

решение1

После создания изображения TikZ оно будет представлять собой просто прямоугольник с самой низкой точкой ограничивающего прямоугольника на базовой линии.

TikZ-CD перезаписывает это значение по умолчанию. Для однорядной диаграммы он будет размещен таким образом, что базовая линия узлов будет на базовой линии окружающего текста.
Для любой другой диаграммы его базовая линия будет центром матрицы (не всего изображения), что такжеу= 0 баллов по умолчанию.

Обычно это хороший выбор, поскольку диаграмма либо располагается на отдельной строке (например, в figureсреде), либо является единственным элементом среды отображения математических данных.

Для встроенных диаграмм необходимо сместить блок вверх так, чтобы центр матрицы оказался на высоте выступа этой скобки. TikZ-CD предоставляет функцию PGFMath, axis_heightкоторая позволяет использовать это расстояние внутри PGF/TikZ.

Таким образом, вам понадобится

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

для ваших встроенных диаграмм.


Я позволил себе настроить некоторые внутренние и внешние разделители, чтобы узлы и матрица были плотно упакованы, но узлы все еще имели немного отступов для стрелок. Если метки, т. е. узлы вдоль стрелок, должны быть использованы, их outer sepследует снова установить на 0ptили по умолчанию .5\pgflinewidth.

Примечания:

  • Я добавил изогнутую (но overlayвытянутую) стрелку, которая не мешает измерению подтяжек.

  • Библиотека matrixпредоставляет left delimiterи right delimiter. Однако, поскольку \left/ \rightне выводит точные длины для разделителей, а библиотека размещает разделители несколько неудачно, их нельзя использовать здесь без корректировки того, как TikZ их размещает.

    Решение с разделителями TikZ прокомментировано в коде ниже.

Код

\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}

Выход

введите описание изображения здесь

решение2

введите описание изображения здесь

вы увидите то же самое с \left\{\begin{array}[t]... X выровнены по базовой линии, поэтому конструкция имеет большую глубину, но \{вертикально центрированы. Сдвиньте базовую линию 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}

решение3

Использовать 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}

введите описание изображения здесь

решение4

Вы можете добавить \vcenter{\hbox{...}}вокруг 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]\&\&#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}

Связанный контент