我正在尝试制作类似这样的图表(来自维基百科)
除了我希望双箭头 $\eta$ two 从节点 $B$ 指向箭头 $X$ 的中间(毕竟,这是从 $RF$ 到 $X$ 的自然变换)。
我正在尝试使用\xtwocell
2cell 包的命令来处理 xy。在xyrefer 手册,其中规定
\xtwocell[⟨hop⟩]{⟨displace⟩}...
连接到由 ⟨displace⟩ 偏移的 ⟨pos⟩,该偏移与由 ⟨hop⟩ 指定的相对单元格位置相距甚远。偏移可以是任何有效的 XY-pic 命令字符串,但它们必须包含在组 {...} 中。当单元格位置是目标时,必须给出一个空分组 {}。当与 <\omit> 微调一起使用时,此类偏移允许将标记箭头放置在 XY-pic 图中的任何位置;此外,箭头可以定向为指向任何方向。
当然,手册中没有给出任何示例,也没有进一步评论如何改变箭头的方向(在本手册中,大写的“箭头”指的是箭头之间的双箭头,即 2 格)。
他说的“任何有效的 XY-pic 命令字符串”是什么意思?位移参数可能\xtwocell
是什么?我尝试过的任何实验(例如 <1>,dr,[0,1])都只是在花括号中输入了 $A$ 节点文本,因此不会被解释为位移、位置或方向。我如何更改箭头的方向?我如何实现承诺给我的“任意方向”?
这是我的简单标记
\xymatrix{
A\ar[d]\ar[r]\xtwocell[0,1]{}\omit{<2>} & B\\
C\ar@{.>}[ur] &
}
得到下面的图像
我想改变双箭头指向的方向,使其指向角落物体 $C$,或者反转它。我可以通过更改 中的数字来移动它\omit{<2>}
,但如何改变方向?
(谷歌告诉我同样的问题被问到在 xy 邮件列表上,但从未回答)
另请参阅我的问题在 xy 的 2cell 包中的复合图中间标记源/目标对象?在此图中尝试另一种方法。
答案1
如果你考虑使用tikz-cd
,这可以很容易地实现
- 命名节点 (
name=X
) 和 - 样式
to node
(见下文)。
该参数\arrow
通常表示方向/目标节点将被忽略。
对于较短的箭头,我会使用short
我对你的另一个问题的回答中的样式在 xy 的 2cell 包中的复合图中间标记源/目标对象?
您可以使用键short shift >
、short shift <
和short center
来调整箭头。
代码A
\documentclass[tikz,convert=false]{standalone}
\usepackage{tikz-cd}
\pgfkeys{
/tikz/commutative diagrams/to node/.style={%
/tikz/execute at begin to=\edef\tikztotarget{#1}},
/tikz/commutative diagrams/to node*/.style={
/tikz/commutative diagrams/to node={#1},
/tikz/shorten >=\pgfkeysvalueof{/tikz/commutative diagrams/to node shorten >}},
/tikz/commutative diagrams/to node shorten >/.initial=+.5ex}
\begin{document}
\begin{tikzcd}[column sep=large]
A \rar[][name=X]{X}
\dar[swap]{F}
& B \\
C \urar[dashed][swap]{R}
\arrow[Rightarrow, to node*=X]{}{\eta}
\end{tikzcd}
\end{document}
输出 A
代码 B
\documentclass[tikz,convert]{standalone}
\usetikzlibrary{decorations.pathreplacing}
\usepackage{tikz-cd}
\newcommand*{\tikzcdset}{\pgfqkeys{/tikz/commutative diagrams}}
\tikzcdset{
to node/.style={%
/tikz/execute at begin to=\edef\tikztotarget{#1}}}
\makeatletter
\tikzcdset{
short shift >/.initial=+.6em,
short shift </.initial=+.6em,
short center/.initial=.5,
short/.style={
to path={
\pgfextra
\pgfinterruptpath
\path (\tikztostart) coordinate (@aux1) -- (\tikztotarget) coordinate (@aux2);
\endpgfinterruptpath
\pgfpointdiff{\pgfpointanchor{@aux1}{center}}{\pgfpointanchor{@aux2}{center}}%
\pgfmathveclen@{\pgfmath@tonumber{\pgf@x}}{\pgfmath@tonumber{\pgf@y}}%
\edef\pgfpathlength{\pgfmathresult pt}%
\pgfcoordinate
{@@aux1}
{\pgfpointlineatdistance
{(\pgfkeysvalueof{/tikz/commutative diagrams/short center})*\pgfpathlength-\pgfkeysvalueof{/tikz/commutative diagrams/short shift <}}
{\pgfpointanchor{@aux1}{center}}
{\pgfpointanchor{@aux2}{center}}}%
\pgfcoordinate
{@@aux2}
{\pgfpointlineatdistance
{(\pgfkeysvalueof{/tikz/commutative diagrams/short center})*\pgfpathlength+\pgfkeysvalueof{/tikz/commutative diagrams/short shift >}}
{\pgfpointanchor{@aux1}{center}}
{\pgfpointanchor{@aux2}{center}}}%
\endpgfextra
(@@aux1) -- (@@aux2) \tikztonodes}}
}
\makeatother
\begin{document}
\begin{tikzcd}[column sep=large]
A \rar[][name=X]{X}
\dar[swap]{F}
& B \\
C \urar[dashed][swap]{R}
\arrow[Rightarrow, to node=X, short]{}{\eta}
\end{tikzcd}
\end{document}
输出 B
答案2
这是我将在 xypic 中使用的解决方案,我相信您要查找的命令是^
在 2 单元格的名称之前写入,并在<2>
将其向右移动之前写入。因此这将为您提供相同的图像:
0。
\[\xymatrix@!0@=18mm{
A\ar[d]\ar[r]\xtwocell[d]{}<>{^<-2>a} & B\\
C\ar@{.>}[ur] &
}\]
现在,要获得“正确”的方向,使用 xypic 并不容易,您可能必须添加更多(空)行和列,这样您才有指向的位置。以下是两次添加额外行和额外列的失败尝试。还有一次成功添加额外两行和额外两列的尝试。
1.
\[\xymatrix@!0@=9mm{
A\ar[dd]\ar[rr] \xtwocell[rd]{}<>{^a}&& B\\
&&\\
C\ar@{.>}[uurr] &&
}\]
2.
\[\xymatrix@!0@=9mm{
A\ar[dd]\ar[rr] \xtwocell[rrd]{}<>{^a}&& B\\
&&\\
C\ar@{.>}[uurr] &&
}\]
3.
\[\xymatrix@!0@=4.5mm{
A\ar[dddd]\ar[rrrr] &&&& B\\
\xtwocell[rrd]{}<>{^<-1>a}&&&&\\
&&&&\\
&&&&\\
C\ar@{.>}[uuuurrrr] &&&&
}\]
在 xypic 中绘制三角形的方法还有很多,这里我留下一些我使用的示例。希望它们有用。
\[\vcenter{\hbox{\xymatrix@!0@=18mm{
A\ar[r]\ar@{.>}[rd]\xtwocell[rd]{}<>{<-3>a}&C\ar[d]\\
&B\\
}}}\qquad\vcenter{\hbox{\xymatrix@!0@C=15mm{
A\ar[rd]\ar@{.>}[rr]\xtwocell[rr]{}<>{^<2>a}&&B\\&C\ar[ru]&
}}}\qquad\vcenter{\hbox{\xymatrix@!0@=18mm{
C\ar[d]&A\ar[l]\ar@{.>}[ld]\xtwocell[ld]{}<>{<3>a}\\
B&
}}}\]