Como fazer um argumento from= , to= funcionar no Tikzcd em modo de compatibilidade?

Como fazer um argumento from= , to= funcionar no Tikzcd em modo de compatibilidade?

Por alguma razão, o que provavelmente será muito trabalhoso para consertar sem quebrar alguma outra coisa no meu documento, o Tikzcd só funciona no meu documento em modo de compatibilidade com a "Sintaxe alternativa para setas" que de acordo com o manual era "usada antes do aparecimento de a sintaxe de aspas para rótulos".

Isso significa que código como:

\arrow[r, Rightarrow, "\phi"]

Não funciona no meu documento, eu teria que escrever assim:

 \arrow[Rightarrow]{r}{\phi}

Para obter o resultado pretendido.

Como então escrevo expressões como [from=A,to=B] as que ocorrem em:

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

\begin{document}
\begin{tikzcd}
   A \arrow[r, bend left=50, ""{name=U, below, draw=red}]
   \arrow[r, bend right=50, ""{name=D, draw=red}]
   & B
   \arrow[Rightarrow, from=U, to=D]
\end{tikzcd}
\end{document}

Mais especificamente, tentei fazer a seguinte expressão funcionar:

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

\begin{document}
\begin{tikzcd}
    \mathcal{C}
    \ar[bend left=47, pos=0.5]{r}{F}
    \ar[bend right=47, pos=0.5]{r}[swap]{G}
    \arrow[phantom,bend left=40, shift right=0.2ex, name=U]{r}
    \arrow[phantom,bend right=38.4, shift left=0.2ex, swap, name=D]{r}
    &   \mathcal{D}
    \arrow[Rightarrow]{from=U,to=D}{N}
\end{tikzcd}
\end{document}

Mas a última seta que deveria ir do meio da seta superior para baixo até o meio da seta inferior dá um erro e é exibida incorretamente como uma seta ligeiramente inclinada para cima e apontando para a esquerda. Ou seja, o resultado que obtenho é: insira a descrição da imagem aqui

Quando eu gostaria de algo como:

insira a descrição da imagem aqui

mas é claro com outros nomes sendo exibidos.

Responder1

De acordo comtikz-cdmanual, além de usar nomes de nós que você pode atribuir por meio da aliasopção dentro da célula relevante (veja o segundo exemplo abaixo), você também pode usar a sintaxe <row number>-<column number>para denotar o início e o fim de uma seta ao usar as opções frome to(veja o primeiro exemplo abaixo) . Entretanto, essas opções devem ser colocadas dentro do argumento opcional. Você também pode deslocar a seta usando xshiftou yshift.

\documentclass[border=10pt, tikz]{standalone} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
    \mathcal{C}
    \arrow[bend left=47, pos=0.5]{r}{F}
    \arrow[bend right=47, pos=0.5]{r}[swap]{G}
    &  \mathcal{D}
    \arrow[Rightarrow, from=1-2, to=1-1, yshift=0.5pt]{}{N}
\end{tikzcd}
\end{document}
\documentclass[border=10pt, tikz]{standalone} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
    |[alias=R]| \mathcal{C}
    \arrow[bend left=47, pos=0.5]{r}{F}
    \arrow[bend right=47, pos=0.5]{r}[swap]{G}
    & |[alias=L]| \mathcal{D}
    \arrow[Rightarrow, from=L, to=R, yshift=0.5pt]{}{N}
\end{tikzcd}
\end{document}

Ambos os trechos de código resultam na mesma saída:

insira a descrição da imagem aqui


Agora, não é muito simples adicionar uma seta para baixo, porque as duas coordenadas que representam o início e o fim da seta não são células que podem ser selecionadas através da estratégia acima. Você poderia, no entanto, estender um pouco a matriz, como no exemplo a seguir:

\documentclass[border=10pt, tikz]{standalone} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
    & {} & \\
    \mathcal{O}(X)^{op}
    \arrow[bend left=47, pos=0.5]{rr}{\Lambda A}
    \arrow[bend right=47, pos=0.5]{rr}[swap]{\Lambda A'}
    &  & \textbf{Set} \\
    & {} & 
    \arrow[Rightarrow, from=1-2, to=3-2, 
        shorten >=5pt, shorten <=5pt, xshift=-3.5pt]
        {}{\Lambda f}
\end{tikzcd}
\end{document}

insira a descrição da imagem aqui


Alternativamente, você poderia usar as opções start anchore end anchor, mas de alguma forma o rótulo da seta curvada inferior está colocado incorretamente em um tamanho tão pequeno:

\documentclass[border=10pt, tikz]{standalone} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
    |[alias=R]| \mathcal{O}(X)^{op}
    \arrow[bend left=47, pos=0.5]{r}{\Lambda A}
    \arrow[bend right=47, pos=0.5]{r}[swap]{\Lambda A'}
    & |[alias=L]| \textbf{Set}
    \arrow[Rightarrow, from=L, to=L, 
        start anchor={[xshift=-1cm]north}, end anchor={[xshift=-1cm]south}]
        {}{\Lambda f}
\end{tikzcd}
\end{document}

insira a descrição da imagem aqui

A posição dos rótulos pode ser corrigida adicionando um \struta cada célula para torná-los igualmente grandes:

\documentclass[border=10pt, tikz]{standalone} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
    |[alias=R]| \mathcal{O}(X)^{op}\strut
    \arrow[bend left=47, pos=0.5]{r}{\Lambda A}
    \arrow[bend right=47, pos=0.5]{r}[swap]{\Lambda A'}
    & |[alias=L]| \textbf{Set}\strut
    \arrow[Rightarrow, from=L, to=L, 
        start anchor={[xshift=-1cm]north}, end anchor={[xshift=-1cm]south}]
        {}{\Lambda f}
\end{tikzcd}
\end{document}

insira a descrição da imagem aqui

Responder2

Deixe-me sugerir uma rota diferente que permite:

  • trabalhar com seu documento, que não suporta a tikz-cdversão mais recente
  • enquanto estiver usando a tikz-cdversão mais recente

A abordagem é separar os requisitos no espaço, ou seja, ISTO em um lugar, AQUELE em outro diferente:

  • trabalhar com seu documento principal, que usa oincompatible documentclass
  • trabalhar com tantos documentos, representando um diagrama cada, com base na standaloneclasse

Aqui vamos nós:

setas.tex, que é o seu código postado com um pequeno toque. Basta compilá-lo, voltaremos arrows.pdfem um minuto.

\documentclass[10pt,border=3mm]{standalone}
    %\documentclass{article} 
\usepackage{tikz-cd}

\begin{document}
\begin{tikzcd}
   A \arrow[r, bend left=50, ""{name=U, below, draw=red}]
   \arrow[r, bend right=50, ""{name=D, draw=red}]
   & B
   \arrow[Rightarrow, from=U, to=D]
\end{tikzcd}
\end{document}

Setas; flechas


principal.tex, que usa uma documentclass incomum, digamos screenplay: isso imita diferenças, deficiências, incompatibilidades etc. que sua classe principal parece ter quando se trata de cooperação com tikz-cd.

o roteiro pode até funcionar com tikz-cd, não verifiquei. mas vamos fingir que não. como você pode ver, ele simplesmente não usa nenhum dialeto Tikz ...

As linhas de código relevantes são:

...
\usepackage{graphicx}       % without tikz showing tikz-cd diagram
...
    \includegraphics[width=.3\textwidth]{arrows}% i.e. arrows.pdf
...

drama

\documentclass{screenplay}[2012/06/30]  % just an alian class
\usepackage{graphicx}       % without tikz showing tikz-cd diagram

% ~~~ some shortcuts ~~~~~~~~~~~~
\newcommand\di[2]{\begin{dialogue}{#1}#2\end{dialogue}}
\newcommand\dia[3]{\begin{dialogue}[#2]{#1}#3\end{dialogue}}
\newcommand\newch[1]{\MakeUppercase{#1}}
\newcommand\pr[0]{Proggi}
\newcommand\ld[0]{Lad}

% ~~~ some redefine ~~~~~~~~~~~
\renewcommand\emph{***}

% ~~~~~~~~~~~~~~~~~~~~~~~
\begin{document}

 \title{An arrows drama}
 \author{MS-SPO}
 \maketitle

 % ~~~ Characters ~~~~~~~~~~~~~~~~~~~~~~
 \newch{Proggi}, a programmer, full of energy.

 \newch{Lad}, a nice document creating language, with some bells and whistles.

 % ~~~ Let the drama begin ~~~~~~~~~~~
 \fadein

 \intslug[Night]{A stubborn documentclass}
 \pr{} spent already endless hours, while \ld{} keeps being stubborn.

 \dia{\pr}{impatient}{Why can't you just do what I'm telling you to do! Why can't you?}

 \dia{\ld}{amused}{You did read the manuals, did you?}

 \dia{\pr}{about to burst}{Yours, yeah \dots other ones?}

 \dia{\ld}{whispering}{Yes: about \emph{standalone} and \emph{graphicx} \dots There you go \dots}

\begin{center}
    \includegraphics[width=.3\textwidth]{arrows}   % <<<
\end{center}


 \fadeout
\end{document}

informação relacionada