我搜索如何绘制辫子图,如果可能的话,在 xy-pic 中。我已经知道如何使用 knot 模块和一些低级指令来做到这一点,并且我正在寻找一种更好的方法来做到这一点。
实际代码:
\documentclass{minimal}
\usepackage[all,knot]{xy}
\begin{document}
\[\vcenter{\xy 0;/r1pc/:
@={(0.5,-0.5),(0,0)}, @@{*{\vtwistneg}},(0,-2),\vtwist,
@i@={(0,-1),(2,0),(2,-2)} @@{="save";"save"-(0,1),**@{-}}\endxy}
\quad = \quad
\vcenter{\xy 0;/r1pc/:
@={(0.5,0),(0,-0.5),(0.5,-1)}, @@{*{\vtwistneg}},
@i@={(0,0),(2,-1),(0,-2)} @@{="save";"save"-(0,1),**@{-}}\endxy}\]
\end{document}
以及期望的结果
答案1
更新(2019-05-09):随着 TikZ 语法的出现,pic
我认为该braids
软件包早就该进行彻底改革了。下面的语法适用于该软件包的原始版本,该版本现已弃用(但仍有效)。请参阅软件包文档以了解如何使用新语法。
更新(2011-09-06):生成的包现在在 CTAN 上http://www.ctan.org/pkg/braids您也可以在我们的博客上阅读相关内容http://tex.blogoverflow.com/2011/09/the-braids-package/。
接受 Charles 的挑战,以下是在 TikZ/PGF 中实现此操作的方法。首先,输出:
接下来,用户代码;也就是说,如果令人讨厌的序言被放在一个很好的包装里,那么你应该输入以下内容:
\begin{document}
\begin{tikzpicture}
\braid[braid colour=red,strands=3,braid start={(0,0)}]
{\sigma_1 \sigma_2 \sigma_1^{-1}}
\node[font=\Huge] at (4.5,-1.5) {\(=\)};
\braid[strands=3,braid start={(5,0)}]
{\sigma_2 \sigma_1 \sigma_2}
\end{tikzpicture}
\end{document}
最后,令人讨厌的序言(实际上包括用户代码,因此您可以将其复制用于 MWE):
\documentclass{standalone}
\usepackage{tikz}
\newcounter{braid}
\newcounter{strands}
\pgfkeyssetvalue{/tikz/braid height}{1cm}
\pgfkeyssetvalue{/tikz/braid width}{1cm}
\pgfkeyssetvalue{/tikz/braid start}{(0,0)}
\pgfkeyssetvalue{/tikz/braid colour}{black}
\pgfkeys{/tikz/strands/.code={\setcounter{strands}{#1}}}
\makeatletter
\def\cross{%
\@ifnextchar^{\message{Got sup}\cross@sup}{\cross@sub}}
\def\cross@sup^#1_#2{\render@cross{#2}{#1}}
\def\cross@sub_#1{\@ifnextchar^{\cross@@sub{#1}}{\render@cross{#1}{1}}}
\def\cross@@sub#1^#2{\render@cross{#1}{#2}}
\def\render@cross#1#2{
\def\strand{#1}
\def\crossing{#2}
\pgfmathsetmacro{\cross@y}{-\value{braid}*\braid@h}
\pgfmathtruncatemacro{\nextstrand}{#1+1}
\foreach \thread in {1,...,\value{strands}}
{
\pgfmathsetmacro{\strand@x}{\thread * \braid@w}
\ifnum\thread=\strand
\pgfmathsetmacro{\over@x}{\strand * \braid@w + .5*(1 - \crossing) * \braid@w}
\pgfmathsetmacro{\under@x}{\strand * \braid@w + .5*(1 + \crossing) * \braid@w}
\draw[braid] \pgfkeysvalueof{/tikz/braid start} +(\under@x pt,\cross@y pt) to[out=-90,in=90] +(\over@x pt,\cross@y pt -\braid@h);
\draw[braid] \pgfkeysvalueof{/tikz/braid start} +(\over@x pt,\cross@y pt) to[out=-90,in=90] +(\under@x pt,\cross@y pt -\braid@h);
\else
\ifnum\thread=\nextstrand
\else
\draw[braid] \pgfkeysvalueof{/tikz/braid start} ++(\strand@x pt,\cross@y pt) -- ++(0,-\braid@h);
\fi
\fi
}
\stepcounter{braid}
}
\tikzset{braid/.style={double=\pgfkeysvalueof{/tikz/braid colour},double distance=1pt,line width=2pt,white}}
\newcommand{\braid}[2][]{%
\begingroup
\pgfkeys{/tikz/strands=2}
\tikzset{#1}
\pgfkeysgetvalue{/tikz/braid width}{\braid@w}
\pgfkeysgetvalue{/tikz/braid height}{\braid@h}
\setcounter{braid}{0}
\let\sigma=\cross
#2
\endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}
\braid[braid colour=red,strands=3,braid start={(0,0)}]%
{\sigma_1 \sigma_2 \sigma_1^{-1}}
\node[font=\Huge] at (4.5,-1.5) {\(=\)};
\braid[strands=3,braid start={(5,0)}]
{\sigma_2 \sigma_1 \sigma_2}
\end{tikzpicture}
\end{document}
改进:实际绘制命令可以稍微优化一下。辫子实际上并不是从头开始,而是移位了一次(不难纠正)。还应该能够计算出给定辫子中的股数:如果我们遇到使用我们尚未看到的股的元素,只需将其从顶部绘制到当前高度即可。
(我确实尝试做了一些 catcode 愚蠢的行为,以便可以代替s
,\sigma
但我无法让它工作(是的,我确实在尝试这样做时用环境替换了命令)。)
答案2
Stijn Symens 有一个很好的 Metapost 包,用于绘制辫子,其抽象概念是给出一个字符串,该字符串按其出现的顺序指定交叉点,使用小写字母绘制左交叉点和右交叉点,大写字母则绘制右交叉点和左交叉点。他有写了一篇简介。
我不知道在 Xypic 或 PGF/Tikz 中有任何相对简洁的方式来表示辫子,尽管对于 PGF 专家来说,为 PGF 编写类似的包应该并不难。