如何在兼容模式下使 from=、to= 参数在 Tikzcd 中工作?

如何在兼容模式下使 from=、to= 参数在 Tikzcd 中工作?

由于某些原因,如果不破坏我的文档中的其他内容,可能需要做太多工作来修复它,Tikzcd 只能在我的文档中以兼容模式使用“箭头的替代语法”,根据手册,该语法“在标签的引号语法出现之前使用”。

这意味着像这样的代码:

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

在我的文档中不起作用,我必须这样写:

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

以达到预期结果。

那么我该如何写出类似于[from=A,to=B] 以下的表达式:

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

更具体地说,我尝试使以下表达式起作用:

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

但是最后一个箭头本来应该从上箭头的中间向下到下箭头的中间,但却出现了错误,显示为一个稍微向上倾斜的左箭头。也就是说,我得到的结果是: 在此处输入图片描述

当我想要类似的东西时:

在此处输入图片描述

但当然也会显示其他名称。

答案1

根据tikz-cd手动的alias,除了使用可以通过相关单元格内的选项分配的节点名称(参见下面的第二个示例)之外,您还可以在使用和选项<row number>-<column number>时使用语法来表示箭头的起点和终点(参见下面的第一个示例)。但是,这些选项应放在可选参数内。您还可以使用或移动箭头。fromtoxshiftyshift

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

两个代码片段都产生相同的输出:

在此处输入图片描述


现在,添加向下箭头并不是太简单,因为表示箭头起点和终点的两个坐标不是可以通过上述策略选择的单元格。但是,您可以稍微扩展矩阵,如下例所示:

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

在此处输入图片描述


或者,您可以使用start anchorend anchor选项,但不知何故,下方弯曲箭头的标签放置错误,尺寸太小:

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

在此处输入图片描述

可以通过向每个单元格添加一个来固定标签的位置,\strut使它们大小相同:

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

在此处输入图片描述

答案2

让我建议一条不同的路线,让您可以:

  • 处理无法处理最新tikz-cd版本的文档
  • 使用最新tikz-cd版本

该方法是在空间中分离需求,即把这个放在一个地方,把那个放在另一个地方:

  • 使用您的主文档,它使用incompatible documentclass
  • 根据类别处理尽可能多的文档,每个文档代表一个standalone图表

开始了:

arrows.texarrows.pdf,这是您发布的代码,但略有改动。只需编译它,我们稍后再回来。

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

箭


主文本,它使用了一个不寻常的文档类,比方说screenplay:这模仿了您的主类在与合作时似乎存在的差异、缺点、不兼容性等tikz-cd

screenplay 甚至可以与 tikz-cd 一起使用,我没有检查。但是让我们假装它不行。如您所见,它根本不使用任何 Tikz 方言......

相关代码行如下:

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

戏剧

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

相关内容