Rótulos distorcidos no tikzcd

Oct 09 2020

Eu estava desenhando um diagrama de transformação natural usando o tikzcd. No entanto, não sei por que a saída foi "distorcida":

\documentclass{article}
\usepackage{mathrsfs}
\usepackage{tikz-cd}
\begin{document}
\[\begin{tikzcd}
\mathscr{O}(X)^{op}
\arrow[r, bend left, "\Lambda A"]
\arrow[r, bend right, swap, "\Lambda A'"]
\arrow[r, phantom, bend left, shift right=0.2ex, ""{name=U}]
\arrow[r, phantom, bend right, shift left=0.2ex, swap, ""{name=D}]
&\textbf{Set}
\arrow[Rightarrow, from=U, to=D, "\Lambda f"]
\end{tikzcd}\]
\end{document}

Obtive a seguinte saída distorcida:

Agora, quando comparado a um código semelhante:

\documentclass{article}
\usepackage{mathrsfs}
\usepackage{tikz-cd}
\begin{document}
\[\begin{tikzcd}
\mathscr{A}
\arrow[r, bend left, "F"]
\arrow[r, bend right, swap, "G"]
\arrow[r, phantom, bend left, shift right=0.2ex, ""{name=U}]
\arrow[r, phantom, bend right, shift left=0.2ex, swap, ""{name=D}]
&\mathscr{B}
\arrow[Rightarrow, from=U, to=D, "\alpha"]
\end{tikzcd}\]
\end{document}

E dá uma bela saída:

Existe alguma maneira de consertar isso?

Respostas

2 Zarko Oct 09 2020 at 11:52

Com ajuste manual das posições dos rótulos das setas:

\documentclass{standalone}%article
\usepackage{mathrsfs}
\usepackage{tikz-cd}

\begin{document}
%\[
\begin{tikzcd}
\mathscr{O}(X)^{op}
    \ar[r, bend  left, pos=0.47, "\Lambda A"]
    \ar[r, bend right, pos=0.47, swap, "\Lambda A'"]
    \ar[r, phantom, bend left, ""{name=U}]
    \ar[r, phantom, bend right, pos=0.47, ""{name=D}]
        &   \textbf{Set}
                \ar[Rightarrow, from=U, to=D, "\Lambda f"]
\end{tikzcd}
%\]
\end{document}

2 SandyG Dec 14 2020 at 04:26

O problema é que a altura e largura de \mathscr{O}(X)^{op}é diferente da altura e largura de \textbf{Set}.

tikz-cddobra as setas de maneira desigual quando essas caixas não são do mesmo tamanho, o que afeta o posicionamento dos rótulos das setas e o posicionamento de Ue D.

Uma maneira de dar \textbf{Set}exatamente a mesma caixa que \mathscr{O}(X)^{op}é \rlapo \textbf{Set}com um invisível \mathscr{O}(X)^{op}usando \phantom.

Eu adicionei um espaço antes Setporque achei melhor assim. Você pode remover ou ajustar ao seu gosto. Além disso, em vez de usar as duas setas fantasmas, você pode namecolocar o espaço acima ou abaixo da seta, como fiz no código abaixo. Se você quiser que a seta central fique mais próxima das setas curvas, você pode usar shorten <=e shorten >=com valores negativos.

\[\begin{tikzcd}
\mathscr{O}(X)^{op}
\arrow[r, bend left, "\Lambda A", ""{name=U, below}]
\arrow[r, bend right, swap, "\Lambda A'", ""{name=D, above}]
&\rlap{\textbf{\ Set}}\phantom{\mathscr{O}(X)^{op}}
\arrow[Rightarrow, from=U, to=D, "\Lambda f"]
\end{tikzcd}\]