如何编出漂亮的辫子图解

如何编出漂亮的辫子图解

这个问题导致了一个新的方案的出现:
braids- 博客:辫子包

我搜索如何绘制辫子图,如果可能的话,在 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 编写类似的包应该并不难。

相关内容