有人可以一步一步地向我解释一下文档命令上方的这个命令吗:
\documentclass{article}
\usepackage{amssymb,amsmath}
\usepackage{xypic}
\usepackage[czech]{babel}
\newcommand{\pullbackcorner}[1][dl]{\save*!/#1-1pc/#1:(1,-1)@^{|-}\restore}
\begin{document}
$$
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] \pullbackcorner & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
$$
\end{document}
它按预期工作,但是我不知道如何操作。
答案1
此命令中有很多内容需要解压,但其中大部分只是常规的 XY 语法,除非你经常使用它(而我不会),否则很难理解。
也许您不理解的部分\save ... \restore
正是理解命令如何工作的关键部分。所以我将从一个非常简单的例子开始,然后我们一点一点地建立起来。
从历史记录来看,该宏本身的原始来源似乎已经丢失,但在 XY 邮件列表的档案中对它有一个早期的引用(承认来源未知):https://tug.org/pipermail/xy-pic/2001-July/000015.html。
运营商
该命令的基本部分使用*
运算符来放置任意文本。要了解其工作原理,让我们使用*
在图表中放置一个红色 X:
\[
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] *{\color{red} X} & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
\]
由于此*
代码位于命令的末尾\ar
,它将文本放在箭头的末尾,最终位于 D 的正上方。因为这只是为了说明目的,所以我们不关心这一点。
\保存和\恢复
现在让我们做同样的事情,但是将*
代码包装在{\save ... \restore}
:
\[
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] \save*{\color{red} X}\restore & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
\]
现在 X 就在 P 的正上方。这就是\save
和\restore
的作用。它们允许添加对象相对于当前位置。在这种情况下,当前位置是磷不是箭头的终点。
定位参数
这就是该命令的基本功能\pullbackcorner
。它将任意文本(在本例中为角符号)放置在相对于当前位置的位置,而不是路径的末尾。因此,我们现在可以解开该命令的其余部分:
\newcommand{\pullbackcorner}[1][dl]{\save*!/#1-1pc/#1:(1,-1)@^{|-}\restore}
是\pullbackcorner
一个宏,它接受一个可选参数(方向指定),其默认值为dl
。这是\newcommand{\pullbackcorner}[1][dl]
宏的一部分。
然后,它将角符号@^{|-}
(实际上不是一个符号,而是众多xy-pic
箭头之一)放置1pc
在远离当前位置的方向dl
(/#1-1pc/
默认情况下#1
为dl
),方向由笛卡尔坐标设置#1:(1,-1)
,即相对于#1
(默认情况下dl
)将原点设置为(1,-1)。更改值1pc
将使角靠近或远离当前位置,更改值(1,-1)
将更改角本身的方向。
以下是一些改变这些值的示例:
我们可以将角移得更远一些:
\renewcommand{\pullbackcorner}[1][dl]{\save*!/#1-3pc/#1:(1,-1)@^{|-}\restore}
\[
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] \pullbackcorner & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
\]
我们可以旋转角:
\renewcommand{\pullbackcorner}[1][dl]{\save*!/#1-1pc/#1:(-1,1)@^{|-}\restore}
\[
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] \pullbackcorner & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
\]
我们可以向宏提供一个可选参数来改变角的相对定位(在此示例中为ul
)。
\[
\xymatrix@=3pc{
& & D \\
B \ar[r]\ar@/^/[rru]^{h} & P \ar[ru] \pullbackcorner[ul] & \\
A \ar [u]^f \ar[r]_g & C \ar[u]\ar@/_/[ruu]_{k} &
}
\]