summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/rubik
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/rubik
Initial commit
Diffstat (limited to 'macros/latex/contrib/rubik')
-rw-r--r--macros/latex/contrib/rubik/README.txt159
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figA.pdfbin0 -> 3929 bytes
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figB.pdfbin0 -> 7192 bytes
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figC.pdfbin0 -> 2799 bytes
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figD.pdfbin0 -> 6844 bytes
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figE.pdfbin0 -> 4064 bytes
-rw-r--r--macros/latex/contrib/rubik/rubik-doc-figF.pdfbin0 -> 7608 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikcube.dtx10529
-rw-r--r--macros/latex/contrib/rubik/rubikcube.ins66
-rw-r--r--macros/latex/contrib/rubik/rubikcube.pdfbin0 -> 1026515 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikexamples.bat3
-rw-r--r--macros/latex/contrib/rubik/rubikexamples.pdfbin0 -> 581089 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikexamples.sh10
-rw-r--r--macros/latex/contrib/rubik/rubikexamples.tex1998
-rw-r--r--macros/latex/contrib/rubik/rubikpatterns-doc-figA.pdfbin0 -> 9503 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikpatterns.dtx609
-rw-r--r--macros/latex/contrib/rubik/rubikpatterns.ins64
-rw-r--r--macros/latex/contrib/rubik/rubikpatterns.pdfbin0 -> 303128 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikpatternsLIST.bat3
-rw-r--r--macros/latex/contrib/rubik/rubikpatternsLIST.pdfbin0 -> 205408 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikpatternsLIST.sh10
-rw-r--r--macros/latex/contrib/rubik/rubikpatternsLIST.tex283
-rw-r--r--macros/latex/contrib/rubik/rubikrot-doc-figA.pdfbin0 -> 1538 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikrot-doc-figB.pdfbin0 -> 1856 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikrot-doc-figC.pdfbin0 -> 3864 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikrot-doc-figD.pdfbin0 -> 10217 bytes
-rw-r--r--macros/latex/contrib/rubik/rubikrotation.161
-rw-r--r--macros/latex/contrib/rubik/rubikrotation.dtx1697
-rw-r--r--macros/latex/contrib/rubik/rubikrotation.ins65
-rw-r--r--macros/latex/contrib/rubik/rubikrotation.pdfbin0 -> 447616 bytes
-rwxr-xr-xmacros/latex/contrib/rubik/rubikrotation.pl2926
-rw-r--r--macros/latex/contrib/rubik/rubikrotationPL.pdfbin0 -> 354766 bytes
-rw-r--r--macros/latex/contrib/rubik/rubiktwo-doc-figA.pdfbin0 -> 11367 bytes
-rw-r--r--macros/latex/contrib/rubik/rubiktwocube.dtx2478
-rw-r--r--macros/latex/contrib/rubik/rubiktwocube.ins66
-rw-r--r--macros/latex/contrib/rubik/rubiktwocube.pdfbin0 -> 494886 bytes
36 files changed, 21027 insertions, 0 deletions
diff --git a/macros/latex/contrib/rubik/README.txt b/macros/latex/contrib/rubik/README.txt
new file mode 100644
index 0000000000..232a271069
--- /dev/null
+++ b/macros/latex/contrib/rubik/README.txt
@@ -0,0 +1,159 @@
+
+
+--------------------------------------------------------
+The RUBIK bundle (version 5) February 24, 2018
+
+rubikcube package : macros for typesetting 3x3x3 cubes
+rubiktwocube package : macros for typesetting 2x2x2 cubes
+rubikrotation package: macros Perl program for rotations
+rubikpatterns package: macros for typesetting
+--------------------------------------------------------
+
+The RUBIK bundle provides four complementary packages for
+documenting the Rubik cube (3x3x3) and Twocube (2x2x2)
+notation and configurations, and for processing rotation
+sequences for both cubes. A Perl program which processes
+rotation sequences on the fly is also included. The four
+packages are:
+(a) the rubikcube (3x3x3) package,
+(b) the rubiktwocube (2x2x2) package (NEW),
+(c) the rubikrotation package,
+(d) the rubikpatterns package.
+
+
+ (1) rubikcube package (3x3x3 cubes)
+
+ The rubikcube package provides a collection of LaTeX
+ commands and macros for typesetting Rubik cube
+ configurations and rotation instructions using the
+ PGF/TikZ graphic languages.
+
+
+ (2) rubiktwocube package (2x2x2 cubes) NEW
+
+ The rubiktwocube package provides a collection of LaTeX
+ commands and macros for typesetting TwoCube configurations
+ and rotation instructions using the PGF/TikZ graphic
+ languages.
+
+
+ (3) rubikrotation package
+
+ The rubikrotation package, is a dynamic extension to the
+ rubikcube and rubiktwocube packages. It consists of the
+ Perl script rubikrotation.pl and style option
+ rubikrotation.sty. The rubikrotation package implements
+ rotation sequences and random scrambling of the Rubik cube
+ on-the-fly, using the RubikRotation command. It returns
+ the new Rubik state in a form which can then be typeset
+ using commands from the Rubik bundle.
+
+ Since the RubikRotation command works by CALLing the Perl
+ script rubikrotation.pl, it follows that the rubikrotation
+ package requires
+ (a) Perl to be installed, and
+ (b) (Pdf/Lua)LaTeX to be run using the --shell-escape
+ command-line switch (available from the shellesc package).
+
+
+ (4) rubikpatterns package
+
+ The RubikPatterns package is a small database of well-known
+ patterns and sequences in the form of named macros which
+ can be processed easily using the RubikRotation command.
+
+
+ (5) New features
+
+ rubikcube:
+ --- Improved documentation.
+ --- Minor improvements to log-file documentation.
+ --- New commands for drawing cube sidebars adjacent to
+ cube edges.
+ --- Two new commands for setting up WY (White opposite
+ Yellow) and WB (White opposite Blue) `starter grey
+ cubes'.
+ --- Bugfix for the \ShowSequence command (fixes a problem
+ of fonts not being contained appropriately).
+ --- Added some missing lower case rotation notation.
+ --- A new \NoSidebar command for disabling sidebars of a
+ specified colour (mainly for use with OLL displays).
+
+ rubiktwocube:
+ --- this is new package dealing with 2x2x2 cubes, having
+ similar functionality to the rubikcube package.
+
+ rubikrotation:
+ --- minor code improvements in Perl programme, and
+ improved syntax checking.
+ --- some minor bugfixes in Perl programme
+ (eg: a zero or missing integer with random keyword
+ now generates an error message).
+ --- added new keyword `cubesize' to hold cube size
+ ie either `three' or `two' to inform Perl programme
+ as to which sort of cube is being processed.
+
+ rubikpatterns:
+ --- (no change from v4).
+
+
+-------------------------------------------------------
+RWD Nickalls email: dick@nickalls.org
+A Syropoulos email: asyropoulos@yahoo.com
+-------------------------------------------------------
+
+Copyright 2018 RWD Nickalls & A Syropoulos
+
+Licence
+
+This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3 of this license or (at your option) any
+ later version. The latest version of this license is
+ in http://www.latex-project.org/lppl.txt and
+ version 1.3 or later is part of all distributions of
+ LaTeX version 2005/12/01 or later.
+-------------------------------------------------------
+
+The RUBIK bundle consists of the following files
+
+Package files:
+ - rubikcube.ins,
+ - rubikcube.dtx,
+ - rubikcube.sty,
+ - rubiktwocube.ins,
+ - rubiktwocube.dtx,
+ - rubiktwocube.sty,
+ - rubikrotation.ins,
+ - rubikrotation.dtx,
+ - rubikrotation.sty,
+ - rubikrotation.pl (Perl script)
+ - rubikpatterns.ins
+ - rubikpatterns.dtx
+ - rubikpatterns.sty
+Documentation and README:
+ - rubikcube.pdf
+ - rubiktwocube.pdf
+ - rubikrotation.pdf,
+ - rubikrotationPL.pdf (Perl script documentation)
+ - rubikrotationPL.tex
+ - rubikrotation.1 (MAN file for Perl script)
+ - rubikpatterns.pdf
+ - rubikpatternsLIST.pdf
+ - rubikpatternsLIST.tex
+ - README.txt (this file)
+Examples:
+ - rubikexamples.pdf,
+ - rubikexamples.tex
+Image files:
+ - pdf files for rubikcube documentation (6 pictures)
+ - pdf files for rubiktwocube documentation (1 picture)
+ - pdf files for rubikrotation documentation (4 pictures)
+ - pdf files for rubikpatterns documentation (1 picture)
+Bash and bat files (for processing rubikexamples.tex and
+ rubikpatternsLIST.tex)
+-------------------------------------------------------
+
+If you have any ideas, suggestions, questions, or bugs
+to report, please contact us.
+-------------------------------------------------------
diff --git a/macros/latex/contrib/rubik/rubik-doc-figA.pdf b/macros/latex/contrib/rubik/rubik-doc-figA.pdf
new file mode 100644
index 0000000000..63be762148
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figA.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubik-doc-figB.pdf b/macros/latex/contrib/rubik/rubik-doc-figB.pdf
new file mode 100644
index 0000000000..bb584fe413
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figB.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubik-doc-figC.pdf b/macros/latex/contrib/rubik/rubik-doc-figC.pdf
new file mode 100644
index 0000000000..53dc10e839
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figC.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubik-doc-figD.pdf b/macros/latex/contrib/rubik/rubik-doc-figD.pdf
new file mode 100644
index 0000000000..5f33c1e28f
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figD.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubik-doc-figE.pdf b/macros/latex/contrib/rubik/rubik-doc-figE.pdf
new file mode 100644
index 0000000000..5d013ff25a
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figE.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubik-doc-figF.pdf b/macros/latex/contrib/rubik/rubik-doc-figF.pdf
new file mode 100644
index 0000000000..497cf9722d
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubik-doc-figF.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikcube.dtx b/macros/latex/contrib/rubik/rubikcube.dtx
new file mode 100644
index 0000000000..c9812ed4ba
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikcube.dtx
@@ -0,0 +1,10529 @@
+% \iffalse meta-comment
+% rubikcube.dtx
+%
+% version v5.0 (February 25, 2018)
+%
+% Copyright 2018
+% RWD Nickalls (dick@nickalls.org) and
+% A Syropoulos (asyropoulos@yahoo.com)
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+%
+% This work consists of the files rubikcube.dtx and rubikcube.ins
+% and the derived file rubikcube.sty.
+%
+%<*readme>
+%
+% The rubikcube package provides a collection of LaTeX commands and macros
+% for the typesetting of Rubik cube configurations and rotation
+% sequences using the TikZ graphic language.
+%
+% Please report errors or suggestions for improvement to
+%
+% Dick Nickalls or Apostolos Syropoulos
+%
+% This package requires the basic TikZ package to be loaded already
+%</readme>
+%
+%<*driver>
+\listfiles
+\documentclass{ltxdoc}
+\IfFileExists{rubikcube.sty}{\usepackage{rubikcube}}{%
+ \GenericWarning{rubikcube.dtx}{Package file rubikcube.sty not found.
+ Documentation will be messed up!^^J
+ (Generate rubikcube.sty by (La)TeXing rubikcube.ins, and then^^J
+ process rubikcube.dtx again)^^J}\stop
+}%
+\pagestyle{myheadings}
+\markright{\texttt{rubikcube} \ \ (Rubik bundle v5.0, 2018) \ \ \texttt{www.ctan.org/pkg/rubik}}
+\usepackage{ifpdf}
+\usepackage{url,path} %% for references
+\usepackage{supertabular} %% for Notation table
+\usepackage{hypdoc} %% for hyperref documenting of LaTeX packages
+%%\OnlyDescription
+\EnableCrossrefs
+\PageIndex
+\CodelineIndex
+\CodelineNumbered
+\RecordChanges
+\setcounter{StandardModuleDepth}{1}
+\begin{document}
+ \DocInput{rubikcube.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+%%% \CheckSum{6231}
+%
+%%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+%
+% \title{%
+% \ifpdf\pdfbookmark[1]{Title}{Title}\else\fi%
+% The \textsc{rubikcube} package}
+%
+% \author{
+% RWD Nickalls (dick@nickalls.org) \\
+% A Syropoulos (asyropoulos@yahoo.com)
+% }
+% \date{This file describes version \RCfileversion\ (\RCfiledate)\\
+% \texttt{www.ctan.org/pkg/rubik}}
+% \maketitle
+%
+% \begin{abstract}
+% The \rubikcube\ package provides LaTeX commands and macros
+% for typesetting Rubik cube (3x3x3) notation, configurations, and
+% rotation sequences using the TikZ graphic language. It is part of the
+% Rubik `bundle'.
+% \end{abstract}
+%
+% \medskip
+%
+% \begin{minipage}{11cm}
+% \centering
+% \ifpdf
+% \includegraphics[width=10cm]{rubik-doc-figF.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+% \tableofcontents
+%
+% \pagebreak
+%
+% \section{Introduction}
+%
+% The \rubikcube\ package (part of the \textsc{rubik} `bundle') provides a
+% collection of \LaTeX\ commands
+% and macros for typesetting Rubik cube (3x3x3) configurations using the
+% PGF/TikZ graphic languages.
+% We have extended the rotation hieroglyph notation, originally
+% developed by Garfath-Cox (1981), and improved by Duvoid (2010, 2011).
+%
+% The \rubikcube\ package is the `base' package of the bundle, and is required by all of
+% the Rubik packages; it deals primarily with typesetting 3x3x3 cube (Rubik cube)
+% configurations.
+% The \textsc{rubikrotation} package processes rotation sequences and keeps track of
+% the cube's configuration during rotations.
+% The \textsc{rubikpatterns} package is a small database of 3x3x3 (Rubik) cube rotation
+% sequences which generate well-known named cube configurations (patterns).
+% The \textsc{rubiktwocube} package allows the typesetting of 2x2x2 cube (Two cube)
+% configurations.
+%
+% Full 3x3x3 functionality requires the following packages to be loaded
+% (TikZ first; \textsc{rubikcube} second), as follows:
+%\begin{verbatim}
+% \usepackage{tikz}
+% \usepackage{rubikcube,rubikrotation,rubikpatterns}
+%\end{verbatim}
+% Full 2x2x2 functionality requires the \textsc{rubiktwocube} package \textit{in addition} to the
+% packages listed above.
+% Note that the \verb!TikZ! package must be loaded \textit{before} the \textsc{rubikcube}
+% package.
+%
+% The \rubikcube\ package has been road-tested on a Microsoft
+% platform (with \textsf{MiK}\TeX), a GNU-Linux platform (Debian 8.2.0
+% and {\TeX}Live 2017), and on a Solaris platform (OpenIndiana).
+%
+%
+% For the mathematics and group theory associated with the Rubik cube see Chen~(2004),
+% Davis (2006), Fung website, Golomb~(1981, 1982), Hofstadter (1981), Hutchings~(2011),
+% Heise website, Joyner~(2008), Kociemba website,
+% Rokicki~\textit{et al.} (2013), Scherphius website, Tran~(2005).
+% Other useful websites are the Speedsolving website, and those
+% maintained by Duvoid, by Fridrich, by Jelinek, by Reid, and by Vandenburgh.
+% A useful online solver utility (based on an algorithm by Kociemba) is
+% available at the RuWix website. Websites with good pages on patterns and symmetries are
+% those by Fridrich, Kociemba, Longridge, Reid, Randelshofer, Scherphius
+% (see References for details).
+%
+% For historical and technical details regarding Rubik's cube see Sher (2014),
+% and also the Wikipedia article \textit{Rubik's Cube}.
+%
+%
+% \subsection{Requirements}
+%
+% The \rubikcube\ package requires the TikZ package, since it makes
+% use of the TikZ picture environment and the \cmd{\pgfmathsetmacro} command.
+% Consequently, the \verb!TikZ! package must be loaded \textit{before}
+% the \textsc{rubikcube} package.
+% The \textsc{rubikrotation} package (see below)
+% requires Perl to be installed.
+%
+%
+% \subsection[rubikrotation package]{Supporting tool---the
+% \textsc{rubikrotation} package}
+% \label{sec:rubikrotation}
+%
+% The \textsc{rubikrotation} package (also part of the \textsc{rubik} `bundle'),
+% is a dynamic extension to the \rubikcube\ package. It consists of the
+% Perl program \texttt{rubikrotation.pl} and the associated style option
+% \texttt{rubikrotation.sty}.
+% The \textsc{rubikrotation} package implements rotation sequences on-the-fly using a
+% \cmd{\RubikRotation}\marg{rotation-sequence} command. It returns the
+% new state in a form which can then be used by the \rubikcube\ package.
+% It also returns some useful strings associated with the rotation sequence
+% which can be used by the \rubikcube\
+% package---see also Section~\ref{sec:showsequence}.
+%
+% Since the \cmd{\RubikRotation} command works by \textsc{call}ing the
+% \texttt{rubikrotation.pl} program, it follows that the \textsc{rubikrotation}
+% package requires (a)~Perl to be installed,
+% and (b)~the \LaTeX\ engine needs to be run using the \texttt{--shell-escape}
+% command-line option. Those wishing to use Lua\LaTeX\ will also need to have access
+% to the \texttt{shellesc} package (this can always be downloaded from CTAN directly).
+% See the \textsc{rubikrotation} documentation for further details.
+% See also the examples in the file \texttt{RubikExamples.pdf}.
+%
+%
+%
+% \subsection[rubikpatterns]{Supporting database---\textsc{rubikpatterns} package }
+% \label{sec:patterns}
+%
+%
+% The \textsc{rubikpatterns.sty} file (also part of the \textsc{rubik} `bundle')
+% is a small database of some well-known 3x3x3 cube (Rubik cube) rotation sequences,
+% stored as named macros. For~example, the `fourspot' and `sixspot' sequences are encoded in
+% this package as follows:
+%\begin{verbatim}
+% \newcommand{\fourspot}{[fourspot],F2,B2,U,Dp,R2,L2,U,Dp,<(12q*, 8f*)>}
+% \newcommand{\sixspot}{[sixspot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*, 8f*)>}
+%\end{verbatim}
+% These sequences can be processed by name (using the \cmd{\RubikRotation} command
+% which also requires Perl to be installed---see Section~\ref{sec:rubikrotation}), and
+% then displayed (using the \cmd{\ShowCube} command in conjunction with various
+% \cmd{\DrawRubikCube...} commands). So, for~example, one could typeset the so-called
+% `fourspot' configuration using the following code:
+%\begin{verbatim}
+% \usepackage{tikz,rubikcube,rubikrotation,rubikpatterns}
+% ...
+% \RubikCubeSolved
+% \RubikRotation{\fourspot} % this runs the Perl program \texttt{rubikrotation.pl}
+% \ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}
+%\end{verbatim}
+% The sequence itself can be readily typeset using the \cmd{\ShowSequence} command
+% (see Section~\ref{sec:showsequence}).
+% See also the \textsc{rubikrotation} documentation---especially
+% Section~5.1.1 \textit{Sequences as macros}.
+% See also the examples in the file \texttt{RubikExamples.pdf}.
+%
+%
+%
+% \subsection[rubiktwocube]{Supporting 2x2x2 package---\textsc{rubiktwocube} package }
+% \label{sec:patterns}
+%
+% The \textsc{rubiktwocube} package carries the macros and commands necessary
+% for processing and displaying 2x2x2 cubes (TwoCubes). The 2x2x2 commands are isomorphic
+% with the 3x3x3 commands---i.e.,~the word `\texttt{Two}' has replaced the
+% word `\texttt{Rubik}' in commands.
+% Consequently, users of this package will need to be familiar with the \textsc{rubikcube} package.
+% There are lots of 2x2x2 examples in the file \texttt{RubikExamples.pdf}.
+%
+%
+% \subsection{Copyright}
+% Copyright 2014--2018 RWD Nickalls and A Syropoulos.
+%
+% \medskip
+% {\noindent}This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or any
+% later version. The latest version of this licence is in
+% |www.latex-project.org/lppl.txt|
+%
+%
+% \section{Installation}
+%
+% The Rubik bundle consists of the four packages \rubikcube, \textsc{rubikrotation},
+% \textsc{rubikpatterns} and \textsc{rubiktwocube}. Although installing the Rubik bundle
+% will typically install everything automatically (eg.,~from the {\TeX}Live DVD),
+% each package can be installed separately if necessary.
+% Here we detail only the \rubikcube\ package.
+%
+% \subsection{Generating the \rubikcube\ files}
+%
+% Place the file \texttt{rubikcube.zip} into a temporary directory, and unzip it.
+% This will generate the following files:
+%\begin{verbatim}
+% rubikcube.ins
+% rubikcube.dtx
+% rubikcube.pdf --documentation of the rubikcube package
+% rubik-doc-figA.pdf
+% rubik-doc-figB.pdf
+% rubik-doc-figC.pdf
+% rubik-doc-figD.pdf
+% rubik-doc-figE.pdf
+% rubik-doc-figF.pdf
+% rubikexamples.tex
+% rubikexamples.pdf
+% rubikexamples.sh
+% rubikexamples.bat
+%\end{verbatim}
+%
+% The style option \texttt{rubikcube.sty} is generated by running (pdf)\LaTeX\ on
+% the file \texttt{rubikcube.ins} as follows:
+%\begin{verbatim}
+% pdflatex rubikcube.ins
+%\end{verbatim}
+% This documentation file (\texttt{rubikcube.pdf}) can then be generated using the following
+% steps\,\footnote{Several pdflatex runs are required, since the documentation includes
+% an index as well as hyperef links (the package \texttt{hypdoc}
+% is used). Prior to the first run it is
+% a good idea to delete any relevant \texttt{.toc}, \texttt{.aux}, \texttt{.out} files.}:
+%\begin{verbatim}
+% pdflatex rubikcube.dtx
+% pdflatex rubikcube.dtx
+% makeindex -s gind.ist rubikcube
+% makeindex -s gglo.ist -o rubikcube.gls rubikcube.glo
+% pdflatex rubikcube.dtx
+% pdflatex rubikcube.dtx
+%\end{verbatim}
+%
+%
+% \subsection{RubikExamples file}
+%
+% Note that the package includes a `rubikexamples' file (\texttt{rubikexamples.pdf}),
+% as well as the source file (\texttt{rubikexamples.tex}), and
+% associated \texttt{.sh} (Linux) and \texttt{.bat} (Microsoft) batch
+% files, which can be used to facilitate processing the source \texttt{.tex} file.
+% The file \texttt{rubikexamples.pdf} showcases both 3x3x3 (Rubik cube)
+% and 2x2x2 (Two cube) examples.
+%
+% Note that should you need to generate the file \texttt{rubikexamples.pdf}
+% from the source file (\texttt{rubikexamples.tex}) you will require
+% the \textsc{rubikrotation}, \textsc{rubikpatterns} and
+% \textsc{rubiktwocube} packages to be installed,
+% and will also need to use the \verb!--shell-escape! command-line
+% option (see Section~\ref{sec:rubikrotation} for details).
+%
+%
+% \subsection{Placing the files}
+%
+% Place the files either in the local working directory, or where your system
+% will find them. For a Linux system with a standard \TeX\ Directory Structure (TDS), then:
+%
+%\medskip
+%{\noindent}*.sty $\rightarrow$
+% \texttt{/usr/local/texlive/texmf-local/tex/latex/rubik/}
+%{\newline}*.pdf $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/doc/rubik/}
+%
+% \medskip
+% {\noindent}Finally, (depending on your system) update the \TeX\ file database.
+% For~example, on a Linux system one uses the \texttt{texhash} command.
+%
+%
+% \subsection{Usage}
+%
+% Load the package by using the command \cmd{\usepackage\{rubikcube\}}.
+% Note that the \rubikcube\ package requires the TikZ package, and so always load TikZ
+% before \rubikcube\ as follows:
+% \begin{quote}
+%\begin{verbatim}
+% \usepackage{tikz}
+% \usepackage{rubikcube,rubikrotation,rubikpatterns,rubiktwocube}
+%\end{verbatim}
+% \end{quote}
+% However, the \rubikcube\ package does check for the presence of TikZ, and will
+% load it if TikZ is not already loaded.
+%
+% While \rubikcube\ is a stand-alone package, for full 3x3x3 functionality it is necessary
+% to load the complementary packages \textsc{rubikrotation}, \textsc{rubikpatterns}.
+% For full 2x2x2 functionality you need to load all four packages.
+%
+%
+% \pagebreak
+%
+% \section{Command conventions}
+% \label{sec:conventions}
+%
+
+%
+% All \rubikcube\ package commands assume a 3x3x3 cube by default.
+% Since all cubes are displayed or `drawn' using the TikZ picture environment,
+% it is useful (initially at least) to categorise commands with regard to this environment
+% (and also with regard to the \cmd{\ShowCube..} command since this
+% is simply a convenient wrapper for the TikZ picture environment).
+% On~this basis, we can distingush three conceptually useful categories, as follows:
+%
+% \begin{enumerate}
+%
+% \item \cmd{\Draw..} commands
+% (which must \textit{always} be used \textit{inside} a TikZ picture environment),
+%
+% \item `parameter-allocation' commands (which can be used either inside
+% or outside a TikZ environment); for example, \cmd{\RubikFace..} (for allocating
+% facelet colours), and
+%
+% \item commands which can be used in ordinary text; for example, |\rr{}| (for typesetting
+% certain rotation codes).
+%
+% \end{enumerate}
+% From a functional point of view, however, we can view the Rubik bundle commands as
+% splitting into the following groups:
+% \begin{enumerate}
+%
+% \item those that allocate colour
+% to faces, facelets etc., ---these commands all start with \cmd{\Rubik} (for 3x3x3 cubes) or \cmd{\Two}
+% (for 2x2x2 cubes \footnote{Requires the \textsc{rubiktwocube} package}),
+%
+% \item those that % draw ---these commands all start with \cmd{\Draw},
+%
+% \item those that typeset rotation codes or hieroglyphs;
+% ---there are just four of these for 3x3x3 cubes (these commands
+% start with \cmd{\rr}, \cmd{\rrh}, \cmd{\Rubik},
+% and \cmd{\textRubik}), and an equivalent four commands for 2x2x2 cubes
+% (these start with \cmd{\tr}, \cmd{\trh}, \cmd{\Two}, and \cmd{\textTwo}).
+%
+% \end{enumerate}
+
+% \medskip
+%
+% \DescribeMacro{\rubikcube}
+% {\noindent}This command generates the logo \rubikcube.
+%
+%
+%
+% \subsection[Keywords Rubik and Two]{The keywords Rubik and Two in commands}
+% \label{sec:rubikandtwo}
+%
+% In order to try and keep commands intuitive\,\footnote{This is a tricky problem
+% given the large number of commands, so any feedback or ideas on how to avoid ambiguity,
+% including pruning or revising `bad' commands, is always welcome.}
+% we adopt the convention that
+% the word `Rubik' in a command reflects the fact that the command
+% relates to a 3x3x3 cube (i.e.,~a `Rubik' cube). Similarly, commands which relate
+% to a 2x2x2 cube (a `Two' cube) ---see the \textsc{rubiktwocube} package---
+% use instead the word `Two'.
+% For~example, the commands for drawing a 3x3x3 cube and a 2x2x2 cube from a RU viewpoint
+% are respectively \cmd{\DrawRubikCubeRU} and \cmd{\DrawTwoCubeRU}.
+%
+% Having packages now for both 3x3x3 and 2x2x2 cubes (v5) means we need to be more careful regarding
+% command names, and try to make commands (a)~as intuitive as possible, and (b)~use the
+% same command name format for equivalent 3x3x3 and 2x2x2 commands (as shown in the example above).
+%
+% In keeping with this approach, some commands have had to be renamed.
+% For~example, in this new version we have therefore renamed the
+% earlier \cmd{\DrawFace..} commands $\rightarrow$ \cmd{\DrawRubikFace..}
+% (see Section~\ref{sec:deprecated}).
+%
+%
+% \subsection{Environments}
+%
+% Although the \rubikcube\ package has been designed with TikZ in mind,
+% it is important to appreciate that of all the various \rubikcube\ package
+% commands only the Rubik \cmd{\Draw...} commands and TikZ commands actually
+% have to be used inside a TikZ picture environment.
+%
+% Indeed, using \rubikcube\ package commands which influence the Rubik colour state
+% (configuration) outside the \texttt{tikzpicture}, \texttt{minipage} or
+% \texttt{figure} environments can make for useful
+% flexibility when a document is generating more than one figure
+% or image. This is because the scope of any colours specified by commands inside
+% these environments is constrained to
+% be `local' to that particular environment, and hence any change in the
+% Rubik colour state brought about by such commands is not accessible
+% globally (i.e.,~outside the environment) ---see also Section~5 in the documentation
+% of the \textsc{rubikrotation} package.
+%
+% Consequently users need to be mindful of the environments when
+% drawing sequences of rotations across several figures; for~example, keeping commands like
+% \cmd{\RubikRotation}, \cmd{\RubikFace..}, \cmd{\RubikCubeSolved},
+% outside the environments keeps their effects global
+% (an example of this problem is presented in the file \texttt{RubikExamples.pdf}).
+%
+%
+% \subsection{Capital letters}
+%
+% Virtually all Rubik bundle commands start with a capital letter, primarily to
+% avoid any confusion with TikZ commands (these generally start with lower-case letters). However,
+% each `word' in a Rubik bundle command (except the word `text') also starts
+% with a capital letter, primarily to facilitate readability.
+% For~example, \cmd{\DrawRubikCubeRU}, \cmd{\DrawCubieRU}.
+% However, as with \LaTeX, `text..' commands start with a lower-case `t';
+% for~example \cmd{\textCubieRU}. Letter arguments for colours (R, O, Y, G, B, W, X) are
+% always written in upper-case letters.
+%
+%
+%
+% \subsection{XYZ argument ordering}
+% \label{sec:xyzarguments}
+%
+% Many commands have an appended two, three, or even six ordered arguments or letters
+% which form some feature of the structure of a command; perhaps
+% either face or colour code or a viewpoint direction.
+%
+% We adopt the convention that where ordering of arguments is critical, then the
+% arguments are ordered in the XYZ, $+$, $-$ order. An XYZ code implies that
+% the first letter in the code relates to an X-related parameter,
+% for~example, L (Left) or R (Right); the second letter relates to a Y-related
+% parameter, for~example, U (Up) or D (Down); the third (if required)
+% relates to a Z-related parameter, for~example, F (Front) or B (Back)
+% ---see Figure~\ref{fig:notation}.
+%
+% Some commands have six arguments which adopt an (XYZ;$+$$-$) format. In this case,
+% for~example, the \cmd{\RubikSolvedConfig} command, for which the six colour arguments
+% are ordered as X$+$, X$-$, Y$+$, Y$-$, Z$+$, Z$-$. Here the colour argument
+% associated with a face positioned on the $+$ve axis is ordered before
+% its $-$ve complement on the same axis.
+%
+% Another example is the |\DrawCubieRU{G}{Y}{O}| command, which draws a cubie. Here
+% the RU letters are XY ordered; i.e.,~RightUp viewpoint. The sequence of colour codes
+% for the three visible faces are XYZ ordered, and hence result in the cube having a
+% Green Right face, Yellow Up face and Orange Front face.
+%
+%
+%
+% \subsection{Trailing \% on the end of commands}
+% \label{sec:trailingpercent}
+%
+% Since the all the output of this package is drawn using graphic elements
+% using TikZ, it is important to include a trailing \% on the end
+% of \rubikcube\ package commands when used \textit{outside} a TikZ picture environment, and
+% also on the end of the \cmd{\end\{tikzpicture\}} environment command itself.
+% In particular it is important to use a trailing \% on
+% the end of lines which break before the terminal curly bracket of a \cmd{\newcommand}.
+%
+% This is to prevent accumulating spurious spaces which may otherwise appear in
+% figures and diagrams as a strange or unexpected horizontal shift or white-space.
+% That this can occur is because in \TeX\ every newline character is automatically converted
+% to a white space---unless you have an empty line
+% (Feuers\"{a}nger 2016).
+%
+% The \LaTeX\ fbox is a useful aid for visualising unwanted white space
+% which may have accumulated, and for identifying the cause.
+% See Section~\ref{sec:showcube} on the \cmd{\ShowCubeF} command for
+% more details regarding this approach.
+%
+% Although this effect is mostly small, and is generally only observed in situations
+% when centering a graphic is critical, it is, however, cumulative and can be surprisingly large.
+% In these situations, the cure is the addition of terminal \% characters to preceding
+% code guided by careful detective use of the fbox technique mentioned above.
+%
+%
+% \subsection{Cubies, cubicles, faces and facelets}
+%
+% The sub-cubes which make up the Rubik cube are known as `cubies'; the small
+% coloured face of a cubie is known as a `facelet'. The cubies
+% are named either according to the colours of their two or three facelets, or
+% according to their physical position.
+%
+% We distinguish three types of cubie:
+% centre-cubies (single colour), edge-cubies (two colours) and corner-cubies
+% (three colours). For~example, the red/white edge-cubie is called
+% the RW cubie, and the red/white/green corner-cubie is called the
+% RWG cubie etc. Note that the colour of a particular face of a 3x3x3 Rubik
+% cube is determined by the colour of its centre-cubie.
+%
+% Similarly, the positions (known as `cubicles') occupied by cubies are
+% defined using either a two or three letter face code. For~example, the
+% right edge position in the Up-layer is termed the Up/Right position,
+% or just the UR position, and the corner joining the \textsc{down}
+% \textsc{front} and \textsc{right} faces is the DFR position.
+%
+%
+%
+% \section{Rubik cube coordinates}
+% \label{sec:coordinates}
+%
+% The coordinate origin of all 2D cube images is located
+% at the bottom-left corner of the \textsc{front} face, as shown in
+% Figure~\ref{fig:cubesquaregraph}. Note also that the bottom left
+% extent of this particular 2D rendering of the 3x3x3 cube is actually
+% at $(-1,-1)$, and hence the default height and width of all oblique-view
+% cubes is 4~units (i.e.,~equivalent to 4cm if the TikZ scale-factor = 1).
+%
+% \begin{figure}[hbt]
+% \centering
+% \ifpdf
+% \includegraphics[height=4cm]{rubik-doc-figB.pdf}
+% \else
+% \includegraphics[height=4cm]{rubik-doc-figB.eps}
+% \fi
+%
+% \parbox{9cm}{\caption{\label{fig:cubesquaregraph}Origin of coordinates
+% is at the bottom left corner of the grey \textsc{front} face.
+% Since $P$ is at $(-1,-1)$ then the default height and width of the
+% 2D~cube image is 4~units.}}
+% \end{figure}
+%
+% Arranging for $P$ to be at $(-1,-1)$, as well as using the bottom-left corner
+% of the \textsc{front} face as the origin, is a useful design
+% feature which make it easy to figure-out the coordinates of any point on
+% the image plane (either on the cube or outside the cube), and hence
+% facilitates the use of TikZ commands
+% (e.g.,~\cmd{\draw} and \cmd{\node} commands) to superimpose lines,
+% arrows and text etc.,~onto the Rubik cube (see Section~\ref{sec:arrows}).
+%
+%
+% \subsection[Size of cube minipage]{Size of cube \cmd{\minipage}}
+% \label{sec:sizeofminipage}
+%
+% Since the the default height and width of the oblique 2D~cube image is
+% 4~units (see Section~\ref{sec:coordinates} above),
+% it follows that the width of the \cmd{\minipage} required for a cube in a
+% \texttt{tikzpicture} environment can be easily calculated. For~example,
+% if the \texttt{tikzpicture} scale factor used is $0.5$, then the minimum
+% width of the required minipage for the \cmd{\DrawRubikCubeLD} view (shown above)
+% is therefore $0.5 \times 4\mbox{cm} = 2\mbox{cm}$.
+%
+% Note that the width of the semi-flat (SF) cube representation is therefore
+% 10~units ($=3+3+1+3$), and that of the flat (F) cube is 12~units ($=3+3+3+3$)
+% --- see Section~\ref{sec:flatcommands} for images of these forms.
+% If in doubt check the horizontal extent of an image using the \cmd{\ShowCubeF} command,
+% which places an fbox around the image.
+%
+%
+%
+% \section{TikZ picture environment}
+% \label{sec:tikz}
+%
+% All the Rubik bundle \cmd{\Draw..} commands are designed to be used
+% with the TikZ picture environment, and are compatible with standard TikZ.
+% For a basic introduction to the use of TikZ see the following manuals
+% (from CTAN or from \texttt{http://altermundus.com/}).
+% \begin{itemize}
+% \item \texttt{https://en.wikipedia.org/wiki/PGF/TikZ}
+% \item \texttt{pgfmanual.pdf}, version 3.0.1a (2015) (1161 pages)
+% \item \texttt{pgfplot.pdf}, version 1.14 (2016) (561 pages)
+% \item \texttt{tkz-base-screen.pdf}, version 1.16c (2011) (91 pages)
+% \end{itemize}
+% An example of the TikZ picture environment for use with the Rubik bundle
+% is as follows:
+% \begin{quote}
+%\begin{verbatim}
+% \begin{tikzpicture}[scale=0.5]
+% ...
+% \end{tikzpicture}%
+%\end{verbatim}
+% \end{quote}
+% If no scale-factor is used (default scale-factor = 1), then each of the small
+% cubie sides will have a length of 1~cm.
+%
+% \textsc{useful commands}:\ Probably the most
+% useful TikZ commands for use with regard
+% to the Rubik bundle are the \cmd{\draw} command (for drawing lines, arrows, circles),
+% and the \cmd{\node} command (for writing text at specific coordinate locations).
+% The basic structure of these commands is as~follows, where
+% (x,y) represent grid coordinates of start or end points of lines or arrows,
+% or of a circle centre, or of text position
+% (see Sections~\ref{sec:drawrubikcubecommands} and \ref{sec:arrows} for examples).
+% \begin{quote}
+% \begin{verbatim}
+% \draw[->,thick,color=blue] (4.5, 2.5) -- (3.5,2.5);
+% \draw[->,ultra thick,color=red] (4.5, 2.5) -- (3.5,2.5);
+% \draw [color=blue, thick] (0.3, 0.3) circle (1.3);
+% \node (B) at (7.5, 1.5) [black]{\small\textsf{B}};
+%\end{verbatim}
+%\end{quote}
+% Remember that all TikZ commands which are valid inside a \texttt{tikzpicture}
+% environment require a terminal semicolon (see Section~\ref{sec:arrows}
+% for examples).
+%
+% \textsc{colours}: \
+% The following colors are predefined by TikZ: red, green, blue, cyan, magenta,
+% yellow, black, gray, darkgray, lightgray, brown, lime, olive, orange, pink,
+% purple, teal, violet and white (see \texttt{https://en.wikipedia.org/wiki/PGF/TikZ}).
+%
+% \textsc{line width}: \
+% TikZ allows line width to be specified directly
+% (e.g.,~\texttt{[line width=<dimension>]}), or by using the following abbreviations:
+% `ultra thin' for 0.1pt, `very thin' for 0.2pt, `thin' for 0.4pt (the default width),
+% `semi thick' for 0.6pt, `thick' for 0.8pt, `very thick' for 1.2pt,
+% `ultra thick' for 1.6pt (see \texttt{https://en.wikipedia.org/wiki/PGF/TikZ}).
+%
+%% \textsc{white space}: \
+% A particularly useful feature of TikZ is that it automatically
+% minimises any horizontal white-space. However, it is good practice to place
+% a \% symbol after the \verb!\end{tikzpicture}! command
+% to avoid additional white space inadvertently being added by \LaTeX\
+% (see Section~\ref{sec:trailingpercent}).
+%
+% When making images it can be helpful to place them inside a minipage
+% (e.g.,~using the \cmd{\ShowCube} command / environment below).
+% A~convenient approach is to first adjust the value of the tikzpicture scale-factor
+% (to obtain the appropriate size), and then adjust the minipage-width as necessary, using
+% the fbox associated with the \cmd{\ShowCubeF} command
+% (see Section~\ref{sec:sizeofminipage} for a useful guide on this).
+%
+% The main `display' tool for drawing cubes is the \cmd{\ShowCube} command
+% (see below), and this incorporates a
+% TikZ picture environment inside a minipage. The equivalent tool for
+% displaying rotation sequences is the \cmd{\ShowSequence} command.
+%
+%
+%
+%
+%
+% \section[ShowCube command]{\cmd{\ShowCube} command}
+% \label{sec:showcube}
+%
+%
+% \DescribeMacro{\ShowCube}
+% This command \cmd{\ShowCube}\marg{width}\marg{scale-factor}\marg{commands}
+% is a convenient tool for placing one or more commands inside a
+% tikzpicture environment which is also inside a minipage
+% (see Section~\ref{sec:showcubecode} for the code).
+% This command takes three arguments: the first (\verb!#1!) is the minipage width,
+% the second (\verb!#2!) is the tikzpicture scale factor, and the third (\verb!#3!)
+% is a series of any \rubikcube\ package \cmd{\Draw..} and other commands, as well as
+% any TikZ commands which are valid in a \texttt{tikzpicture} environment
+% (e.g.,~\cmd{\draw} or \cmd{\node} etc.).
+%
+% \medskip
+%
+% \noindent\textsc{usage}:
+% The following \cmd{\ShowCube} command displays a Rubik cube
+% (the `SixT's configuration\footnote{The \cmd{\sixts} macro is from the \textsc{rubikpatterns}
+% package.}) and a blue arrow in a minipage of width~3cm, using a tikzpicture scale
+% factor of~0.5.
+% Note that the TikZ \cmd{\draw} command requires a terminal
+% semicolon (see Section~\ref{sec:tikz}).
+%
+% \medskip
+%
+% {\noindent}%
+% \begin{minipage}{6.6cm}
+%\begin{verbatim}
+% \RubikCubeSolved
+% \RubikRotation{\sixts}
+% \ShowCube{3cm}{0.5}{%
+% \DrawRubikCubeLU
+% \draw[->,thick,color=blue] (4.5, 2.5) -- (3.5,2.5);
+% }
+%\end{verbatim}
+% \end{minipage}
+% \hspace{2.5cm}%
+%\RubikFaceUp{Y}{Y}{W}{W}{W}{W}{Y}{Y}{W}%
+%\RubikFaceDown{Y}{W}{W}{Y}{Y}{Y}{Y}{W}{W}%
+%\RubikFaceLeft{B}{G}{G}{B}{B}{B}{B}{G}{G}%
+%\RubikFaceRight{G}{B}{B}{G}{G}{G}{G}{B}{B}%
+%\RubikFaceFront{O}{O}{O}{R}{O}{R}{R}{O}{R}%
+%\RubikFaceBack{O}{R}{O}{O}{R}{O}{R}{R}{R}%
+% \ShowCube{3cm}{0.5}{%
+% \DrawRubikCubeLU
+% \draw[->,thick,color=blue] (4.5, 2.5) -- (3.5,2.5);
+% }
+%
+% \medskip
+%
+% {\noindent}The action of the \cmd{\ShowCube} command is illustrated below; the
+% \cmd{\ShowCube} command on the left is equivalent to the bunch of commands
+% on the right (see Section~\ref{sec:showcubecode} for the complete code).
+% $$
+% \left.
+% \begin{array}{l}
+% {\ }\\
+% {\ }\\
+% \verb!\ShowCube{3cm}{0.5}{...}!\\
+% {\ }\\
+% {\ }\\
+% \end{array}
+% \right\{
+% \begin{array}{l}
+% \verb!\begin{minipage}{3cm}%!\\
+% \verb!\centering%!\\
+% \verb!\begin{tikzpicture}[scale=0.5]!\\
+% ...\\
+% \verb!\end{tikzpicture}%!\\
+% \verb!\end{minipage}%!\\
+% \end{array}
+% $$
+%
+% \DescribeMacro{\ShowCubeF}
+% The \cmd{\ShowCubeF} command is similar in all respects except that it places
+% an \texttt{fbox} around the minipage in order to enable users to see the extent of any
+% associated white space. For~example, unexpected spacing between two adjacent images,
+% or between an image and adjacent text, is usually related to
+% `hidden' white-space associated with the image itself or excessive width
+% of the associated \cmd{\minipage} (see also Section~\ref{sec:trailingpercent}).
+% Consequently, a temporary \texttt{fbox} around the minipage can be a
+% useful aid when trying to visualise the full extent of the minipage
+% (and its associated white-space). Use the \cmd{\ShowCubeF} command for this.
+
+% For~example, the following use of the \cmd{\ShowCubeF} command reveals a significant
+% white-space problem:
+%
+% \medskip
+%{\noindent}%
+%\begin{minipage}{6.6cm}
+%\begin{verbatim}
+% \ShowCubeF{4cm}{0.3}{\DrawRubikCubeRU}
+%\end{verbatim}
+%\end{minipage}
+% \RubikCubeSolved
+% \ShowCubeF{4cm}{0.3}{\DrawRubikCubeRU}
+%
+% \medskip
+% {\noindent}In this example, clearly either the minipage is too wide (4cm)
+% or the \texttt{tikzpicture} scale factor is too small (0.3).
+% Once the figure/code has been corrected, then the
+% \texttt{F} in the \cmd{\ShowCubeF} command can be removed.
+%
+% Note that while the \cmd{\ShowCube} command centres the image
+% inside the minipage, \LaTeX\ positions
+% the minipage in the \cmd{\textwidth}, and hence it is generally best to minimise
+% the horizontal white-space as revealed by the \cmd{\ShowCubeF} command. The~relationship
+% between the required width of the minipage and the TikZ scale factor for the various
+% Rubik cube images is detailed in Section~\ref{sec:sizeofminipage}.
+%
+%
+%
+% \section{Optimum strategy}
+% \label{sec:optimumstrategy}
+%
+%
+% We suggest that the most convenient (and intuitive) approach for drawing
+% cubes or particular faces is to do it in stages, as follows
+% (all these steps are well illustrated in the examples file
+% \texttt{RubikExamples.pdf}):
+%\begin{itemize}
+% \item first, start by setting the colour state of the cube. This can be done using
+% either (a)~a \cmd{\RubikCubeSolved..} or \cmd{\RubikCubeGrey..} command
+% (for defining the whole cube), or (b)~using one or more \cmd{\RubikFace..}
+% commands (for defining parts of faces), or (c)~by imputting a file containing
+% a previously saved colour state\footnote{See the \textsc{rubikrotation} package documentation
+% for details of the \cmd{\SaveRubikState} command; see also the `SaveRubikState' example in the
+% file \texttt{RubikExamples.pdf}.}.
+%
+% \item second, use the \cmd{\RubikRotation}\ command to process a sequence of rotations
+% (remembering that this requires use of the \verb!--shell-escape! command-line option).
+% The \textsc{rubikpatterns} package is a small library of named rotation sequences.
+%
+% \item third, draw the image(s) using \cmd{\DrawRubikCube..} or
+% \cmd{\DrawRubikFace..} commands, plus any TikZ commands
+% (e.g.,~\cmd{\draw} and/or \cmd{\node}) in conjunction with the \cmd{\ShowCube} command.
+% Use the \cmd{\ShowCube} scale factor to adjust the size, and use the \cmd{\ShowCubeF}
+% command to reveal the extent of any \texttt{minipage} whitespace.
+%
+% \item fourth, spacing between graphic elements can be influenced by adjusting either
+% (a)~horizontal whitespace as set by the \cmd{\ShowCube} command, or (b)~using standard
+% \TeX\ spacing commands, e.g.,~\cmd{\quad}, \cmd{\qquad}, \cmd{\hspace..} etc.
+%
+% \item finally, give some thought to using a trailing \verb!%! in commands which are
+% broken across multiple lines (see Section~\ref{sec:trailingpercent}).
+%
+%\end{itemize}
+% With this approach the internal colour state
+% will be updated and processed correctly by all subsequent
+% \cmd{\Draw..} or \cmd{\RubikRotation}\ commands.
+% Note that exchanging the word `\texttt{Rubik}' for the word `\texttt{Two}' in a command will
+% generate the equivalent TwoCube version of the command (see Section~\ref{sec:rubikandtwo}).
+%
+%
+%
+% \section{Colour commands}
+% \label{sec:colours}
+%
+% The Rubik bundle of packages uses seven colours which are defined as follows:
+% R~(red), O~(orange), Y~(yellow), G~(green), B~(blue), W~(white),
+% and X~(grey). Now according to the following webpage\,\footnote{We thank Peter Bartal
+% for bringing this webpage to our attention.}
+%
+% \medskip
+% \noindent\texttt{http://The-Rubiks-Cube.deviantart.com/journal/Using-Official-Rubik}
+% \newline\texttt{-s-Cube-Colors-268760351} (Nov 2011)
+%
+% \medskip
+% {\noindent}the official Rubik cube colours are defined as
+% \begin{quote}
+%\begin{verbatim}
+% ... colours which are red (PMS 200C*), green (PMS 347C*),
+% blue (PMS 293C*), orange (PMS 021C*), yellow (PMS 012C*)
+% and white.
+% ...
+% Pantone colors can not be accurately converted to RGB colors,
+% the colors the web runs on. But they can be approximated.
+% Through some research, I have found some estimations which
+% may help you which I have listed below. Remember, these are
+% just approximate RGB equivalents to the official Rubik's Cube
+% colors.
+%
+% Red: 200C #C41E3A (www.perbang.dk/rgb/c41e3a/)
+% Green: 347C #009E60 (www.perbang.dk/rgb/009e60/)
+% Blue: 293C #0051BA (www.perbang.dk/rgb/0051ba/)
+% Orange: 021C "Pantone Orange" #FF5800 (www.perbang.dk/rgb/ff5800/)
+% Yellow: 012C "Pantone Yellow" #FFD500 (www.perbang.dk/rgb/ffd500/)
+% White: N/A #FFFFFF
+%
+% Red {HTML}{C41E3A}
+% green {HTML}{009E60}
+% Blue {HTML}{0051BA}
+% Yellow {HTML}{FFD500}
+% Orange {HTML}{FF5800}
+% White {HTML}{FFFFFF}
+%\end{verbatim}
+% \end{quote}
+%
+% {\noindent}The following RGB specifications are given by Sher (2014):
+% \begin{quote}
+%\begin{verbatim}
+% White {RGB}{255,255,255}
+% Red {RGB}{137,18,20}
+% Blue {RGB}{13,72,172}
+% Orange {RGB}{255,85,37}
+% Green {RGB}{25,155,76}
+% Yellow {RGB}{254,213,47}
+%\end{verbatim}
+% \end{quote}
+%
+% {\noindent}However, we have tried to optimise these prescribed colours very slightly
+% for screen \& print use (for~example, the yellow was made very
+% slightly brighter), and so the actual colours implemented by
+% the \rubikcube\ package are as follows\,\footnote{Although the Pantone
+% colours cannot be converted to RGB, there is a subset of of Pantone colours
+% which can be be converted using CMYK
+% (see \texttt{https://en.wikipedia.org/wiki/Pantone}).}
+% (see Section~\ref{sec:codecolours}):
+%
+% \begin{quote}
+%\begin{verbatim}
+% \definecolor{R}{HTML}{C41E33}
+% \definecolor{G}{HTML}{00BE38}
+% \definecolor{B}{HTML}{0051BA}
+% \definecolor{Y}{HTML}{FFFF00}
+% \colorlet{O}{orange}
+% \colorlet{W}{white}
+% \colorlet{X}{black!30}%
+%\end{verbatim}
+% \end{quote}
+% Different colours can be allocated to the ROYGBWX letters (using the
+% standard \LaTeX\ \cmd{\colorlet} command) as required. For~example, the
+% standard `red' colour could be allocated to the letter R using the command
+% \begin{quote}
+% \cmd{\colorlet\{R\}\{red\}}
+% \end{quote}
+% However, it is important to appreciate that the letter codes
+% ROYGBWX are `hardwired' into many of the macros in the \rubikcube\ package,
+% so don't change these.
+%
+%
+%
+% \subsection{Colour state of the cube}
+% \label{sec:colourstate}
+%
+% A given cubie facelet on a given face is denoted using an ordered sequence
+% of three letters, as follows: first the face code (U,D,L,R,F,B),
+% second the X-position of the column (l,m,r),
+% and third the Y-position of the row (t,m,b).
+% For example, the `right-bottom' facelet of the \textsc{front} face is denoted as
+% \texttt{Frb}, and consequently the curent colour-code (R,O,Y,G,B,W,X) of this facelet
+% is held as the variable \cmd{\Frb} etc.\
+% (see Section~\ref{sec:rubikfacecode} for details and code).
+%
+%
+% Initially, when \LaTeX\ reads the file \texttt{rubikcube.sty} all facelets
+% are allocated the colour-code X, which can be regarded as a zero-colour state.
+% Until a facelet is allocated one of the six cube colours (using a suitable command)
+% it will be rendered as grey by a \cmd{\Draw...} command, since these commands
+% simply implement the current colour state of the cube (e.g.,~\cmd{\DrawRubikCubeRU}).
+% Facelets retain their colour allocation even if they are moved using
+% the \cmd{\RubikRotation} command (see \textsc{rubikrotation} package), unless they are
+% overwritten by a subsequent colour allocation command.
+%
+% \DescribeMacro{\RubikFace..}
+% \DescribeMacro{\RubikSlice..}
+% \DescribeMacro{\RubikCubeSolved..}
+% \DescribeMacro{\RubikCubeGrey..}
+% \DescribeMacro{\RubikCubeGreyAll}
+% Colours are allocated to facelets using using \cmd{\Rubik..} commands.
+% For example, the commands \cmd{\RubikCubeSolvedWY} and \cmd{\RubikCubeSolvedWB}
+% allocate prescribed colour states for the whole `solved' cube, and are
+% a very useful starting point (configuration) for subsequent rotations.
+% The commands \cmd{\RubikCubeGreyWY} and \cmd{\RubikCubeGreyAll} allocate different colour
+% states for the whole cube, and are designed to be useful starting points when illustrating
+% aspects of how to solve the cube. These two commands accept both `grey' and `gray'
+% (to be consistent with TikZ).
+%
+% Colours can also be allocated to subsets of facelets (eg faces, slices etc);
+% for example, using the
+% commands \cmd{\RubikFace...} and \cmd{\RubikSlice...}
+% commands (see Sections~\ref{sec:rubikfacecommands} and \ref{sec:slicecommands}).
+%
+% To visualise the current state of the cube one has to use a \cmd{\Draw...} command.
+% \cmd{\Draw..} commands never influence the internal colour state of the
+% cube.\footnote{That said, the now deprecated \cmd{\DrawRubikLayerFace...}
+% and \cmd{\DrawRubikLayerSice...} commands
+% (see Section~\ref{sec:deprecated}) did, confusingly, allow you to specify colours
+% as arguments, but they only `painted' colours onto facelet positions
+% (on the page, so to speak), and for this reason they are now deprecated,
+% and will be phased out in due course.}
+%
+% The current colour state / configuration of a cube can also be saved and
+% written to a named file, which can then be \cmd{\input} and processed later when required,
+% using the \cmd{\SaveRubikState} command (3x3x3 cube)
+% or \cmd{\SaveTwoState} command (2x2x2 cube).
+%
+%
+%
+% \subsection{RubikFace commands}
+% \label{sec:rubikfacecommands}
+%
+% \DescribeMacro{\RubikFaceUp}
+% \DescribeMacro{\RubikFaceDown}
+% \DescribeMacro{\RubikFaceLeft}
+% \DescribeMacro{\RubikFaceRight}
+% \DescribeMacro{\RubikFaceFront}
+% \DescribeMacro{\RubikFaceBack}
+% These commands allocate colours to the
+% individual cubies of a 3x3x3 cube face; they take nine colour arguments
+% (see Section~\ref{sec:rubikfacecode} for the code).
+% The ordering is isomorphic to the sequence 1--9, i.e.,~numbering the small
+% squares 1-3~(top row, left to right), 4-6~(middle row, left to right),
+% 7-9~(bottom row, left to right), as follows:
+% \begin{quote}
+% \fbox{
+% \begin{minipage}{1.6cm}
+% \#1 \#2 \#3
+%
+% \#4 \#5 \#6
+%
+% \#7 \#8 \#9
+% \end{minipage}
+% }
+% \end{quote}
+% Conveniently, \LaTeX\ allows the colour arguments to be separated by spaces
+% (e.g.,~in groups of three), or even spread across several
+% lines (e.g.,~in a square block to resemble a 9-face). This is fortunate, as it
+% allows the command to be written in several visually intuitive ways, as follows:
+%
+% \begin{quote}
+% \begin{minipage}{8cm}
+%\begin{verbatim}
+% \RubikFaceUp{G}{B}{G} {G}{W}{O} {G}{O}{G}
+%
+% \RubikFaceFront{O}{W}{R}
+% {W}{W}{W}
+% {G}{W}{G}
+%
+%\end{verbatim}
+% \end{minipage}
+% \end{quote}
+% Failure to include a valid colour argument will generate a
+% `missing parameter' error, and no colour will be
+% allocated (i.e.,~you will see a black-hole) when it is rendered.
+%
+% \DescribeMacro{\RubikFaceUpAll}
+% \DescribeMacro{\RubikFaceDownAll}
+% \DescribeMacro{\RubikFaceLeftAll}
+% \DescribeMacro{\RubikFaceRightAll}
+% \DescribeMacro{\RubikFaceFrontAll}
+% \DescribeMacro{\RubikFaceBackAll}
+% Each of the above commands has an associated
+% `\texttt{All}' version which allocates the same colour to all the cubies
+% on a 9-face (i.e.,~only a single colour argument is required).
+% For example, if you want the \textsc{right} face to be all orange, then
+% use the command \cmd{\RubikFaceRightAll\{O\}}.
+% Use of these commands is shown in the following example.
+%
+%
+% \bigskip
+%
+% \begin{minipage}{2.8cm}
+% \RubikCubeGreyAll
+% \RubikFaceRightAll{O}
+% \RubikFaceFront{W}{Y}{G}
+% {W}{Y}{G}
+% {W}{Y}{G}
+% \begin{tikzpicture}[scale=0.7]
+% \DrawRubikCubeRU
+% \end{tikzpicture}%
+% \end{minipage}
+% \hspace{5mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeGreyAll
+% \RubikFaceRightAll{O}
+% \RubikFaceFront{W}{Y}{G}
+% {W}{Y}{G}
+% {W}{Y}{G}
+% \ShowCube{3cm}{0.7}{\DrawRubikCubeRU}
+% \end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+%
+% Note that instead of using \cmd{\RubikCubeGreyAll} we could have used the
+% command \verb!\RubikFaceUpAll{X}! to allocate grey to the whole of the
+% \textsc{up} face. However, the \cmd{\RubikCubeGreyAll} command can be a useful
+% starting point when dealing with a new cube,
+% since it resets all the faces to their initial default colour.
+%
+% Finally, it is important to bear in mind that when allocating colours using
+% the \cmd{\RubikFace..} commands it is very
+% easy to inadvertently create a non-valid cube (ie a cube with either the wrong number
+% of facelets with particular colours, or one which has a non-sovable configuration).
+% However, some basic error checking of this sort is done whenever the
+% \cmd{\RubikRotation} command is used
+% (see the \textsc{rubikrotation} package documentation).
+
+%
+%
+% \subsection{RubikSolvedConfig command}
+% \label{sec:rubiksolvedconfig}
+%
+% \DescribeMacro{\RubikSolvedConfig}
+% This command allocates the six face colours according to the following ordered
+% XYZ$+-$ argument rule, namely X$+$, X$-$, Y$+$, Y$-$, Z$+$, Z$-$; i.e.,~the order
+% of the six colour arguments follows the face order
+% \textsc{right, left, up, down, front, back} (for notation see
+% Section~\ref{sec:xyzarguments} and Figure~\ref{fig:notation}).
+% {\newline}\textsc{usage}:\ \verb!\RubikSolvedConfig{G}{B}{W}{Y}{O}{R}!
+% {\newline}Examples of its use are shown in the next section.
+%
+%
+%
+%
+% \subsection{RubikCubeSolved commands}
+% \label{sec:rubikcubesolved}
+%
+% \DescribeMacro{\RubikCubeSolved}
+% \DescribeMacro{\RubikCubeSolvedWY}
+% The action of both of these commands is identical:
+% they both set all the face colours to the following standard `solved' cube
+% configuration, namely Up=white, Down=yellow, Right=green, Left=blue, Front=orange, Back=red,
+% by invoking the above \cmd{\RubikSolvedConfig} command, as follows:
+%\begin{verbatim}
+%\newcommand{\RubikCubeSolved}{\RubikSolvedConfig{G}{B}{W}{Y}{O}{R}}
+%\end{verbatim}
+% Note that this is in fact just a convenient short-hand for the following:
+%\begin{verbatim}
+%\newcommand{\RubikCubeSolved}{%
+% \RubikFaceRightAll{G}%
+% \RubikFaceLeftAll{B}%
+% \RubikFaceUpAll{W}%
+% \RubikFaceDownAll{Y}%
+% \RubikFaceFrontAll{O}%
+% \RubikFaceBackAll{R}%
+%}
+%\end{verbatim}
+% Note that for convenience, this configuration is also available using the command
+% \verb!\RubikCubeSolvedWY! (WY denoting White opposite Yellow).
+% This solved configuration is shown in the following
+% semi-flat (SF) image.
+%
+%
+% \bigskip
+%
+% \begin{minipage}{5cm}
+% \centering
+% \begin{tikzpicture}[scale=0.5]
+% \RubikCubeSolvedWY
+% \DrawRubikCubeSF
+% \end{tikzpicture}%
+% \end{minipage}
+% \begin{minipage}{0.5\textwidth}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{5cm}{0.5}{\DrawRubikCubeSF}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% Note that the width of the minipage used in the \cmd{\ShowCube} command above
+% is set to 5cm. This value is derived from the fact
+% that the \textit{unscaled} width of the semi-flat image is 10cm (9 + 1 squares), and hence if
+% the TikZ scale factor is set to 0.5 (as in the above example) then the minimum minipage
+% width = $10 \times 0.5 = 5$cm (see Section~\ref{sec:coordinates} for details).
+%
+%
+% \textbf{Other orientations:} If other orientations of the solved cube are required,
+% this can be easily achieved using the \cmd{\RubikRotation} command
+% (from the \texttt{RubikRotation} package) to rotate the cube as required.
+% For~example, we could make a command to show the above solved cube upside-down
+% and rotated slightly, as follows:
+%\begin{verbatim}
+%\newcommand{\CubeUpSideDown}{\RubikCubeSolved\RubikRotation{x2,y}}
+%\end{verbatim}
+% ---this uses the rotations \rrx, \rrx, to invert, and then \rry\ to turn
+% the cube 90~$\deg$:
+%
+% \bigskip
+%
+% \begin{minipage}{2.6cm}
+% \centering
+% \begin{tikzpicture}[scale=0.5]
+% \DrawNCubeAll{3}{O}{Y}{G}
+% \end{tikzpicture}%
+% \end{minipage}
+% \hspace{5mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \CubeUpSideDown
+% \ShowCube{2cm}{0.5}\DrawRubikCubeRU}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+%% \DescribeMacro{\RubikCubeSolvedWB}
+% \textbf{Other configurations:} While the `solved' WY colour configuration
+% described above (White face opposite Yellow)
+% is that of the most commonly occurring Rubik cube, another `solved' colour configuration
+% which is also commercially available has the White opposite Blue configuration, which
+% is available using the command \verb!\RubikCubeSolvedWB!.
+% Its colour configuration is as follows:
+%
+%\begin{center}
+% \RubikCubeSolvedWB
+% \ShowCube{4cm}{0.4}{\DrawRubikCubeSF}%
+%\end{center}
+%
+% \bigskip
+%
+% Note that users can easily create their own alternative `solved'
+% face/colour versions.
+% For~example, the above mentioned white opposite
+% blue~(WB) solved configuration command \verb!\RubikCubeSolvedWB!
+% (white opposite blue, red opposite orange,
+% and green opposite yellow), was created using \verb!\RubikSolvedConfig{R}{O}{W}{B}{G}{Y}!
+% (for the code see \ref{sec:codesolvedconfig}).
+%
+%
+%
+%
+% \subsection{RubikCubeGrey.. commands}
+% \label{sec:rubikcubegrey}
+%
+% \DescribeMacro{\RubikCubeGreyWY}
+% \DescribeMacro{\RubikCubeGreyWB}
+% \DescribeMacro{\RubikCubeGreyAll}
+% The command \cmd{\RubikCubeGreyWY} generates a 3x3x3 cube with no colours allocated
+% \textit{except} for the central cubie of each face, which takes the same colour
+% configuration as defined for the \cmd{\RubikCubeSolvedWY} command.
+% The command \cmd{\RubikCubeGreyAll} generates a cube with \textit{all} the faces
+% completely grey; this is useful as it can be used to reset all the facelets to
+% the initial default state.
+% These commands will accept either `grey' or `gray' (to be consistent with TikZ).
+%
+% These commands, are designed to be useful starting points when wanting to
+% describe the movement of particular cubies. We can see the effect of
+% the \cmd{\RubikCubeGreyWY} command by viewing the cube in a semi-flat (SF) format,
+% as follows:
+%
+% \bigskip
+%
+% \RubikCubeGreyWY
+% \ShowCube{4.5cm}{0.45}{\DrawRubikCubeSF}
+% \hspace{3mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeGreyWY
+% \ShowCube{4.5cm}{0.45}{\DrawRubikCubeSF}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+% Users can of course set up their own alternative face/colour configuration
+% by creating a new `variant' command altogether.
+%
+%
+%
+% \subsection{RubikSlice commands}
+% \label{sec:slicecommands}
+%
+% \DescribeMacro{\RubikSliceTopX}
+% \DescribeMacro{\RubikSliceMiddleX}
+% \DescribeMacro{\RubikSliceBottomX}
+% These three commands allocate the six visible cubie colours associated with a
+% \textit{horizontal} slice of a Rubik cube.
+% There are three pairs of Slice commands; one pair
+% (Left view \& Right view) for each of the horizontal slices Top, Middle, Bottom.
+% The six colour arguments associated with a given slice run in sequence
+% from left to right irrespective of the viewpoint, e.g.,~\#1 \#2 \#3 \#4 \#5 \#6.
+%
+% Since the viewpoint of the Rubik cube (from the Right or from the Left)
+% influences which face the colours are associated with, it is necessary
+% to have the view (R or L) specified in the command name.
+%
+% The format of the `slice' command is shown in the following example.
+% The Rubik cube is shown from the LeftDown (LD) view
+% and consequently each of the `slice' commands in this
+% particular example ends in L, consistent with
+% the final \cmd{\DrawRubikCubeLD} command.
+%
+% Note that the two legacy `Equator' versions (now replaced by `Middle')
+% are retained to allow backward compatibility.
+%
+% \bigskip
+%
+% \begin{minipage}{2.8cm}
+% \centering
+% \RubikFaceDownAll{Y}
+% \RubikSliceTopL {G}{G}{G} {R}{R}{R}
+% \RubikSliceMiddleL {R}{R}{R} {B}{B}{B}
+% \RubikSliceBottomL {O}{O}{O} {G}{G}{G}
+% \begin{tikzpicture}[scale=0.7]
+% \DrawRubikCubeLD
+% \end{tikzpicture}%
+% \end{minipage}
+% \hspace{5mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikFaceDownAll{Y}
+% \RubikSliceTopL {G}{G}{G} {R}{R}{R}
+% \RubikSliceMiddleL {R}{R}{R} {B}{B}{B}
+% \RubikSliceBottomL {O}{O}{O} {G}{G}{G}
+% \ShowCube{3cm}{0.7}{\DrawRubikCubeLD}
+%\end{verbatim}
+% \end{minipage}
+%
+%
+%
+%
+%
+% \section{Rotation commands}
+% \label{sec:RubikCommands}
+%
+% The Rubik bundle implements not only the standard Rubik cube notation of the
+% World Cube Association (see WCA website), but also the main variant notations
+% used by the Rubik interest groups and websites.
+%
+% \begin{figure}[hbt]
+% \centering
+% \ifpdf
+% \includegraphics[height=5cm]{rubik-doc-figA.pdf}
+% \fi
+% \caption{\label{fig:notation}Face rotations}
+% \end{figure}
+%
+% To avoid confusion the Rubik bundle uses a trailing `p' (lower case) in rotation-codes to denote
+% a `prime' (reversed direction); we also recommend that commas are used to separate
+% sequential Rubik rotations (moves).
+% While these are mainly to avoid ambiguity, they also greatly facilitate computer
+% searching and copy-and-pasting of rotation sequences.
+%
+% Unfortunately, obtaining a good balance between an intuitive notation for defining
+% rotations and the need for flexibility is difficult,
+% and consequently some notation is more intuitive than others. A good compromise
+% seems to be the World Cube Association's FADN structure; i.e.,~Face (L,R,U,D,F,B),
+% Action (m,w,s,a,c), Direction (p),
+% N (n); for~example, codes like \texttt{R, R2, Rc, Rm, Rwp, Rwp2} etc.
+%
+%
+% The \rubikcube\ package includes commands for typesetting a wide range of
+% rotation-codes (e.g.,~\rr{R}, \rr{y}, \rr{Bw}) and
+% equivalent hieroglyphs (e.g.,~\rrh{R}, \rrh{y}, \rrh{Bw}), as well as commands
+% for typesetting 3x3x3 cubes\,\footnote{See the \textsc{rubiktwocube} package documentation
+% for 2x2x2 cube commands.} and single cubies. All the rotation-codes and
+% hieroglyphs are typeset using one particular font \& size which we call the `rubikfont'
+% for convenience (see Section~\ref{sec:rubikfont} for details).
+% All of the rotation-codes described
+% here are recognised by the \textsc{rubikrotation} package
+% (see Section~\ref{sec:rubikrotation}).
+%
+% Note that there are some rotation codes which are not represented by arrow
+% hieroglyphs, since their rotation is not visible from the \textsc{front} face,
+% and hence cannot easily be rendered as an arrow hieroglyph. Consequently these
+% rotations have a simple `letter' hieroglyph
+% in the form of the rotation-code in a square; for~example, \rrhBw, \rrhFm.
+%
+%
+%
+% \subsection{Typesetting}
+% \label{sec:typesetting}
+%
+% We now describe the four commands used for typesetting the various rotation-codes.
+%
+% \DescribeMacro{\rr}
+% The text version of a rotation-code is typeset using the rubik-rotation
+% command \cmd{\rr\marg{rotation-code}}, i.e.,~\rr{R}\ is typeset using the command \cmd{\rr\{R\}}.
+% The hieroglyph of a rotation is generated (in text) by \DescribeMacro{\rrh}
+% using instead the command \cmd{\rrh\marg{rotation-code}}. For~example, the command
+% \cmd{\rrh\{R\}} generates \rrh{R}\ which is the hieroglyph associated with
+% the rotation \rr{R}.
+%
+% \DescribeMacro{\Rubik}
+% A vertically combined rotation-code and its hieroglyph is generated using the command
+% \cmd{\Rubik\marg{rotation-code}}. For~example, \Rubik{R}\ is generated by the command \cmd{\Rubik\{R\}},
+% with the square hieroglyph sitting on the baseline.
+% For some hieroglyphs (e.g.,~\rrh{x}, \rrh{y}, \rrh{z}\ denoting 90~degree cube-axis rotations)
+% the only difference between the \cmd{\rrh\{\}} and \cmd{\Rubik\{\}} form is that
+% the \cmd{\Rubik\{\}} form is elevated to sit on the baseline just like the other
+% \cmd{\Rubik\{\}} hieroglyphs.
+% For~example, \cmd{\rrh\{yp\}} generates \rrh{yp}, while
+% \cmd{\Rubik\{yp\}} generates \Rubik{yp}.
+%
+% \DescribeMacro{\textRubik}
+% A horizontally combined rotation-code and its hieroglyph (in sequence as in text)
+% is generated using the command \cmd{\textRubik\marg{rotation-code}}.
+% For~example, \textRubik{R}\ is typeset using the command \cmd{\textRubik\{R\}}.
+% A list of all rotation-code commands and their associated hieroglyphs is given in
+% Section~\ref{sec:listofcommands}.
+%
+%
+%
+% \subsection{Face rotations}
+%
+% \DescribeMacro{U}
+% \DescribeMacro{D}
+% \DescribeMacro{L}
+% \DescribeMacro{R}
+% \DescribeMacro{F}
+% \DescribeMacro{B}
+% The six main faces of the cube are denoted as \textsc{front} (towards the observer),
+% \textsc{back}, \textsc{left}, \textsc{right}, \textsc{up}, \textsc{down}.
+% The upper-case initial letter of each face-name (\rr{F}, \rr{B}, \rr{L}, \rr{R}, \rr{U}, \rr{D})
+% denotes a clockwise 90-degree rotation of the face as shown in
+% Figure~\ref{fig:notation}.
+% For~example, \rr{D}\ is generated by the `rubik rotation' command \cmd{\rr\{D\}}.
+%
+% \DescribeMacro{Up}
+% \DescribeMacro{Dp}
+% \DescribeMacro{Lp}
+% \DescribeMacro{Rp}
+% \DescribeMacro{Fp}
+% \DescribeMacro{Bp}
+% An appended prime~$^\prime$ indicates an anticlockwise rotation; e.g.,~\rr{Fp}.
+% This is sometimes written as \rr{F}$\boldmath{^{-1}}$. The `prime' notation is
+% achieved by appending a lower-case `p' to the face rotation command. For~example, \rr{Rp}\
+% is generated by \cmd{\rr\{Rp\}}. More formally, \rr{Rp} is the `inverse' of \rr{R}.
+%
+% The superscript~$^2$, or sometimes just an ordinary~2, indicates that the rotation
+% is applied twice. For~example, \rr{R}\textbf{$^2$} or \rr{R}\textbf{2}
+% denote \textit{two} successive 90~degree clockwise rotations of the \textsc{right} face;
+% \rr{R}\textbf{$^3$} is equivalent to \rr{Rp} etc.
+%
+%
+% \subsection{Inner-slice rotations}
+% \label{sec:slicerotations}
+%
+% The Rubik cube (3x3x3) has three orthogonal so-called
+% `inner' slices (middle layers, middle slices), whose +ve
+% rotation direction follows that of a named face. For~example, the inner-slice
+% rotation between the \textsc{right} and \textsc{left} faces whose rotation
+% direction follows the rotation \rr{R}\ (i.e.,~its rotation is isomorphic to \rr{R}).
+% The inner-slice rotations form a group (the Slice group), originally
+% described by John Conway (Frey and Singmaster, 1982, p~105).
+%
+%
+% \subsubsection*{The `m' notation}
+% \label{sec:mnotation}
+%
+% \DescribeMacro{Um}
+% \DescribeMacro{Dm}
+% \DescribeMacro{Lm}
+% \DescribeMacro{Rm}
+% \DescribeMacro{Fm}
+% \DescribeMacro{Bm}
+% Here `m' stands for the `middle' slice, namely that parallel to the designated
+% \textsc{face}; its rotation mirrors that of the
+% \textsc{face}. The \texttt{m} must be in lower case.
+% Each of these rotation-codes has a complementary `prime' version, formed
+% by appending a `p'; for~example, \rr{Rm} (\verb!\rr{Rm}!) is a middle layer rotation
+% \rrh{Rm} between the \textsc{right} and \textsc{left} faces, and is in the same
+% direction as \rr{R}. The code \rr{Rmp} (\verb!\rr{Rmp}!) refers to the same
+% middle slice, but rotated in the opposite direction \rrh{Rmp}.
+%
+% This notation, which was probably invented by Singmaster, was originally used on the
+% Cube Lovers usenet group (1981--1997). It is now much used on the
+% Jaap Puzzles website (see Scherphius J) ---see also Section~\ref{sec:codeJaap}.
+%
+%
+% \subsubsection*{The `M' notation}
+% \label{sec:Mnotation}
+%
+% \DescribeMacro{MU}
+% \DescribeMacro{MD}
+% \DescribeMacro{ML}
+% \DescribeMacro{MR}
+% \DescribeMacro{MF}
+% \DescribeMacro{MB}
+% This variant of the above `middle' slice notation (e.g.,~\texttt{MR} $\equiv$ \texttt{Rm})
+% is part of the `superset' notation of Randelshofer. As before, the rotation
+% direction follows that of the designated \textsc{face}.
+% Each has a complementary `prime' version
+% formed by appending a `p'. The \texttt{M} must be in upper case.
+%
+%
+% \bigskip\bigskip
+%
+% \subsubsection*{The MES notation}
+%
+% \DescribeMacro{M}
+% \DescribeMacro{E}
+% \DescribeMacro{S}
+% \DescribeMacro{Mp}
+% \DescribeMacro{Ep}
+% \DescribeMacro{Sp}
+% An alternative but very confusing
+% inner-slice notation (e.g.,~\texttt{Ep} $\equiv$ \texttt{Um}) which is occasionally used
+% is the so-called MES notation as used in the Waterman algorithm
+% (Treep and Waterman 1987), and the Roux method (Giles Roux).
+% \begin{itemize}
+% \item[\rr{M}] \ (\textsc{middle} \rrh{M}, between the \textsc{left}
+% and \textsc{right} faces; direction follows \rr{L}),
+% \item[\rr{E}] \ (\textsc{equator} \rrh{E}, between the \textsc{up} and \textsc{down}
+% faces; direction follows \rr{D}),
+% \item[\rr{S}] \ (\textsc{standing} \rrh{S}, between the \textsc{front} and
+% \textsc{back} faces; direction follows \rr{F}).
+% \end{itemize}
+% Each of these also has an inverse (prime) version.
+%
+%
+% \subsubsection*{The `S' notation}
+%
+% \DescribeMacro{Su}
+% \DescribeMacro{Sd}
+% \DescribeMacro{Sl}
+% \DescribeMacro{Sr}
+% \DescribeMacro{Sf}
+% \DescribeMacro{Sb}
+% In this equally confusing inner-slice notation, `S' stands for `inner-slice';
+% the face letter must be in lower case (e.g.,~\texttt{Sr} $\equiv$ \texttt{Rm}).
+% For~example, the inner-slice
+% rotation between the \textsc{right} and \textsc{left} faces whose rotation
+% direction follows the rotation \rr{R}\ is denoted
+% as \rr{Sr}, which is typeset using the command \cmd{\rr\{Sr\}}.
+% Each has an inverse (prime) p-form.
+%
+%
+% \subsection{Outer-slice rotations}
+%
+% \subsubsection*{The `s' (slice) notation}
+%
+% \DescribeMacro{Us}
+% \DescribeMacro{Ds}
+% \DescribeMacro{Ls}
+% \DescribeMacro{Rs}
+% \DescribeMacro{Fs}
+% \DescribeMacro{Bs}
+% This is a `paired' form of
+% notation (two rotations at once), which can be thought of as complementing the
+% inner-slice (middle layer) rotations.
+% Each of these `slice' commands denotes a rotation of two opposite faces
+% in the \textit{same} direction.
+% {\linebreak}For~example, \textRubik{Us}\ $\equiv$ \textRubik{U}\ + \textRubik{Dp};
+% i.e.,~both face-rotations are in the \textit{same} direction
+% as \rr{U}. Each of these rotation-codes has a complementary `anti-slice' version (see below).
+%
+% This notation was originally described by
+% Singmaster (Frey and Singmaster, 1982), and is much used
+% on the `Pretty patterns' page of the Fridrich website (this
+% page also has a useful link to `notation').
+%
+%
+% \bigskip
+%
+% \DescribeMacro{SU}
+% \DescribeMacro{SD}
+% \DescribeMacro{SL}
+% \DescribeMacro{SR}
+% \DescribeMacro{SF}
+% \DescribeMacro{SB}
+% This variant of the above `slice' notation (e.g.,~\texttt{SU} $\equiv$ \texttt{Us})
+% is part of the `superset' notation of Randelshofer. As before, the rotation
+% direction follows that of the designated
+% \textsc{face}. Each has a complementary `prime' version formed by appending a `p'.
+%
+%
+% \bigskip\bigskip
+%
+
+%
+% \subsubsection*{The `a' (anti-slice) notation}
+%
+% \DescribeMacro{Ua}
+% \DescribeMacro{Da}
+% \DescribeMacro{La}
+% \DescribeMacro{Ra}
+% \DescribeMacro{Fa}
+% \DescribeMacro{Ba}
+% Each of these commands denotes a rotation of two opposite faces
+% in \textit{opposite} directions.
+% For~example, \textRubik{Ua}\ $\equiv$ \textRubik{U}\ + \textRubik{D}.
+% This notation is much used on the `Pretty patterns' page of the
+% Fridrich website (see the note above re: `slice notation').
+%
+% \bigskip\bigskip
+%
+%
+% \subsection{Wide rotations}
+%
+% \subsubsection*{The `w' notation}
+% \label{sec:wnotation}
+%
+% \DescribeMacro{Uw}
+% \DescribeMacro{Dw}
+% \DescribeMacro{Lw}
+% \DescribeMacro{Rw}
+% \DescribeMacro{Fw}
+% \DescribeMacro{Bw}
+% The clockwise \textit{combined} rotation of an outer face AND its adjacent inner-slice
+% (officially known as a `double block', or `double outer slice' move)
+% is denoted by appending a lower-case \textbf{\textsf{\footnotesize{w}}}
+% (denoting `wide') to a rotation-code (endorsed by the WCA).
+% For~example, a \textsc{right} double outer slice rotation \rrh{Rw} (\verb!\rrh{Rw}!)
+% is denoted as \rr{Rw} (\verb!\rr{Rw}!). The `prime' version is formed by
+% appending a `p' to the rotation-code. For~example, \rr{Rwp}\ is generated by \verb!\rr{Rwp}!.
+%
+%
+% \bigskip
+%
+% \subsubsection*{The `T' notation}
+% \label{sec:Tnotation}
+%
+% \DescribeMacro{TU}
+% \DescribeMacro{TD}
+% \DescribeMacro{TL}
+% \DescribeMacro{TR}
+% \DescribeMacro{TF}
+% \DescribeMacro{TB}
+% This confusing variant of the above `w' notation (e.g.,~\texttt{TR} $\equiv$ \texttt{Rw}) is part of
+% the `superset' notation of Randelshofer. As before, the rotation direction
+% follows that of the designated \textsc{face}. Each has a complementary `prime' version
+% formed by appending a `p'.
+%
+% \bigskip\bigskip
+%
+%
+% \subsection{Axis rotations}
+%
+% \subsubsection*{The x, y, z notation}
+% \label{sec:xyznotation}
+%
+% \DescribeMacro{x}
+% \DescribeMacro{y}
+% \DescribeMacro{z}
+% Whole-cube clockwise rotations of 90-degrees about about the orthogonal axes centred
+% on the \textsc{right}, \textsc{up}, \textsc{front} faces are denoted
+% as \rr{x}, \rr{y}, \rr{z}\ (the \cmd{\rr\{\}} forms) respectively (see Figure~\ref{fig:notation}),
+% with their hieroglyphs (the \cmd{\rrh\{\}} forms) being denoted
+% as \rrh{x}, \rrh{y}, \rrh{z}\ in order to distinguish them from square layer-rotation
+% hieroglyphs.
+% Note that since \rr{x}, \rr{y}, \rr{z}\ rotations are always expressed in lower case;
+% this practice is also extended to the commands.
+%
+% For~example, an \rr{x}\textbf{2} rotation (two \rr{x}\ rotations one after
+% the other, i.e.,~\rrh{x}\ \rrh{x}) denotes rotating
+% the cube 180~degrees about its x axis so as to bring the \textsc{down} face
+% into the \textsc{up} position.
+%
+% An appended prime~$^\prime$ indicates an anticlockwise rotation;
+% for~example, \rr{xp}\ (which is generated by appending a `p' to the
+% rotation-code, i.e.,~\cmd{\rr\{xp\}}).
+%
+% The \cmd{\Rubik\{\}} forms (and their prime `p' versions) generate the same
+% hieroglyphs as their \cmd{\rrh\{\}} versions, except that their spacing is
+% similar to that associated with the `square box' \cmd{\Rubik\{\}} hieroglyphs.
+% Consequently when typesetting an axis command in a sequence of `square-box'
+% \cmd{\Rubik\{\}} commands, it is better to use the \cmd{\Rubik\{\}} form rather than
+% the equivalent \cmd{\rrh\{\}} form (see the examples in Section~\ref{sec:examples}).
+% There are no \cmd{\textRubik\{\}} forms for the axis commands (since they are
+% not necessary).
+%
+%
+% \subsubsection*{The u, d, l, r, f, b notation}
+%
+%
+% \DescribeMacro{u}
+% \DescribeMacro{d}
+% \DescribeMacro{l}
+% \DescribeMacro{r}
+% \DescribeMacro{f}
+% \DescribeMacro{b}
+% These are a commonly used alternative for the \rr{x}, \rr{y}, \rr{z}\ notation
+% (and also endorsed by the WCA), and denote a 90~degree whole-cube rotation in the same
+% directional sense as that of the associated face rotation.
+%
+% {\noindent}Thus
+% \rr{d}\ $\equiv$ \rr{up} $\equiv$ \rr{yp} etc.
+% For~example, \rr{d}\ and \rr{dp}\ are generated by the commands \cmd{\rr\{d\}}
+% and \cmd{\rr\{dp\}} respectively.
+% Note that \rr{u}~is the opposite of \rr{d}, \rr{l}~is the opposite of \rr{r}, and
+% \rr{f}~is the opposite of \rr{b}, etc.
+%
+% As with the \rrh{x}, \rrh{y}, \rrh{z}\ forms (described above) there are also
+% equivalent \cmd{\rrh\{\}} and \cmd{\Rubik\{\}} forms. For~example,
+% \rrh{d}\ is generated by the command \cmd{\rrh\{d\}}.
+%
+%
+% \pagebreak
+%
+% \subsubsection*{The `c' notation}
+% \label{sec:cnotation}
+%
+% \DescribeMacro{Uc}
+% \DescribeMacro{Dc}
+% \DescribeMacro{Lc}
+% \DescribeMacro{Rc}
+% \DescribeMacro{Fc}
+% \DescribeMacro{Bc}
+% This slightly more intuitive notation (the `c' stands for `cube') also associates the rotation
+% direction with that of the designated \textsc{face} (e.g.,~\texttt{Rc} $\equiv$ \texttt{x}).
+% Each has a complementary `prime' version formed by appending a `p'.
+% For~example, \rr{Rc} (\verb!\rr{Rc}!) is equivalent to \rr{x};
+% \rr{Rcp} (\verb!\rr{Rcp}!) is equivalent to \rr{xp}.
+%
+% This notation, which was probably invented by Singmaster, was originally used on the
+% Cube Lovers usenet group (1981--1997). It is now much used on the
+% Jaap Puzzles website (see Scherphius J) ---see also Section~\ref{sec:codeJaap}.
+%
+% \bigskip\bigskip
+%
+% \subsubsection*{The `C' notation}
+% \label{sec:Cnotation}
+%
+% \DescribeMacro{CU}
+% \DescribeMacro{CD}
+% \DescribeMacro{CL}
+% \DescribeMacro{CR}
+% \DescribeMacro{CF}
+% \DescribeMacro{CB}
+% This variant of the whole cube rotation notation
+% (e.g.,~\texttt{CR} $\equiv$ \texttt{Rc} $\equiv$ \texttt{x})
+% is part of the `superset' notation of Randelshofer. As before, the rotation
+% direction follows that of the designated \textsc{face}. Each has a complementary
+% `prime' version formed by appending a `p'.
+%
+%
+% \bigskip% \bigskip
+%
+% \subsection{Examples}
+% \label{sec:examples}
+%
+% {\noindent}\rr{R}\ is generated by the command \cmd{\rr\{R\}}
+%
+% {\noindent}\rr{Fw}\ is generated by the command \cmd{\rr\{Fw\}}
+%
+% {\noindent}\rr{L}$^2$ is generated by \cmd{\rr\{L\}}\verb!$^2$!
+%
+% {\noindent}\rr{L}2 is generated by \cmd{\rr\{L\}2}
+%
+% {\noindent}\rr{Rp}\ is generated by \cmd{\rr\{Rp\}}
+%
+% {\noindent}\rr{Fwp}\ is generated by \cmd{\rr\{Fwp\}}
+%
+% {\noindent}\rr{x}\ and \rrh{y}\ and \Rubik{zp}\ are generated by
+% \cmd{\rr\{x\}} and \cmd{\rrh\{y\}} and \cmd{\Rubik\{zp\}}
+%
+% {\noindent}\rr{Fc}\ and \rrh{Bc}\ are generated by \cmd{\rr\{Fc\}} and \cmd{\rrh\{Bc\}}
+%
+% {\noindent}\rr{U}\rr{U}\rr{R}\rr{R}\ is generated by
+% \cmd{\rr\{U\}}\cmd{\rr\{U\}}\cmd{\rr\{R\}}\cmd{\rr\{R\}}
+%
+% \medskip
+%
+% {\noindent}\Rubik{F}\Rubik{U}\Rubik{y}\Rubik{Rp}\Rubik{Lwp}\
+% \ \ \verb!\Rubik{F}\Rubik{U}\Rubik{y}\Rubik{Rp}\Rubik{Lwp}!
+%
+% \bigskip
+%
+% {\noindent}\textRubik{F}\ \textRubik{U}\ \ \ \
+% \verb!\textRubik{F}\ \textRubik{U}!
+%
+% \medskip
+%
+% {\noindent}Commas can be important in avoiding ambiguity; for~example,
+%
+% \medskip
+%
+% {\noindent}\rr{D},\rr{U}2,\rr{F}2,\rr{Ds}2,\rr{B}, \ \ \ \ \verb!\rr{U}2,\rr{F}2,\rr{Ds}2,\rr{B},!
+%
+% \medskip
+%
+% {\noindent}\rrh{U}2,\,\rrh{F}2,\,\rrh{Ds}2,\, \ \ \ \ \verb!\rrh{U}2,\,\rrh{F}2,\,\rrh{Ds}2!
+%
+% \medskip
+%
+% {\noindent}Finally, if each rotation element uses the \textit{same} font or encoding, for~example
+%
+% \medskip
+%
+% {\noindent}\rrh{F}\rrh{U}\rrh{y}\rrh{Rp}\rrh{Lwp} \ \ \ \
+% \verb!\rrh{F}\rrh{U}\rrh{y}\rrh{Rp}\rrh{Lwp}!
+%
+% \medskip
+%
+% {\noindent}then typesetting such a rotation sequence can be achieved more easily using the
+% \verb!\ShowSequence! command (see Section~\ref{sec:showsequence}). For~example, we can
+% typeset the last sequence much more conveniently, as follows:
+%
+% \medskip
+%
+% \verb!\ShowSequence{}{\rrh}{F,U,y,Rp,Lwp}! \ \ $\rightarrow$ \ \ \ShowSequence{}{\rrh}{F,U,y,Rp,Lwp}
+%
+%
+%
+% \subsection{Backwards compatibility}
+% \label{sec:backwardscompat}
+%
+% Note that in keeping with `backwards compatibility' all rotation commands (see below)
+% can still be written without the usual curly braces \verb!{}!.
+% For~example, the hieroglyph \rrhD\ (\cmd{\rrh\{D\}}) can also be generated using the command
+% \cmd{\rrhD}.
+%
+%
+%
+% \subsection{Listing of all rotation commands}
+% \label{sec:listofcommands}
+%
+%
+% Note that all the commands presented here also have a \cmd{\Rubik\{\}} equivalent form which
+% typesets both the hieroglyph and its lettercode in a vertical format,
+% as shown in the `Examples' section above. These have been omitted here
+% owing to the difficulty of including this form easily in the following table.
+%
+%
+% Note also that some \cmd{\rrh\{\}} commands (e.g.,~the \cmd{\rrh\{B\}} command)
+% show only the lettercode in a square box, e.g.,~\rrh{B}. This is because these rotations
+% do not have a `true' visual representation as seen from the \textsc{front} face,
+% and hence can be somewhat ambiguous unless typeset with their associated
+% lettercode.
+%
+%
+% \newcommand{\dnstrut}{\rule{0pt}{17pt}}
+% \newcommand{\dns}{\hspace{2mm}}
+% \newcommand{\dnsp}{\hspace{2mm}}
+%
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{U}\dns\cmd{\rr\{U\}}
+% & \rrh{U}\dns\cmd{\rrh\{U\}}
+% & \textRubik{U}\dns\cmd{\textRubik\{U\}} \nonumber\\
+% \dnstrut\rr{Up}\dns\cmd{\rr\{Up\}}
+% & \rrh{Up}\dns\cmd{\rrh\{Up\}}
+% & \textRubik{Up}\dns\cmd{\textRubik\{Up\}} \nonumber\\
+% \dnstrut\rr{Uw}\dns\cmd{\rr\{Uw\}}
+% & \rrh{Uw}\dns\cmd{\rrh\{Uw\}}
+% & \textRubik{Uw}\dns\cmd{\textRubik\{Uw\}} \nonumber\\
+% \dnstrut\rr{Uwp}\dns\cmd{\rr\{Uwp\}}
+% & \rrh{Uwp}\dns\cmd{\rrh\{Uwp\}}
+% & \textRubik{Uwp}\dns\cmd{\textRubik\{Uwp\}} \nonumber\\
+% \dnstrut\rr{Us}\dns\cmd{\rr\{Us\}}
+% & \rrh{Us}\dns\cmd{\rrh\{Us\}}
+% & \textRubik{Us}\dns\cmd{\textRubik\{Us\}} \nonumber\\
+% \dnstrut\rr{Usp}\dns\cmd{\rr\{Usp\}}
+% & \rrh{Usp}\dns\cmd{\rrh\{Usp\}}
+% & \textRubik{Usp}\dns\cmd{\textRubik\{Usp\}} \nonumber\\
+% \dnstrut\rr{Ua}\dns\cmd{\rr\{Ua\}}
+% & \rrh{Ua}\dns\cmd{\rrh\{Ua\}}
+% & \textRubik{Ua}\dns\cmd{\textRubik\{Ua\}} \nonumber\\
+% \dnstrut\rr{Uap}\dns\cmd{\rr\{Uap\}}
+% & \rrh{Uap}\dns\cmd{\rrh\{Uap\}}
+% & \textRubik{Uap}\dns\cmd{\textRubik\{Uap\}} \nonumber\\
+% \dnstrut\rr{Um}\dns\cmd{\rr\{Um\}}
+% & \rrh{Um}\dns\cmd{\rrh\{Um\}}
+% & \textRubik{Um}\dns\cmd{\textRubik\{Um\}} \nonumber\\
+% \dnstrut\rr{Ump}\dns\cmd{\rr\{Ump\}}
+% & \rrh{Ump}\dns\cmd{\rrh\{Ump\}}
+% & \textRubik{Ump}\dns\cmd{\textRubik\{Ump\}} \nonumber\\
+% \dnstrut\rr{Uc}\dns\cmd{\rr\{Uc\}}
+% & \rrh{Uc}\dns\cmd{\rrh\{Uc\}}
+% & \Rubik{Uc}\dns\cmd{\Rubik\{Uc\}} \nonumber\\
+% \dnstrut\rr{Ucp}\dns\cmd{\rr\{Ucp\}}
+% & \rrh{Ucp}\dns\cmd{\rrh\{Ucp\}}
+% & \Rubik{Ucp}\dns\cmd{\Rubik\{Ucp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{D}\dns\cmd{\rr\{D\}}
+% & \rrh{D}\dns\cmd{\rrh\{D\}}
+% & \textRubik{D}\dns\cmd{\textRubik\{D\}} \nonumber\\
+% \dnstrut\rr{Dp}\dns\cmd{\rr\{Dp\}}
+% & \rrh{Dp}\dns\cmd{\rrh\{Dp\}}
+% & \textRubik{Dp}\dns\cmd{\textRubik\{Dp\}} \nonumber\\
+% \dnstrut\rr{Dw}\dns\cmd{\rr\{Dw\}}
+% & \rrh{Dw}\dns\cmd{\rrh\{Dw\}}
+% & \textRubik{Dw}\dns\cmd{\textRubik\{Dw\}} \nonumber\\
+% \dnstrut\rr{Dwp}\dns\cmd{\rr\{Dwp\}}
+% & \rrh{Dwp}\dns\cmd{\rrh\{Dwp\}}
+% & \textRubik{Dwp}\dns\cmd{\textRubik\{Dwp\}} \nonumber\\
+% \dnstrut\rr{Ds}\dns\cmd{\rr\{Ds\}}
+% & \rrh{Ds}\dns\cmd{\rrh\{Ds\}}
+% & \textRubik{Ds}\dns\cmd{\textRubik\{Ds\}} \nonumber\\
+% \dnstrut\rr{Dsp}\dns\cmd{\rr\{Dsp\}}
+% & \rrh{Dsp}\dns\cmd{\rrh\{Dsp\}}
+% & \textRubik{Dsp}\dns\cmd{\textRubik\{Dsp\}} \nonumber\\
+% \dnstrut\rr{Da}\dns\cmd{\rr\{Da\}}
+% & \rrh{Da}\dns\cmd{\rrh\{Da\}}
+% & \textRubik{Da}\dns\cmd{\textRubik\{Da\}} \nonumber\\
+% \dnstrut\rr{Dap}\dns\cmd{\rr\{Dap\}}
+% & \rrh{Dap}\dns\cmd{\rrh\{Dap\}}
+% & \textRubik{Dap}\dns\cmd{\textRubik\{Dap\}} \nonumber\\
+% \dnstrut\rr{Dm}\dns\cmd{\rr\{Dm\}}
+% & \rrh{Dm}\dns\cmd{\rrh\{Dm\}}
+% & \textRubik{Dm}\dns\cmd{\textRubik\{Dm\}} \nonumber\\
+% \dnstrut\rr{Dmp}\dns\cmd{\rr\{Dmp\}}
+% & \rrh{Dmp}\dns\cmd{\rrh\{Dmp\}}
+% & \textRubik{Dmp}\dns\cmd{\textRubik\{Dmp\}} \nonumber\\
+% \dnstrut\rr{Dc}\dns\cmd{\rr\{Dc\}}
+% & \rrh{Dc}\dns\cmd{\rrh\{Dc\}}
+% & \Rubik{Dc}\dns\cmd{\Rubik\{Dc\}} \nonumber\\
+% \dnstrut\rr{Dcp}\dns\cmd{\rr\{Dcp\}}
+% & \rrh{Dcp}\dns\cmd{\rrh\{Dcp\}}
+% & \Rubik{Dcp}\dns\cmd{\Rubik\{Dcp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{L}\dns\cmd{\rr\{L\}}
+% & \rrh{L}\dns\cmd{\rrh\{L\}}
+% & \textRubik{L}\dns\cmd{\textRubik\{L\}} \nonumber\\
+% \dnstrut\rr{Lp}\dns\cmd{\rr\{Lp\}}
+% & \rrh{Lp}\dns\cmd{\rrh\{Lp\}}
+% & \textRubik{Lp}\dns\cmd{\textRubik\{Lp\}} \nonumber\\
+% \dnstrut\rr{Lw}\dns\cmd{\rr\{Lw\}}
+% & \rrh{Lw}\dns\cmd{\rrh\{Lw\}}
+% & \textRubik{Lw}\dns\cmd{\textRubik\{Lw\}} \nonumber\\
+% \dnstrut\rr{Lwp}\dns\cmd{\rr\{Lwp\}}
+% & \rrh{Lwp}\dns\cmd{\rrh\{Lwp\}}
+% & \textRubik{Lwp}\dns\cmd{\textRubik\{Lwp\}} \nonumber\\
+% \dnstrut\rr{Ls}\dns\cmd{\rr\{Ls\}}
+% & \rrh{Ls}\dns\cmd{\rrh\{Ls\}}
+% & \textRubik{Ls}\dns\cmd{\textRubik\{Ls\}} \nonumber\\
+% \dnstrut\rr{Lsp}\dns\cmd{\rr\{Lsp\}}
+% & \rrh{Lsp}\dns\cmd{\rrh\{Lsp\}}
+% & \textRubik{Lsp}\dns\cmd{\textRubik\{Lsp\}} \nonumber\\
+% \dnstrut\rr{La}\dns\cmd{\rr\{La\}}
+% & \rrh{La}\dns\cmd{\rrh\{La\}}
+% & \textRubik{La}\dns\cmd{\textRubik\{La\}} \nonumber\\
+% \dnstrut\rr{Lap}\dns\cmd{\rr\{Lap\}}
+% & \rrh{Lap}\dns\cmd{\rrh\{Lap\}}
+% & \textRubik{Lap}\dns\cmd{\textRubik\{Lap\}} \nonumber\\
+% \dnstrut\rr{Lm}\dns\cmd{\rr\{Lm\}}
+% & \rrh{Lm}\dns\cmd{\rrh\{Lm\}}
+% & \textRubik{Lm}\dns\cmd{\textRubik\{Lm\}} \nonumber\\
+% \dnstrut\rr{Lmp}\dns\cmd{\rr\{Lmp\}}
+% & \rrh{Lmp}\dns\cmd{\rrh\{Lmp\}}
+% & \textRubik{Lmp}\dns\cmd{\textRubik\{Lmp\}} \nonumber\\
+% \dnstrut\rr{Lc}\dns\cmd{\rr\{Lc\}}
+% & \rrh{Lc}\dns\cmd{\rrh\{Lc\}}
+% & \Rubik{Lc}\dns\cmd{\Rubik\{Lc\}} \nonumber\\
+% \dnstrut\rr{Lcp}\dns\cmd{\rr\{Lcp\}}
+% & \rrh{Lcp}\dns\cmd{\rrh\{Lcp\}}
+% & \Rubik{Lcp}\dns\cmd{\Rubik\{Lcp\}} \nonumber\\
+% \end{supertabular}
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{R}\dns\cmd{\rr\{R\}}
+% & \rrh{R}\dns\cmd{\rrh\{R\}}
+% & \textRubik{R}\dns\cmd{\textRubik\{R\}} \nonumber\\
+% \dnstrut\rr{Rp}\dns\cmd{\rr\{Rp\}}
+% & \rrh{Rp}\dns\cmd{\rrh\{Rp\}}
+% & \textRubik{Rp}\dns\cmd{\textRubik\{Rp\}} \nonumber\\
+% \dnstrut\rr{Rw}\dns\cmd{\rr\{Rw\}}
+% & \rrh{Rw}\dns\cmd{\rrh\{Rw\}}
+% & \textRubik{Rw}\dns\cmd{\textRubik\{Rw\}} \nonumber\\
+% \dnstrut\rr{Rwp}\dns\cmd{\rr\{Rwp\}}
+% & \rrh{Rwp}\dns\cmd{\rrh\{Rwp\}}
+% & \textRubik{Rwp}\dns\cmd{\textRubik\{Rwp\}} \nonumber\\
+% \dnstrut\rr{Rs}\dns\cmd{\rr\{Rs\}}
+% & \rrh{Rs}\dns\cmd{\rrh\{Rs\}}
+% & \textRubik{Rs}\dns\cmd{\textRubik\{Rs\}} \nonumber\\
+% \dnstrut\rr{Rsp}\dns\cmd{\rr\{Rsp\}}
+% & \rrh{Rsp}\dns\cmd{\rrh\{Rsp\}}
+% & \textRubik{Rsp}\dns\cmd{\textRubik\{Rsp\}} \nonumber\\
+% \dnstrut\rr{Ra}\dns\cmd{\rr\{Ra\}}
+% & \rrh{Ra}\dns\cmd{\rrh\{Ra\}}
+% & \textRubik{Ra}\dns\cmd{\textRubik\{Ra\}} \nonumber\\
+% \dnstrut\rr{Rap}\dns\cmd{\rr\{Rap\}}
+% & \rrh{Rap}\dns\cmd{\rrh\{Rap\}}
+% & \textRubik{Rap}\dns\cmd{\textRubik\{Rap\}} \nonumber\\
+% \dnstrut\rr{Rm}\dns\cmd{\rr\{Rm\}}
+% & \rrh{Rm}\dns\cmd{\rrh\{Rm\}}
+% & \textRubik{Rm}\dns\cmd{\textRubik\{Rm\}} \nonumber\\
+% \dnstrut\rr{Rmp}\dns\cmd{\rr\{Rmp\}}
+% & \rrh{Rmp}\dns\cmd{\rrh\{Rmp\}}
+% & \textRubik{Rmp}\dns\cmd{\textRubik\{Rmp\}} \nonumber\\
+% \dnstrut\rr{Rc}\dns\cmd{\rr\{Rc\}}
+% & \rrh{Rc}\dns\cmd{\rrh\{Rc\}}
+% & \Rubik{Rc}\dns\cmd{\Rubik\{Rc\}} \nonumber\\
+% \dnstrut\rr{Rcp}\dns\cmd{\rr\{Rcp\}}
+% & \rrh{Rcp}\dns\cmd{\rrh\{Rcp\}}
+% & \Rubik{Rcp}\dns\cmd{\Rubik\{Rcp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{F}\dns\cmd{\rr\{F\}}
+% & \rrh{F}\dns\cmd{\rrh\{F\}}
+% & \textRubik{F}\dns\cmd{\textRubik\{F\}} \nonumber\\
+% \dnstrut\rr{Fp}\dns\cmd{\rr\{Fp\}}
+% & \rrh{Fp}\dns\cmd{\rrh\{Fp\}}
+% & \textRubik{Fp}\dns\cmd{\textRubik\{Fp\}} \nonumber\\
+% \dnstrut\rr{Fw}\dns\cmd{\rr\{Fw\}}
+% & \rrh{Fw}\dns\cmd{\rrh\{Fw\}}
+% & \textRubik{Fw}\dns\cmd{\textRubik\{Fw\}} \nonumber\\
+% \dnstrut\rr{Fwp}\dns\cmd{\rr\{Fwp\}}
+% & \rrh{Fwp}\dns\cmd{\rrh\{Fwp\}}
+% & \textRubik{Fwp}\dns\cmd{\textRubik\{Fwp\}} \nonumber\\
+% \dnstrut\rr{Fs}\dns\cmd{\rr\{Fs\}}
+% & \rrh{Fs}\dns\cmd{\rrh\{Fs\}}
+% & \textRubik{Fs}\dns\cmd{\textRubik\{Fs\}} \nonumber\\
+% \dnstrut\rr{Fsp}\dns\cmd{\rr\{Fsp\}}
+% & \rrh{Fsp}\dns\cmd{\rrh\{Fsp\}}
+% & \textRubik{Fsp}\dns\cmd{\textRubik\{Fsp\}} \nonumber\\
+% \dnstrut\rr{Fa}\dns\cmd{\rr\{Fa\}}
+% & \rrh{Fa}\dns\cmd{\rrh\{Fa\}}
+% & \textRubik{Fa}\dns\cmd{\textRubik\{Fa\}} \nonumber\\
+% \dnstrut\rr{Fap}\dns\cmd{\rr\{Fap\}}
+% & \rrh{Fap}\dns\cmd{\rrh\{Fap\}}
+% & \textRubik{Fap}\dns\cmd{\textRubik\{Fap\}} \nonumber\\
+% \dnstrut\rr{Fm}\dns\cmd{\rr\{Fm\}}
+% & \rrh{Fm}\dns\cmd{\rrh\{Fm\}}
+% & \textRubik{Fm}\dns\cmd{\textRubik\{Fm\}} \nonumber\\
+% \dnstrut\rr{Fmp}\dns\cmd{\rr\{Fmp\}}
+% & \rrh{Fmp}\dns\cmd{\rrh\{Fmp\}}
+% & \textRubik{Fmp}\dns\cmd{\textRubik\{Fmp\}} \nonumber\\
+% \dnstrut\rr{Fc}\dns\cmd{\rr\{Fc\}}
+% & \rrh{Fc}\dns\cmd{\rrh\{Fc\}}
+% & \Rubik{Fc}\dns\cmd{\Rubik\{Fc\}} \nonumber\\
+% \dnstrut\rr{Fcp}\dns\cmd{\rr\{Fcp\}}
+% & \rrh{Fcp}\dns\cmd{\rrh\{Fcp\}}
+% & \Rubik{Fcp}\dns\cmd{\Rubik\{Fcp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{B}\dns\cmd{\rr\{B\}}
+% & \rrh{B}\dns\cmd{\rrh\{B\}}
+% & \textRubik{B}\dns\cmd{\textRubik\{B\}} \nonumber\\
+% \dnstrut\rr{Bp}\dns\cmd{\rr\{Bp\}}
+% & \rrh{Bp}\dns\cmd{\rrh\{Bp\}}
+% & \textRubik{Bp}\dns\cmd{\textRubik\{Bp\}} \nonumber\\
+% \dnstrut\rr{Bw}\dns\cmd{\rr\{Bw\}}
+% & \rrh{Bw}\dns\cmd{\rrh\{Bw\}}
+% & \textRubik{Bw}\dns\cmd{\textRubik\{Bw\}} \nonumber\\
+% \dnstrut\rr{Bwp}\dns\cmd{\rr\{Bwp\}}
+% & \rrh{Bwp}\dns\cmd{\rrh\{Bwp\}}
+% & \textRubik{Bwp}\dns\cmd{\textRubik\{Bwp\}} \nonumber\\
+% \dnstrut\rr{Bs}\dns\cmd{\rr\{Bs\}}
+% & \rrh{Bs}\dns\cmd{\rrh\{Bs\}}
+% & \textRubik{Bs}\dns\cmd{\textRubik\{Bs\}} \nonumber\\
+% \dnstrut\rr{Bsp}\dns\cmd{\rr\{Bsp\}}
+% & \rrh{Bsp}\dns\cmd{\rrh\{Bsp\}}
+% & \textRubik{Bsp}\dns\cmd{\textRubik\{Bsp\}} \nonumber\\
+% \dnstrut\rr{Ba}\dns\cmd{\rr\{Ba\}}
+% & \rrh{Ba}\dns\cmd{\rrh\{Ba\}}
+% & \textRubik{Ba}\dns\cmd{\textRubik\{Ba\}} \nonumber\\
+% \dnstrut\rr{Bap}\dns\cmd{\rr\{Bap\}}
+% & \rrh{Bap}\dns\cmd{\rrh\{Bap\}}
+% & \textRubik{Bap}\dns\cmd{\textRubik\{Bap\}} \nonumber\\
+% \dnstrut\rr{Bm}\dns\cmd{\rr\{Bm\}}
+% & \rrh{Bm}\dns\cmd{\rrh\{Bm\}}
+% & \textRubik{Bm}\dns\cmd{\textRubik\{Bm\}} \nonumber\\
+% \dnstrut\rr{Bmp}\dns\cmd{\rr\{Bmp\}}
+% & \rrh{Bmp}\dns\cmd{\rrh\{Bmp\}}
+% & \textRubik{Bmp}\dns\cmd{\textRubik\{Bmp\}} \nonumber\\
+% \dnstrut\rr{Bc}\dns\cmd{\rr\{Bc\}}
+% & \rrh{Bc}\dns\cmd{\rrh\{Bc\}}
+% & \Rubik{Bc}\dns\cmd{\Rubik\{Bc\}} \nonumber\\
+% \dnstrut\rr{Bcp}\dns\cmd{\rr\{Bcp\}}
+% & \rrh{Bcp}\dns\cmd{\rrh\{Bcp\}}
+% & \Rubik{Bcp}\dns\cmd{\Rubik\{Bcp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{Su}\dns\cmd{\rr\{Su\}}
+% & \rrh{Su}\dns\cmd{\rrh\{Su\}}
+% & \textRubik{Su}\dns\cmd{\textRubik\{Su\}} \nonumber\\
+% \dnstrut\rr{Sup}\dns\cmd{\rr\{Sup\}}
+% & \rrh{Sup}\dns\cmd{\rrh\{Sup\}}
+% & \textRubik{Sup}\dns\cmd{\textRubik\{Sup\}} \nonumber\\
+% \dnstrut\rr{Sd}\dns\cmd{\rr\{Sd\}}
+% & \rrh{Sd}\dns\cmd{\rrh\{Sd\}}
+% & \textRubik{Sd}\dns\cmd{\textRubik\{Sd\}} \nonumber\\
+% \dnstrut\rr{Sdp}\dns\cmd{\rr\{Sdp\}}
+% & \rrh{Sdp}\dns\cmd{\rrh\{Sdp\}}
+% & \textRubik{Sdp}\dns\cmd{\textRubik\{Sdp\}} \nonumber\\
+% \dnstrut\rr{Sl}\dns\cmd{\rr\{Sl\}}
+% & \rrh{Sl}\dns\cmd{\rrh\{Sl\}}
+% & \textRubik{Sl}\dns\cmd{\textRubik\{Sl\}} \nonumber\\
+% \dnstrut\rr{Slp}\dns\cmd{\rr\{Slp\}}
+% & \rrh{Slp}\dns\cmd{\rrh\{Slp\}}
+% & \textRubik{Slp}\dns\cmd{\textRubik\{Slp\}} \nonumber\\
+% \dnstrut\rr{Sr}\dns\cmd{\rr\{Sr\}}
+% & \rrh{Sr}\dns\cmd{\rrh\{Sr\}}
+% & \textRubik{Sr}\dns\cmd{\textRubik\{Sr\}} \nonumber\\
+% \dnstrut\rr{Srp}\dns\cmd{\rr\{Srp\}}
+% & \rrh{Srp}\dns\cmd{\rrh\{Srp\}}
+% & \textRubik{Srp}\dns\cmd{\textRubik\{Srp\}} \nonumber\\
+% \dnstrut\rr{Sf}\dns\cmd{\rr\{Sf\}}
+% & \rrh{Sf}\dns\cmd{\rrh\{Sf\}}
+% & \textRubik{Sf}\dns\cmd{\textRubik\{Sf\}} \nonumber\\
+% \dnstrut\rr{Sfp}\dns\cmd{\rr\{Sfp\}}
+% & \rrh{Sfp}\dns\cmd{\rrh\{Sfp\}}
+% & \textRubik{Sfp}\dns\cmd{\textRubik\{Sfp\}} \nonumber\\
+% \dnstrut\rr{Sb}\dns\cmd{\rr\{Sb\}}
+% & \rrh{Sb}\dns\cmd{\rrh\{Sb\}}
+% & \textRubik{Sb}\dns\cmd{\textRubik\{Sb\}} \nonumber\\
+% \dnstrut\rr{Sbp}\dns\cmd{\rr\{Sbp\}}
+% & \rrh{Sbp}\dns\cmd{\rrh\{Sbp\}}
+% & \textRubik{Sbp}\dns\cmd{\textRubik\{Sbp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{E}\dns\cmd{\rr\{E\}}
+% & \rrh{E}\dns\cmd{\rrh\{E\}}
+% & \textRubik{E}\dns\cmd{\textRubik\{E\}} \nonumber\\
+% \dnstrut\rr{Ep}\dns\cmd{\rr\{Ep\}}
+% & \rrh{Ep}\dns\cmd{\rrh\{Ep\}}
+% & \textRubik{Ep}\dns\cmd{\textRubik\{Ep\}} \nonumber\\
+% \dnstrut\rr{M}\dns\cmd{\rr\{M\}}
+% & \rrh{M}\dns\cmd{\rrh\{M\}}
+% & \textRubik{M}\dns\cmd{\textRubik\{M\}} \nonumber\\
+% \dnstrut\rr{Mp}\dns\cmd{\rr\{Mp\}}
+% & \rrh{Mp}\dns\cmd{\rrh\{Mp\}}
+% & \textRubik{Mp}\dns\cmd{\textRubik\{Mp\}} \nonumber\\
+% \dnstrut\rr{S}\dns\cmd{\rr\{S\}}
+% & \rrh{S}\dns\cmd{\rrh\{S\}}
+% & \textRubik{S}\dns\cmd{\textRubik\{S\}} \nonumber\\
+% \dnstrut\rr{Sp}\dns\cmd{\rr\{Sp\}}
+% & \rrh{Sp}\dns\cmd{\rrh\{Sp\}}
+% & \textRubik{Sp}\dns\cmd{\textRubik\{Sp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{x}\dns\cmd{\rr\{x\}}
+% & \rrh{x}\dns\cmd{\rrh\{x\}}
+% & \Rubik{x}\dns\cmd{\Rubik\{x\}} \nonumber\\
+% \dnstrut\rr{xp}\dns\cmd{\rr\{xp\}}
+% & \rrh{xp}\dns\cmd{\rrh\{xp\}}
+% & \Rubik{xp}\dns\cmd{\Rubik\{xp\}} \nonumber\\
+% \dnstrut\rr{y}\dns\cmd{\rr\{y\}}
+% & \rrh{y}\dns\cmd{\rrh\{y\}}
+% & \Rubik{y}\dns\cmd{\Rubik\{y\}} \nonumber\\
+% \dnstrut\rr{yp}\dns\cmd{\rr\{yp\}}
+% & \rrh{yp}\dns\cmd{\rrh\{yp\}}
+% & \Rubik{yp}\dns\cmd{\Rubik\{yp\}} \nonumber\\
+% \dnstrut\rr{z}\dns\cmd{\rr\{z\}}
+% & \rrh{z}\dns\cmd{\rrh\{z\}}
+% & \Rubik{z}\dns\cmd{\Rubik\{z\}} \nonumber\\
+% \dnstrut\rr{zp}\dns\cmd{\rr\{zp\}}
+% & \rrh{zp}\dns\cmd{\rrh\{zp\}}
+% & \Rubik{zp}\dns\cmd{\Rubik\{zp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnstrut\rr{u}\dns\cmd{\rr\{u\}}
+% & \rrh{u}\dns\cmd{\rrh\{u\}}
+% & \Rubik{u}\dns\cmd{\Rubik\{u\}} \nonumber\\
+% \dnstrut\rr{up}\dns\cmd{\rr\{up\}}
+% & \rrh{up}\dns\cmd{\rrh\{up\}}
+% & \Rubik{up}\dns\cmd{\Rubik\{up\}} \nonumber\\
+%
+% \dnstrut\rr{d}\dns\cmd{\rr\{d\}}
+% & \rrh{d}\dns\cmd{\rrh\{d\}}
+% & \Rubik{d}\dns\cmd{\Rubik\{d\}} \nonumber\\
+% \dnstrut\rr{dp}\dns\cmd{\rr\{dp\}}
+% & \rrh{dp}\dns\cmd{\rrh\{dp\}}
+% & \Rubik{dp}\dns\cmd{\Rubik\{dp\}} \nonumber\\
+%
+% \dnstrut\rr{l}\dns\cmd{\rr\{l\}}
+% & \rrh{l}\dns\cmd{\rrh\{l\}}
+% & \Rubik{l}\dns\cmd{\Rubik\{l\}} \nonumber\\
+% \dnstrut\rr{lp}\dns\cmd{\rr\{lp\}}
+% & \rrh{lp}\dns\cmd{\rrh\{lp\}}
+% & \Rubik{lp}\dns\cmd{\Rubik\{lp\}} \nonumber\\
+%
+% \dnstrut\rr{r}\dns\cmd{\rr\{r\}}
+% & \rrh{r}\dns\cmd{\rrh\{r\}}
+% & \Rubik{r}\dns\cmd{\Rubik\{r\}} \nonumber\\
+% \dnstrut\rr{rp}\dns\cmd{\rr\{rp\}}
+% & \rrh{rp}\dns\cmd{\rrh\{rp\}}
+% & \Rubik{rp}\dns\cmd{\Rubik\{rp\}} \nonumber\\
+%
+% \dnstrut\rr{f}\dns\cmd{\rr\{f\}}
+% & \rrh{f}\dns\cmd{\rrh\{f\}}
+% & \Rubik{f}\dns\cmd{\Rubik\{f\}} \nonumber\\
+% \dnstrut\rr{fp}\dns\cmd{\rr\{fp\}}
+% & \rrh{fp}\dns\cmd{\rrh\{fp\}}
+% & \Rubik{fp}\dns\cmd{\Rubik\{fp\}} \nonumber\\
+%
+% \dnstrut\rr{b}\dns\cmd{\rr\{b\}}
+% & \rrh{b}\dns\cmd{\rrh\{b\}}
+% & \Rubik{b}\dns\cmd{\Rubik\{b\}} \nonumber\\
+% \dnstrut\rr{bp}\dns\cmd{\rr\{bp\}}
+% & \rrh{bp}\dns\cmd{\rrh\{bp\}}
+% & \Rubik{bp}\dns\cmd{\Rubik\{bp\}} \nonumber\\
+% \end{supertabular}
+%
+%
+% \subsubsection{Randelshofer notation}
+% \label{sec:listofRandelshofercommands}
+%
+% \newcommand{\dnRubik}[1]{%
+% \dnstrut\rr{#1}\dns\cmd{\rr\{#1\}}%
+% & \rrh{#1}\dns\cmd{\rrh\{#1\}}%
+% & \Rubik{#1}\dns\cmd{\Rubik\{#1\}} \nonumber\\%
+% }%
+%
+% \newcommand{\dntextRubik}[1]{%
+% \dnstrut\rr{#1}\dns\cmd{\rr\{#1\}}%
+% & \rrh{#1}\dns\cmd{\rrh\{#1\}}%
+% & \textRubik{#1}\dns\cmd{\textRubik\{#1\}} \nonumber\\%
+% }%
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnRubik{CR}
+% \dnRubik{CRp}
+% \dnRubik{CL}
+% \dnRubik{CLp}
+% \dnRubik{CU}
+% \dnRubik{CUp}
+% \dnRubik{CD}
+% \dnRubik{CDp}
+% \dnRubik{CF}
+% \dnRubik{CFp}
+% \dnRubik{CB}
+% \dnRubik{CBp}
+% \end{supertabular}
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dntextRubik{MR}
+% \dntextRubik{MRp}
+% \dntextRubik{ML}
+% \dntextRubik{MLp}
+% \dntextRubik{MU}
+% \dntextRubik{MUp}
+% \dntextRubik{MD}
+% \dntextRubik{MDp}
+% \dntextRubik{MF}
+% \dntextRubik{MFp}
+% \dntextRubik{MB}
+% \dntextRubik{MBp}
+% \end{supertabular}
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dntextRubik{SR}
+% \dntextRubik{SRp}
+% \dntextRubik{SL}
+% \dntextRubik{SLp}
+% \dntextRubik{SU}
+% \dntextRubik{SUp}
+% \dntextRubik{SD}
+% \dntextRubik{SDp}
+% \dntextRubik{SF}
+% \dntextRubik{SFp}
+% \dntextRubik{SB}
+% \dntextRubik{SBp}
+% \end{supertabular}
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dntextRubik{TR}
+% \dntextRubik{TRp}
+% \dntextRubik{TL}
+% \dntextRubik{TLp}
+% \dntextRubik{TU}
+% \dntextRubik{TUp}
+% \dntextRubik{TD}
+% \dntextRubik{TDp}
+% \dntextRubik{TF}
+% \dntextRubik{TFp}
+% \dntextRubik{TB}
+% \dntextRubik{TBp}
+% \end{supertabular}
+%
+%
+% \subsection{The rubikfont}
+% \label{sec:rubikfont}
+%
+% For hieroglyph-related text we use the standard Computer Modern Sans (cmss)
+% bold extended (bx) 10pt font for upper-case letters, and the 8pt footnote size for lower-case
+% letters (see Section~\ref{sec:coderubikfont} for details). This font (rubikfont)
+% and the `prime' symbol (rubikprime) can be easily changed by `renewing' the three commands there.
+%
+% For~example, to change to the somewhat `lighter' semi-bold extended (sbx) CM Sans (cmss) form
+% one can simply include the following in the preamble (the FNS suffix stands for `footnotesize'):
+%\begin{verbatim}
+% \makeatletter
+% \renewcommand{\@rubikfont}{\fontsize{10}{12pt}\usefont{T1}{cmss}{sbx}{n}}
+% \renewcommand{\@rubikfontFNS}{\fontsize{8}{12pt}\usefont{T1}{cmss}{sbx}{n}}
+% \makeatother
+%\end{verbatim}
+%
+%
+% \subsubsection*{The `rubikprime' symbol}
+% \label{sec:rubikprime}
+%
+% We currently use the apostrophe for the prime symbol (see Section~\ref{sec:coderubikfont}),
+% since the maths \cmd{\prime} seems to be a bit too faint (especially since we need to use
+% the `scriptstyle' size in this setting). However, users can
+% easily make the Rubik bundle use the maths prime instead, by loading the following
+% in the preamble.
+%\begin{verbatim}
+% \makeatletter
+% \renewcommand{\@rubikprime}{\raisebox{1.2pt}{\ensuremath{\scriptstyle{^\prime}}}}
+% \makeatother
+%\end{verbatim}
+%
+%
+%
+% \section{Draw commands}
+%
+% A \cmd{\Draw..} command typesets either a cubie, cube or face
+% using parameters set or defined via
+% previous parameter-allocation commands (e.g.,~colours, dimensions etc).
+%
+% It is important to distinguish between the \rubikcube\ package \cmd{\Draw..} commands
+% (with an upper-case~D) and TikZ \cmd{\draw..} commands (with a lowercase~d).
+% Rubik \cmd{\Draw..} commands are implemented by the
+% TikZ \cmd{\draw..} commands, and consequently \cmd{\Draw..} commands can only be
+% used \textit{inside} a TikZ picture environment---and hence they can also be used safely in
+% conjunction with the \cmd{\ShowCube} command, which itself uses a TikZ picture environment.
+% See also Section~\ref{sec:drawerrormessage} below.
+%
+% There are six types of \cmd{\Draw..} commands, as follows:
+% \begin{quote}
+% \noindent\cmd{\DrawCubie..}
+% \newline\noindent\cmd{\DrawRubikCube..}
+% \newline\noindent\cmd{\DrawRubikCubeSidebar..}
+% \newline\noindent\cmd{\DrawRubikFace..}
+% \newline\noindent\cmd{\DrawRubikFlat..}
+% \newline\noindent\cmd{\DrawNCube..}
+% \end{quote}
+% Note that the former \cmd{\DrawRubikLayer..}, \cmd{\DrawCube..}, \cmd{\DrawFace..}
+% commands are now deprecated, since they have
+% been superseded by more versatile and intuitive commands (see Section~\ref{sec:deprecated}).
+%
+%
+% \subsection[Error message]{\cmd{\Draw} error message}
+% \label{sec:drawerrormessage}
+%
+% If a \cmd{\Draw..} command is used \textit{outside} a
+% TikZ picture environment, then \LaTeX\ issues an
+% ``Undefined control sequence'' error message, indicating
+% that it is trying to draw something using an undefined
+% TikZ \cmd{\draw} command\,\footnote{Note that the TikZ \cmd{\draw} command
+% uses a lower-case `d', while all \rubikcube\ commands start with an upper-case letter.}.
+%
+% This is because all Rubik \cmd{\Draw..} commands achieve their effects by
+% implementing a series of TikZ \cmd{\draw..} and other commands, all of which
+% need to be inside a \texttt{tikzpicture} environment.
+%
+% For~example, if the command \cmd{\DrawRubikCubeF} is used
+% without a surrounding TikZ picture environment,
+% then something similar to the following error message will be generated.
+%\begin{verbatim}
+%! Undefined control sequence.
+%\DrawRubikFlatUp ... }{#1}\pgfmathsetmacro {\uy }{#2}\draw
+% [line join=round,...
+%l.56 \DrawRubikCubeF
+%\end{verbatim}
+%
+%
+%
+% \subsection{DrawCubie commands}
+% \label{sec:drawcubie}
+%
+% \DescribeMacro{\DrawCubieXY}
+% This command draws a single cubie in one of four
+% orientations as denoted by the terminal XY viewing-direction
+% codes.
+% Since a single cubie has only three visible faces this command takes three
+% xyz-ordered colour parameter arguments. Consequently the \cmd{\DrawCubie}
+% command has the format
+% \begin{quote}
+% \cmd{\DrawCubieXY\{x\}\{y\}\{z\}}
+% \end{quote}
+% where the XY pair denotes the viewing direction as before, and
+% the xyz parameters denote the face colours associated with each of
+% the three axes.
+%
+% For~example, the command \cmd{\DrawCubieRU\{O\}\{Y\}\{G\}} draws a
+% single cubie as viewed from the RightUp direction,
+% with face colours Orange (x-axis), Yellow (y-axis), Green (z-axis), as follows.
+%
+% \medskip
+%
+% \ShowCube{1.33cm}{1}{\DrawCubieRU{O}{Y}{G}}
+% \hspace{1cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \ShowCube{1.33cm}{1}{\DrawCubieRU{O}{Y}{G}}
+%\end{verbatim}
+% \end{minipage}
+%
+% \medskip
+%
+% {\noindent}Since the front face is 1~unit wide and the 2D width of the side approx 1/3~unit,
+% and the scale-factor =~1, then the minipage width required for the cubie image
+% $=(1.33 \times 1) = 1.33$cm.
+%
+% \begin{figure}[hbt]
+% \centering
+% \ifpdf
+% \includegraphics[height=4cm]{rubik-doc-figC.pdf}
+% \else
+% \includegraphics[height=4cm]{rubik-doc-figC.eps}
+% \fi
+% \vspace{-5mm}\caption{\label{fig:cubiedydx}Cubiedy and Cubiedx parameters}
+% \end{figure}
+%
+% \DescribeMacro{\Cubiedy}
+% \DescribeMacro{\Cubiedx}
+% Minor cubie configuration changes can be effected
+% by adjusting the Cubiedy and Cubiedx values ($> 0$; no units)
+% shown in Figure~\ref{fig:cubiedydx} via the two commands
+% \begin{quote}
+% \cmd{\Cubiedy\{\}} \\
+% \cmd{\Cubiedx\{\}}
+% \end{quote}
+% as shown in the following example.
+%
+% \bigskip
+%
+% \ShowCube{1.7cm}{1}{%
+% \Cubiedy{0.4}%
+% \Cubiedx{0.8}%
+% \DrawCubieRU{O}{Y}{G}%
+% }
+% \hspace{2cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \ShowCube{1.7cm}{1}{%
+% \Cubiedy{0.4}
+% \Cubiedx{0.8}
+% \DrawCubieRU{O}{Y}{G}
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% {\noindent}Note that the \textsc{front} face of the cubie is a unit square,
+% and the graphic origin of the cubie image is at the bottom left corner of the
+% \textsc{front} face (see also the section on Arrows: Section~\ref{sec:arrows}).
+% The default values of \cmd{\Cubiedy} and \cmd{\Cubiedx} are 0.4.
+%
+%
+%
+% \subsection{textCubie commands}
+%
+% \DescribeMacro{\textCubieRU}
+% \DescribeMacro{\textCubieRD}
+% \DescribeMacro{\textCubieLU}
+% \DescribeMacro{\textCubieLD}
+% For convenience, there are also four (smaller) `text' versions \textCubieRU{O}{Y}{G}
+% of the four \cmd{\DrawCubie} commands for use in ordinary text, as follows:
+% \begin{quote}
+% \textCubieRU{O}{Y}{G} \ \ |\textCubieRU{O}{Y}{G}|
+%
+% \medskip
+%
+% \textCubieRD{O}{Y}{G} \ \ |\textCubieRD{O}{Y}{G}|
+%
+% \medskip
+%
+% \textCubieLU{O}{Y}{G} \ \ |\textCubieLU{O}{Y}{G}|
+%
+% \medskip
+%
+% \textCubieLD{O}{Y}{G} \ \ |\textCubieLD{O}{Y}{G}|
+% \end{quote}
+% Note that these \cmd{\textCubieXY} commands are not influenced by the
+% \cmd{\Cubiedy}, \cmd{\Cubiedx} commands as their size is pre-set for text use.
+%
+%
+%
+% \subsection{DrawRubikCube commands}
+% \label{sec:drawrubikcubecommands}
+%
+% \DescribeMacro{\DrawRubikCubeXY}
+% \DescribeMacro{\DrawRubikCubeF}
+% \DescribeMacro{\DrawRubikCubeSF}
+% This command draws Rubik cubes in one of four oblique
+% orientations or configurations as denoted by the following terminal
+% XY viewing-direction codes: RU~(RightUp), RD~(RightDown), LU~(LeftUp),
+% LD~(LeftDown); two additional terminal codes are F~(Flat) and SF~(Semi-Flat).
+% For~example, the command
+% \begin{quote}
+% \cmd{\DrawRubikCubeRU}
+% \end{quote}
+% will draw a Rubik cube as viewed from the RightUp direction (RU), as
+% shown in the following figure.
+%
+% \bigskip
+%
+% \begin{minipage}{2.8cm}
+% \begin{tikzpicture}[scale=0.7]
+% \RubikCubeSolvedWY
+% \DrawRubikCubeRU
+% \end{tikzpicture}%
+% \end{minipage}
+% \hspace{5mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{3cm}{0.7}{\DrawRubikCubeRU}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% \DescribeMacro{\DrawRubikCubeF}
+% This command draws the completely flat (F) format of the cube, as shown in the following example.
+%
+% \bigskip
+%
+% \begin{minipage}{0.4\textwidth}
+% \centering
+% \begin{tikzpicture}[scale=0.4]
+% \RubikCubeSolvedWY
+% \DrawRubikCubeF
+% \node (U) at (1.5, 4.5) [black]{\small\textsf{U}};
+% \node (D) at (1.5, -1.5) [black]{\small\textsf{D}};
+% \node (L) at (-1.5, 1.5) [black]{\small\textsf{L}};
+% \node (R) at (4.5, 1.5) [black]{\small\textsf{R}};
+% \node (F) at (1.5, 1.5) [black]{\small\textsf{F}};
+% \node (B) at (7.5, 1.5) [black]{\small\textsf{B}};
+% \end{tikzpicture}%
+% \end{minipage}
+% \begin{minipage}{5cm}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{5cm}{0.4}{\DrawRubikCubeF}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% The addition of text (numbers or letters) in the faces is
+% straightforward---the origin of the 1-unit grid is located at the
+% bottom left corner of the \textsc{front} face (orange here).
+% The letters were placed using the following TikZ code inside the
+% TikZ picture environment
+% (remember TikZ commands require a terminal semi-colon~;).
+%
+%\begin{verbatim}
+% \RubikCubeSolved
+% \ShowCube{5cm}{0.4}{%
+% \DrawRubikCubeF
+% \node (U) at (1.5, 4.5) [black]{\small\textsf{U}};
+% \node (D) at (1.5, -1.5) [black]{\small\textsf{D}};
+% \node (L) at (-1.5, 1.5) [black]{\small\textsf{L}};
+% \node (R) at (4.5, 1.5) [black]{\small\textsf{R}};
+% \node (F) at (1.5, 1.5) [black]{\small\textsf{F}};
+% \node (B) at (7.5, 1.5) [black]{\small\textsf{B}};
+% }
+%\end{verbatim}
+%
+% \DescribeMacro{\DrawRubikCubeSF}
+% {\noindent}A useful `semi-flat' (SF) alternative format, which uses
+% the standard RU view of the cube and appends the three hidden
+% sides (cf.,~Rokicki \textit{et~al.}, 2013), is generated by the
+% command \cmd{\DrawRubikCubeSF} as follows.
+%
+% \bigskip
+%
+% \begin{minipage}{5cm}
+% \begin{tikzpicture}[scale=0.5]
+% \RubikCubeSolvedWY
+% \DrawRubikCubeSF
+% \node (B) at (5.5, 2.5) [white]{\small\textsf{B}};
+% \end{tikzpicture}%
+% \end{minipage}
+% \begin{minipage}{5cm}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{5cm}{0.5}{%
+% \DrawRubikCubeSF
+% \node (B) at (5.5, 2.5)
+% [white]{\small\textsf{B}};
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% Note that even in this configuration it is straight-forward to
+% write text on the graphic, since the 2D width (on the page) of
+% the green \textsc{right} face is exactly 1-unit, and the
+% bottom right-hand corner of the green face is raised exactly 1-unit
+% (see Figure~\ref{fig:cubesquaregraph}).
+% Consequently, since the origin of the coordinate-grid is at the bottom left
+% corner of the \textsc{front} face (the orange face here), the ($x,y$) coordinates
+% of the centre of the red \textsc{back} face are easily determined to be (5.5, 2.5).
+%
+%
+%
+% \subsection{DrawRubikFace.. commands}
+% \label{sec:drawrubikfacecommands}
+%
+%
+% \DescribeMacro{\DrawRubikFaceUp}
+% \DescribeMacro{\DrawRubikFaceDown}
+% \DescribeMacro{\DrawRubikFaceLeft}
+% \DescribeMacro{\DrawRubikFaceRight}
+% \DescribeMacro{\DrawRubikFaceFront}
+% \DescribeMacro{\DrawRubikFaceBack}
+% \DescribeMacro{\DrawRubikFaceUpSide}
+% \DescribeMacro{\DrawRubikFaceDownSide}
+% \DescribeMacro{\DrawRubikFaceLeftSide}
+% \DescribeMacro{\DrawRubikFaceRightSide}
+% \DescribeMacro{\DrawRubikFaceFrontSide}
+% \DescribeMacro{\DrawRubikFaceBackSide}
+% These commands draw the current state of a specified face
+% (e.g.,~\cmd{\DrawRubikFaceUp}), or the face and all the associated sidebars
+% (e.g.,~\cmd{\DrawRubikFaceUpSide}). These commands do \textsc{not} take any
+% arguments---for code see Section~\ref{sec:drawrubikfacecode}.
+%
+% \textsc{Note}: These commands replace the earlier
+% \cmd{\DrawFace...} commands (see Section~\ref{sec:deprecated}).
+%
+% For example, a simple way to show the yellow-cross configuration in
+% the \textsc{up}~face would be to first define the colours using
+% the \cmd{\RubikFaceUp} command, and then draw the \textsc{up} face
+% using the \cmd{\DrawRubikFaceUp} command, as follows:
+%
+% \bigskip
+%
+%
+% \RubikFaceUp{X}{Y}{X}
+% {Y}{Y}{Y}
+% {X}{Y}{X}
+% \ShowCube{2.1cm}{0.7}{\DrawRubikFaceUp}
+% \hspace{1cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikFaceUp{X}{Y}{X}
+% {Y}{Y}{Y}
+% {X}{Y}{X}
+% \ShowCube{2.1cm}{0.7}{\DrawRubikFaceUp}
+%\end{verbatim}
+% \end{minipage}
+%
+%
+%
+% \subsection[Drawing Sidebars (Face)]{Sidebars \& DrawRubikFaceXSide commands}
+% \label{sec:sidebars}
+%
+%
+% In the next example we use the \cmd{\DrawRubikFaceUpSide} command to
+% draw the \textsc{up}~face and all its sidebars in a cube having
+% a `solved' WY (White opposite Yellow) configuration.
+%
+% \bigskip
+%
+% \RubikCubeSolvedWY
+% \ShowCube{1.6cm}{0.5}{\DrawRubikFaceUpSide}
+% \hspace{1cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{1.6cm}{0.5}{\DrawRubikFaceUpSide}
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% \noindent\textbf{Short-hand versions}: For convenience each of these commands
+% has an equivalent short-hand version generated by using just the first letter of the
+% face name and (where appropriate) the first letter of the word Side. For~example,
+% \newline\cmd{\DrawRubikFaceR} $\equiv$ \cmd{\DrawRubikFaceRight},
+% \newline \cmd{\DrawRubikFaceRS} $\equiv$ \cmd{\DrawRubikFaceRightSide}, etc.
+%
+%
+%
+%
+%
+% \subsection{Sidebar parameters}
+% \label{sec:sidebarparameters}
+%
+% \DescribeMacro{\RubikSidebarWidth}
+% \DescribeMacro{\RubikSidebarLength}
+% \DescribeMacro{\RubikSidebarSep}
+% The default values (size) of the sidebars are as follows:
+% width (0.3), length(1) and separation from the square face (0.3)
+% ---see Section~\ref{sec:sidebarcode} for the code.
+% Note that the default value of the length of a cubie side is 1.
+% These sidebar values (decimal values $\geq 0$; no units) can be
+% changed from their default values using the three commands.
+% \begin{quote}
+% \cmd{\RubikSidebarWidth\{\}}\hspace{35.751pt}(default = 0.3)\\
+% \cmd{\RubikSidebarLength\{\}}\hspace{30pt}(default = 1.0)\\
+% \cmd{\RubikSidebarSep\{\}}\hspace{46.251pt}(default = 0.3)
+% \end{quote}
+% Values set in the document preamble will apply globally, while values
+% set within a TikZ picture environment will apply only locally to that
+% particular environment. Alternatively, one can keep the effect local
+% using braces (see below).
+%
+% In the following example, we show the effect
+% on the \textsc{up} face and sidebars of a normally solved (WY) cube
+% after dramatically changing the sidebar width, length and separation
+% from the default values---compare with the previous image.
+% For~convenience, we have used a pair of braces
+% to keep the effect local to this example.
+%
+% \bigskip
+%
+% {
+% \RubikCubeSolvedWY
+% \RubikSidebarWidth{0.8}
+% \RubikSidebarLength{0.5}
+% \RubikSidebarSep{0.7}
+% \ShowCube{2cm}{0.5}{\DrawRubikFaceUpSide}
+% }
+% \hspace{2cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% {
+% \RubikCubeSolvedWY
+% \RubikSidebarWidth{0.8}
+% \RubikSidebarLength{0.5}
+% \RubikSidebarSep{0.7}
+% \ShowCube{2cm}{0.5}{\DrawRubikFaceUpSide}
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% Note also that changing the sidebar-width or sidebar-separation
+% values may well also change the surrounding white-space (use \cmd{\fbox}
+% to visualise this) and may therefore require some fine-tuning of the
+% minipage width setting in order to optimise appearance.
+%
+%
+%
+%
+% \subsection[NoSidebar command]{\cmd{\NoSidebar} command}
+% \label{sec:nosidebar}
+%
+% \DescribeMacro{\NoSidebar}
+% The \cmd{\NoSidebar}\marg{colour-code} command
+% (which takes a single colour code argument)
+% allows the user to disable the drawing of sidebars having a particular colour
+% (for code see Section~\ref{sec:nosidebarcode}).
+% Its action can be localised by placing the command inside an environment
+% (e.g.,~inside the \verb!\ShowCube! environment).
+% Alternatively, the action of this command can be disabled simply by writing it with an empty
+% argument, e.g.,~\verb!\NoSidebar{}!.
+%
+% This command is designed to facilitate the drawing of so-called
+% OLL (Orientate Last Layer) configurations,
+% which are typically rendered using the yellow face.
+%
+% For~example, the following figure uses the \verb!\DrawRubikFaceUpSide! command to
+% draw the commonly encountered OLL configuration known as the `yellow cross'
+% (the remaining four yellow facelets associated with this layer are shown as sidebars).
+% In this example, we first define the colours for the whole cube (grey), and then
+% redefine the colours for the \textsc{up}~face and its four adjacent faces.
+% Finally we draw the \textsc{up}~face and sidebars; we also show an alternative
+% way of writing the facelet colour codes (ie without using the curly brackets).
+%
+% \bigskip
+%
+% \begin{minipage}{3cm}
+% \RubikCubeGreyAll
+% \RubikFaceUp XYX
+% YYY
+% XYX
+% \RubikFaceFront YXY XXXXXX
+% \RubikFaceRight XXY XXXXXX
+% \RubikFaceBack XXX XXXXXX
+% \RubikFaceLeft YXX XXXXXX
+% \ShowCube{2.6cm}{0.6}{\DrawRubikFaceUpSide}
+% \end{minipage}
+% \hspace{4mm}
+% \begin{minipage}{5cm}
+% \begin{verbatim}
+% \RubikCubeGreyAll
+% \RubikFaceUp XYX
+% YYY
+% XYX
+% \RubikFaceFront YXY XXXXXX
+% \RubikFaceRight XXY XXXXXX
+% \RubikFaceBack XXX XXXXXX
+% \RubikFaceLeft YXX XXXXXX
+% \ShowCube{2.6cm}{0.6}{\DrawRubikFaceUpSide}
+% \end{verbatim}
+% \end{minipage}
+% \bigskip
+%
+% {\noindent}However, we can greatly improve the OLL image by
+% disabling the drawing of all the grey (X) sidebars by using the
+% \verb!\NoSidebar{X}! command as follows (here we have placed the
+% \verb!\NoSidebar{X}! command inside the \verb!\ShowCube! environment
+% in order to limit its action locally). Note also that this time we
+% have used the short-hand US (UpSide) version of the
+% \cmd{\DrawRubikFaceUpSide} command.
+%
+% \bigskip
+%
+% \begin{minipage}{3cm}
+% \RubikCubeGreyAll
+% \RubikFaceUp XYX
+% YYY
+% XYX
+% \RubikFaceFront YXY XXXXXX
+% \RubikFaceRight XXY XXXXXX
+% \RubikFaceBack XXX XXXXXX
+% \RubikFaceLeft YXX XXXXXX
+% \ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUS}
+% \end{minipage}
+% \hspace{4mm}
+% \begin{minipage}{5cm}
+% \begin{verbatim}
+% \RubikCubeGreyAll
+% ...
+% ...
+% \ShowCube{2.6cm}{0.6}{\NoSidebar{X}%
+% \DrawRubikFaceUS%
+% }
+% \end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+%
+%
+% \subsection[Drawing Sidebars (Cube)]{Cube sidebars \& DrawRubikCubeSidebar commands}
+% \label{sec:sidebarscube}
+%
+%
+%
+%
+% Cube sidebars are drawn adjacent to cube edges which are
+% defined by the two faces forming the edge.
+% Thus the BR (Back-Right) sidebar is placed adjacent to the
+% edge formed by the \textsc{back} and \textsc{right} faces.
+%
+% Since the cube orientation (view direction; RU, RD, LU, LD)
+% determines which sidebars are visible, the command for drawing
+% the sidebar (\texttt{DrawRubikCubeSidebar..}) also needs to
+% incorporate the view direction. The command takes
+% two mandatory arguments: the first is the pair of face codes defining the edge (XX);
+% the second is the view direction, as follows:
+% \begin{quote}
+% \cmd{\DrawRubikCubeSidebarXX}\marg{view direction}
+%
+% \textsc{example:} \verb!\DrawRubikCubeSidebarRB{LD}!
+% \end{quote}
+% Note that the pair of face codes are order \textit{independent},
+% and hence can be written in any order, which makes remembering the commands very easy.
+%
+% Note also that at present commands are only available for the
+% eight sidebars which are parallel to X,Y axes, as these seem
+% to be the most useful.
+%
+% In the following example, we input a previously saved cube state
+% (in the file \texttt{cubestate-A.tex}) and draw the cube and the
+% four main sidebars (BR, BD, FL, FU) visible from the RD view direction.
+%
+% \bigskip
+%
+% \RubikFaceUp{O}{G}{Y}{B}{B}{O}{R}{B}{G}%
+% \RubikFaceDown{Y}{R}{B}{R}{W}{O}{W}{Y}{R}%
+% \RubikFaceLeft{Y}{G}{W}{W}{Y}{R}{O}{W}{B}%
+% \RubikFaceRight{B}{B}{B}{W}{G}{O}{R}{G}{W}%
+% \RubikFaceFront{G}{R}{O}{Y}{R}{O}{R}{G}{G}%
+% \RubikFaceBack{O}{W}{W}{Y}{O}{Y}{Y}{B}{G}%
+% \ShowCube{4cm}{0.6}{
+% \DrawRubikCubeRD
+% \DrawRubikCubeSidebarBR{RD}
+% \DrawRubikCubeSidebarBD{RD}
+% \DrawRubikCubeSidebarFL{RD}
+% \DrawRubikCubeSidebarFU{RD}
+% }
+% \begin{minipage}{5cm}
+%\begin{verbatim}
+% \input{cubestate-A.tex}
+% \ShowCube{3cm}{0.6}{
+% \DrawRubikCubeRD
+% \DrawRubikCubeSidebarBR{RD}
+% \DrawRubikCubeSidebarBD{RD}
+% \DrawRubikCubeSidebarFL{RD}
+% \DrawRubikCubeSidebarFU{RD}
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+%\bigskip
+%
+%
+%
+%
+% \subsection{DrawRubikFlat commands}
+% \label{sec:drawrubikflatcommands}
+%
+% \DescribeMacro{\DrawRubikFlatUp}
+% \DescribeMacro{\DrawRubikFlatDown}
+% \DescribeMacro{\DrawRubikFlatLeft}
+% \DescribeMacro{\DrawRubikFlatRight}
+% \DescribeMacro{\DrawRubikFlatFront}
+% \DescribeMacro{\DrawRubikFlatBack}
+% The \cmd{\DrawRubikFlat..}\marg{x}\marg{y} commands draw a `flat' square
+% representation of a specified face, located such that its
+% bottom left corner is positioned at ($x,y$).
+% Each command (except \cmd{\DrawRubikFlatFront}) takes two arguments,
+% namely the X-coordinate and Y-coordinate of the bottom left
+% corner of the face. This ($x,y$) pair allows the user to position
+% the face (see Section~\ref{sec:codedrawrubikflatcommands} for the code).
+%
+% These commands are designed to supplement the \cmd{\DrawRubikCube...} commands and
+% allow hidden faces to be represented.
+%
+% Note also that the \cmd{\DrawRubikFlatFront} command currently takes \textit{no}
+% arguments, since by definition the bottom left corner of this face is
+% always at (0,0), and there seems to be no reason (just now) for
+% this face to have the ($x,y$) facility.
+%
+% \textsc{usage}:\ The following example uses the command \verb!\DrawRubikFlatBack{4}{1}! to
+% append the \textsc{back} face to the side of a 3D cube. Note that since
+% the coordinates of the bottom/back/right corner of the cube rendered by the
+% command \cmd{\DrawRubikCubeRU} is (4,1)
+% (see Section~\ref{sec:coordinates}), we can position the
+% lower/left corner of the \textsc{back} face at this point using the command
+% \verb!\DrawRubikFlatBack{4}{1}! as follows:
+%
+% \bigskip
+%
+% \begin{minipage}{0.4\textwidth}
+% \centering
+% \RubikCubeSolvedWY
+% \begin{tikzpicture}[scale=0.5]
+% \DrawRubikCubeRU
+% \DrawRubikFlatBack{4}{1}
+% \end{tikzpicture}%
+% \end{minipage}
+% \begin{minipage}{5cm}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{3cm}{0.5}{%
+% \DrawRubikCubeRU
+% \DrawRubikFlatBack{4}{1}
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+%
+% \subsection[DrawNCube]{DrawNCube (NxNxN)}
+% \label{sec:NCube}
+%
+% \DescribeMacro{\DrawNCubeAll}
+% An `NCube' is a solved NxNxN cube drawn from the RU direction;
+% (i.e.,~only shows faces \textsc{up}, \textsc{front}, \textsc{right}).
+% The cubie colours of each face are All the same.
+% \begin{quote}
+% \cmd{\DrawNCubeAll\{N\}\{Xcolour\}\{Ycolour\}\{Zcolour\}}.
+% \end{quote}
+% This command takes four ordered parameters (N, X, Y, Z)---the number
+% (integer; $N>0$) of cubies along an edge, followed by three face
+% colours in XYZ order.
+% Since the viewpoint is only from the RU direction, the three colour
+% parameters are: X(Right), Y(Up), Z(Front).
+%
+% \bigskip
+%
+% \begin{minipage}{0.3\textwidth}
+% \begin{tikzpicture}[scale=0.5]
+% \DrawNCubeAll{5}{O}{Y}{G}
+% \end{tikzpicture}%
+% \end{minipage}
+% \begin{minipage}{0.5\textwidth}
+%\begin{verbatim}
+% \ShowCube{3.5cm}{0.5}{\DrawNCubeAll{5}{O}{Y}{G}}
+%\end{verbatim}
+% \end{minipage}
+%
+%
+%
+%
+% \section[ShowSequence command]{\cmd{\ShowSequence} command}
+% \label{sec:showsequence}
+%
+% \DescribeMacro{\ShowSequence}
+% \DescribeMacro{\ShowSequenceF}
+% \DescribeMacro{\ShowSequencef}
+% The \cmd{\ShowSequence}\marg{separator}\marg{font-code}\marg{sequence} command
+% typesets a comma-separated sequence of rotation
+% codes---for code see Section~\ref{sec:codeshowsequence}.
+% Appending an `F' to the command-name (\cmd{\ShowSequenceF}) results in an fbox around
+% the whole output (cf.~the \cmd{\ShowCubeF} command).
+% Appending a lower-case `f' to the command-name (\cmd{\ShowSequencef}) generates fboxs around
+% \textit{each element} in the output (these two forms can be helpful when checking white space).
+%
+% The \cmd{\ShowSequence} command takes three mandatory arguments:
+% the first is the separator (\verb!#1!),
+% the second is the font or style code (\verb!#2!),
+% and third is a comma-separated sequence of Rubik rotation codes (|#3|).
+%
+% The separator (e.g.,~comma) used for typesetting the sequence can be specified
+% (or just omitted---i.e.,~an empty bracket);
+% the sequence can be either a named sequence (i.e.,~encoded as a macro) or just a
+% comma separated sequence of rotation codes.
+%
+% \noindent\textsc{usage}:
+% The following command displays the rotation sequence F, R, U, Rp, Up, using
+% the \verb!\rr! encoding and comma \& space separated.
+%
+% \medskip
+%
+% \verb!\ShowSequence{,\ }{\rr}{F,R,U,Rp,Up}! \ \ $\rightarrow$ \ \ \ShowSequence{,\ }{\rr}{F,R,U,Rp,Up}
+%
+% \medskip
+%
+% Remember that if you want a very long sequence to break automatically
+% at the line-ends, then you need to include at least one space between
+% the sequence elements, either with or without a comma; for this the
+% separator argument needs to include a space, i.e.,~something like
+% \verb!{,\ }! or \verb!{\ }! or just \verb!{ }! perhaps.
+%
+%
+% For~example, the following commands typeset the comma-separated
+% rotation sequence U,D,Lp,R using different separators and fonts.
+% For convenience, we start by encoding the sequence as the macro \verb!\myseq!.
+%
+%
+% \newcommand{\myseq}{U,D,Lp,R}
+%
+% \medskip\noindent\verb!\newcommand{\myseq}{U,D,Lp,R}!
+%
+% \medskip\noindent\verb!\ShowSequence{,}{\texttt}{\myseq}! \ $\longrightarrow$ \ \ShowSequence{,}{\texttt}{\myseq}
+%
+% \medskip\noindent\verb!\ShowSequence{,}{\rr}{\myseq}! \ $\longrightarrow$ \ \rr{U},\rr{D},\rr{Lp},\rr{R}
+%
+% \medskip\noindent\verb!\ShowSequence{}{\rrh}{\myseq}! \ $\longrightarrow$ \ \rrh{U}\rrh{D}\rrh{Lp}\rrh{R}
+%
+% \medskip\noindent\verb!\ShowSequence{\ }{\rrh}{\myseq}! \ $\longrightarrow$ \ \rrh{U}\ \rrh{D}\ \rrh{Lp}\ \rrh{R}
+%
+% \medskip\noindent\verb!\ShowSequence{,\ }{\textRubik}{\myseq}! \ $\longrightarrow$ \ \textRubik{U},\ \textRubik{D},\
+% \textRubik{Lp},\ \textRubik{R}
+%
+%
+%
+%
+% \subsection{Trailing digits}
+%
+% Note that the commands \verb!\rr!, \verb!\rrh!, \verb!\Rubik!
+% and \verb!\textRubik! will fail for rotation codes which
+% have a trailing digit, e.g.,~R2, Dp3 (so-called `short' codes), since the
+% \verb!\ShowSequence! macro currently only reads the whole string between pairs of
+% commas (i.e.,~it does not \textit{interpret} strings like R2 $\rightarrow$ R,R etc.).
+% However, if you just want to `see' the text, then the standard \LaTeX\ typewriter command
+% \verb!\texttt! will typeset the text correctly, as you would expect
+% (but using the \texttt{tt} font of course).
+%
+% A useful `work-around' for this limitation is provided by the \verb!\RubikRotation{}!
+% command\,\footnote{Using the \texttt{--shell-escape} command-line option
+% with the \LaTeX\ engine---see Section~\ref{sec:rubikrotation}.}
+% (part of the \textsc{rubikrotation} package), since this returns (via the Perl program
+% \texttt{rubikrotation.pl}) an extended (`long') form of a given sequence in which
+% any `short' rotation codes are converted into their separate (atomic) long-form rotation codes;
+% the associated string is \verb!\SequenceLong!.
+% In fact three different forms of the sequence are returned, as shown below.
+%
+% For~example, consider the following short-form sequence L,R,D2,L3, and denote
+% it as `seqA' as follows: \verb!\newcommand{\seqA}{[seqA],L,R,D2,L3,<test>}!.
+% In~this case D2,L3, and the name `seqA' fail to be typeset when using
+% the \verb!\rr! font with the \verb!\ShowSequence! command
+% (notice there are lots of commas with nothing between them),
+% while \cmd{\texttt} does work, as follows:
+%
+% \newcommand{\seqA}{[seqA],L,R,D2,L3,<test>}
+%
+% \medskip\noindent\verb!\newcommand{\seqA}{[seqA],L,R,D2,L3,<test>}!
+%
+% \medskip\noindent\verb!\ShowSequence{,}{\rr}{\seqA}! \ $\longrightarrow$ \ \ShowSequence{,}{\rr}{\seqA}
+%
+% \medskip\noindent\verb!\ShowSequence{,}{\texttt}{\seqA}! \ $\longrightarrow$ \ \ShowSequence{,}{\texttt}{\seqA}
+%
+% \medskip
+%
+% However, if we now run the command \verb!\RubikRotation{\seqA}! we shall then have
+% at our disposal the following four strings:
+%
+% \medskip
+%
+% \verb!\SequenceInfo = ! test
+%
+% \verb!\SequenceName = ! seqA
+%
+% \verb!\SequenceShort = ! L,R,D2,L3
+%
+% \verb!\SequenceLong = ! L,R,D,D,L,L,L
+%
+% \medskip
+%
+% {\noindent}and therefore have full control over typesetting rotation sequences.
+% This approach therefore offers sufficient flexibility for most purposes.
+% For~example, if we now write the command \verb!\ShowSequence{,}{\rr}{\SequenceLong}!
+% we obtain
+%
+% \medskip\noindent\verb!\ShowSequence{,}{\rr}{\SequenceLong}! \ $\longrightarrow$ \
+% \ShowSequence{,}{\rr}{L,R,D,D,L,L,L}
+%
+% \medskip
+%
+% In practice, any trailing digit is converted (modulo~4) and expanded accordingly, the details being
+% copied to the log-file. For~example, if one writes the command
+% \cmd{\RubikRotation\{[test],R,D28978\}}, then since $28978 \equiv 2$\,(modulo~4) then \cmd{\SequenceLong}
+% will be returned containing the string |R,D,D|. The associated entries in the log-file are
+% as follows:
+%\begin{verbatim}
+%...rotation R OK
+%...Expanding D28978 (28978 = 2 mod 4) ...
+%...rotation D OK (= Dp3)
+%...rotation D OK (= Dp3)
+%...writing new Rubik state to file rubikstateNEW.dat
+%...SequenceName = test
+%...SequenceShort = R,D28978
+%...SequenceLong = R,D,D
+%\end{verbatim}
+%
+%
+%
+% \section{SequenceBrace commands}
+% \label{sec:sequencebrace}
+%
+% \DescribeMacro{\SequenceBraceA}
+% \DescribeMacro{\SequenceBraceB}
+% \DescribeMacro{\SequenceBraceAF}
+% \DescribeMacro{\SequenceBraceBF}
+% The \cmd{\SequenceBraceX}\marg{name}\marg{sequence} command
+% is a tool for displaying a named sequence using a brace. The trailing~A
+% denotes that the brace is placed Above the sequence; the trailing~B denotes
+% the brace is Below the sequence.
+% Appending an `F' to the command-name (e.g.,~\cmd{\SequenceBraceAF}) results
+% in a surrounding fbox (cf.~the \cmd{\ShowCubeF} command).
+% For the code see Section~\ref{sec:sequencebracecode}.
+%
+% {\noindent}Thus \verb!\SequenceBraceB{myseq}{U,D,L,R}! generates
+% \ \SequenceBraceB{myseq}{U,D,L,R}.
+%
+% {\noindent}A typical example of its use might be:
+%
+% \bigskip
+%
+%\noindent%
+%\RubikCubeSolvedWY%
+%\ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+%\quad\SequenceBraceA{fourspot}{\ShowSequence{}{\Rubik}{F,F,B,B,U,Dp,R,R,L,L,U,Dp}}%
+%\quad$\longrightarrow$\quad%
+%\RubikFaceFront{R}{R}{R}%
+% {R}{O}{R}%
+% {R}{R}{R}%
+%\RubikFaceRight{B}{B}{B}%
+% {B}{G}{B}%
+% {B}{B}{B}%
+%\ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+%
+%
+% \bigskip
+%
+% {\noindent}which was generated by the following code, showing that the \cmd{\ShowSequence}
+% command can be used as an argument for the \cmd{\SequenceBraceA} command:
+%\begin{verbatim}
+%\newcommand{\fourspot}{[fourspot],F2,B2,U,Dp,R2,L2,U,Dp}%
+%\noindent%
+%\RubikCubeSolvedWY%
+%\ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+%\RubikRotation{\fourspot}%
+%\quad\SequenceBraceA{\SequenceName}{%
+% \ShowSequence{}{\Rubik}{\SequenceLong}}%
+%\quad$\longrightarrow$\quad%
+%\ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+%\end{verbatim}
+% Note (1)~that the `fourspot' listing is included in the \textsc{rubikpatterns} package, and
+% (2)~the \cmd{\RubikRotation} command requires using the \texttt{--shell-escape} command-line
+% option with the \LaTeX\ engine---see Section~\ref{sec:rubikrotation} for details.
+%
+%
+%
+% \section{Arrows}
+% \label{sec:arrows}
+%
+% The \rubikcube\ package does not offer any special commands for drawing
+% arrows since it is straightforward just to include the appropriate TikZ
+% `draw' commands in the \texttt{tikzpicture} environment (i.e.,~in our
+% own \cmd{\ShowCube} environment).
+%
+% In order to facilitate using the standard TikZ `draw' commands
+% the graphic grid origin of Rubik cube images is located at the bottom left corner
+% of the \textsc{front} face (see also Section~\ref{sec:coordinates} for details of the
+% cube's coordinate system). Similarly, single face images (e.g.,~drawn using the
+% \cmd{\DrawRubikFace..} or \cmd{\DrawRubikFlat..} commands etc.) and also Sidebars, have
+% their grid origin at the bottom left corner of the face.
+% Consequently the start and finish coordinates for any arrow or line are
+% easy to determine.
+%
+% \begin{figure}[hbt]
+% \centering
+% \ifpdf
+% \includegraphics[height=3cm]{rubik-doc-figE.pdf}
+% \fi
+%
+% \parbox{9cm}{%
+% \caption{\label{fig:facegraph}Grid showing the positive coordinates
+% associated with \textsc{front} face of a cube image, or of a face-only image.}
+% }%
+% \end{figure}
+%
+% \medskip
+%
+% For~example, Figure~\ref{fig:facegraph} shows a green
+% arrow drawn from the centre of the lower-left cubie $(0.5, 0.5)$ to the centre of
+% middle cubie $(1.5, 1.5)$.
+% To do this we just include the following TikZ command (remember that TikZ
+% commands require a terminal semicolon):
+% \begin{quote}
+%\begin{verbatim}
+% \draw[->,color=green] (0.5,0.5) -- (1.5, 1.5);
+%\end{verbatim}
+% \end{quote}
+%
+% The following example shows the cubie movement in the \textsc{up} face
+% generated by the rotation sequence \rrF\rrR\rrU\rrRp\rrUp\rrFp.
+% The magenta arrows indicate movement \textit{with} cubie rotations,
+% while the black arrow indicates movement \textit{without} rotation.
+% This example also highlights the fact that when there are several arrows,
+% the start and end positions often need to be offset slightly away from cubie centres.
+%
+% \bigskip
+% \noindent
+% \RubikCubeSolvedWY
+% \ShowCube{2.5cm}{0.7}{%
+% \DrawRubikFaceUp
+% \draw[->,thick,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+% \draw[->,thick] (2.5,1.5) -- (1.6, 2.4);
+% \draw[->,thick,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+% \draw[<->,thick,color=magenta] (0.5,2.6) -- (2.5, 2.6);
+% \draw[<->,thick,color=magenta] (0.5,0.3) -- (2.5, 0.3);
+% }
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeSolvedWY
+% \ShowCube{2.5cm}{0.7}{%
+% \DrawRubikFaceUp
+% \draw[->,thick,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+% \draw[->,thick] (2.5,1.5) -- (1.6, 2.4);
+% \draw[->,thick,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+% \draw[<->,thick,color=magenta] (0.5,2.6) -- (2.5, 2.6);
+% \draw[<->,thick,color=magenta] (0.5,0.3) -- (2.5, 0.3);
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+% Since the coordinates shown in Figure~\ref{fig:facegraph} extend
+% outwards in all directions, they can also be used as a guide for drawing
+% arrows (or other structures) outside this 3x3 `face' square.
+% The origin is at lower left corner of the face.
+%
+% In the following example, we input a Rubik cube configuration
+% (previously saved as the file \texttt{CubeFour.tex}
+% (see the \textsc{rubikrotation} package documentation for details)\footnote{See also
+% the `SaveRubikState' example in the file \texttt{RubikExamples.pdf}.}, and
+% draw an arrow to highlight a yellow side facelet.
+%
+% \bigskip
+% \noindent
+% \RubikCubeGreyAll
+% \RubikFaceUp OYG YYY BYY
+% \RubikFaceFront YRR XXXXXX
+% \RubikFaceRight GOO XXXXXX
+% \RubikFaceBack YBB XXXXXX
+% \RubikFaceLeft YGR XXXXXX
+% \ShowCube{2.2cm}{0.5}{\DrawRubikFaceUpSide%
+% \draw[->,ultra thick,color=green] (2.5,5) -- (2.5, 4);
+% }
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \input{CubeFour.tex}
+% \ShowCube{2.2cm}{0.5}{\DrawRubikFaceUpSide%
+% \draw[->,ultra thick,color=green] (2.5,5) -- (2.5, 4);
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% {\noindent}The following example shows an arrow on the Rubik cube.
+% The origin of coordinates is at the bottom left corner of the
+% \textsc{front} face (see Section~\ref{sec:coordinates}).
+%
+% \bigskip
+% \noindent
+% \begin{minipage}{2.8cm}
+% \centering
+% \begin{tikzpicture}[scale=0.7]
+%
+% \RubikFaceFront{O}{O}{O}
+% {O}{O}{X}
+% {X}{O}{X}
+%
+% \RubikFaceRight{G}{G}{G}
+% {X}{G}{G}
+% {X}{X}{X}
+%
+% \RubikFaceDown {X}{G}{X}
+% {X}{Y}{X}
+% {X}{X}{X}
+%
+% \DrawRubikCubeRD
+% \draw[ultra thick,->,color=blue]
+% (1.5,0.5) -- (2.5, 1.5);
+% \end{tikzpicture}%
+% \end{minipage}
+% \hspace{1cm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikFaceFront{O}{O}{O}
+% {O}{O}{X}
+% {X}{O}{X}
+%
+% \RubikFaceRight{G}{G}{G}
+% {X}{G}{G}
+% {X}{X}{X}
+%
+% \RubikFaceDown {X}{G}{X}
+% {X}{Y}{X}
+% {X}{X}{X}
+% \ShowCube{3cm}{0.7}{%
+% \DrawRubikCubeRD
+% \draw[ultra thick,->,color=blue]
+% (1.5,0.5) -- (2.5, 1.5);
+% }
+%\end{verbatim}
+% \end{minipage}
+%
+% \bigskip
+%
+% In the following example we use a blue circle to highlight a corner cubie
+% to be rotated into the top layer. Note we also use the command
+% \verb!\DrawRubikCubeSidebarFD{RU}! to draw the sidebar along
+% the FD (Front-Down) edge, and show the colour of the hidden facelet
+% of the corner-cubie.
+%
+% \bigskip
+%
+% \noindent%
+% \RubikCubeGreyWY
+% \RubikFaceUp{X}{W}{X}%
+% {W}{W}{W}%
+% {W}{W}{X}%
+% \RubikFaceDown{X}{X}{O}{X}{X}{X}{X}{X}{X}%
+% \RubikSliceBottomR{X}{X}{W}{G}{X}{X}%
+% \ShowCube{2.5cm}{0.5}{%
+% \DrawRubikCubeRU
+% \DrawRubikCubeSidebarFD{RU}
+% \draw[ultra thick,->,color=blue] (2.5,0.5) -- (2.5, 2.5);
+% \draw [color=blue, thick] (2.7, 0.3) circle (1.3);
+% }%
+% \hspace{3mm}
+% \begin{minipage}{0.6\textwidth}
+%\begin{verbatim}
+% \RubikCubeGreyWY
+% \RubikFaceUp{X}{W}{X}
+% {W}{W}{W}
+% {W}{W}{X}
+% \RubikFaceDown{X}{X}{O}{X}{Y}{X}{X}{X}{X}%
+% \RubikSliceBottomR{X}{X}{W}{G}{X}{X}
+% \ShowCube{2.5cm}{0.5}{%
+% \DrawRubikCubeRU
+% \DrawRubikCubeSidebarFD{RU}
+% \draw[ultra thick,->,color=blue]
+% (2.5,0.5) -- (2.5, 2.5);
+% \draw [color=blue, thick] (2.7, 0.3) circle (1.3);
+% }%
+%\end{verbatim}
+% \end{minipage}
+%
+%
+%
+%
+%
+% \section{Final example}
+%
+% We now present, as a final example, the code used to draw the front page
+% figure\,\footnote{This is a well-known sequence of order 6 used to cycle three
+% edge cubies; it is used to generate the `cross' configuration in the final layer
+% when solving the cube. Here we are performing the sequence on a `solved' cube,
+% since this allows you to see how the three edge cubies move, and either
+% flip (magenta arrows) or do not flip (black arrow).}.
+% This code uses the \cmd{\RubikRotation} command (from the \textsc{rubikrotation}
+% package), and therefore the \LaTeX\ engine needs to be run using the
+% \verb!--shell-escape! command-line switch (see Section~\ref{sec:rubikrotation} for details).
+%
+% \bigskip
+%
+% \noindent\hfil%
+% \RubikCubeSolvedWY%
+% \ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+% \quad\ShowCube{1.6cm}{0.4}{%
+% \DrawRubikFaceUpSide
+% \draw[thick,->,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+% \draw[thick,->] (2.5,1.5) -- (1.6, 2.4);
+% \draw[thick,->,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+% \draw[thick,<->, color=blue] (0.5,2.6) -- (2.5, 2.6);
+% \draw[thick,<->, color=blue] (0.5,0.3) -- (2.5, 0.3);
+% }%
+% \quad\Rubik{F}\Rubik{R}\Rubik{U}\Rubik{Rp}\Rubik{Up}\Rubik{Fp}%
+% \quad$\longrightarrow$%
+% \RubikFaceUp WWB WWOWRB%
+% \RubikFaceBack RGG XXXXXX%
+% \RubikFaceLeft RBO XXXXXX%
+% \RubikFaceFront GWO XXXXXX%
+% \RubikFaceRight WWW XXXXXX%
+% \quad\ShowCube{1.6cm}{0.4}{\DrawRubikFaceUpSide}
+% \hfil%
+%
+%
+% \bigskip
+%
+%\begin{verbatim}
+% \noindent\hfil%
+% \RubikCubeSolvedWY%
+% \ShowCube{1.6cm}{0.4}{\DrawRubikCubeRU}%
+% \quad\ShowCube{1.6cm}{0.4}{%
+% \DrawRubikFaceUpSide%
+% \draw[thick,->,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+% \draw[thick,->] (2.5,1.5) -- (1.6, 2.4);
+% \draw[thick,->,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+% \draw[thick,<->, color=blue] (0.5,2.6) -- (2.5, 2.6);
+% \draw[thick,<->, color=blue] (0.5,0.3) -- (2.5, 0.3);
+% }%
+% \RubikRotation{F,R,U,Rp,Up,Fp}%
+% \quad\ShowSequence{}{\Rubik}{\SequenceLong}\quad$\longrightarrow$%
+% \ShowCube{1.6cm}{0.4}{\DrawRubikFaceUpSide}%
+% \hfil
+%\end{verbatim}
+%
+%
+%
+% \subsection[Without using {\textbackslash}RubikRotation]{Without using \cmd{\RubikRotation}}
+%
+% If you really need to draw the above figure \textit{without} using
+% the \textsc{rubikrotation} package (as we had to in order to write
+% this particular document) then you would need to replace the
+% commands
+%\begin{verbatim}
+% \RubikRotation{F,R,U,Rp,Up,Fp}
+% \ShowSequence{,}{\Rubik}{\SequenceLong} \ \ \ $\longrightarrow$
+% \ShowCube{2cm}{0.4}{\DrawRubikFaceUpSide}
+%\end{verbatim}
+% with the following commands:
+%
+%\begin{verbatim}
+% \Rubik{F}\Rubik{R}\Rubik{U}\Rubik{Rp}\Rubik{Up}\Rubik{Fp}
+% \ \ \ $\longrightarrow$
+% \RubikFaceUp WWB WWOWRB
+% \RubikFaceBack RGG XXXXXX
+% \RubikFaceLeft RBO XXXXXX
+% \RubikFaceFront GWO XXXXXX
+% \RubikFaceRight WWW XXXXXX
+% \quad\ShowCube{1.6cm}{0.4}{\DrawRubikFaceUpSide}
+% \hfil
+%\end{verbatim}
+%
+%
+%
+%
+%
+% \section{Deprecated commands}
+% \label{sec:deprecated}
+%
+%
+% The \cmd{\DrawRubikLayerFace..} and \cmd{\DrawRubikLayerSide..}
+% are now deprecated; they were found to be
+% confusing since (a)~they both drew faces \textit{and} took colour arguments
+% for facelets, and (b)~they did not update the internal colour state of a
+% cube or face---i.e.,~their colouring was simply a local `painting' action
+% without memory.
+% They have both been superseded by the more versatile
+% \cmd{\DrawRubikFace..}\ commands (see Section~\ref{sec:drawrubikfacecommands}).
+%
+% The \cmd{\RubikSide..} commands are also deprecated, since they duplicated
+% some of the function of the \cmd{\RubikFace..}\ commands.
+%
+% The earlier \cmd{\DrawFace..}\ (v4) and \cmd{\DrawFlat..}\ (v3) commands
+% are also deprecated since they lacked the Rubik or Two keyword
+% (see Sections~\ref{sec:rubikandtwo} and \ref{sec:drawrubikfacecommands}).
+%
+% \medskip
+%
+% {\noindent}Summary of all deprecated commands (and their current versions) since v3.
+%
+% \smallskip
+%
+% \begin{supertabular}[ll]{p{4cm} p{6cm}}
+% \verb!\DrawRubikCubeFlat! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikCubeSF! \ (Semi-Flat) \\
+% \verb!\DrawRubikFlat! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikCubeF! \ \ (Flat) \\
+% \verb!\DrawFace..! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikFace..! \\
+% \verb!\DrawFlat..! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikFlat..! \\
+% \verb!\DrawFlat..Side! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikFace..Side! \\
+% \verb!\DrawRubikLayerFace..! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikFace..! \\
+% \verb!\DrawRubikLayerSide..! & $\rightarrow$ \hspace{0.5cm} \verb!\DrawRubikFace..! \\
+% \end{supertabular}
+%
+%
+%
+%
+% \section{Known limitations}
+%
+% Please contact the authors regarding any ideas for improvement, errors,
+% problems or shortcomings etc.
+%
+% \begin{itemize}
+%
+% \item Note that the rotation hieroglyphs are optimised for a 10pt font
+% and do not scale with document font size. However, they do work well in
+% conjunction with the standard 11pt and 12pt document fonts sizes. Nevertheless,
+% the font size can of course be changed by renewing the font command
+% (see Section~\ref{sec:rubikfont} for details).
+%
+% \item The sidebars cannot be arbitrarily positioned (note: hidden
+% faces can be arbitrarily positioned).
+%
+% \end{itemize}
+%
+%
+%
+%
+% \section{Change history}
+%
+% \begin{itemize}
+%
+% \item Version 5 (February 2018)
+%
+% -- Removed some now unnecessary commands (see Section~\ref{sec:deprecated})
+% and made some of the internal code a bit more efficient.
+%
+% ---Added two new `grey' commands: \cmd{\RubikCubeGreyWY} and \cmd{\RubikCubeGreyWB}
+% (so as to complement the related \cmd{\RubikCubeSolvedXX} commands).
+%
+% ---Bugfix: added a pair of containing braces around the \cmd{\ifthenelse..} command
+% used by the \cmd{\ShowSequence} command (for code see Section~\ref{sec:codeshowsequence}).
+% This fixed an occasional problem of a font not being contained.
+%
+%
+% ---Added missing lowercase cube `prime' versions of whole cube rotation notation
+% (\rr{up}, \rr{dp}, \rr{lp}, \rr{rp}, \rr{fp}, \rr{bp}); see Section~\ref{sec:xyznotation}.
+%
+%
+% ---New \cmd{\NoSidebar} command for disabling the drawing of sidebars of a particular colour
+% (see Section~\ref{sec:nosidebar}).
+%
+%
+% ---Implemented the terminal $x,y$ position parameters for
+% the \cmd{\DrawRubikFlatLeft} and \cmd{\DrawRubikFlatRight}
+% commands; all the \cmd{\DrawRubikFlat..} commands work correctly now
+% (see Section~\ref{sec:codedrawrubikflatcommands})
+%
+%
+%
+% \item Version 4.0 (March 2017)
+%
+% ---Improved documentation.
+%
+% ---Improved inter-hieroglyph spacing and vertical position. The Computer Modern sans bold font
+% (10/12pt) is used for the hieroglyphs and rotation codes (see Section~\ref{sec:coderubikfont}
+% for details).
+%
+% ---Improved the \cmd{\ShowCube} and \cmd{\ShowCubeF} macros (see Sections~\ref{sec:showcube}
+% and \ref{sec:showcubecode}).
+%
+% ---Additional notation for middle slice rotations (`m' notation), e.g.,~\rr{Rm}, \rr{Rmp} etc
+% (see Sections~\ref{sec:mnotation} and \ref{sec:codeJaap}).
+%
+% ---Additional notation for whole cube rotations (`c' notation), e.g.,~\rr{Rc}, \rr{Rcp} etc
+% (see Sections~\ref{sec:cnotation} and \ref{sec:codeJaap}).
+%
+% ---Added Randelshofer notation (the `CMST' rotations), e.g.,~\rr{CR}, \rr{MR} etc
+% (see Sections~\ref{sec:listofRandelshofercommands} and \ref{sec:codeRandelshofer}).
+%
+%
+%
+% ---Six new commands for showing and annotating rotation sequences; the versions with a
+% terminal `F' also surround the object with an fbox to allow users to see the extent
+% of any associated white space
+% (see Sections~\ref{sec:showsequence} \& \ref{sec:sequencebrace}):
+% \begin{quote}
+% \cmd{\ShowSequence}
+% \newline\cmd{\ShowSequenceF}
+% \newline\cmd{\ShowSequencef}
+% \newline\cmd{\SequenceBraceA}
+% \newline\cmd{\SequenceBraceAF}
+% \newline\cmd{\SequenceBraceB}
+% \newline\cmd{\SequenceBraceBF}
+%
+% \end{quote}
+%
+% ---A new command for setting up or allocating a `solved' colour configuration.
+% (see Section~\ref{sec:rubiksolvedconfig}):
+% \begin{quote}
+% \cmd{\RubikSolvedConfig}
+% \end{quote}
+%
+% ---A new command for setting up a `starter cube' for which the \textit{whole} cube
+% is allocated the default `grey' colour (see Section~\ref{sec:rubikcubegrey}):
+% \begin{quote}
+% \cmd{\RubikCubeGreyAll}
+% \end{quote}
+%
+% ---A new supporting \textsc{rubikpatterns} package has been added to
+% the Rubik bundle. It is a small macro database of well-known named Rubik patterns
+% and associated sequences (see Section~\ref{sec:patterns}).
+%
+%
+%
+% \item Version 3.0 (September 2015)
+%
+% ---All rotation commands can now use the rotation-code as an argument; for~example,
+% the rotation \rr{D} can now be typeset using the command \cmd{\rr\{D\}} etc
+% (see Section~\ref{sec:RubikCommands}).
+% The new rotation commands are:
+% \begin{quote}
+% \cmd{\rr\marg{rotation-code}}
+% \newline\cmd{\rrh\marg{rotation-code}}
+% \newline\cmd{\Rubik\marg{rotation-code}}
+% \newline\cmd{\textRubik\marg{rotation-code}}
+%\end{quote}
+% The original rotation command formats (e.g.,~\cmd{\rrD}) are still supported for backwards compatibility.
+%
+% --- \cmd{\ShowCube} and \cmd{\ShowCubeF} are new commands for displaying
+% a cube inside a minipage (see Sections~\ref{sec:showcube} and \ref{sec:showcubecode}).
+%
+% --- \cmd{\RubikCubeGrey} is a new command for setting up a `starter cube' for which the
+% only allocated colours are those for the centre cubies (see Section~\ref{sec:rubikcubegrey}).
+% The colour configuration matches that of the \cmd{\RubikCubeSolved}.
+%
+% \item Version 2.2 (January 2015)
+%
+% ---Fixed typos and minor errors in the documentation.
+%
+% ---Added the following commands to facilitate typesetting a face
+% (but see Section~\ref{sec:deprecated}).
+%\begin{quote}
+%\begin{verbatim}
+%\DrawFlatUp
+%\DrawFlatDown
+%\DrawFlatLeft
+%\DrawFlatRight
+%\DrawFlatFront
+%\DrawFlatBack
+%\DrawFlatUpSide
+%\DrawFlatDownSide
+%\DrawFlatLeftSide
+%\DrawFlatRightSide
+%\DrawFlatFrontSide
+%\DrawFlatBackSide
+%\end{verbatim}
+%\end{quote}
+%
+% ---Changed `Equator' $\rightarrow$ `Middle' in all \cmd{\DrawLayer..}
+% commands (for consistency). Hence `E' $\rightarrow$ `M' in all Flat
+% commands and Slice commands. Note that although the former use of `Equator' is
+% retained for backward compatibility (for the moment) it is now deprecated.
+%
+% ---Fixed a conflict with the \TeX\ \cmd{\sb} command as used by the \textbf{url}
+% package which resulted in reference chaos when the \textbf{url} package was used with
+% the \Rubikcube\ package (internalised \cmd{\sb} to \cmd{\@sb}). Also internalised, for
+% convenience, \cmd{\sd} to \cmd{\@sd}; \cmd{\sh} to \cmd{\@sh}; \cmd{\sc} to \cmd{\@sc};
+% \cmd{\sq} to \cmd{\@sq}.
+%
+%
+% \item Version 2.0 (February 5, 2014)
+%
+% ---First release.
+%
+% \end{itemize}
+%
+%
+%
+% \section{Acknowledgements}
+%
+% We thank Peter Bartal and Peter Grill for useful ideas and
+% suggestions; we have built on some of their ideas and have acknowledged
+% these instances in the documentation.
+% We also thank Christian Tellechea for the \cmd{\@join\{\}\{\}}
+% command (see Section~\ref{sec:usefulinternalcommands}),
+% Christian Schr\"{o}ppel for help regarding the \textsf{forarray} package
+% (see Section~\ref{sec:codeshowsequence}), Herbert Kociemba for helpful comments,
+% and Robert Ma\v{r}\'{\i}k for suggesting the \cmd{\NoSidebar\{\}} command
+% (see Section~\ref{sec:nosidebar}).
+%
+%
+% \section{References}
+%
+% \begin{itemize}
+%
+%
+% \item Bartal P (2011). \
+% \url{http://tex.stackexchange.com/questions/34482/}
+%
+% \item Chen JJ (2004). Group theory and the Rubik's cube.
+% \url{http://www.math.harvard.edu/~jjchen/docs/rubik.pdf}
+%
+%
+% \item Davis T (2006). Group theory via Rubik's cube.
+% \url{http://www.geometer.org/rubik/group.pdf}
+%
+% \item Demaine ED, Demaine ML, Eisenstat S, Lubiw A and Winslow A (2011).
+% Algorithms for solving Rubik's cubes.
+% \url{http://www.arxiv.org/abs/1106.5736/}
+%
+% \item Duvoid T (2010).
+% M\'{e}thode simple pour remonter le Rubik's cube.
+% \newline\url{http://duvoid.fr/rubik/rubik-debutant-couleurs.pdf}
+% \newline\url{http://duvoid.fr/rubik/sources/notation_en.eps}
+% \newline\url{http://duvoid.fr/rubik/sources/rubik-debutant-couleurs.tex}
+%
+% \item Duvoid T (2011).
+% M\'{e}thode avanc\'{e}e pour remonter le Rubik's cube.
+% \newline\url{http://duvoid.fr/rubik/rubik-friddrich-couleurs.pdf}
+% \newline\url{http://duvoid.fr/rubik/sources/rubik-friddrich-couleurs.tex}
+%
+% \item Feuers\"{a}nger (2016). Manual for package \textsc{pgfplots}.
+% v\,1.13 (2016/01/06), \S\,3.2.3, page~21. (\texttt{pgfplots.pdf})
+% \url{http://www.ctan.org/pkg/pgfplots}. [re: preventing extra white space]
+%
+% \item Fridrich website (Fridrich J). \ \ \url{http://www.ws.binghamton.edu/fridrich/}.
+% See the useful `notation' section on the `Pretty patterns' webpage at
+% \url{http://www.ws.binghamton.edu/fridrich/ptrns.html}.
+%
+% \item Frey AH and Singmaster D (1982). \textit{Handbook of cubik math},
+% (Enslow Publishers, Inc.) (republished: 2010, Lutterworth Press, UK)
+%
+% \item Fung website (Fung A). Solving the Rubik's cube systematically.
+% \url{http://alexfung.info/favorite/cube/cube.htm}
+%
+% \item Garfath-Cox, A (1981). \textit{The cube}, (Bolden Publishing Co.,
+% East Molesey, Surrey) pp.32. [copy in British Library]
+%
+% \item Golomb SW (1981). Rubik's cube and a model of quark confinement.
+% \textit{Am.\ J.\ Phys.}; vol~49, pp~1030--1031.
+%
+% \item Golomb SW (1982). Rubik's cube and quarks: twists on the eight corner cells
+% of Rubik's cube provide a model for many aspects of quark behaviour.
+% \textit{American Scientist}; \underline{70}, No~3 (May--June 1982),
+% pp.~257--259. \url{http://www.jstor.org/stable/27851433}
+%
+% \item Gymrek M (2009). The mathematics of the Rubik's cube.
+% \newline\url{http://web.mit.edu/sp.268/www/rubik.pdf}
+%
+% \item Harris D (2008). Speedsolving the cube.
+% (Sterling Publishing Co.\ Inc., New York, USA.) pp.~166.
+% [covers 2x2x2, 3x3x3, 4x4x4, 5x5x5 cubes]
+%
+% \item Harris website (Harris D). \url{http://www.cubestation.co.uk}
+%
+% \item Heise website (Heise R). Rubik's cube theory. \url{http://www.ryanheise.com/cube/theory.html}
+%
+% \item Hofstadter D (1981). Rubik cube. \textit{Scientific American}; March issue.
+%
+% \item Hutchings M (2011). The mathematics of Rubik's cube (slide presentation).
+% \url{http://math.berkeley.edu/~hutching/rubik.pdf}
+%
+% \item Jelinek website (Jelinek J). Rubik's cube solution methods.
+% \url{http://www.rubikscube.info/}
+%
+% \item Joyner D (2008). \textit{Adventures in group theory:
+% Rubik's cube, Merlin's machine and other mathematical toys}; pp~322.
+% \url{http://www.mike.verdone.ca/media/rubiks.pdf}
+%
+%
+% \item Kociemba website (Kociemba H). \url{http://www.kociemba.org/cube.htm}
+% {\newline}---for superflip see: \url{http://www.kociemba.org/math/oh.htm}
+%
+%
+% \item Kriz I and Siegel P (2008). Rubik's cube-inspired puzzles demonstrate math's
+% simple groups. \textit{Scientific American}; July 2008
+%
+% \item Longridge website (Longridge M). The cube pattern archive. \url{http://www.cubeman.org}
+%
+% \item Randelshofer website (Randelshofer W). Pretty patterns.
+% \url{http://www.randelshofer.ch/rubik/patterns/}
+%
+% \item Reid website (Reid M). \ \ \url{http://www.cflmath.com/Rubik},
+% for patterns see \url{http://www.cflmath.com/Rubik/patterns.html}
+%
+% \item Reid M. (1995). Superflip requires 20 face turns. (January 1995)
+% \url{http://www.math.ucf.edu/~reid/Rubik/CubeLovers/}
+% {\newline}[cited from Rokicki \textit{et~al.}, 2013].
+% {\newline}(Note: easier to use is the following html indexed version of the
+% archive of the Cube-Lovers usenet group (1982--1997)
+% \url{http://www.math.rwth-aachen.de/~Martin.Schoenert/Cube-Lovers/})
+%
+%
+% \item Rokicki T, Kociemba H, Davidson M and Dethridge J (2013). The diameter of the
+% Rubik's cube is twenty. \textit{SIAM.\ J.\ Discrete Math.}, \underline{27}, 1082--1105.
+% (\url{http://tomas.rokicki.com/rubik20.pdf})
+%
+% \item Roux website (Roux G). \ \ \url{http://www.grroux.free.fr}
+%
+% \item Rubik's cube. See Section on notation.
+% \newline\url{http://en.wikipedia.org/wiki/Rubik's_Cube}
+%
+% \item RuWix website (Ferenec D). \ \ \url{http://www.ruwix.com}.
+% See the online Rubik's cube solver \url{http://www.ruwix.com/online-rubiks-cube-solver-program}.
+%
+% \item Scherphius website (Scherphius J). Jaap Puzzles website
+% \url{http://www.jaapsch.net/puzzles/symmetr1.htm}
+%
+% \item Sher S.\ T-H.\ (2014). The new durable Rubik's cube (technical description).
+% \url{http://www.scf.usc.edu/~tsher/files/Rubiks_Cube.pdf} [includes RGB colour specification]
+%
+%
+% \item Singmaster D (1981). \textit{Notes on Rubik's magic cube} (Harmondsworth, Eng., Penguin Books)
+%
+% \item Speedsolving website. \url{http://www.speedsolving.com/}
+%
+%
+% \item Storer website (Storer JA). \url{http://www.cs.brandeis.edu/~storer/JimPuzzles/}
+% {\newline} For Rubik cube, see: \url{http://www.cs.brandeis.edu/~storer/JimPuzzles/RUBIK/Rubik3x3x3.pdf}
+% {\newline} For puzzle book, see: \url{http://www.cs.brandeis.edu/~storer/zzzJimPuzzles/JimPuzzlesBook.pdf}
+%
+%
+% \item Tran R (2005). A mathematical approach to solving Rubik's cube.
+% \url{http://www.math.ubc.ca/~cass/courses/m308/projects/rtran/rtran.pdf}
+%
+%
+% \item Treep A and Waterman M (1987). Marc Waterman's Algorithm, Part 2.
+% \textit{Cubism For Fun 15}, p.~10 (Nederlandse Kubus Club)
+% [cited from \textit{Wikipedia} (Rubik's cube)]
+%
+%
+% \item Vandenbergh website (Vandenbergh L). \ \ \textsc{cubezone} \url{http://www.cubezone.be}
+%
+% \item WCA (2016). World Cube Association Regulations. See \S\,12 for notation.
+% \url{http://www.worldcubeassociation.org/regulations.htm}
+%
+%
+% \end{itemize}
+%
+%
+%
+% ^^A ==================================================
+% \StopEventually{\PrintIndex}
+%
+%
+%
+% \section{The code (\texttt{rubikcube.sty})}
+%
+% The conventions we adopt regarding capital letters and the
+% XYZ argument ordering are detailed in Section~\ref{sec:conventions}.
+%
+% Note that it is important when using a graphics package to use a trailing \% on
+% the end of lines which break before the terminal curly bracket of a \cmd{\newcommand}.
+% This is to prevent accumulating spurious spaces which may otherwise appear in
+% figures and diagrams as a strange or unexpected horizontal shift or white-space.
+%
+% \subsection{\hspace{3mm}Package heading}
+%
+% \begin{macrocode}
+%<*rubikcube>
+\def\RCfileversion{5.0}%
+\def\RCfiledate{2018/02/25}% February 25, 2018
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rubikcube}[\RCfiledate\space (v\RCfileversion)]
+% \end{macrocode}
+% The package requires TikZ---so we load it if not already loaded.
+% \begin{macrocode}
+\@ifpackageloaded{tikz}{}{%
+ \typeout{---rubikcube requires the TikZ package.}%
+ \RequirePackage{tikz}}%
+% \end{macrocode}
+%
+% The package requires the Forarray package (see Section~\ref{sec:codeshowsequence})---so
+% we load it if not already loaded.
+% \begin{macrocode}
+\@ifpackageloaded{forarray}{}{%
+ \typeout{---rubikcube requires the Forarray package.}%
+ \RequirePackage{forarray}}%
+% \end{macrocode}
+%
+% The package requires the IfThen package (see Section~\ref{sec:codeshowsequence})---so
+% we load it if not already loaded.
+% \begin{macrocode}
+\@ifpackageloaded{ifthen}{}{%
+ \typeout{---rubikcube requires the IfThen package.}%
+ \RequirePackage{ifthen}}%
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{\rubikcube}
+% First we create a suitable logo
+% \begin{macrocode}
+\newcommand{\rubikcube}{\textsc{rubikcube}}%
+\newcommand{\Rubikcube}{\textsc{Rubikcube}}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}Colours}
+% \label{sec:codecolours}
+%
+% We have adopted the following colour allocations---see Section~\ref{sec:colours}
+% for details.
+%
+% \begin{macrocode}
+\definecolor{R}{HTML}{C41E33}%
+\definecolor{G}{HTML}{00BE38}%
+\definecolor{B}{HTML}{0051BA}%
+\definecolor{Y}{HTML}{FFFF00}%
+\colorlet{X}{black!30}% grey
+\colorlet{O}{orange}%
+\colorlet{W}{white}%
+% \end{macrocode}
+%
+%
+%
+% \subsection{\hspace{3mm}The rubikfont}
+% \label{sec:coderubikfont}
+%
+% \begin{macro}{\@rubikfont}
+% \begin{macro}{\@rubikfontFNS}
+% \begin{macro}{\@rubikprime}
+% We define two fonts for text associated with the Rubik glyphs
+% (both the `arrow' glyphs and the `letter' glyphs),
+% namely, (1)~Computer Modern Sans (cmss), bold extended (bx), normal shape (n)
+% at 10/12pt, and (2)~a footnotesize (FNS) version (8pt) for the lower-case letters
+% [for cmss see Latex Companion (2004), p.\,417 \& p.\,354\,\footnote{Note the typo in Table~7.5 (p.\,354):
+% the font-series code for the Sans semi-bold condensed form is `sbx' (not sbc).}].
+% This has the effect of keeping the size
+% of Rubik glyphs constant in the face of any changes in the document fonts.
+% We make the baseline-skip values the same, since the `arrow' glyphs generated by
+% the \cmd{\Rubik} commands involve a single baseline-skip (for~example, as with
+% \verb!\Rubik{D}!; see Section~\ref{sec:coderotationD}).
+% We use the cmss font apostrophe as the `prime' symbol (the user has
+% the opportunity to use the maths \cmd{\prime}
+% instead---see Section~\ref{sec:rubikprime}).
+%\begin{macrocode}
+\newcommand{\@rubikfont}{\fontsize{10}{12pt}\usefont{T1}{cmss}{bx}{n}}
+\newcommand{\@rubikfontFNS}{\fontsize{8}{12pt}\usefont{T1}{cmss}{bx}{n}}
+\newcommand{\@rubikprime}{'}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{\hspace{3mm}ShowCube command}
+% \label{sec:showcubecode}
+%
+% \begin{macro}{\ShowCube}
+% \begin{macro}{\ShowCubeF}
+% The macro \cmd{\ShowCube}\marg{minipage width}\marg{TikZ scale factor}\marg{Draw.. cmd}
+% displays the cube inside a minipage, so that we can easily tailor the minipage
+% width (|#1|) and also the TikZ scale factor (|#2|). The \cmd{\ShowCubeF} command
+% places an fbox around the minipage so users can see the extent of any white space.
+% {\newline}\textsc{usage}: |\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}|
+%
+% February 2017 (RWDN): \ We first require a new length variable (which will become the minipage-width),
+% so we can add the length 1.6pt to it (this is the width of the TikZ ultra-thick line
+% which is used to draw the Rubik cubes).
+% In order for a width of an image made up of $x$~units to be equal
+% to $x \times (\mbox{scale-factor})$ we need to add an extra line-width
+% (i.e.,~to include the right-hand edge).
+% \begin{macrocode}
+\newlength{\@showcubewidth}%
+% \end{macrocode}
+% We can now build the two macros. We set the \cmd{\fboxsep} value to zero.
+% \begin{macrocode}
+\newcommand{\ShowCube}[3]{%
+ \setlength{\fboxsep}{0cm}%
+ \setlength{\@showcubewidth}{#1}%
+ \advance\@showcubewidth by 1.6pt\relax%
+ \begin{minipage}{\the\@showcubewidth}%
+ \centering%
+ \begin{tikzpicture}[scale=#2]%
+ #3%
+ \end{tikzpicture}%
+ \end{minipage}%
+}%
+\newcommand{\ShowCubeF}[3]{%
+ \setlength{\fboxsep}{0cm}%
+ \setlength{\fboxrule}{0.4pt}%
+ \setlength{\@showcubewidth}{#1}%
+ \advance\@showcubewidth by 1.6pt\relax%
+ \framebox{%
+ \begin{minipage}{\the\@showcubewidth}%
+ \centering%
+ \begin{tikzpicture}[scale=#2]%
+ #3%
+ \end{tikzpicture}%
+ \end{minipage}%
+}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{\hspace{3mm}ShowSequence command}
+% \label{sec:codeshowsequence}
+%
+% \begin{macro}{\ShowSequence}
+% \begin{macro}{\ShowSequenceF}
+% \begin{macro}{\ShowSequencef}
+% The \cmd{\ShowSequence}\marg{separator}\marg{font-code}\marg{sequence} command
+% typesets a comma separated sequence of rotation commands.
+% (See Section~\ref{sec:showsequence}).
+% This command takes three mandatory arguments: the first is the separator (\verb!#1!),
+% the second is the font or style code (\verb!#2!), and third is a comma-separated
+% sequence of Rubik rotation commands (|#3|).
+%
+% This command requires the \texttt{forarray}
+% package---by Christian Schr\"{o}ppel---(for the \cmd{\ForEachX} command)
+% and the \texttt{ifthen} package---by David Carlisle---(for the \cmd{\ifthenelse} command).
+% These two packages are loaded at startup if not already loaded.
+% We first need to define two variables for use by the command; these are
+% derived from the \texttt{forarray} package.
+%
+% \begin{macrocode}
+\newcommand{\x}{\thislevelitem}
+\newcommand{\xcount}{\thislevelcount}
+% \end{macrocode}
+%
+% \noindent\textsc{example usage:} |\ForEachX{;}{\texttt{\x}}{L;R;U;D}|
+%
+% An important feature of the |\ForEachX| command is that it expands its third argument
+% (the list of elements), since this allows the list of elements to be presented as
+% a macro, which is extremely convenient for the user.
+%
+% The \cmd{\ShowSequence} command typesets a sequence of elements (|#3|), and places
+% an optional separator (|#1|) between them.
+% For each element (|\x|, see above) of the sequence |#3| this command forms the
+% construction |#2{element of #3}|.
+% For~example, if |#2 = \rr|, and D is an element of |#3|, then it will form the
+% command |\rr{D}| etc.
+%
+% Note that it is not straightforward to place the separator (|#1|) \textit{only between}
+% the derived elements (i.e.,~without the separator being either before the first element,
+% or following the last element) using only the |ForEachX| command. This is because
+% the |ForEachX| command processes each element in exactly the
+% same way---i.e.,~a comma after the first element (good) means there will be a comma after
+% the final element (bad).
+%
+% We solve this problem by using the |\ifthenelse| command to allow the first element
+% to be processed differently from all the remaining elements. This is because it is easy
+% for \TeX\ to identify the first element of a sequence, but very difficult for it to
+% identify the final element since we generally don't know the number of elements beforehand.
+% Consequently we identify the first element (using the |\xcount|) variable (see above),
+% and then process this first element \textit{without} any comma;
+% we then place a comma in front of each of the remaining elements.
+%
+% We also create two fbox versions of the command: the `F' version places an fbox about the
+% whole output; the `f' version places an fbox about each element in the output
+% (these two versions can be helpful when checking white space).
+%
+% Note: bugfix 22 October 2017 (RWDN): if the user implemented tt output using \cmd{\tt}
+% instead of the standard \cmd{\texttt} as the \verb!#2! argument, then the action would
+% not of course remain local, and consequently we have added a leading brace and
+% complementary trailing brace around the the \cmd{\ifthenelse...} command in each of
+% the following three macros to limit the action.
+%
+% \noindent\textsc{usage}: |\ShowSequence{,}{\rr}{R,L,Up,Dp.....}|
+%
+% \begin{macrocode}
+\newcommand{\ShowSequence}[3]{%
+ \ForEachX{,}{%
+ {\ifthenelse{\xcount=1}{#2{\x}}{#1#2{\x}}}%
+ }{#3}%
+}%
+\newcommand{\ShowSequenceF}[3]{%
+\fbox{%
+ \ForEachX{,}{%
+ {\ifthenelse{\xcount=1}{#2{\x}}{#1#2{\x}}}%
+ }{#3}%
+}}%
+\newcommand{\ShowSequencef}[3]{%
+ \ForEachX{,}{%
+ {\ifthenelse{\xcount=1}{\fbox{#2{\x}}}{#1{\fbox{#2{\x}}}}}%
+ }{#3}%
+}%
+% \end{macrocode}
+% \begin{macro}{\SequenceInfo}
+% \begin{macro}{\SequenceName}
+% \begin{macro}{\SequenceShort}
+% \begin{macro}{\SequenceLong}
+% \noindent\textsc{Sequence holders}: providing none of the Rubik rotation-codes has a trailing
+% integer (e.g.,~R3) then the Rubik macros (|\rr|, |\rrh|, |\Rubik|, |\textRubik|) will work
+% as expected when used as the second argument in the \cmd{\ShowSequence} command
+% (described above). However, a problem arises when trying to process in this way any Rubik
+% rotation-codes having a terminal integer (for~example, short-codes e.g.,~R2, D3,...), since the
+% \cmd{\ShowSequence} macro cannot expand short-codes into their long-code
+% elements (e.g.,~~R,R,D,D,D,...).
+%
+% Accommodating such codes when using the \cmd{\ShowSequence} command is currently
+% solved by using separate `holders' for four derived strings, namely: \cmd{\SequenceInfo},
+% \cmd{\SequenceName},\cmd{\SequenceShort} and \cmd{\SequenceLong}
+% (for details see Section~\ref{sec:showsequence}).
+% These are generated automatically by the Perl \textsc{rubikrotation} program, which returns
+% a so-called `long' version of the `short' string (the argument of the \cmd{\RubikRotation}
+% command). For~example, the Perl program converts
+% any short codes (e.g.,~R2, D3,... ) $\rightarrow$ long form, e.g.,~R,R,D,D,D,...
+% (see the \textsc{rubikrotation} documentation for details).
+% In order for the four `holders' of these derived strings generated by the Perl program
+% (written to the file \texttt{rubikstateNEW.dat}) to be accessible to the user they need to
+% defined here so that they can then be `redefined' (by the Perl program) in the file
+% \texttt{rubikstateNEW.dat}:
+% \begin{macrocode}
+\newcommand{\SequenceInfo}{{}}% %% INFO only
+\newcommand{\SequenceName}{{}}% %% NAME only
+\newcommand{\SequenceShort}{{}}% %% original SHORT seq but with NO NAME
+\newcommand{\SequenceLong}{{}}% %% just the LONG string \& no name
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{\hspace{3mm}SequenceBrace commands}
+% \label{sec:sequencebracecode}
+%
+% \begin{macro}{\SequenceBraceA}
+% \begin{macro}{\SequenceBraceB}
+% The \cmd{\SequenceBraceX}\marg{name}\marg{sequence} command
+% is a tool for displaying a named sequence using a brace. The trailing~A
+% denotes that the brace is placed Above the sequence; B~denotes the brace is Below the sequence.
+% For usage see Section~\ref{sec:sequencebrace}.
+%
+% \begin{macrocode}
+\newcommand{\SequenceBraceA}[2]{$\overbrace{\mbox{#2}}^{\mbox{#1}}$}%
+\newcommand{\SequenceBraceB}[2]{$\underbrace{\mbox{#2}}_{\mbox{#1}}$}%
+\newcommand{\SequenceBraceAF}[2]{\fbox{$\overbrace{\mbox{#2}}^{\mbox{#1}}$}}%
+\newcommand{\SequenceBraceBF}[2]{\fbox{$\underbrace{\mbox{#2}}_{\mbox{#1}}$}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}RubikFace commands}
+% \label{sec:rubikfacecode}
+%
+% Cube face notation: U, D, L, R, F, B (Singmaster)
+% {\newline}Cubie-facelet notation: t, m, b, l, m, r = top, middle,
+% bottom, left, middle, right.
+% We use this lower case notation in XY-pairs to denote individual cubie facelets
+% on a given face (to avoid confusion with cube Face notation), as follows:
+% {\newline}\strut\hspace{1cm}top row \ \ \ \ \ (1,2,3) = lt, \ \, mt, \ rt
+% {\newline}\strut\hspace{1cm}middle row\, (4,5,6) = lm, mm, rm
+% {\newline}\strut\hspace{1cm}bottom row (7,8,9) = lb, \ mb, \ rb
+% {\newline}For example, the current colour of the \textbf{r}ight \textbf{b}ottom facelet
+% on the \textsc{front} face is held as the variable \cmd{\Frb} etc.
+%
+% The cubie-facelets (squares) on a face are also parameterized numerically
+% \verb!#1!--\verb!#9! reading from left-to-right, starting top-left \&
+% ending bottom-right, when used as arguments for specifying particular colours
+% (as in the \cmd{\RubikFace..} commands---see below).
+
+%
+%
+% \begin{macro}{\RubikFaceUp}
+% \begin{macro}{\RubikFaceDown}
+% \begin{macro}{\RubikFaceLeft}
+% \begin{macro}{\RubikFaceRight}
+% \begin{macro}{\RubikFaceFront}
+% \begin{macro}{\RubikFaceBack}
+% These 5 commands allocate a colour to each of the 9 cubie-squares in the
+% specified face (Up, Down, Left, Right, Front, Back). Each command takes 9 arguments
+% (colour codes) in the order 1--9 as specified above.
+%
+% {\noindent}\textsc{example}: \cmd{\RubikFaceUp\{R\}\{O\}\{Y\} \{G\}\{B\}\{W\} \{X\}\{R\}\{G\}}
+%
+%
+% {\noindent}Each of the 9 \cmd{\def\{\}} commands below allocates one colour
+% to a specific cubie-square (facelet), using a simple three-letter encoding.
+% Each letter is an initial letter of the words Up, Down, Left, Right, Front, Back,
+% left, middle, right, top, middle, bottom.
+%
+% For~example, in the command \verb!\def\Urt{#1}!
+% the U denotes the Up face of the cube, while the \texttt{rt} denotes
+% the ``right-top'' facelet on this face. Note that the order
+% of the two lower-case letters (\texttt{rt}) is
+% in the $x,y$ order; i.e.,~the first of the two lower-case letters relates to the $x$
+% direction (either left, middle, or right), while the second lower-case letter
+% relates to the $y$ direction (either top, middle, or bottom)---this rule makes it
+% easy to remember the order.
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\RubikFaceUp}[9]{%
+\def\Ult{#1}\def\Umt{#2}\def\Urt{#3}%
+\def\Ulm{#4}\def\Umm{#5}\def\Urm{#6}%
+\def\Ulb{#7}\def\Umb{#8}\def\Urb{#9}%
+}
+\newcommand{\RubikFaceFront}[9]{%
+\def\Flt{#1}\def\Fmt{#2}\def\Frt{#3}%
+\def\Flm{#4}\def\Fmm{#5}\def\Frm{#6}%
+\def\Flb{#7}\def\Fmb{#8}\def\Frb{#9}%
+}
+\newcommand{\RubikFaceRight}[9]{%
+\def\Rlt{#1}\def\Rmt{#2}\def\Rrt{#3}%
+\def\Rlm{#4}\def\Rmm{#5}\def\Rrm{#6}%
+\def\Rlb{#7}\def\Rmb{#8}\def\Rrb{#9}%
+}
+\newcommand{\RubikFaceDown}[9]{%
+\def\Dlt{#1}\def\Dmt{#2}\def\Drt{#3}%
+\def\Dlm{#4}\def\Dmm{#5}\def\Drm{#6}%
+\def\Dlb{#7}\def\Dmb{#8}\def\Drb{#9}%
+}
+\newcommand{\RubikFaceLeft}[9]{%
+\def\Llt{#1}\def\Lmt{#2}\def\Lrt{#3}%
+\def\Llm{#4}\def\Lmm{#5}\def\Lrm{#6}%
+\def\Llb{#7}\def\Lmb{#8}\def\Lrb{#9}%
+}
+\newcommand{\RubikFaceBack}[9]{%
+\def\Blt{#1}\def\Bmt{#2}\def\Brt{#3}%
+\def\Blm{#4}\def\Bmm{#5}\def\Brm{#6}%
+\def\Blb{#7}\def\Bmb{#8}\def\Brb{#9}%
+}
+% \end{macrocode}
+%
+% \begin{macro}{\RubikFaceUpAll}
+% \begin{macro}{\RubikFaceDownAll}
+% \begin{macro}{\RubikFaceLeftAll}
+% \begin{macro}{\RubikFaceRightAll}
+% \begin{macro}{\RubikFaceFrontAll}
+% \begin{macro}{\RubikFaceBackAll}
+% These 5 commands allocate the same colour to all 9 cubie-squares
+% in the specified face (Up, Down, Left, Right, Front).
+% Each command therefore takes only 1~argument (one of the colour codes).
+%
+% {\noindent}For~example, \cmd{\RubikFaceUpAll\{R\}}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\RubikFaceUpAll}[1]{%
+\def\Ult{#1}\def\Umt{#1}\def\Urt{#1}%
+\def\Ulm{#1}\def\Umm{#1}\def\Urm{#1}%
+\def\Ulb{#1}\def\Umb{#1}\def\Urb{#1}%
+}
+\newcommand{\RubikFaceFrontAll}[1]{%
+\def\Flt{#1}\def\Fmt{#1}\def\Frt{#1}%
+\def\Flm{#1}\def\Fmm{#1}\def\Frm{#1}%
+\def\Flb{#1}\def\Fmb{#1}\def\Frb{#1}%
+}
+\newcommand{\RubikFaceRightAll}[1]{%
+\def\Rlt{#1}\def\Rmt{#1}\def\Rrt{#1}%
+\def\Rlm{#1}\def\Rmm{#1}\def\Rrm{#1}%
+\def\Rlb{#1}\def\Rmb{#1}\def\Rrb{#1}%
+}
+\newcommand{\RubikFaceLeftAll}[1]{%
+\def\Llt{#1}\def\Lmt{#1}\def\Lrt{#1}%
+\def\Llm{#1}\def\Lmm{#1}\def\Lrm{#1}%
+\def\Llb{#1}\def\Lmb{#1}\def\Lrb{#1}%
+}
+\newcommand{\RubikFaceDownAll}[1]{%
+\def\Dlt{#1}\def\Dmt{#1}\def\Drt{#1}%
+\def\Dlm{#1}\def\Dmm{#1}\def\Drm{#1}%
+\def\Dlb{#1}\def\Dmb{#1}\def\Drb{#1}%
+}
+\newcommand{\RubikFaceBackAll}[1]{%
+\def\Blt{#1}\def\Bmt{#1}\def\Brt{#1}%
+\def\Blm{#1}\def\Bmm{#1}\def\Brm{#1}%
+\def\Blb{#1}\def\Bmb{#1}\def\Brb{#1}%
+}
+% \end{macrocode}
+%
+% {\noindent}Finally, we now use these commands to initialise all
+% visible faces to the default colour grey~(X)
+%
+% \begin{macrocode}
+\RubikFaceUpAll{X}%
+\RubikFaceDownAll{X}%
+\RubikFaceLeftAll{X}%
+\RubikFaceRightAll{X}%
+\RubikFaceFrontAll{X}%
+\RubikFaceBackAll{X}%
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{\hspace{3mm}RubikCubeGrey command}
+% \label{sec:codegrey}
+%
+% \begin{macro}{\RubikCubeGrey}
+% \begin{macro}{\RubikCubeGreyWY}
+% \begin{macro}{\RubikCubeGreyWB}
+% This command sets the face/colour configuration (state) of a 3x3x3
+% Rubik cube with no colours allocated except for the central cubie of each face.
+% The colour configuration of the central cubies matches those defined for
+% the RubikCubeSolved command (i.e.,~white opposite yellow etc).
+% We also make WY and WB versions, and implement equivalent `gray' versions
+% (to be consistent with TikZ).
+% \begin{macrocode}
+\newcommand{\RubikCubeGrey}{%
+ \RubikFaceRight{X}{X}{X}{X}{G}{X}{X}{X}{X}%
+ \RubikFaceLeft {X}{X}{X}{X}{B}{X}{X}{X}{X}%
+ \RubikFaceUp {X}{X}{X}{X}{W}{X}{X}{X}{X}%
+ \RubikFaceDown {X}{X}{X}{X}{Y}{X}{X}{X}{X}%
+ \RubikFaceFront{X}{X}{X}{X}{O}{X}{X}{X}{X}%
+ \RubikFaceBack {X}{X}{X}{X}{R}{X}{X}{X}{X}%
+}
+\newcommand{\RubikCubeGray}{\RubikCubeGrey}
+\newcommand{\RubikCubeGreyWY}{\RubikCubeGrey}
+\newcommand{\RubikCubeGrayWY}{\RubikCubeGreyWY}
+%%
+\newcommand{\RubikCubeGreyWB}{%
+ \RubikFaceRight{X}{X}{X}{X}{R}{X}{X}{X}{X}%
+ \RubikFaceLeft {X}{X}{X}{X}{O}{X}{X}{X}{X}%
+ \RubikFaceUp {X}{X}{X}{X}{W}{X}{X}{X}{X}%
+ \RubikFaceDown {X}{X}{X}{X}{B}{X}{X}{X}{X}%
+ \RubikFaceFront{X}{X}{X}{X}{G}{X}{X}{X}{X}%
+ \RubikFaceBack {X}{X}{X}{X}{Y}{X}{X}{X}{X}%
+}
+\newcommand{\RubikCubeGrayWB}{\RubikCubeGreyWB}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{\hspace{3mm}SolvedConfig command}
+%
+% \begin{macro}{\RubikSolvedConfig}
+% This command sets the face/colour configuration (state) of a typical
+% solved Rubik cube. Note that the order is Right, Left, Up, Down, Front, Back
+% (i.e.,~X$+$, X$-$, Y$+$, Y$-$, Z$+$, Z$-$, order).
+% We shall use this command to define solved cube configurations.
+% \begin{macrocode}
+\newcommand{\RubikSolvedConfig}[6]{%
+ \RubikFaceRightAll{#1}%
+ \RubikFaceLeftAll{#2}%
+ \RubikFaceUpAll{#3}%
+ \RubikFaceDownAll{#4}%
+ \RubikFaceFrontAll{#5}%
+ \RubikFaceBackAll{#6}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{\hspace{3mm}RubikCubeGreyAll command}
+% \label{sec:codegreyall}
+%
+% \begin{macro}{\RubikCubeGreyAll}
+% This command sets the face/colour configuration (state) of a 3x3x3
+% Rubik cube with no colours allocated.
+% This colour configuration is the same as the startup default state---all cubies will
+% appear grey. We implement it using the \cmd{\RubikSolvedConfig} command (above).
+% We also implement an equivalent `gray' version (to be consistent with TikZ).
+% \begin{macrocode}
+\newcommand{\RubikCubeGreyAll}{\RubikSolvedConfig{X}{X}{X}{X}{X}{X}}%
+\newcommand{\RubikCubeGrayAll}{\RubikCubeGreyAll}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}RubikCubeSolved command}
+% \label{sec:codesolvedconfig}
+%
+% \begin{macro}{\RubikCubeSolved}
+% \begin{macro}{\RubikCubeSolvedWY}
+% \begin{macro}{\RubikCubeSolvedWB}
+% The first (default) command sets the face/colour configuration (state) one of the standard
+% commercially available solved Rubik cube (white opposite yellow). The argument order
+% follows the XYZ notation. For convenience we make a copy named \cmd{\RubikCubeSolvedWY}
+% (denoting the White opposite Yellow configuration), and also a different version named
+% \cmd{\RubikCubeSolvedWB} (denoting the White opposite Blue configuration).
+% These represent the two standard versions of the Rubik Cube.
+% \begin{macrocode}
+\newcommand{\RubikCubeSolved}{\RubikSolvedConfig{G}{B}{W}{Y}{O}{R}}%
+\newcommand{\RubikCubeSolvedWY}{\RubikCubeSolved}%
+\newcommand{\RubikCubeSolvedWB}{\RubikSolvedConfig{R}{O}{W}{B}{G}{Y}}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}Slice commands}
+%
+% \begin{macro}{\RubikSliceTopR}
+% \begin{macro}{\RubikSliceTopL}
+% \begin{macro}{\RubikSliceMiddleR}
+% \begin{macro}{\RubikSliceMiddleL}
+% \begin{macro}{\RubikSliceBottomR}
+% \begin{macro}{\RubikSliceBottomL}
+% These 6~commands allocate the colour arguments for the 6~visible ordered
+% facelets along a horizontal slice. There are three horizontal
+% slices to consider (Top, Middle, Bottom) and each has two viewpoints.
+% The colour-code arguments are ordered 1--6 from left to right.
+% The terminal L and R denote the Left (L) viewpoint and Right (R)
+% viewpoint versions.
+% Note that the two legacy `Equator' versions (now replaced by `Middle')
+% are retained (below) to allow backward compatibility.
+% \begin{macrocode}
+\newcommand{\RubikSliceTopR}[6]{%
+\def\Flt{#1}\def\Fmt{#2}\def\Frt{#3}%
+\def\Rlt{#4}\def\Rmt{#5}\def\Rrt{#6}%
+}
+\newcommand{\RubikSliceTopL}[6]{%
+\def\Llt{#1}\def\Lmt{#2}\def\Lrt{#3}%
+\def\Flt{#4}\def\Fmt{#5}\def\Frt{#6}%
+}
+\newcommand{\RubikSliceMiddleR}[6]{%
+\def\Flm{#1}\def\Fmm{#2}\def\Frm{#3}%
+\def\Rlm{#4}\def\Rmm{#5}\def\Rrm{#6}%
+}
+\newcommand{\RubikSliceMiddleL}[6]{%
+\def\Llm{#1}\def\Lmm{#2}\def\Lrm{#3}%
+\def\Flm{#4}\def\Fmm{#5}\def\Frm{#6}%
+}
+\newcommand{\RubikSliceEquatorR}[6]{%
+\def\Flm{#1}\def\Fmm{#2}\def\Frm{#3}%
+\def\Rlm{#4}\def\Rmm{#5}\def\Rrm{#6}%
+}
+\newcommand{\RubikSliceEquatorL}[6]{%
+\def\Llm{#1}\def\Lmm{#2}\def\Lrm{#3}%
+\def\Flm{#4}\def\Fmm{#5}\def\Frm{#6}%
+}
+\newcommand{\RubikSliceBottomR}[6]{%
+\def\Flb{#1}\def\Fmb{#2}\def\Frb{#3}%
+\def\Rlb{#4}\def\Rmb{#5}\def\Rrb{#6}%
+}
+\newcommand{\RubikSliceBottomL}[6]{%
+\def\Llb{#1}\def\Lmb{#2}\def\Lrb{#3}%
+\def\Flb{#4}\def\Fmb{#5}\def\Frb{#6}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}Cube drawing macros}
+%
+% Since the three visible sides of a Rubik cube have up to 27 non-grey colours,
+% and \TeX\ has only 9 macro parameters available, we are forced to draw
+% Rubik cubes by first specifying the colours on each of the three faces,
+% and then using a `DrawRubikCubeXY' command, where the trailing XY code
+% defines the viewing direction (X = either R or L; Y = either U or D).
+% The order of the XY code is important: X~first, Y~second (so it is easy to remember).
+%
+% On each face the facelets are drawn in the following order: Top row
+% (left to right), Middle row (left to right), Bottom row (left to right).
+%
+% The TikZ draw cycle for each facelet square on a Rubik cube face cycles
+% through the four corners of the facelet in the following order:
+% lb $\rightarrow$ lt $\rightarrow$ rt $\rightarrow$ rb; the code being
+% lb (LeftBottom), lt (LeftTop), rt (RightTop), rb (RightBottom)
+% (only need four coords); the (x,y) grid origin is at the bottom-left corner of the
+% \textsc{front} face.
+%
+% \begin{macro}{\DrawRubikCubeFrontFace}
+% This `FrontFace' command is an `internal' command which draws and paints
+% all the facelets on the \textsc{front} face of a Rubik cube. It is used by all
+% of the cube drawing macros which display the \textsc{front} face.
+% The 9~colours are allocated by an earlier \cmd{\RubikFaceFront} command.
+% These Face macros are based, in part, on those of Peter Bartal (2011).
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeFrontFace}{%
+% ---top row left to right
+\draw[line join=round,line cap=round,ultra thick,fill=\Flt]%
+(0,2) -- (0, 3) -- (1,3) -- (1,2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmt]%
+(1,2) -- (1, 3) -- (2,3) -- (2,2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Frt]%
+(2,2) -- (2, 3) -- (3,3) -- (3,2) -- cycle;
+% -----middle row left to right
+\draw[line join=round,line cap=round,ultra thick,fill=\Flm]%
+(0,1) -- (0, 2) -- (1,2) -- (1,1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmm]%
+(1,1) -- (1, 2) -- (2,2) -- (2,1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Frm]%
+(2,1) -- (2, 2) -- (3,2) -- (3,1) -- cycle;
+% ----bottom row left to right
+\draw[line join=round,line cap=round,ultra thick,fill=\Flb]%
+(0,0) -- (0, 1) -- (1,1) -- (1,0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmb]%
+(1,0) -- (1, 1) -- (2,1) -- (2,0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Frb]%
+(2,0) -- (2, 1) -- (3,1) -- (3,0) -- cycle;
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\hspace{3mm}Viewing direction}
+%
+% The command `DrawRubikCubeXY' command uses the trailing XY code
+% to specify the view direction (X = either R or L; Y = either U or D).
+% The order of the XY code is important: X~first, Y~second (so it is easy
+% to remember).
+%
+% \begin{macro}{\DrawRubikCubeRU}
+% This command draws and paints a Rubik cube as viewed from
+% the Right Upper (RU) viewpoint. It starts by using the internal
+% command \cmd{\DrawRubikCubeFrontFace} to draw the \textsc{front} face,
+% and then draws the \textsc{up} face followed by the \textsc{right} face.
+% The colours are allocated to particular facelets using the \cmd{\RubikFaceUp},
+% \cmd{\RubikFaceRight} and \cmd{\RubikFaceFront} commands.
+%
+% The (x,y) grid origin is at the bottom-left corner of the \textsc{front} face
+% (see Section~\ref{sec:coordinates}).
+% The perspective is designed so that the 2D~graphic image of the side face
+% (\textsc{right} in this particular case) has its `horizontal' lines running
+% at 45~degrees. This has the useful advantage that the 2D~width of the side is
+% exactly 1-unit, and so makes it easy to determine the 2D~(x,y) coordinates
+% of any position, and hence facilitates typesetting text onto the image of
+% the cube using TikZ commands.
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeRU}{%
+\DrawRubikCubeFrontFace %% frontface
+%%-----------Up face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(0.66,3.66) -- (1,4) -- (2,4) -- (1.66,3.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umt]%
+(1.66,3.66) -- (2,4) -- (3,4) -- (2.66,3.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(2.66,3.66) -- (3,4) -- (4,4) -- (3.66,3.66) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulm]%
+(0.33,3.33) -- (0.66,3.66) -- (1.66,3.66) -- (1.33,3.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umm]%
+(1.33,3.33) -- (1.66,3.66) -- (2.66,3.66) -- (2.33,3.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urm]%
+(2.33,3.33) -- (2.66,3.66) -- (3.66,3.66) -- (3.33,3.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(0,3) -- (0.33,3.33) -- (1.33,3.33) -- (1,3) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umb]%
+(1,3) -- (1.33,3.33) -- (2.33,3.33) -- (2,3) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(2,3) -- (2.33,3.33) -- (3.33,3.33) -- (3,3) -- cycle;
+%%-----------Right face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(3,2) -- (3, 3) -- (3.33,3.33) -- (3.33,2.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmt]%
+(3.33,2.33) -- (3.33, 3.33) -- (3.66,3.66) -- (3.66,2.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(3.66,2.66) -- (3.66, 3.66) -- (4,4) -- (4,3) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlm]%
+(3,1) -- (3, 2) -- (3.33,2.33) -- (3.33,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmm]%
+(3.33,1.33) -- (3.33, 2.33) -- (3.66,2.66) -- (3.66,1.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrm]%
+(3.66,1.66) -- (3.66, 2.66) -- (4,3) -- (4,2) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(3,0) -- (3, 1) -- (3.33,1.33) -- (3.33,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmb]%
+(3.33,0.33) -- (3.33, 1.33) -- (3.66,1.66) -- (3.66,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(3.66,0.66) -- (3.66, 1.66) -- (4,2) -- (4,1) -- cycle;
+}
+% \end{macrocode}
+%
+% \begin{macro}{\DrawRubikCube}
+% This command is equivalent to the previous \cmd{\DrawRubikCubeRU}
+% and hence is the default form (i.e.,~if the trailing XY
+% viewpoint code is accidentally omitted).
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikCube}{\DrawRubikCubeRU}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\DrawRubikCubeRD}
+% This command draws and paints a Rubik cube as viewed from
+% the Right Down (RD) viewpoint.
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeRD}{%
+\DrawRubikCubeFrontFace %% frontface
+%%----------Right face--------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(3,2) -- (3, 3) -- (3.33,2.66) -- (3.33,1.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmt]%
+(3.33,1.66) -- (3.33, 2.66) -- (3.66,2.33) -- (3.66,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(3.66,1.33) -- (3.66, 2.33) -- (4,2) -- (4,1) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlm]%
+(3,1) -- (3, 2) -- (3.33,1.66) -- (3.33,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmm]%
+(3.33,0.66) -- (3.33, 1.66) -- (3.66,1.33) -- (3.66,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrm]%
+(3.66,0.33) -- (3.66, 1.33) -- (4,1) -- (4,0) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(3,0) -- (3, 1) -- (3.33,0.66) -- (3.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmb]%
+(3.33,-0.33) -- (3.33, 0.66) -- (3.66,0.33) -- (3.66,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(3.66,-0.66) -- (3.66, 0.33) -- (4,0) -- (4,-1) -- cycle;
+%%-----------Down face---------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(0.33,-0.33) -- (0, 0) -- (1,0) -- (1.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmt]%
+(1.33,-0.33) -- (1, 0) -- (2,0) -- (2.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(2.33,-0.33) -- (2, 0) -- (3,0) -- (3.33,-0.33) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlm]%
+(0.66,-0.66) -- (0.33, -0.33) -- (1.33,-0.33) -- (1.66,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmm]%
+(1.66,-0.66) -- (1.33, -0.33) -- (2.33,-0.33) -- (2.66,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drm]%
+(2.66,-0.66) -- (2.33, -0.33) -- (3.33,-0.33) -- (3.66,-0.66) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(1,-1) -- (0.66, -0.66) -- (1.66,-0.66) -- (2,-1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmb]%
+(2,-1) -- (1.66, -0.66) -- (2.66,-0.66) -- (3,-1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(3,-1) -- (2.66, -0.66) -- (3.66,-0.66) -- (4,-1) -- cycle;
+}
+% \end{macrocode}
+%
+% \begin{macro}{\DrawRubikCubeLD}
+% This command draws and paints a Rubik cube as viewed from
+% the Left Down (LD) viewpoint.
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeLD}{%
+\DrawRubikCubeFrontFace %% frontface
+%%------------Left face--------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(-1,1) -- (-1, 2) -- (-0.66,2.33) -- (-0.66,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmt]%
+(-0.66,1.33) -- (-0.66, 2.33) -- (-0.33,2.66) -- (-0.33,1.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(-0.33,1.66) -- (-0.33, 2.66) -- (0,3) -- (0,2) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llm]%
+(-1,0) -- (-1, 1) -- (-0.66,1.33) -- (-0.66,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmm]%
+(-0.66,0.33) -- (-0.66, 1.33) -- (-0.33,1.66) -- (-0.33,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrm]%
+(-0.33,0.66) -- (-0.33, 1.66) -- (0,2) -- (0,1) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(-1,-1) -- (-1, 0) -- (-0.66,0.33) -- (-0.66,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmb]%
+(-0.66,-0.66) -- (-0.66, 0.33) -- (-0.33,0.66) -- (-0.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(-0.33,-0.33) -- (-0.33, 0.66) -- (0,1) -- (0,0) -- cycle;
+%%------------Down face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(-0.33,-0.33) -- (0, 0) -- (1,0) -- (0.66,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmt]%
+(0.66,-0.33) -- (1, 0) -- (2,0) -- (1.66,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(1.66,-0.33) -- (2, 0) -- (3,0) -- (2.66,-0.33) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlm]%
+(-0.66,-0.66) -- (-0.33, -0.33) -- (0.66,-0.33) -- (0.33,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmm]%
+(0.33,-0.66) -- (0.66, -0.33) -- (1.66,-0.33) -- (1.33,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drm]%
+(1.33,-0.66) -- (1.66, -0.33) -- (2.66,-0.33) -- (2.33,-0.66) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(-1,-1) -- (-0.66, -0.66) -- (0.33,-0.66) -- (0,-1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmb]%
+(0,-1) -- (0.33, -0.66) -- (1.33,-0.66) -- (1,-1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(1,-1) -- (1.33, -0.66) -- (2.33,-0.66) -- (2,-1) -- cycle;
+}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\DrawRubikCubeLU}
+% This command draws and paints a Rubik cube as viewed from
+% the Left Up (LU) viewpoint.
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeLU}{%
+\DrawRubikCubeFrontFace %% frontface
+%%-----------Left face-----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(-1,3) -- (-1, 4) -- (-0.66,3.66) -- (-0.66,2.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmt]%
+(-0.66,2.66) -- (-0.66, 3.66) -- (-0.33,3.33) -- (-0.33,2.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(-0.33,2.33) -- (-0.33, 3.33) -- (0,3) -- (0,2) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llm]%
+(-1,2) -- (-1, 3) -- (-0.66,2.66) -- (-0.66,1.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmm]%
+(-0.66,1.66) -- (-0.66, 2.66) -- (-0.33,2.33) -- (-0.33,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrm]%
+(-0.33,1.33) -- (-0.33, 2.33) -- (0,2) -- (0,1) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(-1,1) -- (-1, 2) -- (-0.66,1.66) -- (-0.66,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmb]%
+(-0.66,0.66) -- (-0.66, 1.66) -- (-0.33,1.33) -- (-0.33,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(-0.33,0.33) -- (-0.33, 1.33) -- (0,1) -- (0,0) -- cycle;
+%%-----------Up face---------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(-0.66,3.66) -- (-1, 4) -- (0,4) -- (0.33,3.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umt]%
+(0.33,3.66) -- (0, 4) -- (1,4) -- (1.33,3.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(1.33,3.66) -- (1, 4) -- (2,4) -- (2.33,3.66) -- cycle;
+%%---middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulm]%
+(-0.33,3.33) -- (-0.66, 3.66) -- (0.33,3.66) -- (0.66,3.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umm]%
+(0.66,3.33) -- (0.33, 3.66) -- (1.33,3.66) -- (1.66,3.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urm]%
+(1.66,3.33) -- (1.33, 3.66) -- (2.33,3.66) -- (2.66,3.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(0,3) -- (-0.33, 3.33) -- (0.66,3.33) -- (1,3) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umb]%
+(1,3) -- (0.66, 3.33) -- (1.66,3.33) -- (2,3) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(2,3) -- (1.66, 3.33) -- (2.66,3.33) -- (3,3) -- cycle;%
+\ %%trailing space
+}
+% \end{macrocode}
+%
+% RWDN19D removed DrawRubikLayerFace commands Feb 19 2018
+%
+%
+%
+% \subsection{\hspace{3mm}DrawRubikFlatX commands}
+% \label{sec:codedrawrubikflatcommands}
+%
+% [\textsc{Background}: These commands (new in version 3.0) were modified from the
+% earlier \cmd{\FlatUp}, \cmd{\FlatDown} etc., commands; i.e.,~they were
+% renamed as a set of \cmd{\Draw...} commands so as to make this
+% notation consistent with the other \cmd{\Draw..} commands.
+% Note also that the \cmd{\DrawRubikFace..} commands are essentially
+% these same commands but with their two coordinate arguments X,Y
+% set to $x=0$, $y=0$---see Section~\ref{sec:drawrubikfacecode}]
+%
+% \begin{macro}{\DrawRubikFlatUp}
+% \begin{macro}{\DrawRubikFlatDown}
+% \begin{macro}{\DrawRubikFlatLeft}
+% \begin{macro}{\DrawRubikFlatRight}
+% \begin{macro}{\DrawRubikFlatFront}
+% \begin{macro}{\DrawRubikFlatBack}
+% Each of these commands draws a separate (flat) face (9~facelets).
+% Each command (except \cmd{\DrawRubikFlatFront}) takes two arguments,
+% namely the X-coordinate and Y-coordinate of the bottom-left
+% corner of the face. This (X,Y) pair of coordinates therefore allows
+% the user to position the face in relation to the cube itself.
+% These commands were motivated by a need to
+% be able to show hidden faces under certain circumstances.
+%
+% Note also that the \cmd{\DrawRubikFlatFront} command takes no arguments,
+% since by definition the bottom left corner of this face is at (0,0),
+% and there seems to be no reason (just now) for this face to have the
+% facility to be positioned otherwise.
+%
+% \textsc{example}: The following command positions the Up face so
+% that its bottom left corner is located at (0,3):
+% \begin{quote}
+% \cmd{\DrawRubikFlatUp\{0\}\{3\}}
+% \end{quote}
+% These new commands are also used by the commands \cmd{\DrawRubikCubeF} and
+% \cmd{\DrawRubikCubeSF} to draw various `flat' representations
+% of a Rubik cube.
+%
+% The (x,y) variables are here encoded as (\cmd{\ux}, \cmd{\uy}) where the
+% `u' stands for Up etc. However, since we are unable to use a `dx, dy' notation
+% with the \cmd{\DrawRubikFlatDown} command (since dx and dy are already used by the
+% \cmd{\cube@dxdydz...} command), we encode these instead as (\cmd{\ddx}, \cmd{\ddy}).
+%
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawRubikFlatUp}[2]{%
+\pgfmathsetmacro{\ux}{#1}%
+\pgfmathsetmacro{\uy}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(\ux + 0,\uy + 2) -- (\ux + 0,\uy + 3) -- (\ux + 1,\uy + 3)%
+ -- (\ux + 1,\uy + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umt]%
+(\ux + 1,\uy + 2) -- (\ux + 1,\uy + 3) -- (\ux + 2,\uy + 3)%
+ -- (\ux + 2,\uy + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(\ux + 2,\uy + 2) -- (\ux + 2,\uy + 3) -- (\ux + 3,\uy + 3)%
+ -- (\ux + 3,\uy + 2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulm]%
+(\ux + 0,\uy + 1) -- (\ux + 0,\uy + 2) -- (\ux + 1,\uy + 2)%
+ -- (\ux + 1,\uy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umm]%
+(\ux + 1,\uy + 1) -- (\ux + 1,\uy + 2) -- (\ux + 2,\uy + 2)%
+ -- (\ux + 2,\uy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urm]%
+(\ux + 2,\uy + 1) -- (\ux + 2,\uy + 2) -- (\ux + 3,\uy + 2)%
+ -- (\ux + 3,\uy + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(\ux + 0,\uy + 0) -- (\ux + 0,\uy + 1) -- (\ux + 1,\uy + 1)%
+ -- (\ux + 1,\uy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Umb]%
+(\ux + 1,\uy + 0) -- (\ux + 1,\uy + 1) -- (\ux + 2,\uy + 1)%
+ -- (\ux + 2,\uy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(\ux + 2,\uy + 0) -- (\ux + 2,\uy + 1) -- (\ux + 3,\uy + 1)%
+ -- (\ux + 3,\uy + 0) -- cycle;
+}
+%%-------------------------
+\newcommand{\DrawRubikFlatDown}[2]{%
+\pgfmathsetmacro{\ddx}{#1}%
+\pgfmathsetmacro{\ddy}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(\ddx + 0,\ddy + 2) -- (\ddx + 0,\ddy + 3) -- (\ddx + 1,\ddy + 3)%
+ -- (\ddx + 1,\ddy + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmt]%
+(\ddx + 1,\ddy + 2) -- (\ddx + 1,\ddy + 3) -- (\ddx + 2,\ddy + 3)%
+ -- (\ddx + 2,\ddy + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(\ddx + 2,\ddy + 2) -- (\ddx + 2,\ddy + 3) -- (\ddx + 3,\ddy + 3)%
+ -- (\ddx + 3,\ddy + 2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlm]%
+(\ddx + 0,\ddy + 1) -- (\ddx + 0,\ddy + 2) -- (\ddx + 1,\ddy + 2)%
+ -- (\ddx + 1,\ddy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmm]%
+(\ddx + 1,\ddy + 1) -- (\ddx + 1,\ddy + 2) -- (\ddx + 2,\ddy + 2)%
+ -- (\ddx + 2,\ddy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drm]%
+(\ddx + 2,\ddy + 1) -- (\ddx + 2,\ddy + 2) -- (\ddx + 3,\ddy + 2)%
+ -- (\ddx + 3,\ddy + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(\ddx + 0,\ddy + 0) -- (\ddx + 0,\ddy + 1) -- (\ddx + 1,\ddy + 1)%
+ -- (\ddx + 1,\ddy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Dmb]%
+(\ddx + 1,\ddy + 0) -- (\ddx + 1,\ddy + 1) -- (\ddx + 2,\ddy + 1)%
+ -- (\ddx + 2,\ddy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(\ddx + 2,\ddy + 0) -- (\ddx + 2,\ddy + 1) -- (\ddx + 3,\ddy + 1)%
+ -- (\ddx + 3,\ddy + 0) -- cycle;
+}
+%%-------------------------
+\newcommand{\DrawRubikFlatLeft}[2]{%
+\pgfmathsetmacro{\lx}{#1}%
+\pgfmathsetmacro{\ly}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(\lx + 0, \ly + 2) -- (\lx + 0, \ly + 3) -- (\lx + 1, \ly + 3)%
+ -- (\lx + 1, \ly + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmt]%
+(\lx + 1, \ly + 2) -- (\lx + 1, \ly + 3) -- (\lx + 2, \ly + 3)%
+ -- (\lx + 2, \ly + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(\lx + 2, \ly + 2) -- (\lx + 2, \ly + 3) -- (\lx + 3, \ly + 3)%
+ -- (\lx + 3, \ly + 2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llm]%
+(\lx + 0, \ly + 1) -- (\lx + 0, \ly + 2) -- (\lx + 1, \ly + 2)%
+ -- (\lx + 1, \ly + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmm]%
+(\lx + 1, \ly + 1) -- (\lx + 1, \ly + 2) -- (\lx + 2, \ly + 2)%
+ -- (\lx + 2, \ly + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrm]%
+(\lx + 2, \ly + 1) -- (\lx + 2, \ly + 2) -- (\lx + 3, \ly + 2)%
+ -- (\lx + 3, \ly + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(\lx + 0, \ly + 0) -- (\lx + 0, \ly + 1) -- (\lx + 1, \ly + 1)%
+ -- (\lx + 1, \ly + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lmb]%
+(\lx + 1, \ly + 0) -- (\lx + 1, \ly + 1) -- (\lx + 2, \ly + 1)%
+ -- (\lx + 2, \ly + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(\lx + 2, \ly + 0) -- (\lx + 2, \ly + 1) -- (\lx + 3, \ly + 1)%
+ -- (\lx + 3, \ly + 0) -- cycle;
+}
+%%--------------------------
+\newcommand{\DrawRubikFlatRight}[2]{%
+\pgfmathsetmacro{\rx}{#1}%
+\pgfmathsetmacro{\ry}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(\rx + 0, \ry + 2) -- (\rx + 0, \ry + 3) -- (\rx + 1, \ry + 3)%
+ -- (\rx + 1, \ry + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmt]%
+(\rx + 1, \ry + 2) -- (\rx + 1, \ry + 3) -- (\rx + 2, \ry + 3)%
+ -- (\rx + 2, \ry + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(\rx + 2, \ry + 2) -- (\rx + 2, \ry + 3) -- (\rx + 3, \ry + 3)%
+ -- (\rx + 3, \ry + 2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlm]%
+(\rx + 0, \ry + 1) -- (\rx + 0, \ry + 2) -- (\rx + 1, \ry + 2)%
+ -- (\rx + 1, \ry + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmm]%
+(\rx + 1, \ry + 1) -- (\rx + 1, \ry + 2) -- (\rx + 2, \ry + 2)%
+ -- (\rx + 2, \ry + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrm]%
+(\rx + 2, \ry + 1) -- (\rx + 2, \ry + 2) -- (\rx + 3, \ry + 2)%
+ -- (\rx + 3, \ry + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(\rx + 0, \ry + 0) -- (\rx + 0, \ry + 1) -- (\rx + 1, \ry + 1)%
+ -- (\rx + 1, \ry + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rmb]%
+(\rx + 1, \ry + 0) -- (\rx + 1, \ry + 1) -- (\rx + 2, \ry + 1)%
+ -- (\rx + 2, \ry + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(\rx + 2, \ry + 0) -- (\rx + 2, \ry + 1) -- (\rx + 3, \ry + 1)%
+ -- (\rx + 3, \ry + 0) -- cycle;
+}
+%%-----------------------
+\newcommand{\DrawRubikFlatFront}{%
+%% This command is used /only/ by the \cmd{\DrawRubikCubeF} command.
+%% NOTE: x, y variables not implemented as not required here
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Flt]%
+(0,2) -- (0, 3) -- (1,3) -- (1,2) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmt]%
+(1,2) -- (1, 3) -- (2,3) -- (2,2) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Frt]%
+(2,2) -- (2, 3) -- (3,3) -- (3,2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Flm]%
+(0,1) -- (0, 2) -- (1,2) -- (1,1) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmm]%
+(1,1) -- (1, 2) -- (2,2) -- (2,1) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Frm]%
+(2,1) -- (2, 2) -- (3,2) -- (3,1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Flb]%
+(0,0) -- (0, 1) -- (1,1) -- (1,0) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Fmb]%
+(1,0) -- (1, 1) -- (2,1) -- (2,0) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Frb]%
+(2,0) -- (2, 1) -- (3,1) -- (3,0) -- cycle;
+}
+%%-------------------------
+\newcommand{\DrawRubikFlatBack}[2]{%
+\pgfmathsetmacro{\bx}{#1}%
+\pgfmathsetmacro{\by}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Blt]%
+(\bx + 0,\by + 2) -- (\bx + 0,\by + 3) -- (\bx + 1,\by + 3)%
+ -- (\bx + 1,\by + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Bmt]%
+(\bx + 1,\by + 2) -- (\bx + 1,\by + 3) -- (\bx + 2,\by + 3)%
+ -- (\bx + 2,\by + 2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Brt]%
+(\bx + 2,\by + 2) -- (\bx + 2,\by + 3) -- (\bx + 3,\by + 3)%
+ -- (\bx + 3,\by + 2) -- cycle;
+%%-----middle row
+\draw[line join=round,line cap=round,ultra thick,fill=\Blm]%
+(\bx + 0,\by + 1) -- (\bx + 0,\by + 2) -- (\bx + 1,\by + 2)%
+ -- (\bx + 1,\by + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Bmm]%
+(\bx + 1,\by + 1) -- (\bx + 1,\by + 2) -- (\bx + 2,\by + 2)%
+ -- (\bx + 2,\by + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Brm]%
+(\bx + 2,\by + 1) -- (\bx + 2,\by + 2) -- (\bx + 3,\by + 2)%
+ -- (\bx + 3,\by + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Blb]%
+(\bx + 0,\by + 0) -- (\bx + 0,\by + 1) -- (\bx + 1,\by + 1)%
+ -- (\bx + 1,\by + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Bmb]%
+(\bx + 1,\by + 0) -- (\bx + 1,\by + 1) -- (\bx + 2,\by + 1)%
+ -- (\bx + 2,\by + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Brb]%
+(\bx + 2,\by + 0) -- (\bx + 2,\by + 1) -- (\bx + 3,\by + 1)%
+ -- (\bx + 3,\by + 0) -- cycle;
+}
+% \end{macrocode}
+%
+% \begin{macro}{\DrawRubikCubeF}
+% Draws a standard flat (F) representation of the Rubik
+% cube (colours only). Note that \cmd{\DrawRubikFlatFront} (below)
+% does not take any arguments (x,y).
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeF}{%
+ \DrawRubikFlatUp{0}{3}%
+ \DrawRubikFlatDown{0}{-3}%
+ \DrawRubikFlatLeft{-3}{0}%
+ \DrawRubikFlatFront%
+ \DrawRubikFlatRight{3}{0}%
+ \DrawRubikFlatBack{6}{0}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikCubeSF}
+% Draws a Rubik cube together with the three hidden faces
+% (colours only) in a semi-flat (SF) representation. The (x,y)
+% arguments (below) are for the bottom-left corner of the face.
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSF}{%
+ \DrawRubikCubeRU%
+ \DrawRubikFlatDown{0}{-3}%
+ \DrawRubikFlatLeft{-3}{0}%
+ \DrawRubikFlatBack{4}{1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsubsection{DrawRubikFaceXSide commands}
+% \label{sec:drawrubikflatxsidecode}
+%
+% These six commands draw a face together with all four sidebars
+% (colours only). They use the \cmd{\DrawRubikFlatX} commands to draw the face,
+% and the \cmd{\side@bar..} commands to draw the sidebars. Since each
+% of the four sides of a face has three small (side) bars, we use a total
+% of 12 side@bar commands for each command.
+%
+% The parameter codes for the \cmd{\side@bar..}
+% commands are as follows (see Section~\ref{sec:side@barcode} for full details).
+% Top (T) and Bottom (B) = left to right;
+% Left (L) and Right (R) = top to bottom;
+%
+% Note that since these commands are quite long, thay all have a
+% slightly more convenient short-hand version whereby the terminal two words
+% are contracted to their two initial letters (see Section~\ref{sec:drawrubikfacecode}).
+% RWDN19B
+%
+% \begin{macro}{\DrawRubikFaceUpSide}
+% Draws the \textsc{up} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceUpSide}{%
+\DrawRubikFlatUp{0}{0}%
+%Top is a horizontal sidebar, so 1 = r, 3=l
+\side@barT{1}{\Brt}
+\side@barT{2}{\Bmt}
+\side@barT{3}{\Blt}
+%Left is a vertical sidebar, so 1 = r, 3=l
+\side@barL{1}{\Lrt}
+\side@barL{2}{\Lmt}
+\side@barL{3}{\Llt}
+%Right is a vertical sidebar, so 1 = l, 3=r
+\side@barR{1}{\Rlt}
+\side@barR{2}{\Rmt}
+\side@barR{3}{\Rrt}
+%Bottom is a horizontal sidebar, so 1 = l, 3=r
+\side@barB{1}{\Flt}
+\side@barB{2}{\Fmt}
+\side@barB{3}{\Frt}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikFaceFrontSide}
+% Draws the \textsc{front} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceFrontSide}{%
+\DrawRubikFlatFront{0}{0}%
+%Top
+\side@barT{1}{\Ulb}
+\side@barT{2}{\Umb}
+\side@barT{3}{\Urb}
+%Left
+\side@barL{1}{\Lrb}
+\side@barL{2}{\Lrm}
+\side@barL{3}{\Lrt}
+%Right
+\side@barR{1}{\Rlb}
+\side@barR{2}{\Rlm}
+\side@barR{3}{\Rlt}
+%Bottom
+\side@barB{1}{\Dlt}
+\side@barB{2}{\Dmt}
+\side@barB{3}{\Drt}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikFaceRightSide}
+% Draws the \textsc{right} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceRightSide}{%
+\DrawRubikFlatRight{0}{0}%
+%Top
+\side@barT{1}{\Urb}
+\side@barT{2}{\Urm}
+\side@barT{3}{\Urt}
+%Left
+\side@barL{1}{\Frb}
+\side@barL{2}{\Frm}
+\side@barL{3}{\Frt}
+%Right
+\side@barR{1}{\Blb}
+\side@barR{2}{\Blm}
+\side@barR{3}{\Blt}
+%Bottom
+\side@barB{1}{\Drt}
+\side@barB{2}{\Drm}
+\side@barB{3}{\Drb}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikFaceLeftSide}
+% Draws the \textsc{left} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceLeftSide}{%
+\DrawRubikFlatLeft{0}{0}%
+%Top
+\side@barT{1}{\Ult}
+\side@barT{2}{\Ulm}
+\side@barT{3}{\Ulb}
+%Left
+\side@barL{1}{\Brb}
+\side@barL{2}{\Brm}
+\side@barL{3}{\Brt}
+%Right
+\side@barR{1}{\Flb}
+\side@barR{2}{\Flm}
+\side@barR{3}{\Flt}
+%Bottom
+\side@barB{1}{\Dlb}
+\side@barB{2}{\Dlm}
+\side@barB{3}{\Dlt}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikFaceBackSide}
+% Draws the \textsc{back} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceBackSide}{%
+\DrawRubikFlatBack{0}{0}%
+%Top
+\side@barT{1}{\Urt}
+\side@barT{2}{\Umt}
+\side@barT{3}{\Ult}
+%Left
+\side@barL{1}{\Rrb}
+\side@barL{2}{\Rrm}
+\side@barL{3}{\Rrt}
+%Right
+\side@barR{1}{\Llb}
+\side@barR{2}{\Llm}
+\side@barR{3}{\Llt}
+%Bottom
+\side@barB{1}{\Drb}
+\side@barB{2}{\Dmb}
+\side@barB{3}{\Dlb}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macro}{\DrawRubikFaceDownSide}
+% Draws the \textsc{down} face together with all four sidebars.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceDownSide}{%
+\DrawRubikFlatDown{0}{0}%
+%Top
+\side@barT{1}{\Flb}
+\side@barT{2}{\Fmb}
+\side@barT{3}{\Frb}
+%Left
+\side@barL{1}{\Llb}
+\side@barL{2}{\Lmb}
+\side@barL{3}{\Lrb}
+%Right
+\side@barR{1}{\Rrb}
+\side@barR{2}{\Rmb}
+\side@barR{3}{\Rlb}
+%Bottom
+\side@barB{1}{\Brb}
+\side@barB{2}{\Bmb}
+\side@barB{3}{\Blb}
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{\hspace{3mm}DrawRubikFace commands}
+% \label{sec:drawrubikfacecode}
+%
+% \textsc{Background}: \ The above \cmd{\DrawRubikFlat..} commands were originally just
+% \cmd{\DrawFlat..} commands. They were subsequently copied \& renamed
+% (here) as the more intuitive \cmd{\DrawFace..} commands, since most of
+% the time the user wants just to draw a particular face with or
+% without sidebars.
+%
+% In v5 it was necessary to rename them as \cmd{\DrawRubikFace...} commands
+% since they relate to a 3x3x3 cube. At the same time we also included
+% their more convenient short-hand versions
+% (eg \cmd{\DrawRubikFaceUpSide} $\rightarrow$ \cmd{\DrawRubikFaceUS} etc),
+% as the commands were getting a bit too long.
+%
+% We therefore now deprecate the use of the earlier
+% \cmd{\DrawFace...} commands, although they will be maintained for the
+% moment at least.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceUp}{\DrawRubikFlatUp{0}{0}}
+\newcommand{\DrawRubikFaceDown}{\DrawRubikFlatDown{0}{0}}
+\newcommand{\DrawRubikFaceLeft}{\DrawRubikFlatLeft{0}{0}}
+\newcommand{\DrawRubikFaceRight}{\DrawRubikFlatRight{0}{0}}
+\newcommand{\DrawRubikFaceFront}{\DrawRubikFlatFront{0}{0}}
+\newcommand{\DrawRubikFaceBack}{\DrawRubikFlatBack{0}{0}}
+% \end{macrocode}
+%% RWDN19A Finally, we create the short-hand versions.
+% \begin{macrocode}
+\newcommand{\DrawRubikFaceU}{\DrawRubikFaceUp}
+\newcommand{\DrawRubikFaceD}{\DrawRubikFaceDown}
+\newcommand{\DrawRubikFaceL}{\DrawRubikFaceLeft}
+\newcommand{\DrawRubikFaceR}{\DrawRubikFaceRight}
+\newcommand{\DrawRubikFaceF}{\DrawRubikFaceFront}
+\newcommand{\DrawRubikFaceB}{\DrawRubikFaceBack}
+\newcommand{\DrawRubikFaceUS}{\DrawRubikFaceUpSide}
+\newcommand{\DrawRubikFaceDS}{\DrawRubikFaceDownSide}
+\newcommand{\DrawRubikFaceLS}{\DrawRubikFaceLeftSide}
+\newcommand{\DrawRubikFaceRS}{\DrawRubikFaceRightSide}
+\newcommand{\DrawRubikFaceFS}{\DrawRubikFaceFrontSide}
+\newcommand{\DrawRubikFaceBS}{\DrawRubikFaceBackSide}
+% \end{macrocode}
+%
+%
+% \subsection{Sidebars (Face)}
+% \label{sec:sidebarcode}
+%
+% Sidebar commands draw narrow bars of colour indicating the
+% side colours of each of the facelets forming the side of
+% a given layer (face). Each Sidebar is the length of a
+% single facelet (see Section~\ref{sec:sidebars}).
+%
+% \begin{macro}{\RubikSidebarWidth}
+% \begin{macro}{\RubikSidebarLength}
+% \begin{macro}{\RubikSidebarSep}
+% These three commands allow the user to set the Width, Length
+% and Separation parameters for the sidebar (in decimal values,
+% where 1~is equivalent to the length of the side of a facelet).
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\RubikSidebarWidth}[1]{\pgfmathsetmacro{\bw}{#1}}
+\newcommand{\RubikSidebarLength}[1]{\pgfmathsetmacro{\bl}{#1}}
+\newcommand{\RubikSidebarSep}[1]{\pgfmathsetmacro{\bs}{#1}}
+% \end{macrocode}
+% We first set some default values
+% \begin{macrocode}
+\RubikSidebarWidth{0.3}%
+\RubikSidebarLength{1}%
+\RubikSidebarSep{0.3}%
+% \end{macrocode}
+% In order to avoid conflicting nomenclature (between bar and Bar) we recommend
+% using the lowercase `bar' and deprecate the use of `Bar' in commands.
+% For backwards compatibility, however, we will retain the three original `Bar'
+% commands (for the moment at least), as follows:
+% \begin{macrocode}
+\newcommand{\RubikSideBarWidth}[1]{\pgfmathsetmacro{\bw}{#1}}
+\newcommand{\RubikSideBarLength}[1]{\pgfmathsetmacro{\bl}{#1}}
+\newcommand{\RubikSideBarSep}[1]{\pgfmathsetmacro{\bs}{#1}}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsubsection{\hspace{3mm}Drawing and allocating a colour to a single facelet sidebar}
+% \label{sec:side@barcode}
+%
+%
+% Full length face sidebars are really multiple instances of
+% small single facelet bars, each of which is drawn using one of the internal sidebar
+% commands.
+%
+%
+% \begin{figure}[hbt]
+% \centering
+% \ifpdf
+% \includegraphics[height=3cm]{rubik-doc-figD.pdf}
+% \fi
+% \vspace{-5mm}
+% \caption{\label{fig:facenotation}Face-edge and facelet-position codes
+% (see text) }
+% \end{figure}
+%
+%
+% \begin{macro}{\side@barT}
+% \begin{macro}{\side@barB}
+% \begin{macro}{\side@barL}
+% \begin{macro}{\side@barR}
+% There are four \cmd{\side@barX} commands, each with a trailing letter code X, which indicates the
+% position of the sidebar relative to the square face displayed,
+% namely either T (Top), B (Bottom), L (Left) or R (Right)
+% ---see Figure~\ref{fig:facenotation}.
+
+% \cmd{\side@barL}\marg{position-number}\marg{facelet location-code}.
+% Each \cmd{\side@barX} command takes two arguments:
+% The first argument is a number (distance) \marg{$ 1 \mid 2 \mid 3$}
+% from the relevant axis depending on whether it is a vertical or horizontal sidebar
+% (e.g.,~1 = first bar (nearest the origin); 2 = second bar,
+% 3 = third bar).
+%
+% The second argument is the facelet location-code expressed as a command
+% (e.g.,~\cmd{\Lrt}, \cmd{\Dlb} etc. Note that the facelet location
+% uses a three letter code: the first (capital) letter (U, D, L, R, F, B) denotes the \textsc{face};
+% the second (lower-case) letter (l,m,r) is the `x' position in the 3x3 matrix;
+% the third (lower-case) letter (t,m,b) is the `y' position ---see Figure~\ref{fig:facenotation}.
+%
+% \textsc{example}: the following command draws a small single Right sidebar,
+% in the middle position (no.~2), with the colour
+% allocated to the Rlt facelet (left top facelet in the \textsc{right} face.
+% \begin{quote}
+% \verb!\side@barR{2}{\Rlt}!
+% \end{quote}
+% Notice that we use the command \cmd{\Rlt} as the argument; this is because
+% the command is defined as: \verb!\def{\Rlt}{#1}!, and hence the command gets replaced by the
+% colour-code currently allocated to this particular facelet.
+%
+% There are three small rectangular sidebars on each of the four sides
+% of a 3x3 square face, and these are embedded in a coordinate system with origin
+% at the bottom left corner (0,0) of the square face (see Figure~\ref{fig:facenotation}).
+%
+% The \cmd{\side@bar..} command also implements the set (or default)
+% RubikSidebarLength \cmd{\bl}, RubikSidebarWidth \cmd{\bw}
+% and RubikSidebarSep \cmd{\bs} (separation)
+% values mentioned above. \cmd{\blh} = Half \cmd{\bl} = \cmd{\bl}/2.
+% Note that the TikZ \cmd{\pgfmathsetmacro} commands (which do the maths)
+% must be inside the \cmd{\side@bar..} command in order to work.
+% The start point of the TikZ \cmd{\draw} command for each rectangular sidebar
+% is the bottom Left corner of the sidebar = (\cmd{\dx},\cmd{\dy}).
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \label{sec:nosidebarcode}
+% \begin{macro}{\no@sidebar}
+% The \cmd{\NoSidebar}\marg{colour code} command defines a (single) colour for which
+% sidebars should \textit{not} be drawn (particularly useful when drawing OLL configurations).
+% This idea was suggested by Robert Ma\v{r}\'{\i}k (May 2017) ---see Section~\ref{sec:nosidebar}.
+% {\newline}The principle is that we let the command \cmd{\NoSidebar} define a face colour,
+% and then we use the \verb!\ifthenelse{\equal{#2}{\no@sidebar}}{}{...}! structure
+% inside the \cmd{\side@bar..} commands (see below)
+% to either (a)~draw all sidebars as usual (if \cmd{\NoSidebar} is undefined),
+% or (b)~draw all sidebars \textit{except}
+% those having the \cmd{\NoSidebar} colour (if \cmd{\NoSidebar} colour = \verb!#2!).
+% \newline\textsc{usage}: \verb!\NoSidebar{X}! \ If this command in \textit{not}
+% inside an environment, then its action will continue until it is disabled
+% (undefined) as follows: \verb!\NoSidebar{}!.
+% \begin{macrocode}
+\def\no@sidebar{}%
+\newcommand{\NoSidebar}[1]{\def\no@sidebar{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \begin{macrocode}
+\newcommand{\side@barL}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{0 - \bs - \bw}%
+ \pgfmathsetmacro{\dy}{#1-1+0.5-\blh}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+\newcommand{\side@barR}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{3 + \bs}%
+ \pgfmathsetmacro{\dy}{#1 -1+0.5-\blh}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+\newcommand{\side@barT}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh}%
+ \pgfmathsetmacro{\dy}{3 +\bs}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+\newcommand{\side@barB}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh}%
+ \pgfmathsetmacro{\dy}{0 -\bs-\bw}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+% \end{macrocode}
+%
+% RWDN19C removed 20:17:2 and 20:17:3 19 Feb 2018
+%
+%
+%
+%
+%
+%
+% \subsection{Sidebars (Cube)}
+% \label{sec:sidebarscubecode}
+%
+%
+% In order to position sidebars adjacent to a Rubik Cube (ie in 3D)
+% requires that we first make some new \cmd{\side@bar..}
+% commands for drawing sidebars adjacent to the \textsc{back} face of the cube
+% (we have already made the macros for the front
+% face sidebars---see Section~\ref{sec:sidebarcode}).
+% Furthermore, these new macros need to be tailored to each of the
+% four standard cube viewing directions RU, LU, RD, LD.
+%
+% Finally, the USER commands for drawing these sidebars need
+% to accommodate (a)~some code for identifying each set of sidebars,
+% and (b)~the viewing direction. So, for example, a USER command for
+% drawing the sidebars associated with the cube edge formed
+% by the \textsc{right} face and the \textsc{back} face
+% (lets define this as the RB sidebar) as viewed from the RU direction,
+% might be something like \cmd{\DrawRubikCubeSidebarRBRU}.
+% Since this is not particularly user-friendly,
+% we can improve on this slightly for the USER by
+% (a)~defining the sidebar as \texttt{SidebarRB}, and
+% (b)~appending the view direction in a curly bracket, say as \verb!{RU}!.
+% This allows a more intuitive command structure for the USER,
+% as follows: \verb!\DrawRubikCubeSidebarRB{RU}!.
+% We then use the \cmd{\@join} command to append the string \verb!RU! to the string
+% \verb!DrawRubicCubeSidebarRB! forming the (internal)
+% command \cmd{\DrawRubicCubeSidebarRBRU}.
+%
+% In the following we will group the code according to to the view
+% direction (RU, LU, RD, LD).
+%
+%
+%
+% \subsubsection{Sidebars: RU view}
+%
+% \subsubsection*{Right-Back vert sidebar (RU view)}
+%
+%
+% Need to write a new command for this position
+% modified from \cmd{\side@barR} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikRbackRU}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% dx --> dx+1
+ %% dy --> dy+1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{3 + \bs +1}%
+ \pgfmathsetmacro{\dy}{#1 -1+0.5-\blh +1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the RB (RightBack) version;
+% bar 1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarRBRU}{%
+\side@barRubikRbackRU{3}{\Blt}%
+\side@barRubikRbackRU{2}{\Blm}%
+\side@barRubikRbackRU{1}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BR) = RB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBRRU}{\DrawRubikCubeSidebarRBRU}
+% \end{macrocode}
+% Make the join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarRB}[1]{\@join{\DrawRubikCubeSidebarRB}{#1}}
+\newcommand{\DrawRubikCubeSidebarBR}[1]{\@join{\DrawRubikCubeSidebarBR}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Up-Back horiz sidebar (RU view)}
+%
+%
+% Need to write a new command for this position
+% modified from \cmd{\side@barT} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikTbackRU}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% dx --> dx+1
+ %% dy --> dy+1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh +1}%
+ \pgfmathsetmacro{\dy}{3 +\bs +1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the UB (Up-Back) version;
+% bar 1 is at the left, 3 on the rhs (as we look at the image)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarUBRU}{%
+\side@barRubikTbackRU{1}{\Brt}%
+\side@barRubikTbackRU{2}{\Bmt}%
+\side@barRubikTbackRU{3}{\Blt}%
+}
+% \end{macrocode}
+% Now do the reverse (BU) = UB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBURU}{\DrawRubikCubeSidebarUBRU}
+% \end{macrocode}
+% Make the join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarUB}[1]{\@join{\DrawRubikCubeSidebarUB}{#1}}
+\newcommand{\DrawRubikCubeSidebarBU}[1]{\@join{\DrawRubikCubeSidebarBU}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Left vert sidebar (RU view)}
+%
+% For the front face we can use the regular \cmd{side@barL} commands
+% since it is the same as for an ordinary face sidebar
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFLRU}{%
+\side@barL{3}{\Lrt}%
+\side@barL{2}{\Lrm}%
+\side@barL{1}{\Lrb}%
+}
+% \end{macrocode}
+% Now do the reverse (LF)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarLFRU}{\DrawRubikCubeSidebarFLRU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFL}[1]{\@join{\DrawRubikCubeSidebarFL}{#1}}
+\newcommand{\DrawRubikCubeSidebarLF}[1]{\@join{\DrawRubikCubeSidebarLF}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Down horizontal sidebar (RU view)}
+%
+% Horiz sidebar, so 1 at the left, 2=middle, 3= rhs)
+% here we have to use the B for bottom (of front face) and the
+% facelets of the top row of the Down face
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFDRU}{%
+\side@barB{1}{\Dlt}%
+\side@barB{2}{\Dmt}%
+\side@barB{3}{\Drt}%
+}
+% \end{macrocode}
+% Now do the reverse (DF) = FD
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarDFRU}{\DrawRubikCubeSidebarFDRU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFD}[1]{\@join{\DrawRubikCubeSidebarFD}{#1}}
+\newcommand{\DrawRubikCubeSidebarDF}[1]{\@join{\DrawRubikCubeSidebarDF}{#1}}
+% \end{macrocode}
+% But FD-LU is the same as FD-RU, so need to make copies of each
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarDFLU}{\DrawRubikCubeSidebarDFRU}
+\newcommand{\DrawRubikCubeSidebarFDLU}{\DrawRubikCubeSidebarFDRU}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection{Sidebars: LU view}
+%
+%
+% \subsubsection*{Left-Back vert sidebar (LU view)}
+%
+% Need to write a new command for this position
+% modified from \cmd{\side@barL} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikLbackLU}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% dx --> dx-1
+ %% dy --> dy+1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{0 - \bs -\bw -1}%
+ \pgfmathsetmacro{\dy}{#1 -1+0.5-\blh +1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the LB (LeftBack) version;
+% bar 1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarLBLU}{%
+\side@barRubikLbackLU{3}{\Brt}%
+\side@barRubikLbackLU{2}{\Brm}%
+\side@barRubikLbackLU{1}{\Brb}%
+}
+% \end{macrocode}
+% Now do the reverse (BL) = LB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBLLU}{\DrawRubikCubeSidebarLBLU}
+% \end{macrocode}
+% Make the join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarLB}[1]{\@join{\DrawRubikCubeSidebarLB}{#1}}
+\newcommand{\DrawRubikCubeSidebarBL}[1]{\@join{\DrawRubikCubeSidebarBL}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Up-Back horizontal sidebar (LU view)}
+%
+% Modified from \cmd{\side@barT} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikTbackLU}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% dx --> dx-1
+ %% dy --> dy+1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh -1}%
+ \pgfmathsetmacro{\dy}{3 +\bs +1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the UB (Up-Back) version;
+% bar 1 is at the left, 3 on the rhs (as we look at the image)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarUBLU}{%
+\side@barRubikTbackLU{1}{\Brt}%
+\side@barRubikTbackLU{2}{\Bmt}%
+\side@barRubikTbackLU{3}{\Blt}%
+}
+% \end{macrocode}
+% Now do the reverse (BU) = UB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBULU}{\DrawRubikCubeSidebarUBLU}
+% \end{macrocode}
+% Do not need to make the join commands
+% as the USER commands for BU and UB are the same as for the RU.
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Right vertical sidebar (LU view)}
+%
+% Only needed for the LU view and LD.
+% for the front face we can use the regular side@barR commands
+% since it is the same as for an ordinary face sidebar RHS
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFRLU}{%
+\side@barR{3}{\Rlt}%
+\side@barR{2}{\Rlm}%
+\side@barR{1}{\Rlb}%
+}
+% \end{macrocode}
+% Now do the reverse (RF)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarRFLU}{\DrawRubikCubeSidebarFRLU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFR}[1]{\@join{\DrawRubikCubeSidebarFR}{#1}}
+\newcommand{\DrawRubikCubeSidebarRF}[1]{\@join{\DrawRubikCubeSidebarRF}{#1}}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsubsection{Sidebars: RD view}
+%
+% \medskip
+%
+% \subsubsection*{Front-Up horizontal sidebar (RD view)}
+%
+% Horiz sidebar, so 1 at the left, 2=middle, 3= rhs
+% here we have to use the T for bottom (of front face) and the
+% facelets of the top row of the Down face
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFURD}{%
+\side@barT{1}{\Ulb}%
+\side@barT{2}{\Umb}%
+\side@barT{3}{\Urb}%
+}
+% \end{macrocode}
+% Now do the reverse (UF) = FU
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarUFRD}{\DrawRubikCubeSidebarFURD}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFU}[1]{\@join{\DrawRubikCubeSidebarFU}{#1}}
+\newcommand{\DrawRubikCubeSidebarUF}[1]{\@join{\DrawRubikCubeSidebarUF}{#1}}
+% \end{macrocode}
+%
+% \medskip
+%
+% \subsubsection*{Front-Left vertical sidebar (RD view)}
+%
+%
+%
+% Front LEFT (RD view = same as for RU)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFLRD}{\DrawRubikCubeSidebarFLRU}
+\newcommand{\DrawRubikCubeSidebarLFRD}{\DrawRubikCubeSidebarLFRU}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Right-Back vertical sidebar (RD view)}
+%
+% Modified from \cmd{\side@barR} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikRbackRD}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% dx --> dx+1
+ %% dy --> dy-1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{3 + \bs +1}%
+ \pgfmathsetmacro{\dy}{#1 -1+0.5-\blh -1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the RB (RightBack) version;
+% bar 1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarRBRD}{%
+\side@barRubikRbackRD{3}{\Blt}%
+\side@barRubikRbackRD{2}{\Blm}%
+\side@barRubikRbackRD{1}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BR) = RB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBRRD}{\DrawRubikCubeSidebarRBRD}
+% \end{macrocode}
+% Do NOT need to make the join commands (same as for the RU view)
+%
+%
+% \medskip
+%
+% \subsubsection*{Down-Back horizotal sidebar (RD view)}
+%
+% Modified from \cmd{\side@barB} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikBbackRD}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% dx --> dx+1
+ %% dy --> dy-1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh +1}%
+ \pgfmathsetmacro{\dy}{0 -\bs - \bw -1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the DB (Down-Back) version;
+% bar 1 is at the left, 3 on the rhs (as we look at the image)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarDBRD}{%
+\side@barRubikBbackRD{1}{\Brb}%
+\side@barRubikBbackRD{2}{\Bmb}%
+\side@barRubikBbackRD{3}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BD) = DB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBDRD}{\DrawRubikCubeSidebarDBRD}
+% \end{macrocode}
+% Make the join commands
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarDB}[1]{\@join{\DrawRubikCubeSidebarDB}{#1}}
+\newcommand{\DrawRubikCubeSidebarBD}[1]{\@join{\DrawRubikCubeSidebarBD}{#1}}
+% \end{macrocode}
+%
+%
+%
+% \subsubsection{Sidebars: LD view}
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Up horizontal sidebar (LD view)}
+%
+% But FR (LD view) is the same as for (RU view), (see above)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFULD}{\DrawRubikCubeSidebarFURD}
+\newcommand{\DrawRubikCubeSidebarUFLD}{\DrawRubikCubeSidebarUFRD}
+% \end{macrocode}
+%
+% \medskip
+%
+% \subsubsection*{Front-Right vertical sidebar (LD view)}
+%
+% Front Right (LDview) = same as for (LU view), (see above)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarFRLD}{\DrawRubikCubeSidebarFRLU}
+\newcommand{\DrawRubikCubeSidebarRFLD}{\DrawRubikCubeSidebarRFLU}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Left-Back vertical sidebar (LD view)}
+%
+% Modified from \cmd{\side@barL} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikLbackLD}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% dx --> dx-1
+ %% dy --> dy-1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{0 - \bs -\bw -1}%
+ \pgfmathsetmacro{\dy}{#1 -1+0.5-\blh -1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bl)
+ -- (\dx+\bw,\dy+\bl) -- (\dx+\bw,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the LB (LeftBack) version;
+% bar 1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarLBLD}{%
+\side@barRubikLbackLD{3}{\Brt}%
+\side@barRubikLbackLD{2}{\Brm}%
+\side@barRubikLbackLD{1}{\Brb}%
+}
+% \end{macrocode}
+% Now do the reverse (BL) = LB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBLLD}{\DrawRubikCubeSidebarLBLD}
+% \end{macrocode}
+% Do NOT need to make the join commands (same as for the LU view)
+%
+%
+% \medskip
+%
+% \subsubsection*{Down-Back horizontal sidebar (LD view)}
+%
+%
+% Modified from \cmd{\side@barB} (in Section 20.16.1)
+% draws only a single small bar
+% each of the three small bars has a numbered position (1,2,3);
+% (dx,dy) = bottom Left corner of single facelet bar
+% \begin{macrocode}
+\newcommand{\side@barRubikBbackLD}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% dx --> dx-1
+ %% dy --> dy-1
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\blh}{\bl*(0.5)}%
+ \pgfmathsetmacro{\dx}{#1 -1+0.5-\blh -1}%
+ \pgfmathsetmacro{\dy}{0 -\bs - \bw -1}%
+ \draw[fill=#2] (\dx,\dy) -- (\dx,\dy + \bw)
+ -- (\dx+\bl,\dy+\bw) -- (\dx+\bl,\dy) -- cycle;
+}}
+% \end{macrocode}
+% Make the DB (Down-Back) version;
+% bar 1 is at the left, 3 on the rhs (as we look at the image)
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarDBLD}{%
+\side@barRubikBbackLD{1}{\Brb}%
+\side@barRubikBbackLD{2}{\Bmb}%
+\side@barRubikBbackLD{3}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BD) = DB
+% \begin{macrocode}
+\newcommand{\DrawRubikCubeSidebarBDLD}{\DrawRubikCubeSidebarDBLD}
+% \end{macrocode}
+% Do NOT need to make the join commands (same as for the RD view
+%
+%
+%
+%
+% \subsection{\hspace{3mm}DrawNCube command}
+%
+% \textsc{history}: The essence of this command was originally developed by Peter Bartal
+% as his command \cmd{\rubikcube} (see Bartal,
+% 2011). We have modified it, as follows (June 2012):
+% \newline\strut\hspace{\parindent}(1) adjusted to use the
+% TikZ \cmd{\pgfmathsetmacro\{\}\{\}} command (suggested by Peter Grill),
+% \newline\strut\hspace{\parindent}(2) renamed to \cmd{\DrawNCubeAll}.
+%
+% \begin{macro}{\DrawNCubeAll}
+% {\noindent}This command draws a solved NxNxN Rubik's cube from the RightUp viewpoint.
+% All cubies on a given face have the same colour.
+% The command takes four ordered arguments, as follows:
+% \begin{quote}
+% \#1 = number of cubies ($n>0$) along each side,
+% {\newline}\#2, \#3, \#4 = colours of the visible faces (in X,Y,Z order);
+% X=Right face colour, Y=Up face colour, Z=Front face colour.
+% \end{quote}
+% We use the \cmd{\pgfmathsetmacro}\marg{variable-name}\marg{numeric value or maths}
+% command. Note that the second argument must not involve any units---just numeric
+% values or mathematics.
+%
+% \begin{macrocode}
+\newcommand{\DrawNCubeAll}[4]{%
+ \pgfmathsetmacro{\ncubes}{#1-1}%
+%% need to subtract 1 from the given number of cubies per side
+%% to avoid the origin of the initial cube to be displaced
+ \foreach \x in {0,...,\ncubes}{%
+ \foreach \y in {0,...,\ncubes}{%
+ \foreach \z in {0,...,\ncubes}{%
+ \cube@dxdydz{1}{#2}{#3}{#4}{\x}{\y}{\z}%
+ }}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\cube@dxdydz}
+% This internal command is used only by the \cmd{\DrawNCubeAll} command
+% (see above). The original version of this command was developed
+% by Peter Bartal (see Bartal, 2011).
+% It was later modified (2012) by RWD Nickalls (to implement a more
+% intuitive X, Y, Z ordering of the face colour parameters).
+%
+% The cube need not be in the origin, the distances of
+% the \textsc{down}-behind [L] corner from
+% the origin are taken as parameters 5,6,7.
+% The command takes 7 ordered arguments:
+% \begin{quote}
+% 1 - length of an edge
+% {\newline}2 - X-face colour (\textsc{right} face)
+% {\newline}3 - Y-face colour (\textsc{up} face)
+% {\newline}4 - Z-face colour (\textsc{front} face)
+% {\newline}5 - x-position in space
+% {\newline}6 - y-position in space
+% {\newline}7 - z-position in space
+% \end{quote}
+%
+% \textsc{usage}: |\cube@dxdydz{1}{X}{Y}{Z}{x}{y}{z}|
+%
+% {\noindent}The original code
+% |\pgfmathparse{#1+#5}\let\dy\pgfmathresult|
+% {\newline} was changed to the more intuitive |\pgfmathsetmacro{\dx}{#1+#5}|
+% (suggested by Peter Grill 2011).
+%
+% \textsc{changes}: RWD Nickalls (2012):
+% (1) added the [line join=round,line cap=round]
+% options to each of the TikZ \cmd{\draw} commands, in order to improve
+% the line joining (first two options); (2) adjusted the \cmd{\cube@dxdydz} macro
+% to adopt the ordered XYZ face colour notation
+% (by reassigning \#2, \#3, \#4 to the X, Y, Z face colours, as shown above).
+%
+% \begin{macrocode}
+\newcommand{\cube@dxdydz}[7]{%
+ \pgfmathsetmacro{\dx}{#1+#5}%
+%% calculates the 'displacement' (distance from the origin) of the
+%% far corners of the cube along the x axis from the arguments
+ \pgfmathsetmacro{\dy}{#1+#6}%
+%% calculates the 'displacement' (distance from the origin) of the
+%% far corners of the cube along the y axis from the arguments
+ \pgfmathsetmacro{\dz}{#1+#7}%
+%% calculates the 'displacement' (distance from the origin) of the
+%% far corners of the cube along the z axis from the arguments
+%% Draw FRONT face (using the X colour = #4)
+ \draw[line join=round,line cap=round,ultra thick,fill=#4]%
+ (#5,#6,\dz) -- (\dx,#6,\dz) -- (\dx,\dy,\dz) -- (#5,\dy,\dz) -- cycle;
+%% The 'rectangle' command does not work with 3D coordinates,
+%% so this is the way to draw the squares with space coordinates
+%% Draw UP face (using the Y colour = #3)
+ \draw[line join=round,line cap=round,ultra thick,fill=#3]%
+ (#5,\dy,\dz) -- (\dx,\dy,\dz) -- (\dx,\dy,#7) -- (#5,\dy,#7) -- cycle;
+%% Draw RIGHT face (using the X colour = #2)
+ \draw[line join=round,line cap=round,ultra thick,fill=#2]%
+ (\dx,#6,\dz) -- (\dx,#6,#7) -- (\dx,\dy,#7) -- (\dx,\dy,\dz) -- cycle;
+ }
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \subsection{\hspace{3mm}Drawing single cubies}
+%
+% \begin{macro}{\Cubiedx}
+% \begin{macro}{\Cubiedy}
+% These two commands set the value of the two length parameters
+% \texttt{cx} and \texttt{cy}, and allow the user to vary the size
+% (adjust \texttt{cy}) and horizontal viewpoint (adjust \texttt{cx})
+% of a single cubie (described in more detail in the \rubikcube\
+% package documentation).
+% Note that we cannot use the names \texttt{dx}, \texttt{dy} for the
+% variables here since these names have been allocated already
+% (see above). However, we can use \texttt{dx}, \texttt{dy} in the
+% command names as these will be more readily understood by the user.
+% \begin{macrocode}
+\newcommand{\Cubiedx}[1]{\pgfmathsetmacro{\cx}{#1}}
+\newcommand{\Cubiedy}[1]{\pgfmathsetmacro{\cy}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% We now set the default values (cx=cy=0.4)
+% \begin{macrocode}
+\Cubiedx{0.4}
+\Cubiedy{0.4}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\DrawCubieRU}
+% \begin{macro}{\DrawCubieRD}
+% \begin{macro}{\DrawCubieLU}
+% \begin{macro}{\DrawCubieLD}
+% These four commands draw a single cubie from the RightUp, RightDown,
+% LeftUp, LeftDown viewpoint. The viewpoint is specified using an appended
+% two-letter XY ordered viewpoint code: either RU, RD, LU, LD.
+% These commands take three arguments, namely three different XYZ
+% ordered colour codes (R,O,Y,G,B,W,X).
+% \newline\textsc{format}: \cmd{\DrawCubieRU}\marg{Xcolour}\marg{Ycolour}\marg{Zcolour}
+% \newline\textsc{usage}: |\DrawCubieRU{G}{B}{W}|
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\DrawCubieRU}[3]{%
+%% Front face (z)
+\draw[line join=round,line cap=round,ultra thick,fill=#3]%
+ (0,0) -- (0, 1) -- (1, 1) -- (1,0) -- cycle;
+%% Up face(y)
+\draw[line join=round,line cap=round,ultra thick,fill=#2]%
+ (0,1) -- (\cx, 1+\cy) -- (1+\cx,1+\cy) -- (1,1) -- cycle;
+%% Right face(x)
+\draw[line join=round,line cap=round,ultra thick,fill=#1]%
+ (1,0) -- (1,1) -- (1+\cx,1+\cy) -- (1+\cx, \cy) -- cycle;
+}
+\newcommand{\DrawCubieRD}[3]{%
+%% Front face (z)
+\draw[line join=round,line cap=round,ultra thick,fill=#3]%
+ (0,0) -- (0, 1) -- (1, 1) -- (1,0) -- cycle;
+%% Down face (y)
+\draw[line join=round,line cap=round,ultra thick,fill=#2]%
+ (\cx,-\cy) -- (0, 0) -- (1,0) -- (1+\cx,-\cy) -- cycle;
+%% Right face (x)
+\draw[line join=round,line cap=round,ultra thick,fill=#1]%
+ (1,0) -- (1,1) -- (1+\cx,-\cy+1) -- (1+\cx, -\cy) -- cycle;
+}
+\newcommand{\DrawCubieLD}[3]{%
+%% Front face (z)
+\draw[line join=round,line cap=round,ultra thick,fill=#3]%
+ (0,0) -- (0, 1) -- (1, 1) -- (1,0) -- cycle;
+%% Down face (y)
+\draw[line join=round,line cap=round,ultra thick,fill=#2]%
+ (-\cx,-\cy) -- (0, 0) -- (1,0) -- (1-\cx,-\cy) -- cycle;
+%% Left face (x)
+\draw[line join=round,line cap=round,ultra thick,fill=#1]%
+ (-\cx,-\cy) -- (-\cx,-\cy+1) -- (0,1) -- (0,0) -- cycle;
+}
+\newcommand{\DrawCubieLU}[3]{%
+%% Front face (z)
+\draw[line join=round,line cap=round,ultra thick,fill=#3]%
+ (0,0) -- (0, 1) -- (1, 1) -- (1,0) -- cycle;
+%% Up face (y)
+\draw[line join=round,line cap=round,ultra thick,fill=#2]%
+ (-\cx,1+\cy) -- (1-\cx, 1+\cy) -- (1,1) -- (0,1) -- cycle;
+%% Left face (x)
+\draw[line join=round,line cap=round,ultra thick,fill=#1]%
+ (-\cx, \cy) -- (-\cx,\cy+1) -- (0,1) -- (0,0) -- cycle;
+}
+% \end{macrocode}
+%
+%
+% \subsection{\hspace{3mm}Text cubies}
+%
+% \begin{macro}{\textCubieRU}
+% \begin{macro}{\textCubieRD}
+% \begin{macro}{\textCubieLU}
+% \begin{macro}{\textCubieLD}
+% These four commands draw a single `text' cubie from the RightUp, RightDown,
+% LeftUp, LeftDown viewpoint.
+% They are `text' forms of the \cmd{\DrawCubie} commands described above.
+% Their size was chosen to be suitable for use with 10--12 point fonts.
+%
+% As before, the viewpoint is specified using an appended
+% two-letter XY ordered viewpoint code: either RU, RD, LU, LD.
+% These commands take three arguments (since just three faces are visible with this
+% cube format), namely three different XYZ ordered colour codes (R,O,Y,G,B,W,X).
+% \newline\textsc{format}: \cmd{\textCubieRU}\marg{Xcolour}\marg{Ycolour}\marg{Zcolour}
+% \newline\textsc{usage}: |\textCubieRU{G}{B}{W}|
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macrocode}
+\newcommand{\textCubieRU}[3]{%
+\begin{minipage}{0.66cm}
+\centering
+\begin{tikzpicture}[scale=0.5]
+\Cubiedx{0.4}\Cubiedy{0.4}
+\DrawCubieRU{#1}{#2}{#3}
+\end{tikzpicture}%
+\end{minipage}
+}
+\newcommand{\textCubieRD}[3]{%
+\begin{minipage}{0.66cm}
+\centering
+\begin{tikzpicture}[scale=0.5]
+\Cubiedx{0.4}\Cubiedy{0.4}
+\DrawCubieRD{#1}{#2}{#3}
+\end{tikzpicture}%
+\end{minipage}
+}
+\newcommand{\textCubieLD}[3]{%
+\begin{minipage}{0.66cm}
+\centering
+\begin{tikzpicture}[scale=0.5]
+\Cubiedx{0.4}\Cubiedy{0.4}
+\DrawCubieLD{#1}{#2}{#3}
+\end{tikzpicture}%
+\end{minipage}
+}
+\newcommand{\textCubieLU}[3]{%
+\begin{minipage}{0.66cm}
+\centering
+\begin{tikzpicture}[scale=0.5]
+\Cubiedx{0.4}\Cubiedy{0.4}
+\DrawCubieLU{#1}{#2}{#3}
+\end{tikzpicture}%
+\end{minipage}
+}
+% \end{macrocode}
+%
+%
+% \subsection{\hspace{3mm}Rotation commands}
+% \label{sec:rotationcommandscode}
+%
+%
+% \subsubsection{\hspace{3mm}Introduction}
+%
+% We use a special prefix notation to denote each of four different representations
+% of the various Rubik cube rotations as follows: the name of the Rubik rotation (rr), its
+% associated hieroglyph (rrh), and combinations of name and hieroglyph both vertical (Rubik)
+% and horizontal (textRubik). A rotation command is a combination of a rotation-code appended
+% to one of the four prefixes.
+%
+% For~example, the command \cmd{\rrhD} generates the hieroglyph (rrh) associated with
+% the rotation-code D. In this form it is used internally, but it is also available for the user.
+%
+% In version~3.0, however, all the rotation commands were also made available to the user
+% in the much more intuitive form stem\{argument\} form, for~example,
+% |\rrh{D}|. In practice, this `argument' form actually generates the original non-argument
+% form by the use of the internal macro |\@join|.
+% For~example, \verb!\rrh{D}! $\rightarrow$ join(\verb!\rrh! + \verb!D!) $\rightarrow$ \verb!\rrhD!
+% (see Section~\ref{sec:cmdsusingjoin} for details).
+%
+% The hieroglyphs are of two types: `arrow' glyphs (all exactly square),
+% and `letter' glyphs (mostly square, but many are rectangular); however both
+% types are designed to have the same height so they sit nicely when arranged side-by-side.
+% A lot of special macros for generating these glyphs are described below
+% in Section~\ref{sec:usefulinternalcommands} (and also in Section~\ref{sec:codedrawnotationbox}).
+%
+% The `arrow' hieroglyphs are built up in stages using TikZ. We first create a
+% command for drawing the square (\cmd{\DrawNotationBox};
+% see Section~\ref{sec:codedrawnotationbox}) and then draw the
+% contents (lines, arrows, arcs of circles). For an example,
+% see the D~form \rrh{D}\ constructed in Section~\ref{sec:coderotationD}.
+%
+% The `letter' hieroglyphs (glyphs for which the rotations cannot be seen from the front,
+% and hence cannot have arrows) just give a letter representation of the rotation
+% (say, Bw for `back wide'). These glyphs are therefore made using an fbox (for convenience),
+% and therefore these are sometimes not square. Some vertical fine-tuning using
+% the \verb!\raisebox! command is often required to force these `letter' glyphs to
+% have the same vertical position as their `arrow' cousins. A typical example
+% is the form \rrh{Bw}\ which is detailed in Section~\ref{sec:coderotationBw}.
+%
+% The presence of small overfilled \cmd{\hbox}es associated with these squares
+% were originally checked for using the \texttt{ltugboat.cls}, and all fixed mainly
+% by setting their associated small minipages $\rightarrow$ width = 0.6cm,
+% and using TikZ scale=0.5.
+%
+%
+% \subsubsection{\hspace{3mm}DrawNotationBox}
+% \label{sec:codedrawnotationbox}
+%
+%
+% \begin{macro}{\DrawNotationBox}
+% This internal command draws the surrounding square box of all the hieroglyphs.
+% Note that we start at (0,0) and draw to the final point
+% in order to make a nice corner join.
+%
+% \textsc{todo}: ? make this a proper internal command
+% using \verb!@! sometime.
+%
+% \begin{macrocode}
+\newcommand{\DrawNotationBox}{%
+ \draw [thick] (0,0) -- (0,1) -- (1,1) -- (1,0) -- (0,0) -- (0,1)%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% We now define a number of points and line-segments inside the square
+% `notationbox' (e.g.,~\cmd{\@sd}, \cmd{\@sh} \ldots\ etc.) which will be required
+% for use in drawing the various lines and arrows.
+% Some hieroglyphs contain either one circular arc, or two concentric arcs,
+% and these arcs require both a centre and a start point.
+% Note that the final argument does not use any units.
+% For the TikZ ARC command see TikZ pgfmanual (2012) page~146 (\S 14.8).
+%
+% \textsc{todo}: make a small diagram to illustrate the position of these
+% parameters and make things a bit clearer sometime.
+%
+%\begin{macrocode}
+\pgfmathsetmacro{\@sd}{0.25} % a small horiz space
+\pgfmathsetmacro{\@sdd}{2*\@sd} % 2x horiz space
+\pgfmathsetmacro{\@sddd}{3*\@sd} % 3x horiz space
+\pgfmathsetmacro{\@sh}{0.6} % height
+\pgfmathsetmacro{\@sb}{0.2} % base
+\pgfmathsetmacro{\@sbh}{\@sb + \@sh} % UP
+\pgfmathsetmacro{\@scx}{\@sdd+0.2} % Start of CircleX arc
+\pgfmathsetmacro{\@scy}{\@sd*2/3} % Start of CircleY arc
+\pgfmathsetmacro{\@sqcx}{\@scx-0.13} %% SQuare CenterX coord
+\pgfmathsetmacro{\@sqcy}{\@scy+0.25} %% SQuare CenterY cpprd
+% \end{macrocode}
+%
+%
+%
+%
+% \subsubsection{\hspace{3mm}Some useful internal commands}
+% \label{sec:usefulinternalcommands}
+%
+% \begin{macro}{\@rr}
+% \begin{macro}{\@rrp}
+% \begin{macro}{\@rrw}
+% \begin{macro}{\@rrwp}
+% \begin{macro}{\@rrs}
+% \begin{macro}{\@rrsp}
+% \begin{macro}{\@rra}
+% \begin{macro}{\@rrap}
+% \begin{macro}{\@xyzh}
+% \begin{macro}{\@xyzhp}
+% \begin{macro}{\@xyzRubik}
+% \begin{macro}{\@xyzRubikp}
+% \begin{macro}{\@SquareLetter}
+% \begin{macro}{\@hRubik}
+% These internal commands are used to generate the
+% prime, w, w-prime, s, s-prime, a, a-prime
+% rotation commands. They attach a letter or a prime to the associated argument;
+% for~example, the command \verb!\@rrwp{B}! appends a `w' and a prime (p) to the
+% argument `B', i.e.~$\rightarrow$ \rr{Bwp} (see Section~\ref{sec:coderotationBwp}).
+% Users are then able to access this glyph by typing the command \verb!\rrBwp!, or,
+% more intuitively, \verb!\rr{Bwp}!
+% (see also \verb!\@join! detailed in Section~\ref{sec:cmdsusingjoin}).
+%
+% The \cmd{\@xyz..} commands are used to generate the
+% x, y, z, u, d, l, r, f, b commands and their associated prime rotation commands.
+% The commands \verb!\@xyzhbdfl! and \verb!\@xyzbdflRubik! relate to the
+% axis rotations denoted as b, d, f, l; since these four letters have long upstrokes
+% they require special fine-tuning for vertical position.
+%
+% The \cmd{\@SquareLetter} command is used to form the separate square hieroglyph form
+% used for rotations with no visible representation from the front
+% (e.g.,~B.., Fs, Fsp, Fa, Fap, S, Sp, Sf, Sfp, Sb, Sbp).
+% Note that the TikZ `thick' line code = 0.8pt (used in \cmd{\@SquareLetter}).
+% The \cmd{\@hRubik} is the vertical shift used to raise the box carrying the rotation
+% rotation-code in \cmd{\Rubik..} commands not visible from the front.
+%
+% The idea is that by using these internal
+% tools taking parameters we are able to more easily standardise the size
+% and position of all the various glyphs. For details of the
+% rubikfont and rubikprime see Section~\ref{sec:coderubikfont}).
+%
+% \begin{macrocode}
+\newcommand{\@rr}[1]{{\@rubikfont #1}}
+\newcommand{\@rrp}[1]{{\@rubikfont #1\@rubikprime}}
+\newcommand{\@rrw}[1]{{\@rubikfont #1{\@rubikfontFNS w}}}
+\newcommand{\@rrwp}[1]{{\@rubikfont #1{\@rubikfontFNS w}\@rubikprime}}
+\newcommand{\@rrs}[1]{{\@rubikfont #1{\@rubikfontFNS s}}}
+\newcommand{\@rrsp}[1]{{\@rubikfont #1{\@rubikfontFNS s}\@rubikprime}}
+\newcommand{\@rra}[1]{{\@rubikfont #1{\@rubikfontFNS a}}}
+\newcommand{\@rrap}[1]{{\@rubikfont #1{\@rubikfontFNS a}\@rubikprime}}
+\newcommand{\@rru}[1]{{\@rubikfont #1{\@rubikfontFNS u}}}
+\newcommand{\@rrup}[1]{{\@rubikfont #1{\@rubikfontFNS u}\@rubikprime}}
+\newcommand{\@rrd}[1]{{\@rubikfont #1{\@rubikfontFNS d}}}
+\newcommand{\@rrdp}[1]{{\@rubikfont #1{\@rubikfontFNS d}\@rubikprime}}
+\newcommand{\@rrl}[1]{{\@rubikfont #1{\@rubikfontFNS l}}}
+\newcommand{\@rrlp}[1]{{\@rubikfont #1{\@rubikfontFNS l}\@rubikprime}}
+\newcommand{\@rrr}[1]{{\@rubikfont #1{\@rubikfontFNS r}}}
+\newcommand{\@rrrp}[1]{{\@rubikfont #1{\@rubikfontFNS r}\@rubikprime}}
+\newcommand{\@rrf}[1]{{\@rubikfont #1{\@rubikfontFNS f}}}
+\newcommand{\@rrfp}[1]{{\@rubikfont #1{\@rubikfontFNS f}\@rubikprime}}
+\newcommand{\@rrb}[1]{{\@rubikfont #1{\@rubikfontFNS b}}}
+\newcommand{\@rrbp}[1]{{\@rubikfont #1{\@rubikfontFNS b}\@rubikprime}}
+\newcommand{\@rrc}[1]{{\@rubikfont #1{\@rubikfontFNS c}}}
+\newcommand{\@rrcp}[1]{{\@rubikfont #1{\@rubikfontFNS c}\@rubikprime}}
+\newcommand{\@rrm}[1]{{\@rubikfont #1{\@rubikfontFNS m}}}
+\newcommand{\@rrmp}[1]{{\@rubikfont #1{\@rubikfontFNS m}\@rubikprime}}
+\newcommand{\@xyzh}[1]{[{\@rubikfont #1}]}
+\newcommand{\@xyzhp}[1]{[{\@rubikfont #1\raisebox{-0.6pt}{\@rubikprime}}]}
+\newcommand{\@xyzRubik}[1]%
+ {\raisebox{3.45pt}{[{\@rubikfont #1}]}}
+\newcommand{\@xyzRubikp}[1]%
+ {\raisebox{3.45pt}{[{\@rubikfont #1\raisebox{-0.6pt}{\@rubikprime}}]}}
+\newcommand{\@xyzhbdfl}[1]%
+ {[\raisebox{-0.6pt}{{\@rubikfont #1}}]}
+\newcommand{\@xyzhbdflp}[1]%
+ {[\raisebox{-0.6pt}{{\@rubikfont #1\@rubikprime}}]}
+\newcommand{\@xyzbdflRubik}[1]%
+ {\raisebox{3.45pt}{[\raisebox{-0.6pt}{{\@rubikfont #1}}]}}
+\newcommand{\@xyzbdflRubikp}[1]%
+ {\raisebox{3.45pt}{[\raisebox{-0.6pt}{{\@rubikfont #1\@rubikprime}}]}}
+\newcommand{\@SquareLetter}[1]{\setlength{\fboxsep}{2.5pt}%
+ \setlength{\fboxrule}{0.8pt}%
+ \fbox{\rule[-1pt]{0pt}{8.5pt}\raisebox{-0.5pt}{#1}}}
+\newlength\@hRubik%
+\setlength{\@hRubik}{0.185cm}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@tlen}
+% Feb 2017 (RWDN): \ We also need to define a small length for fine-tuning the default
+% horizontal space between a pair of `letter' hieroglyphs, eg~B (i.e.,~when no
+% additional space has been added by the user), so that this matches that between a pair of
+% `arrow' hieroglyphs. This length is inserted on both sides of the square frame.
+% This length is used in two settings: (a)~in `letter' hieroglyphs (for an example,
+% see the definition of the macro \cmd{\SquareB} in Section~\ref{sec:coderotationB}),
+% and in (b)~in `arrow' hieroglyphs (for an example,
+% see the definition of the macro \cmd{\rrhD} in Section~\ref{sec:coderotationD}).
+%
+%\begin{macrocode}
+\newcommand{\@tlen}{\hspace{1pt}}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsubsection{\hspace{3mm}Using {\textbackslash}\texttt{@join}}
+% \label{sec:cmdsusingjoin}
+%
+%
+% \begin{macro}{\@join}
+% We also require a macro for joining two strings so we can convert
+% a rotation-code, say U, into a macro (say, \cmd{\rrhU}) which typesets it in some form.
+% The following \cmd{\@join\{\}\{\}} command is by Christian Tellechea (many thanks\,!).
+% {\newline}\textsc{usage}: \cmd{\@join\marg{command-stem}\marg{rotation-code}}. For~example,
+% to create the command \cmd{\rrhU} we would write |\@join{\rrh}{U}|, and hence
+% the intuitive command |\rrh{U}| is equivalent to \cmd{\rrhU}.
+% {\newline}Since this macro is also useful for processing rotation-codes in a list,
+% which may also include macros, it is important that |#2| is not detokenized.
+% \begin{macrocode}
+\newcommand*\@join[2]{%
+ \csname\expandafter\@gobble\string#1#2\endcsname}
+% \end{macrocode}
+% The following section shows how this command is used in practice.
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\textRubik}
+% \begin{macro}{\Rubik}
+% \begin{macro}{\rr}
+% \begin{macro}{\rrh}
+% The following four commands typeset a single rotation, where a rotation-code (e.g.,~U) is
+% the argument (see Section~\ref{sec:typesetting}). As an example, the format for
+% the \cmd{\rrh\{\}} command is
+% \cmd{\rrh}\marg{rotation-code}. In practice, these four commands are really a
+% sort of front-end for all the commands which follow this section. For~example, the
+% command \cmd{\rrh\{U\}} generates the command \cmd{\rrhU} which itself typesets the
+% rotation hieroglyph for the rotation~U, etc.
+%
+% These four commands, which use the
+% internal \cmd{\@join} command (see above), are
+% especially useful when typesetting a list of rotation-codes.
+% Furthermore, it is more intuitive for the user to specify a rotation command
+% using the rotation-code as an argument.
+% \begin{macrocode}
+\newcommand*{\Rubik}[1]{\@join{\Rubik}{#1}}
+\newcommand*{\textRubik}[1]{\@join{\textRubik}{#1}}
+\newcommand*{\rr}[1]{\@join{\rr}{#1}}
+\newcommand*{\rrh}[1]{\@join{\rrh}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotation B}
+% \label{sec:coderotationB}
+%
+% \begin{macro}{\rrB}
+% \begin{macro}{\SquareB}
+% \begin{macro}{\rrhB}
+% \begin{macro}{\RubikB}
+% \begin{macro}{\textRubikB}
+% These commands all draw forms which denote the B (\textsc{back}-face) rotation.
+% Not visible from the front.
+%
+% Feb 2017 (RWDN): added the \cmd{\@tlen} length (= 1pt; defined above) to the
+% \cmd{\SquareB} command, and removed the terminal \cmd{\,} space
+% from the rrhB, RubikB, textRubikB commands, and copied
+% this action with all the subsequent Letter hieroglyphs (e.g.,~B, Bw,..).
+% These minor changes were to improve the spacing between two Letter hieroglyphs,
+% and make it match that between two square `arrow' hieroglyphs.
+% The same changes were made to all the `letter' hieroglyphs.
+% \begin{macrocode}
+\newcommand{\rrB}{\@rr{B}}
+\newcommand{\SquareB}{\@tlen\@SquareLetter{\rrB}\@tlen}
+\newcommand{\rrhB}{\raisebox{-0.25mm}{\SquareB}}
+\newcommand{\RubikB}{\raisebox{\@hRubik}{\SquareB}}
+\newcommand{\textRubikB}{\rrhB}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bp}
+%
+% \begin{macro}{\rrBp}
+% \begin{macro}{\SquareBp}
+% \begin{macro}{\rrhBp}
+% \begin{macro}{\RubikBp}
+% \begin{macro}{\textRubikBp}
+% These commands all draw forms which denote the Bp rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBp}{\@rrp{B}}
+\newcommand{\SquareBp}{\@tlen\@SquareLetter{\rrBp}\@tlen}
+\newcommand{\rrhBp}{\raisebox{-0.25mm}{\SquareBp}}
+\newcommand{\RubikBp}{\raisebox{\@hRubik}{\SquareBp}}
+\newcommand{\textRubikBp}{\rrhBp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bw}
+% \label{sec:coderotationBw}
+%
+% \begin{macro}{\rrBw}
+% \begin{macro}{\SquareBw}
+% \begin{macro}{\rrhBw}
+% \begin{macro}{\RubikBw}
+% \begin{macro}{\textRubikBw}
+% These commands all draw forms which denote the Bw rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBw}{\@rrw{B}}
+\newcommand{\SquareBw}{\@tlen\@SquareLetter{\rrBw}\@tlen}
+\newcommand{\rrhBw}{\raisebox{-0.25mm}{\SquareBw}}
+\newcommand{\RubikBw}{\raisebox{\@hRubik}{\SquareBw}}
+\newcommand{\textRubikBw}{\rrhBw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bwp}
+% \label{sec:coderotationBwp}
+%
+% \begin{macro}{\rrBwp}
+% \begin{macro}{\SquareBwp}
+% \begin{macro}{\rrhBwp}
+% \begin{macro}{\RubikBwp}
+% \begin{macro}{\textRubikBwp}
+% These commands all draw forms which denote the Bwp rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBwp}{\@rrwp{B}}
+\newcommand{\SquareBwp}{\@tlen\@SquareLetter{\rrBwp}\@tlen}
+\newcommand{\rrhBwp}{\raisebox{-0.25mm}{\SquareBwp}}
+\newcommand{\RubikBwp}{\raisebox{\@hRubik}{\SquareBwp}}
+\newcommand{\textRubikBwp}{\rrhBwp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bs}
+%
+% \begin{macro}{\rrBs}
+% \begin{macro}{\SquareBs}
+% \begin{macro}{\rrhBs}
+% \begin{macro}{\RubikBs}
+% \begin{macro}{\textRubikBs}
+% These commands all draw forms which denote the Bs rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBs}{\@rrs{B}}
+\newcommand{\SquareBs}{\@tlen\@SquareLetter{\rrBs}\@tlen}
+\newcommand{\rrhBs}{\raisebox{-0.25mm}{\SquareBs}}
+\newcommand{\RubikBs}{\raisebox{\@hRubik}{\SquareBs}}
+\newcommand{\textRubikBs}{\rrhBs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bsp}
+%
+% \begin{macro}{\rrBsp}
+% \begin{macro}{\SquareBsp}
+% \begin{macro}{\rrhBsp}
+% \begin{macro}{\RubikBsp}
+% \begin{macro}{\textRubikBsp}
+% These commands all draw forms which denote the Bsp rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBsp}{\@rrsp{B}}
+\newcommand{\SquareBsp}{\@tlen\@SquareLetter{\rrBsp}\@tlen}
+\newcommand{\rrhBsp}{\raisebox{-0.25mm}{\SquareBsp}}
+\newcommand{\RubikBsp}{\raisebox{\@hRubik}{\SquareBsp}}
+\newcommand{\textRubikBsp}{\rrhBsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ba}
+%
+% \begin{macro}{\rrBa}
+% \begin{macro}{\SquareBa}
+% \begin{macro}{\rrhBa}
+% \begin{macro}{\RubikBa}
+% \begin{macro}{\textRubikBa}
+% These commands all draw forms which denote the Ba rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBa}{\@rra{B}}
+\newcommand{\SquareBa}{\@tlen\@SquareLetter{\rrBa}\@tlen}
+\newcommand{\rrhBa}{\raisebox{-0.25mm}{\SquareBa}}
+\newcommand{\RubikBa}{\raisebox{\@hRubik}{\SquareBa}}
+\newcommand{\textRubikBa}{\rrhBa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Bap}
+%
+% \begin{macro}{\rrBap}
+% \begin{macro}{\SquareBap}
+% \begin{macro}{\rrhBap}
+% \begin{macro}{\RubikBap}
+% \begin{macro}{\textRubikBap}
+% These commands all draw forms which denote the Bap rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBap}{\@rrap{B}}
+\newcommand{\SquareBap}{\@tlen\@SquareLetter{\rrBap}\@tlen}
+\newcommand{\rrhBap}{\raisebox{-0.25mm}{\SquareBap}}
+\newcommand{\RubikBap}{\raisebox{\@hRubik}{\SquareBap}}
+\newcommand{\textRubikBap}{\rrhBap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation D}
+% \label{sec:coderotationD}
+%
+% \begin{macro}{\rrD}
+% \begin{macro}{\SquareD}
+% \begin{macro}{\rrhD}
+% \begin{macro}{\RubikD}
+% \begin{macro}{\textRubikD}
+% These commands all draw forms which denote the D rotation.
+%
+% Feb 2017 (RWDN): \ added the \cmd{\@tlen} length to the \cmd{\rrhD} command to improve the
+% spacing between two `arrow' square hieroglyphs; and also removed the terminal \cmd{\,}
+% space. The same changes were made to all the `arrow' hieroglyphs.
+% \begin{macrocode}
+\newcommand{\rrD}{\@rr{D}}
+%%
+\newcommand{\SquareD}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhD}{\raisebox{-0.333\height}{\@tlen\SquareD\@tlen}}
+%%
+\newcommand{\RubikD}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareD\\
+\rrD%
+\end{minipage}%
+}}
+\newcommand{\textRubikD}{\rrD\,\rrhD}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dp}
+%
+% \begin{macro}{\rrDp}
+% \begin{macro}{\SquareDp}
+% \begin{macro}{\rrhDp}
+% \begin{macro}{\RubikDp}
+% \begin{macro}{\textRubikDp}
+% These commands all draw forms which denote the Dp rotation.
+% \begin{macrocode}
+\newcommand{\rrDp}{\@rrp{D}}
+%%
+\newcommand{\SquareDp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDp}{\raisebox{-0.333\height}{\@tlen\SquareDp\@tlen}}
+%%
+\newcommand{\RubikDp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDp\\
+\rrDp%
+\end{minipage}%
+}}
+\newcommand{\textRubikDp}{\rrDp\,\rrhDp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dw}
+%
+% \begin{macro}{\rrDw}
+% \begin{macro}{\SquareDw}
+% \begin{macro}{\rrhDw}
+% \begin{macro}{\RubikDw}
+% \begin{macro}{\textRubikDw}
+% These commands all draw forms which denote the Dw rotation.
+% \begin{macrocode}
+\newcommand{\rrDw}{\@rrw{D}}
+%%
+\newcommand{\SquareDw}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, ->] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDw}{\raisebox{-0.333\height}{\@tlen\SquareDw\@tlen}}
+%%
+\newcommand{\RubikDw}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDw\\
+\rrDw%
+\end{minipage}%
+}}
+\newcommand{\textRubikDw}{\rrDw\,\rrhDw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dwp}
+%
+% \begin{macro}{\rrDwp}
+% \begin{macro}{\SquareDwp}
+% \begin{macro}{\rrhDwp}
+% \begin{macro}{\RubikDwp}
+% \begin{macro}{\textRubikDwp}
+% These commands all draw forms which denote the Dwp rotation.
+% \begin{macrocode}
+\newcommand{\rrDwp}{\@rrwp{D}}
+%%
+\newcommand{\SquareDwp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, <-] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDwp}{\raisebox{-0.333\height}{\@tlen\SquareDwp\@tlen}}
+%%
+\newcommand{\RubikDwp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDwp\\
+\rrDwp%
+\end{minipage}%
+}}
+\newcommand{\textRubikDwp}{\rrDwp\,\rrhDwp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ds}
+%
+% \begin{macro}{\rrDs}
+% \begin{macro}{\SquareDs}
+% \begin{macro}{\rrhDs}
+% \begin{macro}{\RubikDs}
+% \begin{macro}{\textRubikDs}
+% These commands all draw forms which denote the Ds rotation.
+% \begin{macrocode}
+\newcommand{\rrDs}{\@rrs{D}}
+%%
+\newcommand{\SquareDs}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDs}{\raisebox{-0.333\height}{\@tlen\SquareDs\@tlen}}
+%%
+\newcommand{\RubikDs}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDs\\
+\rrDs%
+\end{minipage}%
+}}
+\newcommand{\textRubikDs}{\rrDs\,\rrhDs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dsp}
+%
+% \begin{macro}{\rrDsp}
+% \begin{macro}{\SquareDsp}
+% \begin{macro}{\rrhDsp}
+% \begin{macro}{\RubikDsp}
+% \begin{macro}{\textRubikDsp}
+% These commands all draw forms which denote the Dsp rotation.
+% \begin{macrocode}
+\newcommand{\rrDsp}{\@rrsp{D}}
+%%
+\newcommand{\SquareDsp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDsp}{\raisebox{-0.333\height}{\@tlen\SquareDsp\@tlen}}
+%%
+\newcommand{\RubikDsp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDsp\\
+\rrDsp%
+\end{minipage}%
+}}
+\newcommand{\textRubikDsp}{\rrDsp\,\rrhDsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Da}
+%
+% \begin{macro}{\rrDa}
+% \begin{macro}{\SquareDa}
+% \begin{macro}{\rrhDa}
+% \begin{macro}{\RubikDa}
+% \begin{macro}{\textRubikDa}
+% These commands all draw forms which denote the Da rotation.
+% \begin{macrocode}
+\newcommand{\rrDa}{\@rra{D}}
+%%
+\newcommand{\SquareDa}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDa}{\raisebox{-0.333\height}{\@tlen\SquareDa\@tlen}}
+%%
+\newcommand{\RubikDa}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDa\\
+\rrDa%
+\end{minipage}%
+}}
+\newcommand{\textRubikDa}{\rrDa\,\rrhDa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dap}
+%
+% \begin{macro}{\rrDap}
+% \begin{macro}{\SquareDap}
+% \begin{macro}{\rrhDap}
+% \begin{macro}{\RubikDap}
+% \begin{macro}{\textRubikDap}
+% These commands all draw forms which denote the Dap rotation.
+% \begin{macrocode}
+\newcommand{\rrDap}{\@rrap{D}}
+%%
+\newcommand{\SquareDap}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhDap}{\raisebox{-0.333\height}{\@tlen\SquareDap\@tlen}}
+%%
+\newcommand{\RubikDap}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDap\\
+\rrDap%
+\end{minipage}%
+}}
+\newcommand{\textRubikDap}{\rrDap\,\rrhDap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation E}
+%
+% \begin{macro}{\rrE}
+% \begin{macro}{\SquareE}
+% \begin{macro}{\rrhE}
+% \begin{macro}{\RubikE}
+% \begin{macro}{\textRubikE}
+% These commands all draw forms which denote the E rotation.
+% \begin{macrocode}
+\newcommand{\rrE}{\@rr{E}}
+%%
+\newcommand{\SquareE}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, ->] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhE}{\raisebox{-0.333\height}{\@tlen\SquareE\@tlen}}
+%%
+\newcommand{\RubikE}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrE%
+\end{minipage}%
+}}
+\newcommand{\textRubikE}{\rrE\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ep}
+%
+% \begin{macro}{\rrEp}
+% \begin{macro}{\SquareEp}
+% \begin{macro}{\rrhEp}
+% \begin{macro}{\RubikEp}
+% \begin{macro}{\textRubikEp}
+% These commands all draw forms which denote the Ep rotation.
+% \begin{macrocode}
+\newcommand{\rrEp}{\@rrp{E}}
+%%
+\newcommand{\SquareEp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, <-] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhEp}{\raisebox{-0.333\height}{\@tlen\SquareEp\@tlen}}
+%%
+\newcommand{\RubikEp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrEp%
+\end{minipage}%
+}}
+\newcommand{\textRubikEp}{\rrEp\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation F}
+%
+% \begin{macro}{\rrF}
+% \begin{macro}{\SquareF}
+% \begin{macro}{\rrhF}
+% \begin{macro}{\RubikF}
+% \begin{macro}{\textRubikF}
+% These commands all draw forms which denote the F rotation.
+% \begin{macrocode}
+\newcommand{\rrF}{\@rr{F}}
+%%
+\newcommand{\SquareF}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@scx, \@scy) arc[radius=0.35, start angle=-60, delta angle=290];
+\end{tikzpicture}%
+}
+\newcommand{\rrhF}{\raisebox{-0.333\height}{\@tlen\SquareF\@tlen}}
+%%
+\newcommand{\RubikF}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareF\\
+\rrF%
+\end{minipage}%
+}}
+\newcommand{\textRubikF}{\rrF\,\rrhF}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fp}
+%
+% \begin{macro}{\rrFp}
+% \begin{macro}{\SquareFp}
+% \begin{macro}{\rrhFp}
+% \begin{macro}{\RubikFp}
+% \begin{macro}{\textRubikFp}
+% These commands all draw forms which denote the Fp rotation.
+% \begin{macrocode}
+\newcommand{\rrFp}{\@rrp{F}}
+%%
+\newcommand{\SquareFp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@scx, \@scy) arc[radius=0.35, start angle=-60, delta angle=290];
+\end{tikzpicture}%
+}
+\newcommand{\rrhFp}{\raisebox{-0.333\height}{\@tlen\SquareFp\@tlen}}
+%%
+\newcommand{\RubikFp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareFp\\
+\rrFp%
+\end{minipage}%
+}}
+\newcommand{\textRubikFp}{\rrFp\,\rrhFp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fw}
+%
+% \begin{macro}{\rrFw}
+% \begin{macro}{\SquareFw}
+% \begin{macro}{\rrhFw}
+% \begin{macro}{\RubikFw}
+% \begin{macro}{\textRubikFw}
+% These commands all draw forms which denote the Fw rotation.
+% \begin{macrocode}
+\newcommand{\rrFw}{\@rrw{F}}
+%%
+\newcommand{\SquareFw}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@scx, \@scy) arc[radius=0.35, start angle=-60, delta angle=290];
+\draw [thick] (\@sqcx,\@sqcy) arc[radius=0.1, start angle=-60, delta angle=360];
+%\node (squareLab) at (0.5,0.5) {$o$};
+\end{tikzpicture}%
+}
+\newcommand{\rrhFw}{\raisebox{-0.333\height}{\@tlen\SquareFw\@tlen}}
+%%
+\newcommand{\RubikFw}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareFw\\
+\rrFw%
+\end{minipage}%
+}}
+\newcommand{\textRubikFw}{\rrFw\,\rrhFw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fwp}
+%
+% \begin{macro}{\rrFwp}
+% \begin{macro}{\SquareFwp}
+% \begin{macro}{\rrhFwp}
+% \begin{macro}{\RubikFwp}
+% \begin{macro}{\textRubikFwp}
+% These commands all draw forms which denote the Fwp rotation.
+% \begin{macrocode}
+\newcommand{\rrFwp}{\@rrwp{F}}
+%%
+\newcommand{\SquareFwp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@scx, \@scy) arc[radius=0.35, start angle=-60, delta angle=290];
+\draw [thick] (\@sqcx,\@sqcy) arc[radius=0.1, start angle=-60, delta angle=360];
+\end{tikzpicture}%
+}
+\newcommand{\rrhFwp}{\raisebox{-0.333\height}{\@tlen\SquareFwp\@tlen}}
+%%
+\newcommand{\RubikFwp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareFwp\\
+\rrFwp%
+\end{minipage}%
+}}
+\newcommand{\textRubikFwp}{\rrFwp\,\rrhFwp}
+%%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fs}
+%
+% \begin{macro}{\rrFs}
+% \begin{macro}{\rrhFs}
+% \begin{macro}{\RubikFs}
+% \begin{macro}{\textRubikFs}
+% These commands draw forms of the Singmaster Fs slice rotation.
+% We need to just make square with Fs in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFs}{\@rrs{F}}
+\newcommand{\SquareFs}{\@tlen\@SquareLetter{\rrFs}\@tlen}
+\newcommand{\rrhFs}{\raisebox{-0.25mm}{\SquareFs}}
+\newcommand{\RubikFs}{\raisebox{\@hRubik}{\SquareFs}}
+\newcommand{\textRubikFs}{\rrhFs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fsp}
+%
+% \begin{macro}{\rrFsp}
+% \begin{macro}{\rrhFsp}
+% \begin{macro}{\RubikFsp}
+% \begin{macro}{\textRubikFsp}
+% These commands draw forms of the Singmaster Fsp slice rotation.
+% We need to just make square with Fsp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFsp}{\@rrsp{F}}
+\newcommand{\SquareFsp}{\@tlen\@SquareLetter{\rrFsp}\@tlen}
+\newcommand{\rrhFsp}{\raisebox{-0.25mm}{\SquareFsp}}
+\newcommand{\RubikFsp}{\raisebox{\@hRubik}{\SquareFsp}}
+\newcommand{\textRubikFsp}{\rrhFsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fa}
+%
+% \begin{macro}{\rrFa}
+% \begin{macro}{\rrhFa}
+% \begin{macro}{\RubikFa}
+% \begin{macro}{\textRubikFa}
+% These commands draw forms of the Singmaster Fa slice rotation.
+% We need to just make square with Fa in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFa}{\@rra{F}}
+\newcommand{\SquareFa}{\@tlen\@SquareLetter{\rrFa}\@tlen}
+\newcommand{\rrhFa}{\raisebox{-0.25mm}{\SquareFa}}
+\newcommand{\RubikFa}{\raisebox{\@hRubik}{\SquareFa}}
+\newcommand{\textRubikFa}{\rrhFa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Fap}
+%
+% \begin{macro}{\rrFap}
+% \begin{macro}{\rrhFap}
+% \begin{macro}{\RubikFap}
+% \begin{macro}{\textRubikFap}
+% These commands draw forms of the Singmaster Fap slice rotation.
+% We need to just make square with Fap in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFap}{\@rrap{F}}
+\newcommand{\SquareFap}{\@tlen\@SquareLetter{\rrFap}\@tlen}
+\newcommand{\rrhFap}{\raisebox{-0.25mm}{\SquareFap}}
+\newcommand{\RubikFap}{\raisebox{\@hRubik}{\SquareFap}}
+\newcommand{\textRubikFap}{\rrhFap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation L}
+%
+% \begin{macro}{\rrL}
+% \begin{macro}{\SquareL}
+% \begin{macro}{\rrhL}
+% \begin{macro}{\RubikL}
+% \begin{macro}{\textRubikL}
+% These commands all draw forms which denote the L rotation.
+% \begin{macrocode}
+\newcommand{\rrL}{\@rr{L}}
+%%
+\newcommand{\SquareL}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhL}{\raisebox{-0.333\height}{\@tlen\SquareL\@tlen}}
+%%
+\newcommand{\RubikL}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareL\\
+\rrL%
+\end{minipage}%
+}}
+\newcommand{\textRubikL}{\rrL\,\rrhL}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lp}
+%
+% \begin{macro}{\rrLp}
+% \begin{macro}{\SquareLp}
+% \begin{macro}{\rrhLp}
+% \begin{macro}{\RubikLp}
+% \begin{macro}{\textRubikLp}
+% These commands all draw forms which denote the Lp rotation.
+% \begin{macrocode}
+\newcommand{\rrLp}{\@rrp{L}}
+%%
+\newcommand{\SquareLp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLp}{\raisebox{-0.333\height}{\@tlen\SquareLp\@tlen}}
+%%
+\newcommand{\RubikLp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLp\\
+\rrLp%
+\end{minipage}%
+}}
+\newcommand{\textRubikLp}{\rrLp\,\rrhLp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lw}
+%
+% \begin{macro}{\rrLw}
+% \begin{macro}{\SquareLw}
+% \begin{macro}{\rrhLw}
+% \begin{macro}{\RubikLw}
+% \begin{macro}{\textRubikLw}
+% These commands all draw forms which denote the Lw rotation.
+% \begin{macrocode}
+\newcommand{\rrLw}{\@rrw{L}}
+%%
+\newcommand{\SquareLw}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick, <-] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLw}{\raisebox{-0.333\height}{\@tlen\SquareLw\@tlen}}
+%%
+\newcommand{\RubikLw}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLw\\
+\rrLw%
+\end{minipage}%
+}}
+\newcommand{\textRubikLw}{\rrLw\,\rrhLw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lwp}
+%
+% \begin{macro}{\rrLwp}
+% \begin{macro}{\SquareLwp}
+% \begin{macro}{\rrhLwp}
+% \begin{macro}{\RubikLwp}
+% \begin{macro}{\textRubikLwp}
+% These commands all draw forms which denote the Lwp rotation.
+% \begin{macrocode}
+\newcommand{\rrLwp}{\@rrwp{L}}
+%%
+\newcommand{\SquareLwp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick,->] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLwp}{\raisebox{-0.333\height}{\@tlen\SquareLwp\@tlen}}
+%%
+\newcommand{\RubikLwp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLwp\\
+\rrLwp%
+\end{minipage}%
+}}
+\newcommand{\textRubikLwp}{\rrLwp\,\rrhLwp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ls}
+%
+% \begin{macro}{\rrLs}
+% \begin{macro}{\SquareLs}
+% \begin{macro}{\rrhLs}
+% \begin{macro}{\RubikLs}
+% \begin{macro}{\textRubikLs}
+% These commands all draw forms which denote the Ls rotation.
+% \begin{macrocode}
+\newcommand{\rrLs}{\@rrs{L}}
+%%
+\newcommand{\SquareLs}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, <-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLs}{\raisebox{-0.333\height}{\@tlen\SquareLs\@tlen}}
+%%
+\newcommand{\RubikLs}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLs\\
+\rrLs%
+\end{minipage}%
+}}
+\newcommand{\textRubikLs}{\rrLs\,\rrhLs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lsp}
+%
+% \begin{macro}{\rrLsp}
+% \begin{macro}{\SquareLsp}
+% \begin{macro}{\rrhLsp}
+% \begin{macro}{\RubikLsp}
+% \begin{macro}{\textRubikLsp}
+% These commands all draw forms which denote the Lsp rotation.
+% \begin{macrocode}
+\newcommand{\rrLsp}{\@rrsp{L}}
+%%
+\newcommand{\SquareLsp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, ->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLsp}{\raisebox{-0.333\height}{\@tlen\SquareLsp\@tlen}}
+%%
+\newcommand{\RubikLsp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLsp\\
+\rrLsp%
+\end{minipage}%
+}}
+\newcommand{\textRubikLsp}{\rrLsp\,\rrhLsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation La}
+%
+% \begin{macro}{\rrLa}
+% \begin{macro}{\SquareLa}
+% \begin{macro}{\rrhLa}
+% \begin{macro}{\RubikLa}
+% \begin{macro}{\textRubikLa}
+% These commands all draw forms which denote the La rotation.
+% \begin{macrocode}
+\newcommand{\rrLa}{\@rra{L}}
+%%
+\newcommand{\SquareLa}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, ->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLa}{\raisebox{-0.333\height}{\@tlen\SquareLa\@tlen}}
+%%
+\newcommand{\RubikLa}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLa\\
+\rrLa%
+\end{minipage}%
+}}
+\newcommand{\textRubikLa}{\rrLa\,\rrhLa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lap}
+%
+% \begin{macro}{\rrLap}
+% \begin{macro}{\SquareLap}
+% \begin{macro}{\rrhLap}
+% \begin{macro}{\RubikLap}
+% \begin{macro}{\textRubikLap}
+% These commands all draw forms which denote the Lap rotation.
+% \begin{macrocode}
+\newcommand{\rrLap}{\@rrap{L}}
+%%
+\newcommand{\SquareLap}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, <-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhLap}{\raisebox{-0.333\height}{\@tlen\SquareLap\@tlen}}
+%%
+\newcommand{\RubikLap}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLap\\
+\rrLap%
+\end{minipage}%
+}}
+\newcommand{\textRubikLap}{\rrLap\,\rrhLap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation M}
+%
+% \begin{macro}{\rrM}
+% \begin{macro}{\SquareM}
+% \begin{macro}{\rrhM}
+% \begin{macro}{\RubikM}
+% \begin{macro}{\textRubikM}
+% These commands all draw forms which denote the M rotation.
+% \begin{macrocode}
+\newcommand{\rrM}{\@rr{M}}
+%%
+\newcommand{\SquareM}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick, <-] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhM}{\raisebox{-0.333\height}{\@tlen\SquareM\@tlen}}
+%%
+\newcommand{\RubikM}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrM%
+\end{minipage}%
+}}
+\newcommand{\textRubikM}{\rrM\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Mp}
+%
+% \begin{macro}{\rrMp}
+% \begin{macro}{\SquareMp}
+% \begin{macro}{\rrhMp}
+% \begin{macro}{\RubikMp}
+% \begin{macro}{\textRubikMp}
+% These commands all draw forms which denote the Mp rotation.
+% \begin{macrocode}
+\newcommand{\rrMp}{\@rrp{M}}
+%%
+\newcommand{\SquareMp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick,->] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhMp}{\raisebox{-0.333\height}{\@tlen\SquareMp\@tlen}}
+%%
+\newcommand{\RubikMp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrMp%
+\end{minipage}%
+}}
+\newcommand{\textRubikMp}{\rrMp\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation R}
+%
+% \begin{macro}{\rrR}
+% \begin{macro}{\SquareR}
+% \begin{macro}{\rrhR}
+% \begin{macro}{\RubikR}
+% \begin{macro}{\textRubikR}
+% These commands all draw forms which denote the R rotation.
+% \begin{macrocode}
+\newcommand{\rrR}{\@rr{R}}
+%%
+\newcommand{\SquareR}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+%% draw three lines in the square, one with an arrow
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, ->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhR}{\raisebox{-0.333\height}{\@tlen\SquareR\@tlen}}
+%%
+\newcommand{\RubikR}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareR\\
+\rrR%
+\end{minipage}%
+}}
+\newcommand{\textRubikR}{\rrR\,\rrhR}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rp}
+%
+% \begin{macro}{\rrRp}
+% \begin{macro}{\SquareRp}
+% \begin{macro}{\rrhRp}
+% \begin{macro}{\RubikRp}
+% \begin{macro}{\textRubikRp}
+% These commands all draw forms which denote the Rp rotation.
+% \begin{macrocode}
+\newcommand{\rrRp}{\@rrp{R}}
+%%
+\newcommand{\SquareRp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, <-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRp}{\raisebox{-0.333\height}{\@tlen\SquareRp\@tlen}}
+%%
+\newcommand{\RubikRp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRp\\
+\rrRp%
+\end{minipage}%
+}}
+\newcommand{\textRubikRp}{\rrRp\,\rrhRp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rw}
+%
+% \begin{macro}{\rrRw}
+% \begin{macro}{\SquareRw}
+% \begin{macro}{\rrhRw}
+% \begin{macro}{\RubikRw}
+% \begin{macro}{\textRubikRw}
+% These commands all draw forms which denote the Rw rotation.
+% \begin{macrocode}
+\newcommand{\rrRw}{\@rrw{R}}
+%%
+\newcommand{\SquareRw}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick, ->] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, ->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRw}{\raisebox{-0.333\height}{\@tlen\SquareRw\@tlen}}
+%%
+\newcommand{\RubikRw}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRw\\
+\rrRw%
+\end{minipage}%
+}}
+\newcommand{\textRubikRw}{\rrRw\,\rrhRw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rwp}
+%
+% \begin{macro}{\rrRwp}
+% \begin{macro}{\SquareRwp}
+% \begin{macro}{\rrhRwp}
+% \begin{macro}{\RubikRwp}
+% \begin{macro}{\textRubikRwp}
+% These commands all draw forms which denote the Rwp rotation.
+% \begin{macrocode}
+\newcommand{\rrRwp}{\@rrwp{R}}
+%%
+\newcommand{\SquareRwp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick, <-] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick, <-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRwp}{\raisebox{-0.333\height}{\@tlen\SquareRwp\@tlen}}
+%%
+\newcommand{\RubikRwp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRwp\\
+\rrRwp%
+\end{minipage}%
+}}
+\newcommand{\textRubikRwp}{\rrRwp\,\rrhRwp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rs}
+%
+% \begin{macro}{\rrRs}
+% \begin{macro}{\SquareRs}
+% \begin{macro}{\rrhRs}
+% \begin{macro}{\RubikRs}
+% \begin{macro}{\textRubikRs}
+% These commands all draw forms which denote the Rs rotation.
+% \begin{macrocode}
+\newcommand{\rrRs}{\@rrs{R}}
+%%
+\newcommand{\SquareRs}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick,->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRs}{\raisebox{-0.333\height}{\@tlen\SquareRs\@tlen}}
+%%
+\newcommand{\RubikRs}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRs\\
+\rrRs%
+\end{minipage}%
+}}
+\newcommand{\textRubikRs}{\rrRs\,\rrhRs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rsp}
+%
+% \begin{macro}{\rrRsp}
+% \begin{macro}{\SquareRsp}
+% \begin{macro}{\rrhRsp}
+% \begin{macro}{\RubikRsp}
+% \begin{macro}{\textRubikRsp}
+% These commands all draw forms which denote the Rsp rotation.
+% \begin{macrocode}
+\newcommand{\rrRsp}{\@rrsp{R}}
+%%
+\newcommand{\SquareRsp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,<-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick,<-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRsp}{\raisebox{-0.333\height}{\@tlen\SquareRsp\@tlen}}
+%%
+\newcommand{\RubikRsp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRsp\\
+\rrRsp%
+\end{minipage}%
+}}
+\newcommand{\textRubikRsp}{\rrRsp\,\rrhRsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ra}
+%
+% \begin{macro}{\rrRa}
+% \begin{macro}{\SquareRa}
+% \begin{macro}{\rrhRa}
+% \begin{macro}{\RubikRa}
+% \begin{macro}{\textRubikRa}
+% These commands all draw forms which denote the Ra rotation.
+% \begin{macrocode}
+\newcommand{\rrRa}{\@rra{R}}
+%%
+\newcommand{\SquareRa}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,<-] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick,->] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRa}{\raisebox{-0.333\height}{\@tlen\SquareRa\@tlen}}
+%%
+\newcommand{\RubikRa}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRa\\
+\rrRa%
+\end{minipage}%
+}}
+\newcommand{\textRubikRa}{\rrRa\,\rrhRa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rap}
+%
+% \begin{macro}{\rrRap}
+% \begin{macro}{\SquareRap}
+% \begin{macro}{\rrhRap}
+% \begin{macro}{\RubikRap}
+% \begin{macro}{\textRubikRap}
+% These commands all draw forms which denote the Rap rotation.
+% \begin{macrocode}
+\newcommand{\rrRap}{\@rrap{R}}
+%%
+\newcommand{\SquareRap}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,->] (\@sd, \@sb) -- (\@sd, \@sbh);
+\draw [thick] (\@sdd,\@sb) -- (\@sdd, \@sbh);
+\draw [thick,<-] (\@sddd, \@sb) -- (\@sddd, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\rrhRap}{\raisebox{-0.333\height}{\@tlen\SquareRap\@tlen}}
+%%
+\newcommand{\RubikRap}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRap\\
+\rrRap%
+\end{minipage}%
+}}
+\newcommand{\textRubikRap}{\rrRap\,\rrhRap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation S}
+%
+% \begin{macro}{\rrS}
+% \begin{macro}{\SquareS}
+% \begin{macro}{\rrhS}
+% \begin{macro}{\RubikS}
+% \begin{macro}{\textRubikS}
+% These commands all draw forms which denote the S rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrS}{\@rr{S}}
+\newcommand{\SquareS}{\@tlen\@SquareLetter{\rrS}\@tlen}
+\newcommand{\rrhS}{\raisebox{-0.25mm}{\SquareS}}
+\newcommand{\RubikS}{\raisebox{\@hRubik}{\SquareS}}
+\newcommand{\textRubikS}{\rrhS}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sp}
+%
+% \begin{macro}{\rrSp}
+% \begin{macro}{\SquareSp}
+% \begin{macro}{\rrhSp}
+% \begin{macro}{\RubikSp}
+% \begin{macro}{\textRubikSp}
+% These commands all draw forms which denote the Sp rotation.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSp}{\@rrp{S}}
+\newcommand{\SquareSp}{\@tlen\@SquareLetter{\rrSp}\@tlen}
+\newcommand{\rrhSp}{\raisebox{-0.25mm}{\SquareSp}}
+\newcommand{\RubikSp}{\raisebox{\@hRubik}{\SquareSp}}
+\newcommand{\textRubikSp}{\rrhSp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Su}
+%
+% \begin{macro}{\rrSu}
+% \begin{macro}{\rrhSu}
+% \begin{macro}{\RubikSu}
+% \begin{macro}{\textRubikSu}
+% These commands draw forms of the Singmaster Su slice rotation.
+% We also need to fine-tune the spacing
+% between these `slice' hieroglyphs (especially Fs and Bs).
+% \begin{macrocode}
+\newcommand{\rrSu}{\@rru{S}}
+\newcommand{\rrhSu}{\rrhEp}%
+\newcommand{\RubikSu}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrSu%
+\end{minipage}%
+}}
+\newcommand{\textRubikSu}{\rrSu\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sup}
+%
+% \begin{macro}{\rrSup}
+% \begin{macro}{\rrhSup}
+% \begin{macro}{\RubikSup}
+% \begin{macro}{\textRubikSup}
+% These commands draw forms of the Singmaster Sup slice rotation.
+% We also need to fine-tune the spacing
+% between these `slice' hieroglyphs (especially Fs and Bs).
+% \begin{macrocode}
+\newcommand{\rrSup}{\@rrup{S}}
+\newcommand{\rrhSup}{\rrhE}%
+\newcommand{\RubikSup}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrSup%
+\end{minipage}%
+}}
+\newcommand{\textRubikSup}{\rrSup\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sd}
+%
+% \begin{macro}{\rrSd}
+% \begin{macro}{\rrhSd}
+% \begin{macro}{\RubikSd}
+% \begin{macro}{\textRubikSd}
+% These commands draw forms of the Singmaster Sd slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSd}{\@rrd{S}}
+\newcommand{\rrhSd}{\rrhE}%
+\newcommand{\RubikSd}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrSd%
+\end{minipage}%
+}}
+\newcommand{\textRubikSd}{\rrSd\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sdp}
+%
+% \begin{macro}{\rrSdp}
+% \begin{macro}{\rrhSdp}
+% \begin{macro}{\RubikSdp}
+% \begin{macro}{\textRubikSdp}
+% These commands draw forms of the Singmaster Sdp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSdp}{\@rrdp{S}}
+\newcommand{\rrhSdp}{\rrhEp}%
+\newcommand{\RubikSdp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrSdp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSdp}{\rrSdp\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sl}
+%
+% \begin{macro}{\rrSl}
+% \begin{macro}{\rrhSl}
+% \begin{macro}{\RubikSl}
+% \begin{macro}{\textRubikSl}
+% These commands draw forms of the Singmaster Sl slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSl}{\@rrl{S}}
+\newcommand{\rrhSl}{\rrhM}%
+\newcommand{\RubikSl}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrSl%
+\end{minipage}%
+}}
+\newcommand{\textRubikSl}{\rrSl\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Slp}
+%
+% \begin{macro}{\rrSlp}
+% \begin{macro}{\rrhSlp}
+% \begin{macro}{\RubikSlp}
+% \begin{macro}{\textRubikSlp}
+% These commands draw forms of the Singmaster Slp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSlp}{\@rrlp{S}}
+\newcommand{\rrhSlp}{\rrhMp}%
+\newcommand{\RubikSlp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrSlp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSlp}{\rrSlp\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sr}
+%
+% \begin{macro}{\rrSr}
+% \begin{macro}{\rrhSr}
+% \begin{macro}{\RubikSr}
+% \begin{macro}{\textRubikSr}
+% These commands draw forms of the Singmaster Sr slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSr}{\@rrr{S}}
+\newcommand{\rrhSr}{\rrhMp}%
+\newcommand{\RubikSr}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrSr%
+\end{minipage}%
+}}
+\newcommand{\textRubikSr}{\rrSr\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Srp}
+%
+% \begin{macro}{\rrSrp}
+% \begin{macro}{\rrhSrp}
+% \begin{macro}{\RubikSrp}
+% \begin{macro}{\textRubikSrp}
+% These commands draw forms of the Singmaster Srp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSrp}{\@rrrp{S}}
+\newcommand{\rrhSrp}{\rrhM}%
+\newcommand{\RubikSrp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrSrp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSrp}{\rrSrp\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sf}
+%
+% \begin{macro}{\rrSf}
+% \begin{macro}{\rrhSf}
+% \begin{macro}{\RubikSf}
+% \begin{macro}{\textRubikSf}
+% These commands draw forms of the Singmaster Sf slice rotation.
+% We need to just make square with Sf in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSf}{\@rrf{S}}
+\newcommand{\SquareSf}{\@tlen\@SquareLetter{\rrSf}\@tlen}
+\newcommand{\rrhSf}{\raisebox{-0.25mm}{\SquareSf}}
+\newcommand{\RubikSf}{\raisebox{\@hRubik}{\SquareSf}}
+\newcommand{\textRubikSf}{\rrhSf}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sfp}
+%
+% \begin{macro}{\rrSfp}
+% \begin{macro}{\rrhSfp}
+% \begin{macro}{\RubikSfp}
+% \begin{macro}{\textRubikSfp}
+% These commands draw forms of the Singmaster Sfp slice rotation.
+% We need to just make square with Sfp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSfp}{\@rrfp{S}}
+\newcommand{\SquareSfp}{\@tlen\@SquareLetter{\rrSfp}\@tlen}
+\newcommand{\rrhSfp}{\raisebox{-0.25mm}{\SquareSfp}}
+\newcommand{\RubikSfp}{\raisebox{\@hRubik}{\SquareSfp}}
+\newcommand{\textRubikSfp}{\rrhSfp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sb}
+%
+% \begin{macro}{\rrSb}
+% \begin{macro}{\rrhSb}
+% \begin{macro}{\RubikSb}
+% \begin{macro}{\textRubikSb}
+% These commands draw forms of the Singmaster Sb slice rotation.
+% We need to just make square with Sb in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSb}{\@rrb{S}}
+\newcommand{\SquareSb}{\@tlen\@SquareLetter{\rrSb}\@tlen}
+\newcommand{\rrhSb}{\raisebox{-0.25mm}{\SquareSb}}
+\newcommand{\RubikSb}{\raisebox{\@hRubik}{\SquareSb}}
+\newcommand{\textRubikSb}{\rrhSb}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Sbp}
+%
+% \begin{macro}{\rrSbp}
+% \begin{macro}{\rrhSbp}
+% \begin{macro}{\RubikSbp}
+% \begin{macro}{\textRubikSbp}
+% These commands draw forms of the Singmaster Sbp slice rotation.
+% We need to just make square with Sbp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from th front.
+% \begin{macrocode}
+\newcommand{\rrSbp}{\@rrbp{S}}
+\newcommand{\SquareSbp}{\@tlen\@SquareLetter{\rrSbp}\@tlen}
+\newcommand{\rrhSbp}{\raisebox{-0.25mm}{\SquareSbp}}
+\newcommand{\RubikSbp}{\raisebox{\@hRubik}{\SquareSbp}}
+\newcommand{\textRubikSbp}{\rrhSbp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation U}
+%
+% \begin{macro}{\rrU}
+% \begin{macro}{\SquareU}
+% \begin{macro}{\rrhU}
+% \begin{macro}{\RubikU}
+% \begin{macro}{\textRubikU}
+% These commands all draw forms which denote the U rotation.
+% \begin{macrocode}
+\newcommand{\rrU}{\@rr{U}}
+%%
+\newcommand{\SquareU}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhU}{\raisebox{-0.333\height}{\@tlen\SquareU\@tlen}}
+%%
+\newcommand{\RubikU}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareU\\
+\rrU%
+\end{minipage}%%
+}}
+\newcommand{\textRubikU}{\rrU\,\rrhU}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Uw}
+%
+% \begin{macro}{\rrUw}
+% \begin{macro}{\SquareUw}
+% \begin{macro}{\rrhUw}
+% \begin{macro}{\RubikUw}
+% \begin{macro}{\textRubikUw}
+% These commands all draw forms which denote the Uw rotation.
+% \begin{macrocode}
+\newcommand{\rrUw}{\@rrw{U}}
+%%
+\newcommand{\SquareUw}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, <-] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+%
+\newcommand{\rrhUw}{\raisebox{-0.333\height}{\@tlen\SquareUw\@tlen}}
+%%
+\newcommand{\RubikUw}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUw\\
+\rrUw%
+\end{minipage}%%
+}}
+%%
+\newcommand{\textRubikUw}{\rrUw\,\rrhUw}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Up}
+%
+% \begin{macro}{\rrUp}
+% \begin{macro}{\SquareUp}
+% \begin{macro}{\rrhUp}
+% \begin{macro}{\RubikUp}
+% \begin{macro}{\textRubikUp}
+% These commands all draw forms which denote the Up rotation.
+% \begin{macrocode}
+\newcommand{\rrUp}{\@rrp{U}}
+%%
+\newcommand{\SquareUp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUp}{\raisebox{-0.333\height}{\@tlen\SquareUp\@tlen}}
+%%
+\newcommand{\RubikUp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUp\\
+\rrUp%
+\end{minipage}%%
+}}
+\newcommand{\textRubikUp}{\rrUp\,\rrhUp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Uwp}
+%
+% \begin{macro}{\rrUwp}
+% \begin{macro}{\SquareUwp}
+% \begin{macro}{\rrhUwp}
+% \begin{macro}{\RubikUwp}
+% \begin{macro}{\textRubikUwp}
+% These commands all draw forms which denote the Uwp rotation.
+% \begin{macrocode}
+\newcommand{\rrUwp}{\@rrwp{U}}
+%%
+\newcommand{\SquareUwp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick, ->] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUwp}{\raisebox{-0.333\height}{\@tlen\SquareUwp\@tlen}}
+%%
+\newcommand{\RubikUwp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUwp\\
+\rrUwp%
+\end{minipage}%%
+}}
+\newcommand{\textRubikUwp}{\rrUwp\,\rrhUwp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Us}
+%
+% \begin{macro}{\rrUs}
+% \begin{macro}{\SquareUs}
+% \begin{macro}{\rrhUs}
+% \begin{macro}{\RubikUs}
+% \begin{macro}{\textRubikUs}
+% These commands all draw forms which denote the Us rotation.
+% \begin{macrocode}
+\newcommand{\rrUs}{\@rrs{U}}
+%%
+\newcommand{\SquareUs}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUs}{\raisebox{-0.333\height}{\@tlen\SquareUs\@tlen}}
+%%
+\newcommand{\RubikUs}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUs\\
+\rrUs%
+\end{minipage}%
+}}
+\newcommand{\textRubikUs}{\rrUs\,\rrhUs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Usp}
+%
+% \begin{macro}{\rrUsp}
+% \begin{macro}{\SquareUsp}
+% \begin{macro}{\rrhUs}
+% \begin{macro}{\RubikUs}
+% \begin{macro}{\textRubikUsp}
+% These commands all draw forms which denote the Usp rotation.
+% \begin{macrocode}
+\newcommand{\rrUsp}{\@rrsp{U}}
+%%
+\newcommand{\SquareUsp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUsp}{\raisebox{-0.333\height}{\@tlen\SquareUsp\@tlen}}
+%%
+\newcommand{\RubikUsp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUsp\\
+\rrUsp%
+\end{minipage}%
+}}
+\newcommand{\textRubikUsp}{\rrUsp\,\rrhUsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Ua}
+%
+% \begin{macro}{\rrUa}
+% \begin{macro}{\SquareUa}
+% \begin{macro}{\rrhUa}
+% \begin{macro}{\RubikUa}
+% \begin{macro}{\textRubikUa}
+% These commands all draw forms which denote the Ua rotation.
+% \begin{macrocode}
+\newcommand{\rrUa}{\@rra{U}}
+%%
+\newcommand{\SquareUa}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, ->] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUa}{\raisebox{-0.333\height}{\@tlen\SquareUa\@tlen}}
+%%
+\newcommand{\RubikUa}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUa\\
+\rrUa%
+\end{minipage}%
+}}
+\newcommand{\textRubikUa}{\rrUa\,\rrhUa}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Uap}
+%
+% \begin{macro}{\rrUap}
+% \begin{macro}{\SquareUap}
+% \begin{macro}{\rrhUap}
+% \begin{macro}{\RubikUap}
+% \begin{macro}{\textRubikUap}
+% These commands all draw forms which denote the Uap rotation.
+% \begin{macrocode}
+\newcommand{\rrUap}{\@rrap{U}}
+%%
+\newcommand{\SquareUap}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd) -- (\@sbh, \@sddd);
+\draw [thick] (\@sb,\@sdd) -- (\@sbh, \@sdd);
+\draw [thick, <-] (\@sb,\@sd) -- (\@sbh, \@sd);
+\end{tikzpicture}%
+}
+\newcommand{\rrhUap}{\raisebox{-0.333\height}{\@tlen\SquareUap\@tlen}}
+%%
+\newcommand{\RubikUap}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUap\\
+\rrUap%
+\end{minipage}%
+}}
+\newcommand{\textRubikUap}{\rrUap\,\rrhUap}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotations x and xp}
+%
+% \begin{macro}{\rrx}
+% \begin{macro}{\rrhx}
+% \begin{macro}{\Rubikx}
+% These commands all draw forms which denote the x rotation.
+% \begin{macrocode}
+\newcommand{\rrx}{\@rr{x}}
+\newcommand{\Rubikx}{\@xyzRubik{x}}
+\newcommand{\rrhx}{\@xyzh{x}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrxp}
+% \begin{macro}{\rrhxp}
+% \begin{macro}{\Rubikxp}
+% These commands all draw forms which denote the xp rotation.
+% \begin{macrocode}
+\newcommand{\rrxp}{\@rrp{x}}
+\newcommand{\Rubikxp}{\@xyzRubikp{x}}
+\newcommand{\rrhxp}{\@xyzhp{x}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations y and yp}
+%
+% \begin{macro}{\rry}
+% \begin{macro}{\rrhy}
+% \begin{macro}{\Rubiky}
+% These commands all draw forms which denote the y rotation.
+% \begin{macrocode}
+\newcommand{\rry}{\@rr{y}}
+\newcommand{\Rubiky}{\@xyzRubik{y}}
+\newcommand{\rrhy}{\@xyzh{y}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rryp}
+% \begin{macro}{\rrhyp}
+% \begin{macro}{\Rubikyp}
+% These commands all draw forms which denote the yp rotation.
+% \begin{macrocode}
+\newcommand{\rryp}{\@rrp{y}}
+\newcommand{\Rubikyp}{\@xyzRubikp{y}}
+\newcommand{\rrhyp}{\@xyzhp{y}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations z and zp}
+%
+% \begin{macro}{\rrz}
+% \begin{macro}{\rrhz}
+% \begin{macro}{\Rubikz}
+% These commands all draw forms which denote the z rotation.
+% \begin{macrocode}
+\newcommand{\rrz}{\@rr{z}}
+\newcommand{\Rubikz}{\@xyzRubik{z}}
+\newcommand{\rrhz}{\@xyzh{z}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrzp}
+% \begin{macro}{\rrhzp}
+% \begin{macro}{\Rubikzp}
+% These commands all draw forms which denote the zp rotation.
+% \begin{macrocode}
+\newcommand{\rrzp}{\@rrp{z}}
+\newcommand{\Rubikzp}{\@xyzRubikp{z}}
+\newcommand{\rrhzp}{\@xyzhp{z}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations u and d}
+%
+% \begin{macro}{\rru}
+% \begin{macro}{\rrhu}
+% \begin{macro}{\Rubiku}
+% These commands all draw forms which denote the u and up cube rotation.
+% \begin{macrocode}
+\newcommand{\rru}{\@rr{u}}
+\newcommand{\rrup}{\@rrp{u}}
+\newcommand{\rrhu}{\@xyzh{u}}
+\newcommand{\rrhup}{\@xyzhp{u}}
+\newcommand{\Rubiku}{\@xyzRubik{u}}
+\newcommand{\Rubikup}{\@xyzRubikp{u}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrd}
+% \begin{macro}{\rrhd}
+% \begin{macro}{\Rubikd}
+% These commands all draw forms which denote the d and dp cube rotation.
+% \begin{macrocode}
+\newcommand{\rrd}{\@rr{d}}
+\newcommand{\rrdp}{\@rrp{d}}
+\newcommand{\rrhd}{\@xyzhbdfl{d}}
+\newcommand{\rrhdp}{\@xyzhbdflp{d}}
+\newcommand{\Rubikd}{\@xyzbdflRubik{d}}
+\newcommand{\Rubikdp}{\@xyzbdflRubikp{d}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations l and r}
+%
+% \begin{macro}{\rrl}
+% \begin{macro}{\rrhl}
+% \begin{macro}{\Rubikl}
+% These commands all draw forms which denote the l and lp cube rotation.
+% \begin{macrocode}
+\newcommand{\rrl}{\@rr{l}}
+\newcommand{\rrlp}{\@rrp{l}}
+\newcommand{\rrhl}{\@xyzhbdfl{l}}
+\newcommand{\rrhlp}{\@xyzhbdflp{l}}
+\newcommand{\Rubikl}{\@xyzbdflRubik{l}}
+\newcommand{\Rubiklp}{\@xyzbdflRubikp{l}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrr}
+% \begin{macro}{\rrhr}
+% \begin{macro}{\Rubikr}
+% These commands all draw forms which denote the r and rp cube rotation.
+% \begin{macrocode}
+\newcommand{\rrr}{\@rr{r}}
+\newcommand{\rrrp}{\@rrp{r}}
+\newcommand{\rrhr}{\@xyzh{r}}
+\newcommand{\rrhrp}{\@xyzhp{r}}
+\newcommand{\Rubikr}{\@xyzRubik{r}}
+\newcommand{\Rubikrp}{\@xyzRubikp{r}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations f and b}
+%
+% \begin{macro}{\rrf}
+% \begin{macro}{\rrhf}
+% \begin{macro}{\Rubikf}
+% These commands all draw forms which denote the f and fp cube rotation.
+% \begin{macrocode}
+\newcommand{\rrf}{\@rr{f}}
+\newcommand{\rrfp}{\@rrp{f}}
+\newcommand{\rrhf}{\@xyzhbdfl{f}}
+\newcommand{\rrhfp}{\@xyzhbdflp{f}}
+\newcommand{\Rubikf}{\@xyzbdflRubik{f}}
+\newcommand{\Rubikfp}{\@xyzbdflRubikp{f}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrb}
+% \begin{macro}{\rrhb}
+% \begin{macro}{\Rubikb}
+% These commands all draw forms which denote the b and bp cube rotation.
+% \begin{macrocode}
+\newcommand{\rrb}{\@rr{b}}
+\newcommand{\rrbp}{\@rrp{b}}
+\newcommand{\rrhb}{\@xyzhbdfl{b}}
+\newcommand{\rrhbp}{\@xyzhbdflp{b}}
+\newcommand{\Rubikb}{\@xyzbdflRubik{b}}
+\newcommand{\Rubikbp}{\@xyzbdflRubikp{b}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}Face(c) and Face(m) rotations}
+% \label{sec:codeJaap}
+%
+% This subsection (added Nov 2016) is to accommodate some additional notation,
+% much used on the Jaap Puzzles website (Scherphius J), which, although quite
+% convenient, is technically `non-standard'. This additional notation
+% makes available the (middle slice) rotations of the form Rm, Rmp, Lm, Lmp, ... and
+% also the (whole cube) rotations Rc, Lc, ... (referenced to a face) as used on the
+% Cube Lovers usenet group (1981--1997). This notation was probably invented by Singmaster
+% (see Scherphius J).
+%
+% \begin{macro}{\@xyzhc}
+% \begin{macro}{\@xyzhcp}
+% \begin{macro}{\@xyzRubikc}
+% \begin{macro}{\@xyzRubikcp}
+% First we have some useful facilitating commands we shall make use of in
+% conjunction with the Face(c) and Face(cp) notation.
+% \begin{macrocode}
+\newcommand{\@xyzhc}[1]{[\raisebox{-1.2pt}%
+ {{\@rubikfont #1\@rubikfontFNS c}}]}
+\newcommand{\@xyzhcp}[1]{[\raisebox{-1.2pt}%
+ {{\@rubikfont #1{\@rubikfontFNS c}\@rubikprime}}]}
+\newcommand{\@xyzRubikc}[1]{\raisebox{3.45pt}%
+ {[\raisebox{-1.2pt}{{\@rubikfont #1\@rubikfontFNS c}}]}}
+\newcommand{\@xyzRubikcp}[1]{\raisebox{3.45pt}%
+ {[\raisebox{-1.2pt}{{\@rubikfont #1{\@rubikfontFNS c}\@rubikprime}}]}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Rc and Rcp}
+%
+% Whole cube rotations Rc = x, Rcp = xp.
+%
+% \begin{macro}{\rrRc}
+% \begin{macro}{\rrhRc}
+% \begin{macro}{\RubikRc}
+% These commands all draw forms which denote the Rc rotation.
+% \begin{macrocode}
+\newcommand{\rrRc}{\@rrc{R}}
+\newcommand{\RubikRc}{\@xyzRubikc{R}}
+\newcommand{\rrhRc}{\@xyzhc{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrRcp}
+% \begin{macro}{\rrhRcp}
+% \begin{macro}{\RubikRcp}
+% These commands all draw forms which denote the Rcp rotation.
+% \begin{macrocode}
+\newcommand{\rrRcp}{\@rrcp{R}}
+\newcommand{\RubikRcp}{\@xyzRubikcp{R}}
+\newcommand{\rrhRcp}{\@xyzhcp{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Lc and Lcp}
+%
+% Whole cube rotations Lc = xp, Lcp = x.
+%
+% \begin{macro}{\rrLc}
+% \begin{macro}{\rrhLc}
+% \begin{macro}{\RubikLc}
+% These commands all draw forms which denote the Lc rotation.
+% \begin{macrocode}
+\newcommand{\rrLc}{\@rrc{L}}
+\newcommand{\RubikLc}{\@xyzRubikc{L}}
+\newcommand{\rrhLc}{\@xyzhc{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrLcp}
+% \begin{macro}{\rrhLcp}
+% \begin{macro}{\RubikLcp}
+% These commands all draw forms which denote the Lcp rotation.
+% \begin{macrocode}
+\newcommand{\rrLcp}{\@rrcp{L}}
+\newcommand{\RubikLcp}{\@xyzRubikcp{L}}
+\newcommand{\rrhLcp}{\@xyzhcp{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Uc and Ucp}
+%
+% Whole cube rotation Uc = y, Ucp=yp.
+%
+% \begin{macro}{\rrUc}
+% \begin{macro}{\rrhUc}
+% \begin{macro}{\RubikUc}
+% These commands all draw forms which denote the Uc rotation.
+% \begin{macrocode}
+\newcommand{\rrUc}{\@rrc{U}}
+\newcommand{\RubikUc}{\@xyzRubikc{U}}
+\newcommand{\rrhUc}{\@xyzhc{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrUcp}
+% \begin{macro}{\rrhUcp}
+% \begin{macro}{\RubikUcp}
+% These commands all draw forms which denote the Ucp rotation.
+% \begin{macrocode}
+\newcommand{\rrUcp}{\@rrcp{U}}
+\newcommand{\RubikUcp}{\@xyzRubikcp{U}}
+\newcommand{\rrhUcp}{\@xyzhcp{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Dc and Dcp}
+%
+% Whole cube rotations Dc = yp, Dcp = y.
+%
+% \begin{macro}{\rrDc}
+% \begin{macro}{\rrhDc}
+% \begin{macro}{\RubikDc}
+% These commands all draw forms which denote the Dc rotation.
+% \begin{macrocode}
+\newcommand{\rrDc}{\@rrc{D}}
+\newcommand{\RubikDc}{\@xyzRubikc{D}}
+\newcommand{\rrhDc}{\@xyzhc{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrDcp}
+% \begin{macro}{\rrhDcp}
+% \begin{macro}{\RubikDcp}
+% These commands all draw forms which denote the Dcp rotation.
+% \begin{macrocode}
+\newcommand{\rrDcp}{\@rrcp{D}}
+\newcommand{\RubikDcp}{\@xyzRubikcp{D}}
+\newcommand{\rrhDcp}{\@xyzhcp{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Fc and Fcp}
+%
+% Whole cube rotations Fc = z, Fcp = zp.
+%
+% \begin{macro}{\rrFc}
+% \begin{macro}{\rrhFc}
+% \begin{macro}{\RubikFc}
+% These commands all draw forms which denote the Fc rotation.
+% \begin{macrocode}
+\newcommand{\rrFc}{\@rrc{F}}
+\newcommand{\RubikFc}{\@xyzRubikc{F}}
+\newcommand{\rrhFc}{\@xyzhc{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrFcp}
+% \begin{macro}{\rrhFcp}
+% \begin{macro}{\RubikFcp}
+% These commands all draw forms which denote the Fcp rotation.
+% \begin{macrocode}
+\newcommand{\rrFcp}{\@rrcp{F}}
+\newcommand{\RubikFcp}{\@xyzRubikcp{F}}
+\newcommand{\rrhFcp}{\@xyzhcp{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Bc and Bcp}
+%
+% Whole cube rotation Bc = zp, Bcp = z.
+%
+% \begin{macro}{\rrBc}
+% \begin{macro}{\rrhBc}
+% \begin{macro}{\RubikBc}
+% These commands all draw forms which denote the Bc rotation.
+% \begin{macrocode}
+\newcommand{\rrBc}{\@rrc{B}}
+\newcommand{\RubikBc}{\@xyzRubikc{B}}
+\newcommand{\rrhBc}{\@xyzhc{B}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrBcp}
+% \begin{macro}{\rrhBcp}
+% \begin{macro}{\RubikBcp}
+% These commands all draw forms which denote the Bcp rotation.
+% \begin{macrocode}
+\newcommand{\rrBcp}{\@rrcp{B}}
+\newcommand{\RubikBcp}{\@xyzRubikcp{B}}
+\newcommand{\rrhBcp}{\@xyzhcp{B}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Rm and Rmp}
+%
+% Rm = Mp= Sr (M follows Left). We use Sr and Srp as the templates.
+%
+% \begin{macro}{\rrRm}
+% \begin{macro}{\rrhRm}
+% \begin{macro}{\RubikRm}
+% \begin{macro}{\textRubikRm}
+% These commands draw forms of the Rm slice rotation.
+% \begin{macrocode}
+\newcommand{\rrRm}{\@rrm{R}}
+\newcommand{\rrhRm}{\rrhMp}%
+\newcommand{\RubikRm}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrRm%
+\end{minipage}%
+}}
+\newcommand{\textRubikRm}{\rrRm\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrRmp}
+% \begin{macro}{\rrhRmp}
+% \begin{macro}{\RubikRmp}
+% \begin{macro}{\textRubikRmp}
+% These commands draw forms of the Rmp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrRmp}{\@rrmp{R}}
+\newcommand{\rrhRmp}{\rrhM}%
+\newcommand{\RubikRmp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrRmp%
+\end{minipage}%
+}}
+\newcommand{\textRubikRmp}{\rrRmp\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Lm and Lmp}
+%
+% Lm = M = Sl (M follows Left). We use Sl and Slp as the templates.
+%
+% \begin{macro}{\rrLm}
+% \begin{macro}{\rrhLm}
+% \begin{macro}{\RubikLm}
+% \begin{macro}{\textRubikLm}
+% These commands draw forms of the Lm slice rotation.
+% \begin{macrocode}
+\newcommand{\rrLm}{\@rrm{L}}
+\newcommand{\rrhLm}{\rrhM}%
+\newcommand{\RubikLm}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrLm%
+\end{minipage}%
+}}
+\newcommand{\textRubikLm}{\rrLm\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrLmp}
+% \begin{macro}{\rrhLmp}
+% \begin{macro}{\RubikLmp}
+% \begin{macro}{\textRubikLmp}
+% These commands draw forms of the Lmp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrLmp}{\@rrmp{L}}
+\newcommand{\rrhLmp}{\rrhMp}%
+\newcommand{\RubikLmp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrLmp%
+\end{minipage}%
+}}
+\newcommand{\textRubikLmp}{\rrLmp\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Um and Ump}
+%
+% Um = Ep = Su (E follows Down). We use Su and Sup as the templates.
+%
+% \begin{macro}{\rrUm}
+% \begin{macro}{\rrhUm}
+% \begin{macro}{\RubikUm}
+% \begin{macro}{\textRubikUm}
+% These commands draw forms of the Um slice rotation.
+% We also need to fine-tune the spacing
+% between these `slice' hieroglyphs (especially Fs and Bs).
+% \begin{macrocode}
+\newcommand{\rrUm}{\@rrm{U}}
+\newcommand{\rrhUm}{\rrhEp}%
+\newcommand{\RubikUm}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrUm%
+\end{minipage}%
+}}
+\newcommand{\textRubikUm}{\rrUm\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrUmp}
+% \begin{macro}{\rrhUmp}
+% \begin{macro}{\RubikUmp}
+% \begin{macro}{\textRubikUmp}
+% These commands draw forms of the Ump slice rotation.
+% We also need to fine-tune the spacing
+% between these `slice' hieroglyphs (especially Fs and Bs).
+% \begin{macrocode}
+\newcommand{\rrUmp}{\@rrmp{U}}
+\newcommand{\rrhUmp}{\rrhE}%
+\newcommand{\RubikUmp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrUmp%
+\end{minipage}%
+}}
+\newcommand{\textRubikUmp}{\rrUmp\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Dm and Dmp}
+%
+% Dm = E = Sd (E follows Down). We use Sd and Sdp as the templates.
+%
+% \begin{macro}{\rrDm}
+% \begin{macro}{\rrhDm}
+% \begin{macro}{\RubikDm}
+% \begin{macro}{\textRubikDm}
+% These commands draw forms of the Singmaster Dm slice rotation.
+% \begin{macrocode}
+\newcommand{\rrDm}{\@rrm{D}}
+\newcommand{\rrhDm}{\rrhE}%
+\newcommand{\RubikDm}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrDm%
+\end{minipage}%
+}}
+\newcommand{\textRubikDm}{\rrDm\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrDmp}
+% \begin{macro}{\rrhDmp}
+% \begin{macro}{\RubikDmp}
+% \begin{macro}{\textRubikDmp}
+% These commands draw forms of the Singmaster Dmp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrDmp}{\@rrmp{D}}
+\newcommand{\rrhDmp}{\rrhEp}%
+\newcommand{\RubikDmp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrDmp%
+\end{minipage}%
+}}
+\newcommand{\textRubikDmp}{\rrDmp\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Fm and Fmp}
+%
+% Fm = S = Sf (S follows Front).
+% S is not visible from the front, so is represented in a square box.
+% We use Sf and Sfp as the templates.
+%
+% \begin{macro}{\rrFm}
+% \begin{macro}{\rrhFm}
+% \begin{macro}{\RubikFm}
+% \begin{macro}{\textRubikFm}
+% These commands draw forms of the Fm slice rotation.
+% We need to just make square with Fm in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFm}{\@rrm{F}}
+\newcommand{\SquareFm}{\@tlen\@SquareLetter{\rrFm}\@tlen}
+\newcommand{\rrhFm}{\raisebox{-0.25mm}{\SquareFm}}
+\newcommand{\RubikFm}{\raisebox{\@hRubik}{\SquareFm}}
+\newcommand{\textRubikFm}{\rrhFm}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrFmp}
+% \begin{macro}{\rrhFmp}
+% \begin{macro}{\RubikFmp}
+% \begin{macro}{\textRubikFmp}
+% These commands draw forms of the Fmp slice rotation.
+% We need to just make square with Fmp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrFmp}{\@rrmp{F}}
+\newcommand{\SquareFmp}{\@tlen\@SquareLetter{\rrFmp}\@tlen}
+\newcommand{\rrhFmp}{\raisebox{-0.25mm}{\SquareFmp}}
+\newcommand{\RubikFmp}{\raisebox{\@hRubik}{\SquareFmp}}
+\newcommand{\textRubikFmp}{\rrhFmp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations Bm and Bmp}
+%
+% Bm = Sp = Sb. We use Sb and Sbp as the templates.
+%
+% \begin{macro}{\rrBm}
+% \begin{macro}{\rrhBm}
+% \begin{macro}{\RubikBm}
+% \begin{macro}{\textRubikBm}
+% These commands draw forms of the Bm slice rotation.
+% We need to just make square with Bm in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBm}{\@rrm{B}}
+\newcommand{\SquareBm}{\@tlen\@SquareLetter{\rrBm}\@tlen}
+\newcommand{\rrhBm}{\raisebox{-0.25mm}{\SquareBm}}
+\newcommand{\RubikBm}{\raisebox{\@hRubik}{\SquareBm}}
+\newcommand{\textRubikBm}{\rrhBm}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrBmp}
+% \begin{macro}{\rrhBmp}
+% \begin{macro}{\RubikBmp}
+% \begin{macro}{\textRubikBmp}
+% These commands draw forms of the Bmp slice rotation.
+% We need to just make square with Bmp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrBmp}{\@rrmp{B}}
+\newcommand{\SquareBmp}{\@tlen\@SquareLetter{\rrBmp}\@tlen}
+\newcommand{\rrhBmp}{\raisebox{-0.25mm}{\SquareBmp}}
+\newcommand{\RubikBmp}{\raisebox{\@hRubik}{\SquareBmp}}
+\newcommand{\textRubikBmp}{\rrhBmp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{\hspace{3mm}Randelshofer superset ENG rotations (CMST)}
+% \label{sec:codeRandelshofer}
+%
+% (see webpage: \verb!Randelshofer.ch/rubik/patterns/doc/supersetENG_3x3.html!)
+%
+% This section relates to the recent Rubik notation developed
+% by Randelshofer (see URL above), known as the ``superset ENG rotations''
+% (see Sections~\ref{sec:RubikCommands} and \ref{sec:listofRandelshofercommands}
+% for details).
+%
+% I denote this notation as ``CMST'' (i.e.,~his C, M, S and T notation).
+% Although this notation replicates previously existing World Cube Association notation,
+% we include it here for completeness. Fortunately the Randelshofer notation does
+% not conflict with existing notation.
+%
+% Briefly, the CMST letters denote whole Cube, Middle, outer-Slice and wide (T)
+% rotations associated with named faces. For~example, the rotation-code MR
+% indicates a rotation of the middle slice parallel to the \textsc{right} face,
+% and in the same sense (direction) as \rr{R}\ (see Section~\ref{sec:RubikCommands} for details).
+%
+%
+% First we make some useful facilitating commands for the CX1 and CX1p forms
+% as these are handled with raised square brackets.
+% We model these four macros on the equivalent
+% \verb!\@xyzh!, \verb!\@xyzhp!,\verb!\@xyzRubik!,\verb!\@xyzRubikp! macros defined above.
+% \begin{macrocode}
+\newcommand{\@randhc}[1]{[\raisebox{-1.2pt}{{\@rubikfont C#1}}]}
+\newcommand{\@randhcp}[1]{[\raisebox{-1.2pt}{{\@rubikfont C#1\@rubikprime}}]}
+\newcommand{\@randRubikc}[1]%
+ {\raisebox{3.45pt}{[\raisebox{-1.2pt}{{\@rubikfont C#1}}]}}
+\newcommand{\@randRubikcp}[1]%
+ {\raisebox{3.45pt}{[\raisebox{-1.2pt}{{\@rubikfont C#1\@rubikprime}}]}}
+% \end{macrocode}
+%
+%
+% In the following we create the base form of a rotation code, eg \rrhCR\ and then
+% the user typesets this rotation using CR as the argument for \verb!\rrh{}!.
+% This works because the macro \verb!\@join{}{}! is used to join \cmd{\rrh}
+% and CR $\rightarrow$ \cmd{\rrhCR} etc.
+%
+% The = signs at the beginning of each new section indicate the equivalence
+% between the Randelshofer notation and the current (World Cube Association)
+% notation.
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CR and CRp}
+%
+% Whole cube rotations CR = Rc = x, CRp = Rcp = xp.
+%
+% \begin{macro}{\rrCR}
+% \begin{macro}{\rrhCR}
+% \begin{macro}{\RubikCR}
+% These commands all draw forms which denote the CR = Rc rotation.
+% \begin{macrocode}
+\newcommand{\rrCR}{\@rr{CR}}
+\newcommand{\RubikCR}{\@randRubikc{R}}
+\newcommand{\rrhCR}{\@randhc{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCRp}
+% \begin{macro}{\rrhCRp}
+% \begin{macro}{\RubikCRp}
+% These commands all draw forms which denote the CRp = Rcp rotation.
+% \begin{macrocode}
+\newcommand{\rrCRp}{\@rrp{CR}}
+\newcommand{\RubikCRp}{\@randRubikcp{R}}
+\newcommand{\rrhCRp}{\@randhcp{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CL and CLp}
+%
+% Whole cube rotations CL = Lc = xp, CLp = Lcp = x.
+%
+% \begin{macro}{\rrCL}
+% \begin{macro}{\rrhCL}
+% \begin{macro}{\RubikCL}
+% These commands all draw forms which denote the CL rotation.
+% \begin{macrocode}
+\newcommand{\rrCL}{\@rr{CL}}
+\newcommand{\RubikCL}{\@randRubikc{L}}
+\newcommand{\rrhCL}{\@randhc{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCLp}
+% \begin{macro}{\rrhCLp}
+% \begin{macro}{\RubikCLp}
+% These commands all draw forms which denote the CLp rotation.
+% \begin{macrocode}
+\newcommand{\rrCLp}{\@rrp{CL}}
+\newcommand{\RubikCLp}{\@randRubikcp{L}}
+\newcommand{\rrhCLp}{\@randhcp{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CU and CUp}
+%
+% Whole cube rotation CU = Uc = y, CUp = Ucp=yp.
+%
+% \begin{macro}{\rrCU}
+% \begin{macro}{\rrhCU}
+% \begin{macro}{\RubikCU}
+% These commands all draw forms which denote the CU rotation.
+% \begin{macrocode}
+\newcommand{\rrCU}{\@rr{CU}}
+\newcommand{\RubikCU}{\@randRubikc{U}}
+\newcommand{\rrhCU}{\@randhc{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCUp}
+% \begin{macro}{\rrhCUp}
+% \begin{macro}{\RubikCUp}
+% These commands all draw forms which denote the CUp rotation.
+% \begin{macrocode}
+\newcommand{\rrCUp}{\@rrp{CU}}
+\newcommand{\RubikCUp}{\@randRubikcp{U}}
+\newcommand{\rrhCUp}{\@randhcp{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CD and CDp}
+%
+% Whole cube rotations CD = Dc = yp, CDp = Dcp = y.
+%
+% \begin{macro}{\rrCD}
+% \begin{macro}{\rrhCD}
+% \begin{macro}{\RubikCD}
+% These commands all draw forms which denote the CD rotation.
+% \begin{macrocode}
+\newcommand{\rrCD}{\@rr{CD}}
+\newcommand{\RubikCD}{\@randRubikc{D}}
+\newcommand{\rrhCD}{\@randhc{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCDp}
+% \begin{macro}{\rrhCDp}
+% \begin{macro}{\RubikCDp}
+% These commands all draw forms which denote the CDp rotation.
+% \begin{macrocode}
+\newcommand{\rrCDp}{\@rrp{CD}}
+\newcommand{\RubikCDp}{\@randRubikcp{D}}
+\newcommand{\rrhCDp}{\@randhcp{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CF and CFp}
+%
+% Whole cube rotations CF = Fc = z, CFp = Fcp = zp.
+%
+% \begin{macro}{\rrCF}
+% \begin{macro}{\rrhCF}
+% \begin{macro}{\RubikCF}
+% These commands all draw forms which denote the CF rotation.
+% \begin{macrocode}
+\newcommand{\rrCF}{\@rr{CF}}
+\newcommand{\RubikCF}{\@randRubikc{F}}
+\newcommand{\rrhCF}{\@randhc{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCFp}
+% \begin{macro}{\rrhCFp}
+% \begin{macro}{\RubikCFp}
+% These commands all draw forms which denote the CFp rotation.
+% \begin{macrocode}
+\newcommand{\rrCFp}{\@rrp{CF}}
+\newcommand{\RubikCFp}{\@randRubikcp{F}}
+\newcommand{\rrhCFp}{\@randhcp{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations CB and CBp}
+%
+% Whole cube rotation CB = Bc = zp, CBp = Bcp = z.
+%
+% \begin{macro}{\rrCB}
+% \begin{macro}{\rrhCB}
+% \begin{macro}{\RubikCB}
+% These commands all draw forms which denote the CB rotation.
+% \begin{macrocode}
+\newcommand{\rrCB}{\@rr{CB}}
+\newcommand{\RubikCB}{\@randRubikc{B}}
+\newcommand{\rrhCB}{\@randhc{B}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\rrCBp}
+% \begin{macro}{\rrhCBp}
+% \begin{macro}{\RubikCBp}
+% These commands all draw forms which denote the CBp rotation.
+% \begin{macrocode}
+\newcommand{\rrCBp}{\@rrp{CB}}
+\newcommand{\RubikCBp}{\@randRubikcp{B}}
+\newcommand{\rrhCBp}{\@randhcp{B}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotations MR and MRp}
+%
+% MR = Rm = Mp= Sr (M follows Left). We use Sr and Srp as the templates.
+%
+% \begin{macro}{\rrMR}
+% \begin{macro}{\rrhMR}
+% \begin{macro}{\RubikMR}
+% \begin{macro}{\textRubikMR}
+% These commands draw forms of the MR middle slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMR}{\@rr{MR}}
+\newcommand{\rrhMR}{\rrhMp}%
+\newcommand{\RubikMR}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrMR%
+\end{minipage}%
+}}
+\newcommand{\textRubikMR}{\rrMR\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMRp}
+% \begin{macro}{\rrhMRp}
+% \begin{macro}{\RubikMRp}
+% \begin{macro}{\textRubikMRp}
+% These commands draw forms of the MRp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMRp}{\@rrp{MR}}
+\newcommand{\rrhMRp}{\rrhM}%
+\newcommand{\RubikMRp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrMRp%
+\end{minipage}%
+}}
+\newcommand{\textRubikMRp}{\rrMRp\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations ML and MLp}
+%
+% ML = Lm = M = Sl (M follows Left). We use Sl and Slp as the templates.
+%
+% \begin{macro}{\rrML}
+% \begin{macro}{\rrhML}
+% \begin{macro}{\RubikML}
+% \begin{macro}{\textRubikML}
+% These commands draw forms of the ML slice rotation.
+% \begin{macrocode}
+\newcommand{\rrML}{\@rr{ML}}
+\newcommand{\rrhML}{\rrhM}%
+\newcommand{\RubikML}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareM\\
+\rrML%
+\end{minipage}%
+}}
+\newcommand{\textRubikML}{\rrML\,\rrhM}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMLp}
+% \begin{macro}{\rrhMLp}
+% \begin{macro}{\RubikMLp}
+% \begin{macro}{\textRubikMLp}
+% These commands draw forms of the MLp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMLp}{\@rrp{ML}}
+\newcommand{\rrhMLp}{\rrhMp}%
+\newcommand{\RubikMLp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareMp\\
+\rrMLp%
+\end{minipage}%
+}}
+\newcommand{\textRubikMLp}{\rrMLp\,\rrhMp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations MU and MUp}
+%
+% MU = Um = Ep = Su (E follows Down). We use Su and Sup as the templates.
+%
+% \begin{macro}{\rrMU}
+% \begin{macro}{\rrhMU}
+% \begin{macro}{\RubikMU}
+% \begin{macro}{\textRubikMU}
+% These commands draw forms of the MU slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMU}{\@rr{MU}}
+\newcommand{\rrhMU}{\rrhEp}%
+\newcommand{\RubikMU}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrMU%
+\end{minipage}%
+}}
+\newcommand{\textRubikMU}{\rrMU\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMUp}
+% \begin{macro}{\rrhMUp}
+% \begin{macro}{\RubikMUp}
+% \begin{macro}{\textRubikMUp}
+% These commands draw forms of the MUp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMUp}{\@rrp{MU}}
+\newcommand{\rrhMUp}{\rrhE}%
+\newcommand{\RubikMUp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrMUp%
+\end{minipage}%
+}}
+\newcommand{\textRubikMUp}{\rrMUp\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations MD and MDp}
+%
+% MD = Dm = E = Sd (E follows Down). We use Sd and Sdp as the templates.
+%
+% \begin{macro}{\rrMD}
+% \begin{macro}{\rrhMD}
+% \begin{macro}{\RubikMD}
+% \begin{macro}{\textRubikMD}
+% These commands draw forms of the Randelshofer MD slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMD}{\@rr{MD}}
+\newcommand{\rrhMD}{\rrhE}%
+\newcommand{\RubikMD}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareE\\
+\rrMD%
+\end{minipage}%
+}}
+\newcommand{\textRubikMD}{\rrMD\,\rrhE}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMDp}
+% \begin{macro}{\rrhMDp}
+% \begin{macro}{\RubikMDp}
+% \begin{macro}{\textRubikMDp}
+% These commands draw forms of the Randelshofer MDp slice rotation.
+% \begin{macrocode}
+\newcommand{\rrMDp}{\@rrp{MD}}
+\newcommand{\rrhMDp}{\rrhEp}%
+\newcommand{\RubikMDp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareEp\\
+\rrMDp%
+\end{minipage}%
+}}
+\newcommand{\textRubikMDp}{\rrMDp\,\rrhEp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations MF and MFp}
+%
+% MF = Fm = S = Sf (S follows Front).
+% MF = S is not visible from the front, so is represented in a square box.
+% We use Sf and Sfp as the templates.
+%
+% \begin{macro}{\rrMF}
+% \begin{macro}{\rrhMF}
+% \begin{macro}{\RubikMF}
+% \begin{macro}{\textRubikMF}
+% These commands draw forms of the MF slice rotation.
+% We need to just make square with MF in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrMF}{\@rr{MF}}
+\newcommand{\SquareMF}{\@tlen\@SquareLetter{\rrMF}\@tlen}
+\newcommand{\rrhMF}{\raisebox{-0.25mm}{\SquareMF}}
+\newcommand{\RubikMF}{\raisebox{\@hRubik}{\SquareMF}}
+\newcommand{\textRubikMF}{\rrhMF}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMFp}
+% \begin{macro}{\rrhMFp}
+% \begin{macro}{\RubikMFp}
+% \begin{macro}{\textRubikMFp}
+% These commands draw forms of the MFp slice rotation.
+% We need to just make square with MFp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrMFp}{\@rrp{MF}}
+\newcommand{\SquareMFp}{\@tlen\@SquareLetter{\rrMFp}\@tlen}
+\newcommand{\rrhMFp}{\raisebox{-0.25mm}{\SquareMFp}}
+\newcommand{\RubikMFp}{\raisebox{\@hRubik}{\SquareMFp}}
+\newcommand{\textRubikMFp}{\rrhMFp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations MB and MBp}
+%
+% MB = Bm = Sp = Sb. We use Sb and Sbp as the templates.
+%
+% \begin{macro}{\rrMB}
+% \begin{macro}{\rrhMB}
+% \begin{macro}{\RubikMB}
+% \begin{macro}{\textRubikMB}
+% These commands draw forms of the MB slice rotation.
+% We need to just make square with MB in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrMB}{\@rr{MB}}
+\newcommand{\SquareMB}{\@tlen\@SquareLetter{\rrMB}\@tlen}
+\newcommand{\rrhMB}{\raisebox{-0.25mm}{\SquareMB}}
+\newcommand{\RubikMB}{\raisebox{\@hRubik}{\SquareMB}}
+\newcommand{\textRubikMB}{\rrhMB}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrMBp}
+% \begin{macro}{\rrhMBp}
+% \begin{macro}{\RubikMBp}
+% \begin{macro}{\textRubikMBp}
+% These commands draw forms of the MBp slice rotation.
+% We need to just make square with MBp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrMBp}{\@rrp{MB}}
+\newcommand{\SquareMBp}{\@tlen\@SquareLetter{\rrMBp}\@tlen}
+\newcommand{\rrhMBp}{\raisebox{-0.25mm}{\SquareMBp}}
+\newcommand{\RubikMBp}{\raisebox{\@hRubik}{\SquareMBp}}
+\newcommand{\textRubikMBp}{\rrhMBp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotations T (wide)}
+%
+% TR = Rw \ \ (We use Rw and Rwp as the templates).
+%
+% {\noindent}We first set up some useful T and Tp macros for use with (L,R,U,D,F,B)
+% slightly more general than before. As before the rubikfont command needs to be
+% delimited using two curly brackets to contain the font expression.
+% \begin{macrocode}
+\newcommand{\@rrT}[1]{{\@rubikfont T#1}}
+\newcommand{\@rrhT}[1]{\@join{\rrh#1}{w}}%
+\newcommand{\@textRubikT}[1]{\@rrT{#1}\,\@join{\rrh#1}{w}}
+%
+\newcommand{\@RubikT}[1]{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%%
+\@join{\Square#1}{w}\\%
+\@rrT{#1}%%
+\end{minipage}%
+}}
+%%
+\newcommand{\@rrTp}[1]{{\@rubikfont T#1\@rubikprime}}
+\newcommand{\@rrhTp}[1]{\@join{\rrh#1}{wp}}%
+\newcommand{\@textRubikTp}[1]{\@rrTp{#1}\,\@join{\rrh#1}{wp}}
+%%
+\newcommand{\@RubikTp}[1]{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%%
+\@join{\Square#1}{wp}\\%
+\@rrTp{#1}%%
+\end{minipage}%
+}}
+% \end{macrocode}
+%
+%
+%
+% \begin{macro}{\rrTL}
+% \begin{macro}{\rrhTL}
+% \begin{macro}{\RubikTL}
+% \begin{macro}{\textRubikTL}
+% These commands draw forms of the TL = Lw wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTL}{\@rrT{L}}% = rrLw
+\newcommand{\rrhTL}{\@rrhT{L}}
+\newcommand{\textRubikTL}{\@textRubikT{L}}
+\newcommand{\RubikTL}{\@RubikT{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTLp}
+% \begin{macro}{\rrhTLp}
+% \begin{macro}{\RubikTLp}
+% \begin{macro}{\textRubikTLp}
+% These commands draw forms of the TLp = Lwp wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTLp}{\@rrTp{L}}
+\newcommand{\rrhTLp}{\@rrhTp{L}}
+\newcommand{\textRubikTLp}{\@textRubikTp{L}}
+\newcommand{\RubikTLp}{\@RubikTp{L}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\rrTR}
+% \begin{macro}{\rrhTR}
+% \begin{macro}{\RubikTR}
+% \begin{macro}{\textRubikTR}
+% These commands draw forms of the TR = Rw wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTR}{\@rrT{R}}
+\newcommand{\rrhTR}{\@rrhT{R}}
+\newcommand{\textRubikTR}{\@textRubikT{R}}
+\newcommand{\RubikTR}{\@RubikT{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTRp}
+% \begin{macro}{\rrhTRp}
+% \begin{macro}{\RubikTRp}
+% \begin{macro}{\textRubikTRp}
+% These commands draw forms of the TRp = Rmp wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTRp}{\@rrTp{R}}
+\newcommand{\rrhTRp}{\@rrhTp{R}}
+\newcommand{\textRubikTRp}{\@textRubikTp{R}}
+\newcommand{\RubikTRp}{\@RubikTp{R}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\rrTU}
+% \begin{macro}{\rrhTU}
+% \begin{macro}{\RubikTU}
+% \begin{macro}{\textRubikTU}
+% These commands draw forms of the TU = Uw wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTU}{\@rrT{U}}
+\newcommand{\rrhTU}{\@rrhT{U}}
+\newcommand{\textRubikTU}{\@textRubikT{U}}
+\newcommand{\RubikTU}{\@RubikT{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTUp}
+% \begin{macro}{\rrhTUp}
+% \begin{macro}{\RubikTUp}
+% \begin{macro}{\textRubikTUp}
+% These commands draw forms of the TUp = Uwp wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTUp}{\@rrTp{U}}
+\newcommand{\rrhTUp}{\@rrhTp{U}}
+\newcommand{\textRubikTUp}{\@textRubikTp{U}}
+\newcommand{\RubikTUp}{\@RubikTp{U}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\rrTD}
+% \begin{macro}{\rrhTD}
+% \begin{macro}{\RubikTD}
+% \begin{macro}{\textRubikTD}
+% These commands draw forms of the TD = Dw wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTD}{\@rrT{D}}
+\newcommand{\rrhTD}{\@rrhT{D}}
+\newcommand{\textRubikTD}{\@textRubikT{D}}
+\newcommand{\RubikTD}{\@RubikT{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTDp}
+% \begin{macro}{\rrhTDp}
+% \begin{macro}{\RubikTDp}
+% \begin{macro}{\textRubikTDp}
+% These commands draw forms of the TDp = Dwp wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTDp}{\@rrTp{D}}
+\newcommand{\rrhTDp}{\@rrhTp{D}}
+\newcommand{\textRubikTDp}{\@textRubikTp{D}}
+\newcommand{\RubikTDp}{\@RubikTp{D}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrTF}
+% \begin{macro}{\rrhTF}
+% \begin{macro}{\RubikTF}
+% \begin{macro}{\textRubikTF}
+% These commands draw forms of the TF = Fw wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTF}{\@rrT{F}}
+\newcommand{\rrhTF}{\@rrhT{F}}
+\newcommand{\textRubikTF}{\@textRubikT{F}}
+\newcommand{\RubikTF}{\@RubikT{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTFp}
+% \begin{macro}{\rrhTFp}
+% \begin{macro}{\RubikTFp}
+% \begin{macro}{\textRubikTFp}
+% These commands draw forms of the TFp = Fwp wide slice rotation.
+% \begin{macrocode}
+\newcommand{\rrTFp}{\@rrTp{F}}
+\newcommand{\rrhTFp}{\@rrhTp{F}}
+\newcommand{\textRubikTFp}{\@textRubikTp{F}}
+\newcommand{\RubikTFp}{\@RubikTp{F}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\rrTB}
+% \begin{macro}{\rrhTB}
+% \begin{macro}{\RubikTB}
+% \begin{macro}{\textRubikTB}
+% These commands draw forms of the TB = Bw wide slice rotation.
+% NOTE we just use the letters TB in a square
+% \begin{macrocode}
+\newcommand{\rrTB}{\@rrT{B}}
+\newcommand{\SquareTB}{\@tlen\@SquareLetter{\rrTB}\@tlen}
+\newcommand{\rrhTB}{\raisebox{-0.25mm}{\SquareTB}}
+\newcommand{\textRubikTB}{\rrhTB}
+\newcommand{\RubikTB}{\raisebox{\@hRubik}{\SquareTB}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\rrTBp}
+% \begin{macro}{\rrhTBp}
+% \begin{macro}{\RubikTBp}
+% \begin{macro}{\textRubikTBp}
+% These commands draw forms of the TBp = Bwp wide slice rotation.
+% NOTE we just use the letters TB' in a square
+% \begin{macrocode}
+\newcommand{\rrTBp}{\@rrTp{B}}
+\newcommand{\SquareTBp}{\@tlen\@SquareLetter{\rrTBp}\@tlen}
+\newcommand{\rrhTBp}{\raisebox{-0.25mm}{\SquareTBp}}
+\newcommand{\textRubikTBp}{\rrhTBp}
+\newcommand{\RubikTBp}{\raisebox{\@hRubik}{\SquareTBp}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SR and SRp (opposite slices)}
+%
+% opposite slices in same direction
+% SR = Rs (both rotating in R direction)
+%
+% \begin{macro}{\rrSR}
+% \begin{macro}{\rrhSR}
+% \begin{macro}{\RubikSR}
+% \begin{macro}{\textRubikSR}
+% These commands draw forms of the SR opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSR}{\@rr{SR}}
+\newcommand{\rrhSR}{\rrhRs}%
+\newcommand{\RubikSR}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRs\\
+\rrSR%
+\end{minipage}%
+}}
+\newcommand{\textRubikSR}{\rrSR\,\rrhRs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSRp}
+% \begin{macro}{\rrhSRp}
+% \begin{macro}{\RubikSRp}
+% \begin{macro}{\textRubikSRp}
+% These commands draw forms of the SRp opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSRp}{\@rrp{SR}}
+\newcommand{\rrhSRp}{\rrhRsp}%
+\newcommand{\RubikSRp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareRsp\\
+\rrSRp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSRp}{\rrSRp\,\rrhRsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SL and SLp}
+%
+% SL = Ls (both rotating in L direction)
+%
+% \begin{macro}{\rrSL}
+% \begin{macro}{\rrhSL}
+% \begin{macro}{\RubikSL}
+% \begin{macro}{\textRubikSL}
+% These commands draw forms of the SL opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSL}{\@rr{SL}}
+\newcommand{\rrhSL}{\rrhLs}%
+\newcommand{\RubikSL}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLs\\
+\rrSL%
+\end{minipage}%
+}}
+\newcommand{\textRubikSL}{\rrSL\,\rrhLs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSLp}
+% \begin{macro}{\rrhSLp}
+% \begin{macro}{\RubikSLp}
+% \begin{macro}{\textRubikSLp}
+% These commands draw forms of the SLp opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSLp}{\@rrp{SL}}
+\newcommand{\rrhSLp}{\rrhLsp}%
+\newcommand{\RubikSLp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareLsp\\
+\rrSLp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSLp}{\rrSLp\,\rrhLsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SU and SUp}
+%
+% SU = Us (both rotating in U direction)
+%
+% \begin{macro}{\rrSU}
+% \begin{macro}{\rrhSU}
+% \begin{macro}{\RubikSU}
+% \begin{macro}{\textRubikSU}
+% These commands draw forms of the SU opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSU}{\@rr{SU}}
+\newcommand{\rrhSU}{\rrhUs}%
+\newcommand{\RubikSU}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUs\\
+\rrSU%
+\end{minipage}%
+}}
+\newcommand{\textRubikSU}{\rrSU\,\rrhUs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSUp}
+% \begin{macro}{\rrhSUp}
+% \begin{macro}{\RubikSUp}
+% \begin{macro}{\textRubikSUp}
+% These commands draw forms of the SUp opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSUp}{\@rrp{SU}}
+\newcommand{\rrhSUp}{\rrhUsp}%
+\newcommand{\RubikSUp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareUsp\\
+\rrSUp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSUp}{\rrSUp\,\rrhUsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SD and SDp}
+%
+% SD = Ds (both rotating in D direction)
+%
+% \begin{macro}{\rrSD}
+% \begin{macro}{\rrhSD}
+% \begin{macro}{\RubikSD}
+% \begin{macro}{\textRubikSD}
+% These commands draw forms of the SD opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSD}{\@rr{SD}}
+\newcommand{\rrhSD}{\rrhDs}%
+\newcommand{\RubikSD}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDs\\
+\rrSD%
+\end{minipage}%
+}}
+\newcommand{\textRubikSD}{\rrSD\,\rrhDs}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSDp}
+% \begin{macro}{\rrhSDp}
+% \begin{macro}{\RubikSDp}
+% \begin{macro}{\textRubikSDp}
+% These commands draw forms of the SDp opposite slice rotation.
+% \begin{macrocode}
+\newcommand{\rrSDp}{\@rrp{SD}}
+\newcommand{\rrhSDp}{\rrhDsp}%
+\newcommand{\RubikSDp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquareDsp\\
+\rrSDp%
+\end{minipage}%
+}}
+\newcommand{\textRubikSDp}{\rrSDp\,\rrhDsp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SF and SFp}
+%
+% SF = Fs is not visible from the front, so is represented in a square box.
+% Both rotating in the F direction
+% We use Fs and Fsp as the templates.
+%
+% \begin{macro}{\rrSF}
+% \begin{macro}{\rrhSF}
+% \begin{macro}{\RubikSF}
+% \begin{macro}{\textRubikSF}
+% These commands draw forms of the SF opposite slice rotation.
+% We need to just make square with SF in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSF}{\@rr{SF}}
+\newcommand{\SquareSF}{\@tlen\@SquareLetter{\rrSF}\@tlen}
+\newcommand{\rrhSF}{\raisebox{-0.25mm}{\SquareSF}}
+\newcommand{\RubikSF}{\raisebox{\@hRubik}{\SquareSF}}
+\newcommand{\textRubikSF}{\rrhSF}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSFp}
+% \begin{macro}{\rrhSFp}
+% \begin{macro}{\RubikSFp}
+% \begin{macro}{\textRubikSFp}
+% These commands draw forms of the SFp opposite slice rotation.
+% We need to just make square with SFp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSFp}{\@rrp{SF}}
+\newcommand{\SquareSFp}{\@tlen\@SquareLetter{\rrSFp}\@tlen}
+\newcommand{\rrhSFp}{\raisebox{-0.25mm}{\SquareSFp}}
+\newcommand{\RubikSFp}{\raisebox{\@hRubik}{\SquareSFp}}
+\newcommand{\textRubikSFp}{\rrhSFp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotations SB and SBp}
+%
+% SB = Bs is not visible from the front, so is represented in a square box.
+% Both rotating in the B direction
+% We use Bs and Bsp as the templates.
+%
+% \begin{macro}{\rrSB}
+% \begin{macro}{\rrhSB}
+% \begin{macro}{\RubikSB}
+% \begin{macro}{\textRubikSB}
+% These commands draw forms of the SB opposite slice rotation.
+% We need to just make square with SB in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSB}{\@rr{SB}}
+\newcommand{\SquareSB}{\@tlen\@SquareLetter{\rrSB}\@tlen}
+\newcommand{\rrhSB}{\raisebox{-0.25mm}{\SquareSB}}
+\newcommand{\RubikSB}{\raisebox{\@hRubik}{\SquareSB}}
+\newcommand{\textRubikSB}{\rrhSB}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \begin{macro}{\rrSBp}
+% \begin{macro}{\rrhSBp}
+% \begin{macro}{\RubikSBp}
+% \begin{macro}{\textRubikSBp}
+% These commands draw forms of the SBp opposite slice rotation.
+% We need to just make square with SBp in square;
+% adjust box height using a \cmd{\rule};
+% adjust \cmd{\fboxsep} (default=3pt);
+% adjust \cmd{\fboxrule} (default=0.4pt);
+% bounded by \{\} so no need to reset to defaults.
+% Not visible from the front.
+% \begin{macrocode}
+\newcommand{\rrSBp}{\@rrp{SB}}
+\newcommand{\SquareSBp}{\@tlen\@SquareLetter{\rrSBp}\@tlen}
+\newcommand{\rrhSBp}{\raisebox{-0.25mm}{\SquareSBp}}
+\newcommand{\RubikSBp}{\raisebox{\@hRubik}{\SquareSBp}}
+\newcommand{\textRubikSBp}{\rrhSBp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{\hspace{3mm}Axis rotations (textRubik versions)}
+% \label{sec:codetextrubikaxisversions}
+%
+% For completeness we include a \cmd{\textRubik} version of all the
+% axis rotation codes (making them equal to their hieroglyphic \cmd{\rrh} version).
+% Obviously this list must go at the end of this file. While these commands are perhaps
+% strictly unnecessary, the motivation is to allow users to include them in
+% a \cmd{\ShowSequence} command when using the \cmd{\textRubik} font argument.
+%
+% \begin{macrocode}
+\newcommand{\textRubikx}{\rrhx}
+\newcommand{\textRubikxp}{\rrhxp}
+\newcommand{\textRubiky}{\rrhy}
+\newcommand{\textRubikyp}{\rrhyp}
+\newcommand{\textRubikz}{\rrhz}
+\newcommand{\textRubikzp}{\rrhzp}
+\newcommand{\textRubikl}{\rrhl}
+\newcommand{\textRubiklp}{\rrhlp}
+\newcommand{\textRubikr}{\rrhr}
+\newcommand{\textRubikrp}{\rrhrp}
+\newcommand{\textRubiku}{\rrhu}
+\newcommand{\textRubikup}{\rrhup}
+\newcommand{\textRubikd}{\rrhd}
+\newcommand{\textRubikdp}{\rrhdp}
+\newcommand{\textRubikf}{\rrhf}
+\newcommand{\textRubikfp}{\rrhfp}
+\newcommand{\textRubikb}{\rrhb}
+\newcommand{\textRubikbp}{\rrhbp}
+\newcommand{\textRubikLc}{\rrhLc}
+\newcommand{\textRubikLcp}{\rrhLcp}
+\newcommand{\textRubikRc}{\rrhRc}
+\newcommand{\textRubikRcp}{\rrhRcp}
+\newcommand{\textRubikUc}{\rrhUc}
+\newcommand{\textRubikUcp}{\rrhUcp}
+\newcommand{\textRubikDc}{\rrhDc}
+\newcommand{\textRubikDcp}{\rrhDcp}
+\newcommand{\textRubikFc}{\rrhFc}
+\newcommand{\textRubikFcp}{\rrhFcp}
+\newcommand{\textRubikBc}{\rrhBc}
+\newcommand{\textRubikBcp}{\rrhBcp}
+\newcommand{\textRubikCL}{\rrhCL}
+\newcommand{\textRubikCLp}{\rrhCLp}
+\newcommand{\textRubikCR}{\rrhCR}
+\newcommand{\textRubikCRp}{\rrhCRp}
+\newcommand{\textRubikCU}{\rrhCU}
+\newcommand{\textRubikCUp}{\rrhCUp}
+\newcommand{\textRubikCD}{\rrhCD}
+\newcommand{\textRubikCDp}{\rrhCDp}
+\newcommand{\textRubikCF}{\rrhCF}
+\newcommand{\textRubikCFp}{\rrhCFp}
+\newcommand{\textRubikCB}{\rrhCB}
+\newcommand{\textRubikCBp}{\rrhCBp}
+% \end{macrocode}
+%
+%
+%
+% --------------------------
+% End of this package
+% --------------------------
+% \begin{macrocode}
+%</rubikcube>
+% \end{macrocode}
+%
+%
+%
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex/contrib/rubik/rubikcube.ins b/macros/latex/contrib/rubik/rubikcube.ins
new file mode 100644
index 0000000000..fd52994a6a
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikcube.ins
@@ -0,0 +1,66 @@
+%% rubikcube.ins
+%%
+%% --- automatic overwriting of .sty is disabled-------
+%% =========================================================
+%% Authors: RWD Nickalls (dick@nickalls.org)
+%% and Apostolos Syropoulos (asyropoulos@yahoo.com)
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{rubikcube.ins}
+\input docstrip.tex
+
+\preamble
+
+-----------------------------------------------------------------
+ Authors: RWD Nickalls (dick@nickalls.org)
+ and Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ Copyright February 25, 2018 RWD Nickalls and A Syropoulos
+
+ VERSION 5.0
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3c of this license or (at your option) any
+ later version: <http://www.latex-project.org/lppl.txt>
+
+ This work consists of the files listed in the README file.
+-----------------------------------------------------------------
+
+ This is a LaTeX/TikZ package for drawing Rubik cubes
+ Please report errors or suggestions for improvement to
+
+ RWD Nickalls (dick@nickalls.org)
+ Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ This package requires the basic TikZ package to be loaded already
+------------------------------------------------------------------
+\endpreamble
+
+\keepsilent %%disables most of the screen output
+%% \askforoverwritefalse %%enables automatic overwriting of .sty
+\generate{\file{rubikcube.sty}{\from{rubikcube.dtx}{rubikcube}}}
+
+%%now write a screen message for the user
+\obeyspaces
+\Msg{*******************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* rubikcube.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* rubikcube.dtx through LaTeX. *}
+\Msg{* For an index, process any filename.idx file by *}
+\Msg{* makeindex -s gind.ist filename *}
+\Msg{* For list of changes, process any filename.glo file *}
+\Msg{* makeindex -s gglo.ist -o filename.gls filename.glo *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{*******************************************************}
+
+\endbatchfile
+%%------------EOF---------------
diff --git a/macros/latex/contrib/rubik/rubikcube.pdf b/macros/latex/contrib/rubik/rubikcube.pdf
new file mode 100644
index 0000000000..24c67a1172
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikcube.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikexamples.bat b/macros/latex/contrib/rubik/rubikexamples.bat
new file mode 100644
index 0000000000..b16f8146e4
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikexamples.bat
@@ -0,0 +1,3 @@
+ pdflatex --shell-escape rubikexamples.tex
+
+
diff --git a/macros/latex/contrib/rubik/rubikexamples.pdf b/macros/latex/contrib/rubik/rubikexamples.pdf
new file mode 100644
index 0000000000..18e9af6868
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikexamples.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikexamples.sh b/macros/latex/contrib/rubik/rubikexamples.sh
new file mode 100644
index 0000000000..2ddad50b4d
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikexamples.sh
@@ -0,0 +1,10 @@
+
+## rubikexamples.sh
+## Rubik bundle v5.0, 2018
+## run twice to get hyperref links correct
+
+ pdflatex --shell-escape rubikexamples.tex
+ pdflatex --shell-escape rubikexamples.tex
+
+## echo "...checking error file"
+## grep ERROR ./rubikstateERRORS.dat
diff --git a/macros/latex/contrib/rubik/rubikexamples.tex b/macros/latex/contrib/rubik/rubikexamples.tex
new file mode 100644
index 0000000000..7e14e1a6e3
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikexamples.tex
@@ -0,0 +1,1998 @@
+%%
+%% rubikexamples.tex
+%% February 25, 2018
+%% Requires ALL the rubik bundle packages and also the tikz package
+%% Part of the Rubik bundle v5.0 (www.ctan.org/pkg/rubik)
+%% authors: RWD Nickalls & A Syropoulos
+%%--------NOTE-------------------------------------------
+%% USAGE: (pdf)latex --shell-escape rubikexamples.tex
+%% run three times to get all labels and fig nos correct
+%%-------------------------------------------------------
+\documentclass[a4paper]{article}
+
+%------rubik----------
+\usepackage{tikz} %% load tikz BEFORE rubikcube
+\usepackage{rubikcube,rubikrotation,rubikpatterns,rubiktwocube}
+%----------------------
+\usepackage{url}
+\usepackage{ifpdf}
+\usepackage{lmodern}
+%---------------------
+\ifpdf
+ \usepackage[verbose]{microtype}
+ \usepackage{cmap}
+ \usepackage[pdfencoding=auto]{hyperref}
+
+ \hypersetup{%
+ pdftitle={rubikexamples.pdf},
+ pdfsubject={Rubik cube, Rubik bundle},
+ pdfkeywords={Rubik cube LaTeX}
+ }
+\fi
+%%-------------------
+\pagestyle{myheadings}
+\markright{\texttt{rubikexamples.pdf} \ \
+(Rubik bundle v5.0, 2018) \ \ \texttt{www.ctan.org/pkg/rubik}}
+
+%% increase text height and width
+\addtolength{\oddsidemargin}{-1.5cm}
+\addtolength{\textwidth}{3cm}
+\addtolength{\textheight}{1cm}
+%----------------------
+%==========Rubik stuff================
+%----edge sequences for 3x3x3 cubes--------------------------
+\newcommand{\CycleThreeEdgesFlipTwo}{[CycleThreeEdgesFlipTwo],F,R,U,Rp,Up,Fp}%
+\newcommand{\cyclethreeedgesfliptwo}{\CycleThreeEdgesFlipTwo}%
+%
+%----corner sequences--------------------------
+\newcommand{\AllYellow}{[allyellow],R,U,Rp,U,R,Up,Up,Rp}% = SUNE %cross -->allyellow
+\newcommand{\allyellow}{\AllYellow}%
+\newcommand{\CycleThreeCorners}{[cyclethreecorners],Lp,U,R,Up,L,U,Rp,Up}%
+\newcommand{\cyclethreecorners}{\CycleThreeCorners}%
+\newcommand{\SwapTwoCorners}{[swaptwocorners],Rp,F,Rp,B2,R,Fp,Rp,B2,R2,Up}
+\newcommand{\swaptwocorners}{\SwapTwoCorners}
+%
+%% brace and bracket macros
+\newcommand{\Rubikbracket}[1]{$\left(\mbox{#1}\right)$}
+\newcommand{\Rubikbrace}[1]{$\left\{\mbox{#1}\right\}$}
+\newcommand{\cubenumber}[1]{\strut\raisebox{1cm}{#1}}
+%-----------------
+%
+\begin{document}
+%
+\ifpdf\pdfbookmark[1]{Title}{Title}\fi
+\title{Rubik examples\\
+\smallskip\normalsize\texttt{www.ctan.org/tex-archives/macros/latex/contrib/rubik/rubikexamples.pdf}
+\,\footnote{This file is part of the Rubik bundle v5.0. To generate this file,
+use the following command: \newline \texttt{\$ pdflatex --shell-escape rubikexamples.tex}}}
+\author{RWD Nickalls\,\footnote{email: \textsf{dick@nickalls.org}}%
+ \ \ \& A Syropoulos\,\footnote{email: \textsf{asyropoulos@yahoo.com}}}
+\date{25 February, 2018 (Rubik bundle v5.0)}
+\maketitle
+\tableofcontents
+
+\pagebreak
+%%----------------------
+\section{Preliminaries}
+These examples were generated using the \TeX\
+Rubik bundle\,\footnote{\url{http://www.ctan.org/pkg/rubik}} v5.0.
+They assume some familiarity with the four packages \textsc{rubikcube},
+\textsc{rubikrotation}, \textsc{rubikpatterns} and \textsc{rubiktwocube}.
+For~documentation see the following files:
+
+\begin{quote}
+\begin{verbatim}
+rubikcube.pdf 3x3x3 documentation
+rubikrotation.pdf commands for implementing rotation sequences
+rubikrotationPL.pdf documentation of rubikrotation.pl (Perl program)
+rubikpatterns.pdf small database of well-known 3x3x3 configurations
+rubikpatternsLIST.pdf shows all configurations in the rubikpatterns database
+rubiktwocube.pdf 2x2x2 documentation
+\end{verbatim}
+\end{quote}
+
+This file requires the following packages: \texttt{tikz, rubikcube, rubikrotation,
+rubikpatterns, rubiktwocube}; note that the \texttt{tikz} package must be loaded
+\textit{before} the \texttt{rubikcube} package.
+
+This file needs to be run using the \verb!--shell-escape! command-line option;
+for example:
+\begin{quote}
+\begin{verbatim}
+pdflatex --shell-escape rubikexample.tex
+\end{verbatim}
+\end{quote}
+This is because nearly all the examples make use of the \verb!\RubikRotation!
+command, which calls the Perl script \texttt{rubikrotation.pl}.
+If you do forget to use the \verb!--shell-escape! command-line switch,
+the file will still run, but all the cubes will remain in the initial
+unprocessed configuration\,\footnote{As a quick check, run this file
+(\texttt{rubikexamples.tex}) in a separate directory and look at Figure~1;
+if this appears as a `solved' cube then your system has failed to call the Perl
+script \texttt{rubikrotation.pl} correctly for some reason. The most likely
+causes of this are (a)~failure to invoke the \texttt{--shell-escape} command-line
+option correctly, or (b)~failure to use a configuration file correctly
+(ie your system can't find the Perl program)---search the \texttt{.log} file
+to see whether the file \texttt{rubikrotation.pl} has been used.}.
+
+\subsection{3x3x3 vs 2x2x2 command names}
+The introduction of the \textsc{rubiktwocube} package (Rubik bundle v5)
+has necessitated a few command name changes in order to avoid confusion
+(see the \textsc{rubikcube} package documentation \S\,3.1 for details).
+Consequently, command names containing the word `\texttt{Rubik}' denote
+a 3x3x3 cube action; similarly those containing the word `\texttt{Two}'
+denote a 2x2x2 cube action.
+
+\subsection{Environments}
+When using the Rubik bundle one sometimes needs to be mindful of the various
+\LaTeX\ environments in which Rubik commands are placed (e.g.,~the figure,
+minipage and TikZ picture environments), since these environments restrict
+the actions of commands they contain to the particular environment.
+The \verb!\ShowCube! command is also relevant here, since it is a
+minipage-wrapper for the TikZ picture environment. Only Rubik \verb!\Draw..!
+commands and TikZ commands (e.g.,~\verb!\draw! and \verb!\node!)
+actually need to be inside a TikZ picture environment, and hence
+inside a \verb!\ShowCube! command.
+
+This issue arises because the Rubik bundle allows you to create figures
+showing different stages during a sequence of rotations. Consequently
+the effects of commands executed inside an environment (especially
+commands which determine the colour-state or rotations), may not be
+apparent to subsequent commands outside that particular environment.
+See Example~3 for an illustration of how to handle environments.
+
+\pagebreak
+
+%%------------------
+\section{RubikCube examples (3x3x3)}
+
+\subsection{Sixspot}
+\typeout{---Example (sixspot)}
+
+In Figure~\ref{fig:sixspot} we show the so-called ``sixspot'' configuration,
+ generated from a solved cube using the rotation sequence
+\rr{U}, \rr{Dp}, \rr{R}, \rr{Lp}, \rr{F}, \rr{Bp}, \rr{U}, \rr{Dp}.
+
+%%--------FIGURE 1 -----------
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolvedWY
+\RubikRotation{\sixspot}
+\ShowCube{7cm}{0.7}{\DrawRubikCubeSF}
+\caption{\label{fig:sixspot}The `sixspot' configuration.}
+\end{figure}
+%----------------
+
+{\noindent}Creating a macro to hold a rotation sequence greatly
+facilitates their use, as follows:
+\begin{quote}
+\begin{verbatim}
+\newcommand{\sixspot}{[sixspot],U,Dp,R,Lp,F,Bp,U,Dp}
+\end{verbatim}
+\end{quote}
+We can now process this sequence using its macro name as an argument
+for the \verb!\RubikRotation! command. The code used for the above
+Figure uses the \verb!\ShowCube{}{}{}! command for which \verb!#1!
+is the minipage width, \verb!#2! is the tikzpicture scale factor (0--1),
+and \verb!#3! can include \textsc{rubikcube} package \verb!\Draw..!
+commands, and any commands which are valid for use in a TikZ
+\texttt{tikzpicture} environment. The code for the above figure is
+as follows:
+
+\begin{quote}
+\begin{verbatim}
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolvedWY
+ \RubikRotation{\sixspot}
+ \ShowCube{7cm}{0.7}{\DrawRubikCubeSF}
+\caption{...}
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+Note that the sixspot sequence is a so-called `order~3' sequence, which
+means that running the `sixspot' sequence 3 times returns the cube
+to its original `solved' state. The~command for processing it three
+times is \verb!\RubikRotation[3]{\sixspot}!.
+
+Note that the semi-flat form of the cube here is generated by the
+ \verb!\DrawRubikCubeSF! command, where the terminal SF denotes
+ the Semi-Flat form. To draw it completely flat use a terminal F,
+ e.g.,~\verb!\DrawRubikCubeF! (see Figure~\ref{fig:sixspotE}).
+
+\subsubsection{Log-file extract}
+Users may find it instructive to inspect the the log-file and
+follow the dynamic interaction between \LaTeX\ and the Perl script.
+This is easy to follow, since output by \texttt{rubikrotation.sty}
+is prefixed by 3 dashes (\verb!---!), while output by the Perl script
+is prefixed by 3 dots (\verb!...!). Search for the keyword `Example',
+as this is written to the log-file at the start of each example.
+
+The following is part of the log-file extract associated with Example~1.
+
+\begin{quote}
+\begin{verbatim}
+---Example (sixspot)
+
+---TeX process---------------------------
+---script = rubikrotation.sty v5.0 (2018/02/25)
+---NEW rotation command
+---command = RubikRotation[1]{[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*, 8f*)>}
+---writing current cube state to file rubikstate.dat
+\openout7 = `rubikstate.dat'.
+
+\ourRRcounter=\count134
+---CALLing Perl script (rubikrotation.pl)
+runsystem(perl $HOME/RubikTeX/PERLstuff/dtx-rubikrotation/rubikrotation.pl
+ -i rubikstate.dat -o rubikstateNEW.dat)...executed.
+
+---inputting NEW datafile (data written by Perl script)
+(./rubikstateNEW.dat
+
+...PERL process..................................
+...script = rubikrotation.pl v5.0 (25 February 2018)
+...reading the current cube state (from File: rubikstate.dat)
+...
+...command = cubesize,three
+...cube = THREEcube
+...
+......up,W,W,W,W,W,W,W,W,W
+....down,Y,Y,Y,Y,Y,Y,Y,Y,Y
+....left,B,B,B,B,B,B,B,B,B
+...right,G,G,G,G,G,G,G,G,G
+...front,O,O,O,O,O,O,O,O,O
+....back,R,R,R,R,R,R,R,R,R
+...
+...rotation keyword
+...checking state of cube
+...cubiesum = 54 (Red=9, Or=9, Ye=9, Gr=9, Bl=9, Wh=9, X=0)
+...
+...command = rotation,[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*, 8f*)>
+...dataline = rotation,[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*; 8f*)>
+...[SixSpot] is a label OK
+...rotation U, OK
+...rotation Dp, OK
+...rotation R, OK
+...rotation Lp, OK
+...rotation F, OK
+...rotation Bp, OK
+...rotation U, OK
+...rotation Dp, OK
+...writing new cube state to file rubikstateNEW.dat
+...SequenceName = SixSpot
+...SequenceInfo = (8q*; 8f*)
+...SequenceShort = [SixSpot],U,Dp,R,Lp,F,Bp,U,Dp
+...SequenceLong = U,Dp,R,Lp,F,Bp,U,Dp
+)
+\end{verbatim}
+\end{quote}
+
+\pagebreak
+
+\subsection{ShowErrors}
+\typeout{---Example (ShowRubikErrors)}
+
+ In this example we demonstrate the use of the \verb!\ShowErrors!
+ command\,\footnote{ The \texttt{ {\textbackslash}ShowErrors} command
+ replaces the earlier \texttt{{\textbackslash}ShowRubikErrors} command
+ which is now deprecated. However, the earlier command is still
+ supported (for now) for backward compatibility.},
+ which places a copy of the Perl output file \verb!rubikstateERRORS.dat!
+ underneath the graphic so you can see a list of all the errors, if any.
+ Note that this example is similar to the previous one except that we have
+ introduced several errors---e.g.,~bad minipage width, typos, as well as
+ some animals---into the rotation sequence).
+ It is important to note that the \verb!\ShowErrors! command must be
+ placed \textit{after} the TikZ picture environment (i.e.,~in this case after
+the \verb!\ShowCube! command), or even at the end of the document.
+Note that full details of all errors are also included in the .log file (search for \texttt{*ERR}).
+
+%%--------FIGURE 2 -----------
+%
+\RubikCubeSolvedWY
+\RubikRotation{[sixspot],U,Dp,R,Lp,F,Bp,U,Dpppp,cat,dog}
+\begin{figure}[hbt]
+\centering
+\ShowCubeF{4.5cm}{0.5}{\DrawRubikCubeF}
+\ShowErrors
+\parbox{0.8\textwidth}{%
+\caption{\label{fig:sixspotE}The same `sixspot' sequence of rotations as shown
+in Example~1, but now with some errors (wrong minipage width, typos and some
+animals\,!) in the rotation sequence (it \textit{should} be just
+\texttt{U,Dp,R,Lp,F,Bp,U,Dp}).}}
+\end{figure}
+%
+{\noindent}In this example we have used the F version of the \verb!\ShowCube!
+command (\verb!\ShowCubeF!) which places an fbox around the image so you can see the
+extent of any white space etc. This reveals that the set minipage-width ($4.5$cm) in
+the \verb!\ShowCubeF! command---see code below---is too narrow: it should be
+5cm ($10 \times 0.5$) to just include the whole image (i.e.,~$10 \times$ the TikZ
+scale-factor in this case).
+Once fixed, we can remove the F from the \verb!\ShowCubeF! command.
+Note also that only `\verb!\Draw...!' commands really need to be inside the TikZ
+picture environment (i.e.,~inside the \verb!\ShowCube! command). The above figure
+was generated by the following code.
+%-----------------
+\begin{quote}
+\begin{verbatim}
+\RubikCubeSolvedWY
+\RubikRotation{[sixspot],U,Dp,R,Lp,F,Bp,U,Dpppp,cat,dog}
+\begin{figure}[hbt]
+ \centering
+ \ShowCubeF{4.5cm}{0.5}{\DrawRubikCubeF}
+ \ShowErrors
+\caption{....}
+\end{figure}
+\end{verbatim}
+\end{quote}
+Even if the \verb!\ShowErrors! command is not used, it is always a good idea
+to check the file \verb!rubikstateERRORS.dat! after a \LaTeX\ run, since this
+file will also reveal any errors.
+
+
+\pagebreak
+%----------------------
+
+\subsection{Environments}
+\typeout{---Example (Environments)}
+
+
+In this example we highlight the fact that Rubik commands used inside a \LaTeX\
+environment remain local to that environment, and how this can sometimes be
+problematic. Commands whose reach is meant to be more global need to be
+executed outside such environments, where they can implement global colour
+settings, which will then be accessible to subsequent \verb!\Draw..! commands.
+
+Since we are drawing images, this is primarily an issue
+with the \verb!minipage!, \verb!figure!, and TikZ picture environments.
+Consequently, it is generally best when drawing a sequence of cubes to reserve
+the TikZ picture environment only for \verb!\Draw..! commands and TikZ
+commands. Importantly, this also applies to our main display tool the \verb!\ShowCube!
+command, since this is a minipage-wrapper for the TikZ picture environment
+(see the \textsc{rubikcube} package documentation).
+
+In this example the first cube (9a) uses a \verb!\RubikCubeSolvedWY! command
+\textit{inside} a \verb!\ShowCube! environment. However, if we now perform the
+rotation \textRubik{R}\ (using the command \verb!\RubikRotation{R}!) this results
+in a quite unexpected effect on cube (9b) (and obviously not correct).
+This is because the action of the initial \verb!\RubikCubeSolved! command
+ (setting a new colour-state) is not visible outside its \verb!\ShowCube!
+ environment, and hence the subsequent \verb!\RubikRotation{R}! command is unaware
+ of this earlier attempt to update the global colour-state information.
+ It turns out that the internal colour-state was actually last updated following
+ the action of the \textbackslash\texttt{RubikRotation\{[sixspot],....\}}
+ command used in Example~2, being the last colour-state command executed
+ \textit{outside} an environment (a \texttt{figure} environment in that
+ example). Consequently, the strange cube 9b is not what we expected.
+
+\medskip
+\noindent%
+\cubenumber{9a}%
+\ShowCube{2cm}{0.5}{%
+ \RubikCubeSolvedWY%
+ \DrawRubikCubeRU}%
+\quad\Rubik{R}%
+\RubikRotation{R}%
+\cubenumber{9b}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+%---------------
+\hspace{5mm}
+\begin{minipage}{0.5\textwidth}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+\newcommand{\cubenumber}[1]{\strut\raisebox{1cm}{#1}}
+...
+\cubenumber{9a}%
+\ShowCube{2cm}{0.5}{%
+ \RubikCubeSolvedWY%
+ \DrawRubikCubeRU%
+ }%
+\quad\Rubik{R}%
+\RubikRotation{R}%
+\cubenumber{9b}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\end{verbatim}
+\end{minipage}
+
+\bigskip
+
+If we now bring the \verb!\RubikCubeSolvedWY! command out of the \verb!\ShowCube!
+environment and place it \textit{before} the \verb!\ShowCube! command (see cubes 9c, 9d),
+then its colour `state' information becomes globally accessible (i.e.,~colour-state
+gets updated) and therefore gets used by the subsequent \verb!\RubikRotation{R}!
+command, and hence the cube (9d) is now rendered correctly.
+
+\bigskip
+
+\noindent%
+\cubenumber{9c}%
+\RubikCubeSolvedWY%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\quad\Rubik{R}%
+\RubikRotation{R}%
+\cubenumber{9d}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+%---------------
+\hspace{5mm}
+\begin{minipage}{0.5\textwidth}
+\begin{verbatim}
+\cubenumber{9c}%
+\RubikCubeSolvedWY%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\quad\Rubik{R}%
+\RubikRotation{R}%
+\cubenumber{9d}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\end{minipage}
+\end{verbatim}
+\end{minipage}
+
+\bigskip
+
+Note that the horizontal space occupied by \texttt{9d} is almost exactly
+the same as \verb!\quad!, and so we don't need to include any additional
+space before the \verb!\cubenumber{9d}! command.
+
+
+
+\pagebreak
+%----------------------
+\subsection{Coordinates}
+\typeout{---Example (coordinates)}
+
+
+For all cubes the origin of coordinates is defined as the bottom left corner of
+the \textsc{front} face. Consequently, it is easy to determine the coordinates
+of points and hence draw lines, circles, and place lettering or other objects
+using the standard TikZ \verb!\draw..! and \verb!\node..! commands. Note that for
+convenience point $P$ (bottom back left corner) is designed to be $(-1,-1)$
+on the 2D view. (The~following diagram is Fig~1 from the \textsc{rubikcube}
+package documentation).
+
+\begin{figure}[hbt]
+\centering
+\RubikFaceFrontAll{X} % X = default = grey
+\ShowCube{5.6cm}{0.7}{%
+ \DrawRubikFaceFront
+
+\draw[line join=round,line cap=round,ultra thick] (0,0) -- (0,4); % Y
+\draw[line join=round,line cap=round,ultra thick] (0,0) -- (4,0); % X
+
+%draw labels
+\node (Ylabel) at (-0.35, 3.8) {$Y$};
+\node (Xlabel) at ( 3.8, -0.4) {$X$};
+
+%%----------draw the Rubik faces--------
+%% outline Front face
+\draw[line join=round,line cap=round,ultra thick]%
+ (0,3) -- (-1,2) -- (-1,-1) -- (2,-1) -- (3,0);
+%%
+%% outline Down face
+\draw[line join=round,line cap=round,ultra thick]%
+ (-1,-1) -- (0, 0);
+%%
+%%
+%% draw labels
+\node (Y0) at (-0.4, 0) [blue]{$0$};
+\node (Y1) at (-0.4, 1) [blue]{$1$};
+\node (Y2) at (-0.4, 2) [blue]{$2$};
+\node (Y3) at (-0.4, 3) [blue]{$3$};
+%%
+\node (X0) at (0, -0.5) [blue]{$0$};
+\node (X1) at (1, -0.5) [blue]{$1$};
+\node (X2) at (2, -0.5) [blue]{$2$};
+\node (X3) at (3, -0.5) [blue]{$3$};
+%%
+\node (P) at (-2.4, -1) [blue]{$P\,(-1,-1)$};
+}
+\end{figure}
+
+{\noindent}The code for the figure is given below.
+
+We draw everything in the \verb!\ShowCube! environment; the \textsc{front} face
+in grey (colour code = \texttt{X}) using the Rubik command
+\verb!\DrawRubikFlatFront!, and then draw all the lines and text using standard
+TikZ commands. The correct minipage-width argument (5.6cm) for the
+\verb!\ShowCube! command is determined by trial-and-error, using the `fbox'
+form of the command (\verb!\ShowCubeF!), and then the `F' is removed
+($\rightarrow$ \verb!\ShowCube!). In order to avoid confusion, all Rubik commands
+start with a capital letter (e.g.,~\verb!\Draw..!), while all TikZ commands
+start with a lower-case letter (e.g.,~\verb!\draw..!).
+
+\begin{quote}
+\begin{verbatim}
+\begin{figure}[hbt]
+\centering
+\RubikFaceFrontAll{X}% X = default non-colour (grey)
+\ShowCube{5.6cm}{0.7}{%
+ \DrawRubikFaceFront
+ \draw[line join=round,line cap=round,ultra thick] (0,0) -- (0,4);% Yaxis
+ \draw[line join=round,line cap=round,ultra thick] (0,0) -- (4,0);% Xaxis
+ \node (Ylabel) at (-0.35, 3.8) {$Y$};
+ \node (Xlabel) at ( 3.8, -0.4) {$X$};
+ %% outline Left and Down faces
+ \draw[line join=round,line cap=round,ultra thick]%
+ (0,3) -- (-1,2) -- (-1,-1) -- (2,-1) -- (3,0);
+ \draw[line join=round,line cap=round,ultra thick]%
+ (-1,-1) -- (0, 0);
+ \node (Y0) at (-0.4, 0) [blue]{$0$};
+ \node (Y1) at (-0.4, 1) [blue]{$1$};
+ \node (Y2) at (-0.4, 2) [blue]{$2$};
+ \node (Y3) at (-0.4, 3) [blue]{$3$};
+ \node (X0) at (0, -0.5) [blue]{$0$};
+ \node (X1) at (1, -0.5) [blue]{$1$};
+ \node (X2) at (2, -0.5) [blue]{$2$};
+ \node (X3) at (3, -0.5) [blue]{$3$};
+ \node (P) at (-2.4, -1) [blue]{$P\,(-1,-1)$};
+ }
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+
+\pagebreak
+
+%----------------------
+\subsection{Face notation}
+\typeout{---Example (face notation)}
+
+The following diagram is Fig~2 from the \textsc{rubikcube} package documentation.
+
+\begin{figure}[htb]
+\centering%
+\RubikFaceUpAll{Y}
+\RubikFaceFrontAll{G}
+\RubikFaceRightAll{O}
+\ShowCubeF{5cm}{0.6}{%
+\DrawRubikCubeRU%
+%%-----------------
+
+%% Right
+\draw[line width=2pt,color=blue,->] (3.5,2) -- (5.3, 2);
+\node (R) at (4.6, 2.5) [blue]{\textbf{\textsf{R}}};
+\node (x) at (5.8, 2) [blue]{\textbf{\textsf{x}}};
+
+%%Left
+\draw[line width=2pt,color=blue] (-0.2,2) -- (-1.5, 2);
+\node (L) at (-1.1, 2.5) [blue]{\textbf{\textsf{L}}};
+
+%%Up
+\draw[line width=2pt,color=blue,->] (2, 3.5) -- (2, 5.5);
+\node (U) at (1.4, 4.7) [blue]{\textbf{\textsf{U}}};
+\node (y) at (2, 6.1) [blue]{\textbf{\textsf{y}}};
+
+%%Down
+\draw[line width=2pt,color=blue] (2, -0.2) -- (2, -1.5);
+\node (D) at (2.6, -1.1) [blue]{\textbf{\textsf{D}}};
+
+
+%%Front
+\draw[line width=2pt,color=blue,->] (1.5, 1.5) -- (0, -1);
+\node (F) at (0.7, -0.7) [blue]{\textbf{\textsf{F}}};
+\node (z) at (-0.3, -1.4) [blue]{\textbf{\textsf{z}}};
+
+%%Back
+\draw[line width=2pt,color=blue] (3.2, 4.2) -- (4, 5.5);
+\node (B) at (4.4, 5) [blue]{\textbf{\textsf{B}}};
+%%
+}
+\end{figure}
+
+{\noindent}The code for the figure is as follows
+(the origin $(0,0)$ is at the bottom left corner of the \textsc{front} (green) face).
+
+\begin{quote}
+\begin{verbatim}
+\begin{figure}[htb]
+\centering%
+\RubikFaceUpAll{Y}
+\RubikFaceFrontAll{G}
+\RubikFaceRightAll{O}
+\ShowCubeF{5cm}{0.6}{%
+ \DrawRubikCubeRU%
+ %% Right
+ \draw[line width=2pt,color=blue,->] (3.5,2) -- (5.3, 2);
+ \node (R) at (4.6, 2.5) [blue]{\textbf{\textsf{R}}};
+ \node (x) at (5.8, 2) [blue]{\textbf{\textsf{x}}};
+ %%Left
+ \draw[line width=2pt,color=blue] (-0.2,2) -- (-1.5, 2);
+ \node (L) at (-1.1, 2.5) [blue]{\textbf{\textsf{L}}};
+ %%Up
+ \draw[line width=2pt,color=blue,->] (2, 3.5) -- (2, 5.5);
+ \node (U) at (1.4, 4.7) [blue]{\textbf{\textsf{U}}};
+ \node (y) at (2, 6.1) [blue]{\textbf{\textsf{y}}};
+ %%Down
+ \draw[line width=2pt,color=blue] (2, -0.2) -- (2, -1.5);
+ \node (D) at (2.6, -1.1) [blue]{\textbf{\textsf{D}}};
+ %%Front
+ \draw[line width=2pt,color=blue,->] (1.5, 1.5) -- (0, -1);
+ \node (F) at (0.7, -0.7) [blue]{\textbf{\textsf{F}}};
+ \node (z) at (-0.3, -1.4) [blue]{\textbf{\textsf{z}}};
+ %%Back
+ \draw[line width=2pt,color=blue] (3.2, 4.2) -- (4, 5.5);
+ \node (B) at (4.4, 5) [blue]{\textbf{\textsf{B}}};
+ }
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+
+\pagebreak
+
+%----------------------
+\subsection{Grey cube}
+\label{sec:greycube}
+\typeout{---Example (grey cube)}
+
+When explaining elementary layer-1 moves, it can be useful to use the `grey cube'
+(\verb!\RubikCubeGreyWY!) ---White opposite Yellow--- as this sets up only
+the central cubie on each face.
+We have shown the first cube here in Semi-Flat (SF) mode simply to show how the grey
+cube is configured (note that a WB version (\verb!\RubikCubeGreyWB!)
+and an `all-grey' version (\verb!\RubikCubeAllGrey!) are also available.
+Note that all these grey cube commands will also accept
+the word `gray' (to be consistent with TikZ).
+
+In this example, we show how to position a single `flipped' white/orange edge
+cubie in the top layer.
+
+\begin{figure}[hbt]
+
+\centering%
+\RubikCubeGreyWY%
+
+\RubikFaceUp{X}{X}{X}%
+ {X}{W}{O}%
+ {X}{X}{X}%
+
+\RubikFaceRight{X}{W}{X}
+ {X}{G}{X}
+ {X}{X}{X}
+%
+\cubenumber{1}%
+\ShowCube{5cm}{0.5}{\DrawRubikCubeSF}%
+%------------------
+\quad\Rubik{Rp}\RubikRotation{Rp}
+\cubenumber{2}%
+\ShowCube{2cm}{0.5}{\DrawRubikCube}%
+%-----------------------
+\quad\Rubik{Fp}\RubikRotation{Fp}
+\cubenumber{3}%
+\ShowCube{2cm}{0.5}{\DrawRubikCube}%
+%-----------------------
+\end{figure}
+
+
+{\noindent}The code for the figure is given below.
+After setting up the first cube, we then just use the \verb!\RubikRotation!
+command to generate the remaining cubes.
+The colours are coded as follows: R~(red), O~(orange), Y~(yellow),
+G~(green), B~(blue), W~(white), and X~(grey).
+
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+\newcommand{\cubenumber}[1]{\strut\raisebox{1cm}{#1}}
+...
+\begin{figure}[hbt]
+\centering
+% set up the first cube
+\RubikCubeGreyWY%
+\RubikFaceUp{X}{X}{X}%
+ {X}{W}{O}%
+ {X}{X}{X}%
+
+\RubikFaceRight{X}{W}{X}
+ {X}{G}{X}
+ {X}{X}{X}
+\cubenumber{1}%
+\ShowCube{5cm}{0.5}{\DrawRubikCubeSF}%
+%
+\quad\Rubik{Rp}\RubikRotation{Rp}
+\cubenumber{2}%
+\ShowCube{2cm}{0.5}{\DrawRubikCube}%
+%
+\quad\Rubik{Fp}\RubikRotation{Fp}
+\cubenumber{3}%
+\ShowCube{2cm}{0.5}{\DrawRubikCube}%
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+
+\pagebreak
+
+%-------------------------------
+\subsection{Scramble a cube}
+\label{sec:scrambleacube}
+\typeout{---Example (scramble a cube)}
+
+In this example we use the \verb!\RubikRotation! command to scramble a `solved'
+Rubik cube via a sequence of 120 random rotations, using the following command
+(the details of the process can be seen in the \texttt{.log} file):
+\begin{quote}
+\begin{verbatim}
+\RubikRotation{random,120}
+\end{verbatim}
+\end{quote}
+On this occasion we draw the cube Flat (F) using the command \verb!\DrawRubikCubeF!.
+In this example, we also make use of the \verb!\SaveRubikState{}! command to save
+the configuration (state) displayed here in Figure~3 to a file
+(\texttt{rubikexampfig3.tex}) using \verb!\SaveRubikState{rubikexampfig3.tex}!,
+so we can display the same cube configuration later but in a different format
+(we show it again in the following example (Example~\ref{sec:saverubikstate}).
+Note that since we are using a random sequence, it follows that each
+time this file is run not only will a visually different cube be generated,
+but the same state will be shown both
+here and in Example~\ref{sec:saverubikstate}.
+%%--------FIGURE 3 -----------
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolvedWY
+ \RubikRotation{random,120}
+ \SaveRubikState{rubikexampfig3.tex}
+ \ShowCubeF{6cm}{0.5}{\DrawRubikCubeF}
+\parbox{0.7\textwidth}{%
+\caption{\label{fig:randomone}This shows a cube generated by 120 random rotations}}
+\end{figure}
+%----------------
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{figure}[hbt]
+ \centering\RubikCubeSolvedWY
+ \RubikRotation{random,120}
+ \SaveRubikState{rubikexampfig3.tex}
+ \ShowCubeF{6cm}{0.5}{\DrawRubikCubeF}
+\caption{....}
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+{\noindent}Q: How do we determine the minipage-width ($7.2$cm) in the
+\verb!\ShowCube! command?
+
+\smallskip
+
+{\noindent}A: The object is 12~cubie squares wide. Since the TikZ scale-factor
+argument of the \verb!\ShowCube! command (cms/unit length) in this
+case is set to~$0.5$, then the true width of the image will
+be $12 \times 0.5 = 6$\,cm. Note that here we have used the \verb!\ShowCubeF!
+command and so we can see that this is correct. Changing the scale-factor will
+change the image size and hence a new width argument will be required to just fit
+the image.
+
+Note that in this particular case (where there is only a single image in the
+`figure' environment), since the \verb!\ShowCube! command places the image
+(in a TikZ picture environment) centrally inside a minipage, the image will
+in fact be centrally placed in the \verb!\textwidth! provided the image
+is \textit{smaller} than the fbox---i.e.,~if we used instead a minipage-width of,
+say, 12\,cm the image would still appear centred in the \verb!\textwidth! in
+this case. However, when there are several images in the `figure', then the spacing
+may appear strange unless each image closely fits its own minipage-width etc.
+It is often useful, therefore, to check the size of the fbox (using the
+\verb!\ShowCubeF! command) as we have done here.
+
+
+\pagebreak
+
+%----------------------
+\subsection{SaveRubikState}
+\label{sec:saverubikstate}
+\typeout{---Example (SaveRubikState)}
+
+In this example we display a cube having the same colour state as that shown in
+the previous example (Example~\ref{sec:scrambleacube}) ---see Figure~\ref{fig:randomone}.
+The cube's colour state was saved from the previous example using the command
+\verb!\SaveRubikState{rubikexampfig3.tex}!, and then input here
+using the command \verb!\input{rubikexampfig3.tex}!. These commands therefore allow the
+state of a previous cube to be saved to a file, and then displayed again
+later in a different format.
+
+%%-----------FIGURE 4 -----------
+\begin{figure}[hbt]
+ \centering
+ \input{rubikexampfig3.tex}
+ \ShowCube{4cm}{0.8}{\DrawRubikCubeLD}
+\parbox{0.7\textwidth}{%
+ \caption{\label{fig:randomtwo} This shows a Rubik cube in exactly the same
+ colour state as the one shown in Figure~\ref{fig:randomone}, but here displayed
+ as a cube seen from the LD (Left-Down) viewpoint.}%
+}%
+\end{figure}
+
+%%---------------------------------
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{figure}[hbt]
+ \centering
+ \input{rubikexampfig3.tex}
+ \ShowCube{4cm}{0.8}{\DrawRubikCubeLD}
+ \parbox{0.7\textwidth}{%
+ \caption{....}%
+ }%
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+\noindent\textsc{note}: The command \verb!\SaveRubikState{}! is part of the
+\textsc{rubikrotation} package; see the documentation for further details.
+
+
+\pagebreak
+
+%----------------------
+\subsection{Series of cubes}
+\typeout{---Example (series of cubes)}
+
+Here we show a convenient way of displaying a series of small cubes showing
+the action of a sequence of rotations (\rr{U}, \rr{R}, \rr{F}) on a solved cube.
+
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolvedWY%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\quad\Rubik{U}\quad%
+\RubikRotation{U}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\quad\Rubik{R}\quad%
+\RubikRotation{R}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\quad\Rubik{F}\quad%
+\RubikRotation{F}%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\caption{The rotations \rr{U}, \rr{R}, \rr{F}\ on a solved cube.}
+\end{figure}
+
+{\noindent}The code for the above sequence is as follows:
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{figure}[hbt]
+ \centering%
+ \RubikCubeSolvedWY%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \quad\Rubik{U}\quad%
+ \RubikRotation{U}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \quad\Rubik{R}\quad%
+ \RubikRotation{R}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \quad\Rubik{F}\quad%
+ \RubikRotation{F}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\caption{The rotations \rr{U}, \rr{R}, \rr{F}\ on a solved cube.}
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+{\noindent}\textsc{Note} 1: We start with the White-opposite-Yellow (WY)
+solved cube, using the command \verb!\RubikCubeSolvedWY!.
+A White-opposite-Blue (WB) solved cube is available as \verb!\RubikCubeSolvedWB!.
+
+\medskip
+
+{\noindent}\textsc{Note} 2: There are four different commands for typesetting
+ 3x3x3 rotation codes in various formats (a slightly different set of four
+commands are used for the equivalent 2x2x2 rotation codes).
+In~this (3x3x3) example, we have used two of them; for example:
+{\newline}\verb!\rr{U}! $\rightarrow$ \rr{U} \ (here the \verb!\rr{}! stands
+for `rubik rotation'), and also
+{\newline}\verb!\Rubik{U}! $\rightarrow$ \Rubik{U}. This command typesets
+both the hieroglyph and the rotation code vertically one above the other.
+ The other two commands are as follows:
+{\newline}\verb!\rrh{U}! $\rightarrow$ \rrh{U} \ (here the \verb!\rrh{}!
+stands for `rubik rotation hieroglyph'), and also
+{\newline}\verb!\textRubik{U}! $\rightarrow$ \textRubik{U}. This command
+typesets both the rotation code and the hieroglyph on the same line one
+after the other.
+
+
+\pagebreak
+
+%----------------------
+\subsection{Rotation sequence}
+\typeout{---Example (rotation sequence)}
+
+We now explore using the named Rubik cube rotation sequences and associated
+patterns available in the \textsc{rubikpatterns} package---a small macro database
+(see the \textsc{rubikpatterns} documentation, and also its companion file \texttt{rubikpatternsLIST.pdf}). Having the sequences available as macros is
+very convenient since (a)~it avoids making errors when typing them out,
+and (b)~allows the easy application of software tools.
+
+ A Rubik pattern is the configuration generated by a sequence of rotations
+ (or `moves') from some initial starting configuration (typically a `solved'
+ configuration). For example, FourSpot is a well known pattern which we can
+ generate from a solved Rubik cube using the macro \verb!\FourSpot!; it is
+ defined in the \textsc{rubikpatterns} package as follows:
+\begin{quote}
+\begin{verbatim}
+\newcommand{\FourSpot}{[FourSpot],F2,B2,U,Dp,R2,L2,U,Dp,<(12q*, 8f*)>}
+\newcommand{\fourspot}{\FourSpot}
+\end{verbatim}
+\end{quote}
+ Note that for convenience the macros names in the \textsc{rubikpatterns} package
+ are defined in both upper and lower-case (i.e.,~the macros \verb!\FourSpot!
+ and \verb!\fourspot! are identical). The following figure shows the FourSpot
+ sequence and pattern.
+
+\bigskip
+
+\noindent%
+\RubikCubeSolvedWY%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRD}
+\RubikRotation{\FourSpot}
+\quad%
+\SequenceBraceA{FourSpot}{%
+ \ShowSequence{}{\Rubik}{\SequenceLong}%
+ }
+\quad%
+\ShowCube{5cm}{0.5}{\DrawRubikCubeSF}
+
+\bigskip
+
+{\noindent}The code for the above figure is as follows:
+
+
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation,rubikpatterns}
+...
+\noindent%
+\RubikCubeSolvedWY%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRD}
+\RubikRotation{\FourSpot}
+\quad%
+\SequenceBraceA{FourSpot}{%
+ \ShowSequence{}{\Rubik}{\SequenceLong}%
+ }
+\quad%
+\ShowCube{5cm}{0.5}{\DrawRubikCubeSF}
+\end{verbatim}
+\end{quote}
+Note that we have spread the code slightly here in order to emphasise that
+the \verb!\ShowSequence! command is being used as an argument for the
+\verb!\SequenceBraceA! command (the `A' in the command \verb!\SequenceBraceA!
+denotes that the annotation is placed Above the sequence.)
+We have used a solved cube with the WY (White opposite Yellow)
+configuration (\verb!\RubikCubeSolvedWY!).
+The first cube is drawn from the RD (Right-Down) viewpoint (\verb!\DrawRubikCubeRD!).
+The second cube is drawn from the SF (Semi-Flat) viewpoint (\verb!\DrawRubikCubeSF!)
+so we can see all the faces.
+
+Note that we execute the \verb!\RubikRotation{}! command \textit{before} showing
+the sequence itself. This is because the Perl program (CALLed by
+\verb!\RubikRotation!) allocates the rotation sequence to the variable
+\verb!\SequenceLong! which we then display using the \verb!\ShowSequence! command
+(see the \textsc{rubikrotation} documentation for details).
+
+
+\pagebreak
+
+%----------------------
+\subsection{SixTs}
+\typeout{---Example (SixTs)}
+
+A more interesting cube pattern is the SixTs configuration (from the
+\textsc{rubikpatterns} package), which we now show in a slightly
+different way (adding an extra face and also some cube sidebars), as follows:
+
+\bigskip
+
+\noindent\hfil%
+\RubikCubeSolvedWB
+\ShowCube{1.6cm}{0.4}{
+ \DrawRubikCubeRU
+ \DrawRubikFlatDown{0}{-3.3}}
+\RubikRotation{\sixts}
+\quad\SequenceBraceA{SixTs}{\ShowSequence{,\ }{\texttt}{\SequenceLong}}
+\quad\ShowCube{3cm}{0.5}{
+ \DrawRubikCubeRU
+ \DrawRubikCubeSidebarFL{RU}
+ \DrawRubikCubeSidebarFD{RU}
+ \DrawRubikCubeSidebarBR{RU}
+ \DrawRubikCubeSidebarBU{RU}
+ }
+
+\hfil
+
+\bigskip
+
+This time we have started with a solved cube having the WB configuration
+(White opposite Blue), which is generated using the command
+\verb!\RubikCubeSolvedWB!
+(we have added the \textsc{down} face (blue) below to reveal the colour of this
+face---see note below).
+
+The rotation sequence is in `long-format' (expanded into
+separate rotations), comma-separated and space, typewriter font,
+using the command \verb!\ShowSequence{,\ }{\texttt}{\SequenceLong}!.
+
+The final image shows the sixT cube together with the main cube sidebars
+ indicating the colours of the adjacent facelets,
+using the \verb!\DrawRubikCubeSidebarXX! commands.
+The code for the above figure is as follows:
+
+\begin{quote}
+\begin{verbatim}
+\RubikCubeSolvedWB
+\ShowCube{1.6cm}{0.4}{%
+ \DrawRubikCubeRU%
+ \DrawRubikFlatDown{0}{-3.3}%
+ }
+\RubikRotation{\SixTs}
+\quad\SequenceBraceA{SixTs}{%
+ \ShowSequence{,\ }{\texttt}{\SequenceLong}%
+ }
+\quad\ShowCube{2cm}{0.5}{
+ \DrawRubikCubeRU
+ \DrawRubikCubeSidebarFL{RU}
+ \DrawRubikCubeSidebarFD{RU}
+ \DrawRubikCubeSidebarBR{RU}
+ \DrawRubikCubeSidebarBU{RU}
+ }
+\end{verbatim}
+\end{quote}
+
+
+
+\subsubsection*{Notes}
+
+\begin{enumerate}
+
+ \item We have drawn the \textsc{down} face of the first cube using the command
+\verb!\DrawRubikFlatDown{0}{-3.3}! where the two arguments are the $x$ and
+$y$ coordinates of the \textit{bottom left} corner of the \textsc{down} face
+(blue); these $(x,y)$ arguments allow us to position the blue `flat' face in
+relation to the cube. Note that the grid origin of a cube image (on the page)
+coincides with the \textit{bottom left} corner of the \textsc{front} face
+(green in this case).
+
+\item The first image is really just 4 units wide. This is because the 2D width
+of the \textit{side} face (red) is designed to measure 1~unit wide in the
+oblique view (similarly, the 2D height of the \textit{top} face also measures
+just 1~unit). Consequently, since the TikZ scale factor used is $0.4$, then
+the (minimum) width argument for its \verb!\ShowCube{}{}{}! command is
+$4\times 0.4 = 1.6$cm., hence we have \verb!\ShowCube{1.6cm}{0.4}{...}!.
+
+\end{enumerate}
+
+
+\pagebreak
+
+%----------------------
+\subsection[Cycle three edges]{Cycle three edges (flip two)}
+\typeout{---Example (cycle three edges (flip two))}
+
+The following example illustrates a sequence used for cycling three edges,
+which is often used in generating the `cross' formation while solving the
+final layer. However, it is a useful exercise to perform this sequence on
+a solved cube, as this reveals quite clearly its rather complex actions
+(it~also swaps two pairs of corners).
+
+ The black arrow (no flip) and magenta arrows (flip) indicate the \textsc{up}
+ face edge cubies which are cycled anti-clockwise by the sequence
+\ShowSequence{,}{\rr}{F,R,U,Rp,Up,Fp}. The blue arrows indicate the associated
+`collateral damage' actions (two pairs of corner cubies swap positions);
+depending on the circumstances, these other actions may be an acceptable
+cost since they can be fixed at a later stage. (This diagram is from
+Section~13 in the \textsc{rubikcube} package documentation).
+
+Note that we include the \textsc{up}-face sidebars to reveal the remaining
+facelet colours of the top layer (using the command \verb!\DrawRubikFaceUpSide!)
+so we can see how the sequence makes the cubies rotate and turn as they move.
+
+ \bigskip%
+ \noindent\hfil%
+ \RubikCubeSolvedWY%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \quad\ShowCube{2.3cm}{0.5}{%
+ \DrawRubikFaceUpSide%
+ \draw[thick,->,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+ \draw[thick,->] (2.5,1.5) -- (1.6, 2.4);
+ \draw[thick,->,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+ \draw[thick,<->, color=blue] (0.5,2.6) -- (2.5, 2.6);
+ \draw[thick,<->, color=blue] (0.5,0.3) -- (2.5, 0.3);
+ }%
+ \RubikRotation{\CycleThreeEdgesFlipTwo}%
+ \quad\ShowSequence{}{\Rubik}{\SequenceLong}\quad$\longrightarrow$\quad%
+ \ShowCube{2.3cm}{0.5}{\DrawRubikFaceUpSide}%
+ \hfil%
+ \bigskip%
+
+
+{\noindent}The code for the figure is as follows
+
+
+\begin{verbatim}
+\newcommand{\CycleThreeEdgesFlipTwo}{F,R,U,Rp,Up,Fp}%
+ ...
+ ...
+ \RubikCubeSolved%
+ \ShowCube{2cm}{0.4}{\DrawRubikCubeRU}%
+ \quad\ShowCube{2.3cm}{0.4}{%
+ \DrawRubikFaceUpSide%
+ \draw[thick,->,color=magenta] (1.5,0.5) -- (2.4, 1.4);
+ \draw[thick,->] (2.5,1.5) -- (1.6, 2.4);
+ \draw[thick,->,color=magenta] (1.3, 2.3) -- (1.3, 0.5);
+ \draw[thick,<->, color=blue] (0.5,2.6) -- (2.5, 2.6);
+ \draw[thick,<->, color=blue] (0.5,0.3) -- (2.5, 0.3);
+ }%
+ \RubikRotation{\CycleThreeEdgesFlipTwo}%
+ \quad\ShowSequence{}{\Rubik}{\SequenceLong}\quad$\longrightarrow$\quad%
+ \ShowCube{2.3cm}{0.4}{\DrawRubikFaceUpSide}%
+\end{verbatim}
+
+{\noindent}Note that the TikZ \verb!\draw! commands (for drawing the arrows
+on the cube face) start with a lower-case letter, and also require a terminal
+semicolon.
+
+
+
+
+\pagebreak
+%----------------------
+\subsection{Superflip}
+\typeout{---Example (superflip)}
+
+
+Once you can solve Rubik's cube, then an interesting exercise is to generate
+the so-called `superflip' configuration, in which all the
+corners are correctly solved, while all the edges are
+flipped\,\footnote{See the `superflip' entry in \textit{Wikipedia}, and also
+the Kociemba website (\url{www.kociemba.org/cube.htm}); particularly the page
+\url{http://kociemba.org/math/oh.htm}}.
+
+%--------draw the images-------------
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolvedWY%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \qquad$\longrightarrow$\qquad%
+ \RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeLD}%
+ \qquad%
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeSF}%
+\caption{Two representations of the superflip configuration.}
+\end{figure}
+%----------------------
+
+{\noindent}A superflip sequence converts the solved cube on the left
+into the form on the right, using the command \verb!\RubikRotation{\superflip}!.
+The code for the above figure is shown below (the~\verb!\superflip! macro
+used here is from the \textsc{rubikpatterns} package).
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation,rubikpatterns}
+...
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolvedWY%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+ \qquad$\longrightarrow$\qquad%
+ \RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeLD}
+ \qquad%
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeSF}
+\caption{...}
+\end{figure}
+\end{verbatim}
+
+
+The following superflip sequence\,\footnote{This particular superflip
+sequence (in the \textsc{rubikpatterns} package) is due to Reid (1995);
+for details see the \textsc{rubikpatterns} package documentation, and
+also \url{http://kociemba.org/math/oh.htm}.
+Another 20-move superflip sequence (due to H Kociemba), is designated
+as K32466 in \url{www.nickalls.org/dick/papers/tex/RUBIK20moves.zip}.}
+has just 20 HTM rotations (Half Turn Metric: counting 180~degree turns
+as just one `rotation'). Note that the \textsc{rubikpatterns} package
+contains this particular superflip sequence as the macro \verb!\superflip!
+(see \texttt{rubikpatterns.pdf}). Consequently the code
+\verb!\ShowSequence{,}{\large\texttt}{\superflip}!, will typeset the sequence
+as follows:
+
+\begin{center}
+%% show the Short code
+\ShowSequence{,}{\texttt}{\superflip}
+\end{center}
+Note that for convenience, the \textsc{rubikpatterns} package includes
+the sequence name (in square brackets) as the first element of the
+associated macro. This is possible since the contents of a comma-separated
+square bracket are not actioned as a rotation by the \verb!\RubikRotation!
+command.
+
+\pagebreak
+
+Next we present the same superflip sequence but without commas and in
+the form of hieroglyphs, using the \verb!\Rubik! font, for which we
+require the `expanded' \verb!\SequenceLong! form (since the `short form'
+includes trailing digits---see Section~11 in the \textsc{rubikcube}
+documentation), using the following code:
+
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation,rubikpatterns}
+...
+\RubikCubeSolvedWY
+\RubikRotation{\superflip}
+\noindent\strut\hspace{-8mm}\ShowSequence{}{\Rubik}{\SequenceLong}
+\end{verbatim}
+\end{quote}
+which gives
+
+
+\bigskip
+
+\RubikCubeSolvedWY
+\RubikRotation{\superflip}
+\noindent\strut\hspace{-8mm}\ShowSequence{}{\Rubik}{\SequenceLong}
+
+
+%%---------------------------------
+\bigskip
+
+\subsubsection*{Equivalent sequence}
+
+
+Interestingly, the superflip sequence is actually equivalent to
+\Rubikbrace{\Rubikbracket{\Rubik{Rm}\Rubik{U}}4, \Rubik{x},
+\Rubik{yp}}3 \ \ (Harris (2008), p151).
+Furthermore we can readily demonstrate this, as we can process
+this novel form of the sequence using some useful features of
+the \verb!\RubikRotation! command, as follows:
+
+\begin{quote}
+\begin{verbatim}
+\RubikCubeSolvedWF
+\RubikRotation[3]{[superflip],(Rm,U)4,x,yp,<Harris (2008), p151>}
+\ShowCube{4cm}{0.4}{\DrawRubikCubeSF}
+\end{verbatim}
+\end{quote}
+which generates the following
+
+%-------------------
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolvedWY
+ %%% \RubikRotation[3]{[shortsuper],(Rmp,Up)4,yp,x}% ORG
+ \RubikRotation[3]{[shortsuper],(Rm,U)4,x,yp,<Harris (2008), p151>}
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeSF}
+ \end{figure}
+%----------------------
+{\noindent}which is exactly the same configuration as before.
+Note that to do this we made use of the `repeat' option \verb![3]!
+as well as the \verb!(Rmp,Up)4! `repeat-block' in
+the argument of the \verb!\RubikRotation! command above.
+
+
+\pagebreak
+
+%----------------------
+\subsection{Inverse sequence}
+\typeout{---Example (inverse sequence)}
+
+
+Generating the inverse of a Rubik sequence involves (a)~reversing the
+order of the sequence, and (b)~inverting each rotation in the sequence
+(see Sections~5.1 and 5.1.1 in the \textsc{rubikrotation} package
+documentation).
+
+From the grey-cube example~(\ref{sec:greycube}) we saw that the sixspot
+sequence is: \verb!U,Dp,R,Lp,F,Bp,U,Dp!; its inverse is therefore
+readily determined as \verb!D,Up,B,Fp,L,Rp,D,Up!. Note that this is
+easy to check since the sequence generated by the \verb!\RubikRotation!
+command is held by the macro \verb!\SequenceLong!. For~example, the
+output of the following commands
+\begin{quote}
+\begin{verbatim}
+\fbox{\strut\rule{0pt}{10pt}%
+ The inverse of the sixspot sequence is:
+ \RubikRotation{\sixspot,<inverse>}
+ \ShowSequence{,}{\texttt}{\SequenceLong}.
+ }
+\end{verbatim}
+\end{quote}
+is \quad\fbox{\strut\rule{0pt}{10pt} %
+The inverse of the sixspot sequence is:
+\RubikRotation{\sixspot,<inverse>}
+\ShowSequence{,}{\texttt}{\SequenceLong}.
+}
+
+\bigskip
+
+A sequence and its inverse will annihilate each other when applied
+consecutively. For example, in the following figure we start with
+a solved cube and apply the sixspot sequence. Applying the inverse
+of the sixspot sequence then results in the solved cube configuration
+ again.
+
+\newcommand{\sixspotarrow}{$\quad\overrightarrow{\strut\textsc{sixspot}}\quad$}
+\newcommand{\sixspotINVarrow}{$\quad\overrightarrow{\strut\textsc{sixspotINV}}\quad$}
+
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolvedWY%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot}%
+ \sixspotarrow%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot,<inverse>}%
+ \sixspotINVarrow%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{figure}
+
+{\noindent}The code for the above figure is as follows:
+
+\begin{verbatim}
+\newcommand{\sixspotarrow}{$\quad\overrightarrow{\strut\textsc{sixspot}}\quad$}
+\newcommand{\sixspotINVarrow}{$\quad\overrightarrow{\strut\textsc{sixspotINV}}\quad$}
+...
+\RubikCubeSolvedWY\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot}%
+ \sixspotarrow%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot,<inverse>}%
+ \sixspotINVarrow%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{verbatim}
+
+
+A significant property of the superflip configuration is that it is its own
+inverse. Consequently we can achieve a similar result simply by applying the
+superflip sequence \textit{twice in succession}, as follows:
+
+\newcommand{\superfliparrow}{$\quad\overrightarrow{\strut\textsc{superflip}}\quad$}
+
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolved%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}\superfliparrow%
+\RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}\superfliparrow%
+\RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{figure}
+
+
+\pagebreak
+
+%-------------------
+\subsection{OLL example}
+
+% ThreeCube YellowCross (from dnRUBIKsolution15)
+\newcommand{\yellowcross}{[yellowcross],F,R,U,Rp,Up,Fp}
+\newcommand{\arrow}[1]{$\overrightarrow{\strut\mbox{#1}}$}
+\newcommand{\ShowYellowFace}{\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUpSide}}
+
+Here we illustrate the use of the \verb!\NoSidebar! command (see the
+\textsc{rubikcube} package documentation) to generate nice displays
+of so-called OLL (Orientate Lower Layer) configurations, which are
+typically rendered using the yellow face.
+
+For example, the following sequence shows an efficient
+algorithm (sequence) for `solving' the OLL configuration shown
+in cube~A (listed as OLL case~33 in Harris
+(2008, page~61)\footnote{Harris D (2008). \textit{Speedsolving the cube},
+(Stirling Publishing Co, New York) {\newline}(\texttt{www.stirlingpublishing.com})
+[covers 2x2x2, 3x3x3, 4x4x4, 5x5x5 cubes].} and also on the Harris OLL webpage \url{http://www.cubestation/3x3x3/cfop/oll/ollprintablepage.php}).
+
+
+%% Dan Harris case 33 (in his 2008 book)
+\newcommand{\CaseXXXIII}{[caseHarris33],R, U, Rp, U, R, Up, Rp, Up, Rp, F, R, Fp}
+% {\DH2008thth}
+
+\bigskip
+
+%% setup OLL position DH33 (Dan Harris)
+\RubikCubeGreyAll
+\RubikFaceUp{X}{Y}{Y}
+ {Y}{Y}{X}
+ {Y}{X}{X}
+\RubikFaceBack XXY XXXXXX
+\RubikFaceLeft XXX XXXXXX
+\RubikFaceRight YYX XXXXXX
+\RubikFaceFront XYX XXXXXX
+%
+\cubenumber{A}%
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUpSide}%
+%
+\RubikRotation{\CaseXXXIII}%
+\quad\SequenceBraceA{OLLcase33Harris}{%
+ \ShowSequence{}{\Rubik}{\CaseXXXIII}%
+ }%
+\quad$\longrightarrow$\quad%
+\cubenumber{B}%
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUpSide}%
+
+\bigskip
+
+{\noindent}The code for the above figure is as follows (note that
+the \verb!\NoSidebar{X}! command is placed inside the \verb!\ShowCube!
+environment in order to limit its action).
+
+\begin{quote}
+\begin{verbatim}
+\newcommand{\cubenumber}[1]{\strut\raisebox{1cm}{#1}}
+\newcommand{\CaseXXXIII}{[caseHarris33],R,U,Rp,U,R,Up,Rp,Up,Rp,F,R,Fp}
+%
+\RubikCubeGreyAll
+\RubikFaceUp{X}{Y}{Y}
+ {Y}{Y}{X}
+ {Y}{X}{X}
+\RubikFaceBack XXY XXXXXX
+\RubikFaceLeft XXX XXXXXX
+\RubikFaceRight YYX XXXXXX
+\RubikFaceFront XYX XXXXXX
+\cubenumber{A}%
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUpSide}%
+\RubikRotation{\CaseXXXIII}%
+\quad\SequenceBraceA{OLLcase33Harris}{%
+ \ShowSequence{}{\Rubik}{\CaseXXXIII}%
+ }%
+\quad$\longrightarrow$\quad%
+\cubenumber{B}%
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUpSide}%
+\end{verbatim}
+\end{quote}
+Note that since we originally defined the OLL case~33 algorithm
+(Harris 2008) as a macro, it follows that we could instead have
+recovered the OLL~33 configuration (cube~A above) using the
+inverse algorithm, as follows:
+
+\bigskip
+
+\RubikCubeGreyAll
+\RubikFaceUpAll{Y}
+\RubikRotation{<inverse>,\CaseXXXIII}
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUS}%
+\hspace{1cm}
+\begin{minipage}{4cm}
+\begin{verbatim}
+\RubikCubeGreyAll
+\RubikFaceUpAll{Y}
+\RubikRotation{<inverse>,\CaseXXXIII}
+\ShowCube{2.6cm}{0.6}{\NoSidebar{X}\DrawRubikFaceUS}
+\end{verbatim}
+\end{minipage}
+
+\bigskip
+
+{\noindent}Note that in this last example we have used the more convenient
+short-hand US (UpSide) version of the \verb!\DrawRubikFaceUpSide! command,
+namely \verb!\DrawRubikFaceUS!.
+
+
+
+\pagebreak
+%----------------------
+\subsection{Cube patterns}
+\typeout{---Example (Cube patterns)}
+
+\newcommand{\CycleThreeUpEdges}{[CycleUpEdges],F2,U,Rm,Up,Up,Lm,U,Fp2}
+\newcommand{\StripesOrtho}{[StripesOrtho],Lp,Fp,Rp,L,U,D, Rp,Dp,Lp,Bp,U2,Lp,Up,R,L,Up,F2,Rp,<Harris 2008, p150>}
+
+We now look at how the \verb!\RubikRotation! command can be used to
+investigate cube patterns, which are typically shown only as a
+regular cube. For example, consider the following interesting sequence
+\linebreak\texttt{L' F' R' L U D R' D' L' B' U2 L' U' R L U' F2 R'}
+(Harris 2008, page~150), which is presented as a cube with orthogonal
+stripes (see figure~A). In order to show the pattern using the Rubik
+ bundle, it is often useful to first express the sequence as a macro.
+ In this particular case we need to adjust the Harris (2008) notation
+ slightly to make it compatible (ie, insert commas, change trailing
+ `primes' into a trailing `p'), give it a suitable name
+ (say, \verb![StripesOrtho]!), and, for completion, include the citation
+in an `infoblock' ($<$...$>$), as follows:
+
+\begin{verbatim}
+\newcommand{\StripesOrtho}{%
+ [StripesOrtho],Lp,Fp,Rp,L,U,D,Rp,Dp,Lp,Bp,U2,Lp,Up,R,L,Up,F2,Rp,<Harris 2008, p150>}
+\end{verbatim}
+We can now process it simply by using its macro-name as the argument for
+the \verb!\RubikRotation! command; for example, the following code displays
+it as figure~A.
+
+\begin{verbatim}
+\RubikCubeSolved
+\RubikRotation{\StripesOrtho}
+\ShowCube{2.6cm}{0.6}{\DrawRubikCubeRU}
+\end{verbatim}
+
+At first sight this looks like a nice example of orthogonal stripes,
+but if we look at all the faces by rendering the cube in a Semi-Flat
+(SF) view (using the command \verb!\DrawRubikCubeSF!)
+ ---see~figure~B--- this reveals that unfortunately only five faces
+actually have a center stripe.
+
+\bigskip
+
+\RubikCubeSolved
+\RubikRotation{\StripesOrtho}
+\cubenumber{A}
+\ShowCube{2.6cm}{0.6}{\DrawRubikCubeRU}
+\hspace{3cm}
+\cubenumber{B}
+\ShowCube{4cm}{0.4}{\DrawRubikCubeSF}
+
+\bigskip
+
+{\noindent}So the question is: can we improve on this and create a cube
+with a fully orthogonal pattern, by swapping the relevant red/yellow
+and blue/yellow edge cubies in the back layer? Since it is impossible
+to swap just two edge cubies within the same layer in a 3x3x3 cube
+without changing any other cubies, the answer is no. However, we are
+able to cycle cleanly three edge cubies within one face, and a single
+cycle could at least create the final stripe with only minimal collateral
+damage.
+
+For example, if we rotate the whole cube using the rotation denoted
+as \rr{Rcp} (= \verb!\rr{Rcp}!)\,\footnote{There are several equivalent
+notations for this: \rr{Rcp} $\equiv$ \rr{xp} $\equiv$ \rr{CRp};
+the c and C denote a whole cube rotation.} to bring the \textsc{back} face to
+the \textsc{up} position (as shown in figure~C), we can then cycle the three
+\textsc{up} edge cubies UL, UR, UF clockwise using the following
+`CycleThreeUpEdges' sequence:
+\begin{verbatim}
+\newcommand{\CycleThreeUpEdges}{F2,U,Rm,Up,Up,Lm,U,Fp2}
+\end{verbatim}
+We can combine these two actions using the command
+\verb!\RubikRotation{Rcp,\CycleThreeUpEdges}!, which will then align the
+three red facelets in the \textsc{up} face and form the final stripe
+(see figure~D).
+
+\RubikCubeSolved
+\RubikRotation{\StripesOrtho,Rcp}
+\cubenumber{C}
+\ShowCube{2.6cm}{0.6}\DrawRubikCubeRU
+\hspace{3cm}
+\RubikRotation{\CycleThreeUpEdges}
+\cubenumber{D}
+\ShowCube{4cm}{0.4}\DrawRubikCubeSF
+
+\medskip
+
+The downside, of course, is that a yellow and a white facelet are also
+swapped in the top layer, but at least we now have a cube with six
+mutually adjacent orthogonal central stripes\,!
+
+
+\pagebreak
+
+%%=====================TWOcube stuff======================================
+%%========================================================================
+
+\section{TwoCube examples (2x2x2)}
+
+\subsection{Commands \& notation}
+
+Regarding the 2x2x2 cube as a `TwoCube' (instead of a RubikCube) makes
+the 2x2x2 commands very intuitive (assuming you are familiar with the
+3x3x3 commands), since they are mostly obtained just by exchanging
+the word `Rubik' in 3x3x3 commands for the word `Two'. For example,
+
+\medskip
+
+\verb!3x3x3!\quad\hspace{1cm}$\rightarrow$\quad\hspace{1cm}\verb!2x2x2!
+
+\smallskip
+
+\verb!\RubikCubeSolvedWY! $\rightarrow$ \verb!\TwoCubeSolvedWY!
+
+\verb!\RubikRotation!\qquad\ $\rightarrow$ \quad\verb!\TwoRotation!
+
+\verb!\SaveRubikState!\qquad\ $\rightarrow$ \quad\verb!\SaveTwoState!
+
+\medskip
+
+Note that although the 2x2x2 cube does not have any middle slices, one can still
+ actually use the 3x3x3 commands \verb!\RubikRotation! and \verb!\SaveRubikState!
+ in the usual way (because the corner cubies are still processed in
+the usual way). However, in the interests of consistency
+both of these commands have equivalent `Two' versions: namely
+\verb!\TwoRotation! and \verb!\SaveTwoState!.
+
+Of course there are considerably fewer rotation codes and hieroglyphs
+associated with the TwoCube (since there are no middle slices), and
+their commands also mirror the 3x3x3 equivalents in the \textsc{rubikcube}
+package; i.e.,~\verb!Rubik! $\rightarrow$ \verb!Two! and
+\verb!r! $\rightarrow$ \verb!t!. Thus the changes associated with the
+four key commands can be summarised as follows :
+
+ \medskip
+
+ \verb!3x3x3! \hphantom{$\rightarrow$} \verb!2x2x2!
+
+ \smallskip
+
+ \verb!\rr{}! $\rightarrow$ \verb!\tr{}!
+
+ \verb!\rrh{}! $\rightarrow$ \verb!\trh{}!
+
+ \verb!\Rubik{}! $\rightarrow$ \verb!\Two{}!
+
+ \verb!\textRubik{}! $\rightarrow$ \verb!\textTwo{}!
+
+
+%-----------------------
+
+\bigskip
+
+%-------------------
+\subsection{Visualising white-space}
+
+This example shows how the F version of the \verb!\ShowCube{}{}{}! command can be useful for revealing excess white space.
+
+
+
+ \bigskip
+
+\TwoCubeSolvedWB%
+\ShowCubeF{3cm}{0.6}{\DrawTwoCubeRU}%
+\quad\ShowCubeF{1.7cm}{0.6}{\DrawTwoFaceUS}%
+\hspace{1cm}
+\begin{minipage}{0.3\textwidth}
+\begin{verbatim}
+\TwoCubeSolvedWB%
+\ShowCubeF{3cm}{0.6}{\DrawTwoCubeRU}%
+\quad%
+\ShowCubeF{1.7cm}{0.5}{\DrawTwoFaceUS}%
+\end{verbatim}
+\end{minipage}
+
+
+\bigskip
+
+ Both images above have an F-box drawn around them (so we can see the
+ extent of any white space) using the F version of the \verb!\ShowCube!$\{\mbox{\textit{width}}\}\{\mbox{\textit{scale-factor}}\}\{\}$ command,
+ namely \verb!\ShowCubeF{}{}{}!. Clearly the \verb!3cm! width we have
+ used for the first cube above is too much, and so in the second pair
+ of images below we have reduced this width for the first image to
+ its correct value of \verb!1.6cm!, and have removed the F from the
+ \verb!\ShowCubeF! command accordingly.
+
+\bigskip
+
+\quad%
+\TwoCubeSolvedWB%
+\ShowCube{1.6cm}{0.6}{\DrawTwoCubeRU}%
+\quad%
+\ShowCube{1.7cm}{0.6}{\DrawTwoFaceUS}%
+\hspace{1cm}
+\begin{minipage}{0.3\textwidth}
+\begin{verbatim}
+\TwoCubeSolvedWB%
+\ShowCube{1.6cm}{0.6}{\DrawTwoCubeRU}%
+\quad%
+\ShowCube{1.7cm}{0.5}{\DrawTwoFaceUS}%
+\end{verbatim}
+\end{minipage}
+
+\bigskip
+
+Thus use of the F version of the the \verb!ShowCube! command allows
+the user to easily determine---by trial \& error---the correct minipage
+width for a particular cube.
+
+
+\pagebreak
+
+%-------------------
+\subsection{Flat and semi-flat formats}
+
+We can view the hidden faces of a cube using the semi-flat (SF) and
+flat (F) versions of the \verb!\DrawTwoCube..! command as follows.
+
+In the first figure we have also used the F version of the
+\verb!\ShowCube{}{}{}! command to reveal the size of the minipage
+which contains the image. Notice that since the 2D width of the side
+face (red) is approximately 1 unit, we can estimate that the total
+width of the image will be 6 + 1 = 7 units, and hence as we have
+specified a TikZ scale factor of 0.6, then the required width of
+the minipage is approximately $4.2$ ($= 7 \times 0.6$)
+---see Section~4.1 in the \textsc{rubikcube} package documentation
+for details).
+
+\bigskip
+
+\begin{minipage}{0.3\textwidth}
+\centering
+\TwoCubeSolvedWB%
+\ShowCubeF{4.2cm}{0.6}{\DrawTwoCubeSF}%
+\end{minipage}
+ \hspace{2cm}
+\begin{minipage}{0.3\textwidth}
+\begin{verbatim}
+\TwoCubeSolvedWB%
+\ShowCubeF{4.2cm}{0.6}{\DrawTwoCubeSF}%
+\end{verbatim}
+ \end{minipage}
+
+\bigskip
+
+\begin{minipage}{0.3\textwidth}
+\centering
+\TwoCubeSolvedWB%
+\ShowCube{4.8cm}{0.6}{\DrawTwoCubeF}%
+\end{minipage}
+ \hspace{2cm}
+\begin{minipage}{0.3\textwidth}
+\begin{verbatim}
+\TwoCubeSolvedWB%
+\ShowCube{4.8cm}{0.6}{\DrawTwoCubeF}%
+\end{verbatim}
+ \end{minipage}
+
+
+
+ \pagebreak
+
+%-------------------
+\subsection{Grey cube}
+
+
+A cube with all of the facelets coloured grey (a `grey' cube) can be
+useful as a starting state for instruction. Such a cube is generated
+by the command \verb!\TwoCubeGreyAll!.
+We can then allocate colours to those facelets demonstrating
+some feature of cube manipulation.
+ Here we are showing how to rotate the GWR corner cubie in the bottom layer
+ up into its `solved' position in the top layer. We also use two cube
+ sidebars to show the colours of the hidden facelets of the corner cubie.
+
+ \bigskip
+
+
+\noindent\hfil%
+\TwoCubeGrey
+\ShowCube{2cm}{0.7}{\DrawTwoCube}%
+%
+\TwoFaceUp{X}{X}
+ {R}{W}%
+\TwoFaceFront{G}{R}
+ {W}{X}%
+\TwoFaceLeft XX
+ XG%
+\TwoFaceDown{R}{X}
+ {X}{X}%
+\quad\ShowCube{2cm}{0.7}{
+ \DrawTwoCube
+ \DrawTwoCubeSidebarFD{RU}
+ \DrawTwoCubeSidebarFL{RU}
+ }%
+\quad\Two{Lp}\quad
+\TwoRotation{Lp}
+\ShowCube{2cm}{0.7}{\DrawTwoCube}%
+\hfil%
+
+\bigskip
+
+{\noindent}The code for the above figure is as follows:
+\begin{quote}
+\begin{verbatim}
+\noindent\hfil%
+\TwoCubeGrey
+\ShowCube{2cm}{0.6}{\DrawTwoCube}%
+%
+\TwoFaceUp{X}{X}
+ {R}{W}%
+\TwoFaceFront{G}{R}
+ {W}{X}%
+\TwoFaceLeft XX
+ XG%
+\TwoFaceDown{R}{X}
+ {X}{X}%
+\ShowCube{2cm}{0.6}{
+ \DrawTwoCube
+ \DrawTwoCubeSidebarFD{RU}
+ \DrawTwoCubeSidebarFL{RU}
+ }%
+\quad\Two{Lp}\quad
+\TwoRotation{Lp}
+\ShowCube{2cm}{0.6}{\DrawTwoCube}%
+\hfil%
+\end{verbatim}
+\end{quote}
+Notice that the curly brackets associated with the \verb!\TwoFace..! commands
+can be omitted providing at least one space is left before the first colour code
+(see the \verb!\TwoFaceLeft..! command above).
+
+
+ \pagebreak
+
+%-------------------
+\subsection{Scrambled cube}
+
+In the following example we scramble the cube using 20 random rotations using
+$\langle$\texttt{random,20}$\rangle$ as the argument
+for the \verb!\TwoRotation{}! command. We have also added a set of cube sidebars
+to the second cube. The final semi-flat (SF) cube has the same colour configuration
+and shows the hidden faces, allowing you to check the colours of the sidebars.
+
+\bigskip
+
+ \noindent\hfil%
+ \TwoCubeSolvedWY%
+ \ShowCube{1.8cm}{0.7}{\DrawTwoCubeRU}%
+ \qquad$\longrightarrow$\qquad%
+ %---------------
+ \TwoRotation{random,20}
+ %----------------
+ \ShowCube{2.8cm}{0.7}{
+ \DrawTwoCubeRU
+ \DrawTwoCubeSidebarFL{RU} % Front-Left edge sidebar
+ \DrawTwoCubeSidebarFD{RU} % Front-Down edge
+ \DrawTwoCubeSidebarBR{RU} % Back-Right edge
+ \DrawTwoCubeSidebarBU{RU} % Back-Up edge
+ }%
+ \qquad\ShowCube{5cm}{0.7}{\DrawTwoCubeSF}%
+ \hfil%
+
+ \bigskip
+
+
+ \begin{quote}
+ \begin{verbatim}
+ \noindent\hfil%
+ \TwoCubeSolvedWY%
+ \ShowCube{1.8cm}{0.7}{\DrawTwoCubeRU}%
+ \qquad$\longrightarrow$\qquad%
+ %---------------
+ \TwoRotation{random,20}
+ %----------------
+ \ShowCube{2.8cm}{0.7}{
+ \DrawTwoCubeRU
+ \DrawTwoCubeSidebarFL{RU} % Front-Left edge sidebar
+ \DrawTwoCubeSidebarFD{RU} % Front-Down edge
+ \DrawTwoCubeSidebarBR{RU} % Back-Right edge
+ \DrawTwoCubeSidebarBU{RU} % Back-Up edge
+ }%
+ \qquad\ShowCube{5cm}{0.7}{\DrawTwoCubeSF}%
+ \hfil%
+ \end{verbatim}
+ \end{quote}
+
+
+
+%-------------------
+\subsubsection*{A simple scramble}
+
+A simple scramble (from a solved position) which
+makes each face have four different facelets is $\left\{\mbox{\tr{R},
+\tr{y}}\right\}$5 as follows (note that the optional \verb!\TwoRotation!
+square bracket holds the repeat number~$5$):
+
+\bigskip
+
+\begin{minipage}{0.3\textwidth}
+\centering
+\TwoCubeSolvedWB%
+\TwoRotation[5]{R,y}%
+\ShowCube{5cm}{0.6}{\DrawTwoCubeF}%
+\end{minipage}
+ \hspace{2cm}
+\begin{minipage}{0.3\textwidth}
+\begin{verbatim}
+\TwoCubeSolvedWB%
+\TwoRotation[5]{R,y}%
+\ShowCube{5cm}{0.6}{\DrawTwoCubeF}%
+\end{verbatim}
+ \end{minipage}
+
+
+\pagebreak
+
+%-------------------
+\subsection{Swap two corners}
+
+The following example is the header figure for the \textsc{rubiktwocube}
+package documentation, and shows the `SwapTwoCorners' sequence often
+necessary in the solution of a 2x2x2 cube.
+
+ \bigskip
+
+ \noindent\hfil%
+ %% set up the cube with corners swapped
+ \TwoCubeSolvedWY%
+ \TwoRotation{Rc2}% turn upside down (= Rc2) x2
+ \TwoRotation{\swaptwocorners}%
+ %%
+ % now show the cube, before and after swapping the corners again
+ \ShowCube{1.6cm}{0.6}{\DrawTwoCubeRU}%
+ \quad\ShowCube{1.7cm}{0.5}{\DrawTwoFaceUS}%
+ \TwoRotation{\swaptwocorners}%
+ \quad\SequenceBraceA{SwapTwoCorners}{\ShowSequence{}{\Two}{\SequenceLong}}%
+ \quad$\longrightarrow$%
+ \quad\ShowCube{1.7cm}{0.5}{\DrawTwoFaceUS}%
+ \hfil%
+
+ \bigskip%
+
+ {\noindent}The code for the above figure is as follows:
+ \begin{verbatim}
+ \usepackage{tikz}
+ \usepackage{rubikcube,rubikrotation,rubikpatterns,rubiktwocube}
+ ...
+ \newcommand{\SwapTwoCorners}{[swaptwocorners],Rp,F,Rp,B2,R,Fp,Rp,B2,R2,Up}
+ \newcommand{\swaptwocorners}{\SwapTwoCorners}
+ ...
+ \noindent
+ \hfil%
+ %% set up the cube with corners swapped
+ \TwoCubeSolvedWY%
+ \TwoRotation{Rc2}% turn cube upside down about the R face
+ \TwoRotation{\swaptwocorners}%
+ %% now show the cube, before and after swapping the corners
+ \ShowCube{1.6cm}{0.6}{\DrawTwoCubeRU}%
+ \quad\ShowCube{1.7cm}{0.5}{\DrawTwoFaceUS}%
+ \TwoRotation{\swaptwocorners}%
+ \quad\SequenceBraceA{SwapTwoCorners}{\ShowSequence{}{\Two}{\SequenceLong}}%
+ \quad$\longrightarrow$%
+ \quad\ShowCube{1.7cm}{0.5}{\DrawTwoFaceUS}%
+ \hfil%
+ \end{verbatim}
+
+\pagebreak
+
+%-------------------
+\subsection{OLL example}
+
+Here we illustrate an OLL algorithm which orientates the last layer
+starting from a single yellow facelet in the UFL position.
+
+\bigskip
+
+\noindent\hfil%
+\TwoCubeGreyAll%
+\TwoFaceUp{X}{X}%
+ {Y}{X}%
+\TwoFaceBack XY XX
+\TwoFaceRight XY XX%
+\TwoFaceFront XY XX%
+\ShowCube{2cm}{0.7}{\NoSidebar{X}\DrawTwoFaceUS}
+ \SaveTwoState{cubeTWO.tex} %***
+\TwoRotation{\allyellow}%
+\quad\SequenceBraceA{AllYellow}{\ShowSequence{}{\Two}{\SequenceLong}}\quad$\longrightarrow$\quad%
+\ShowCube{1.5cm}{0.7}{\NoSidebar{X}\DrawTwoFaceUS}
+\hfil%
+
+\bigskip
+
+The code is shown below. Note that we have used the \verb!\NoSidebar{X}!
+command to disable the drawing of any grey sidebars by the \verb!\DrawTwoFaceUS!
+command\footnote{Note that the \textbackslash\texttt{DrawTwoFaceUS} command is a short-hand
+equivalent to the \textbackslash\texttt{DrawTwoFaceUpSide} command.}
+ and hence only yellow sidebars are drawn. Note that we have placed the
+\verb!\NoSidebar{X}! command inside the \verb!\ShowCube! environment in order
+to limit its action locally.
+
+\begin{quote}
+\begin{verbatim}
+\noindent\hfil%
+\TwoCubeGreyAll%
+\TwoFaceUp{X}{X}%
+ {Y}{X}%
+\TwoFaceBack XY XX
+\TwoFaceRight XY XX%
+\TwoFaceFront XY XX%
+\ShowCube{2cm}{0.7}{\NoSidebar{X}\DrawTwoFaceUS}%
+\TwoRotation{\allyellow}%
+\quad\SequenceBraceA{AllYellow}{\ShowSequence{}{\Two}{\SequenceLong}}%
+\quad$\longrightarrow$\quad%
+\ShowCube{1.5cm}{0.7}{\NoSidebar{X}\DrawTwoFaceUS}%
+\hfil%
+\end{verbatim}
+\end{quote}
+
+\bigskip
+
+
+\begin{center}
+------ END ------
+\end{center}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/rubik/rubikpatterns-doc-figA.pdf b/macros/latex/contrib/rubik/rubikpatterns-doc-figA.pdf
new file mode 100644
index 0000000000..bcf34e0cdd
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatterns-doc-figA.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikpatterns.dtx b/macros/latex/contrib/rubik/rubikpatterns.dtx
new file mode 100644
index 0000000000..26995cce27
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatterns.dtx
@@ -0,0 +1,609 @@
+% \iffalse meta-comment
+%
+% rubikpatterns.dtx
+%
+% version 5.0
+%
+% Authors: RWD Nickalls (dick@nickalls.org)
+% and Apostolos Syropoulos (asyropoulos@yahoo.com)
+%
+% Copyright 25 February 2018 RWD Nickalls + A Syropoulos
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any
+% later version. The latest version of this licence is in
+%
+% http://www.latex-project.org/lppl.txt
+%
+%<*readme>
+%
+% The rubikpatterns package provides a collection of LaTeX commands and macros
+% for the typesetting of Rubik cube configurations and rotation
+% sequences using the TikZ graphic language.
+%
+% Please report errors or suggestions for improvement to
+%
+% Dick Nickalls or Apostolos Syropoulos
+%
+% This package requires the basic TikZ package to be loaded already
+%</readme>
+%
+%<*driver>
+\listfiles
+\documentclass{ltxdoc}
+\IfFileExists{rubikpatterns.sty}{\usepackage{rubikpatterns}}{%
+ \GenericWarning{rubikpatterns.dtx}{Package file rubikpatterns.sty not found.
+ Documentation will be messed up!^^J
+ (Generate rubikpatterns.sty by (La)TeXing rubikpatterns.ins, and then^^J
+ process rubikpatterns.dtx again)^^J}\stop
+}%
+\pagestyle{myheadings}
+\markright{\texttt{rubikpatterns} \ \ (Rubik bundle v5.0, 2018) \ \ \texttt{www.ctan.org/pkg/rubik}}
+\usepackage{ifpdf}
+\usepackage{url,path} %% for references and paths
+\usepackage{graphicx} %% for the two pdf figs
+\usepackage{hypdoc} %% for pdf bookmarks + hyperref documenting of packages
+%%\OnlyDescription
+\EnableCrossrefs
+\PageIndex
+\CodelineIndex
+\CodelineNumbered
+\RecordChanges
+\setcounter{StandardModuleDepth}{1}
+\begin{document}
+ \DocInput{rubikpatterns.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+%%% \CheckSum{187}
+%
+%%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+%
+%
+% \title{%
+% \ifpdf\pdfbookmark[1]{Title}{Title}\else\fi%
+% The \textsc{rubikpatterns} package}
+%
+% \author{
+% RWD Nickalls (dick@nickalls.org) \\
+% A Syropoulos (asyropoulos@yahoo.com)
+% }
+% \date{This file describes version \RPfileversion\ (\RPfiledate)\\
+% \texttt{www.ctan.org/pkg/rubik}}
+% \maketitle
+%
+% \begin{abstract}
+% The \rubikpatterns\ package is a small data-base of well-known named
+% Rubik patterns and associated rotation sequences, for use in conjunction
+% with the other Rubik `bundle' packages.
+% \end{abstract}
+%
+%
+% \tableofcontents
+%
+% \pagebreak
+%
+% \section{Introduction}
+%
+% The \textsc{rubikpatterns} package is a small a data-base of well-known Rubik
+% rotation sequences for use in conjunction with the Rubik bundle packages.
+% These rotation sequences, which are well-known and widely available,
+% were sourced from the Rubik-related
+% websites of Reid M and Kociemba H (see References for URLs).
+%
+%
+%
+% \section{Requirements}
+%
+% The \textsc{rubikpatterns} package requires (a)~the TikZ package, since it makes
+% use of the TikZ picture environment, (b)~the \textsc{rubikcube} package, and
+% (c)~the \textsc{rubikrotation} package, since it uses
+% the Perl program \texttt{rubikrotation.pl}.
+% The \verb!TikZ! package must be loaded \textit{before} the \textsc{rubikcube} package.
+% The \textsc{rubikrotation} package requires Perl to be installed.
+%
+%
+%
+% \section{Installation}
+%
+%
+% The Rubik bundle consists of the four packages \textsc{rubikcube}, \textsc{rubikrotation},
+% \textsc{rubikpatterns} and \textsc{rubiktwocube}.
+%
+% Here we describe only the installation of the \textsc{rubikpatterns} package,
+% which consists of the following files:
+%\begin{quote}
+% \begin{verbatim}
+% rubikpatterns.ins
+% rubikpatterns.dtx
+% rubikpatterns.pdf --this document
+% rubikpatternsLIST.tex
+% rubikpatternsLIST.pdf --a graphic list of all patterns in this package
+% rubikpatterns-doc-figA.pdf
+%\end{verbatim}
+%\end{quote}
+% The package documentation is the file \texttt{rubikpatterns.pdf}.
+% The style option \texttt{rubikpatterns.sty} is generated by running (pdf)\LaTeX\ on
+% the file \texttt{rubikpatterns.ins} as follows:
+%\begin{quote}
+%\begin{verbatim}
+% pdflatex rubikpatterns.ins
+%\end{verbatim}
+%\end{quote}
+% The documentation file (\texttt{rubikpatterns.pdf}) is then generated using the following
+% sequence of steps\,\footnote{Since the documentation includes a complicated indexing
+% system as well a \textsc{pdf} index and hyperef links (the package \texttt{hypdoc}
+% is used), then a lot of pdflatex runs are required. Prior to the first run it is
+% a good idea to delete any relevant \texttt{.toc}, \texttt{.aux}, \texttt{.out} files.}:
+%\begin{quote}
+% \begin{verbatim}
+% pdflatex rubikpatterns.dtx
+% pdflatex rubikpatterns.dtx
+% makeindex -s gind.ist rubikpatterns
+% makeindex -s gglo.ist -o rubikpatterns.gls rubikpatterns.glo
+% pdflatex rubikpatterns.dtx
+% pdflatex rubikpatterns.dtx
+%\end{verbatim}
+%\end{quote}
+%
+%
+%
+% \subsection{Placing the files}
+% \label{sec:placingfiles}
+%
+% Place the files either in a working directory, or where your system
+% will find them, e.g.,~in your \texttt{/texmf-local/} directory tree.
+% For example, on a Linux platform with a standard \TeX\ Directory Structure (TDS), then:
+%
+%\medskip
+%{\noindent}*.sty $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/tex/latex/rubik/}
+%{\newline}*.pdf $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/doc/rubik/}
+%
+%\medskip
+%
+%\medskip
+%{\noindent}\textsc{file database}:\ \ Finally, (depending on your system) update the
+% \TeX\ file database.
+% For example, on a Linux platform this is achieved using the \texttt{texhash} command.
+%
+%
+% \subsection{The rubikpatternsLIST file}
+%
+
+% Note that the package includes a `rubikpatternsLIST' file (\texttt{rubikpatternsLIST.pdf}),
+% as well as the source file (\texttt{rubikpatternsLIST.tex}), and
+% associated \texttt{.sh} (Linux) and \texttt{.bat} (Microsoft) batch
+% files, which can be used to facilitate processing the source \texttt{.tex} file.
+% The file \texttt{rubikpatternsLIST.pdf} showcases the Rubik cube
+% patterns made available in this package.
+%
+% Note that should you need to generate the file \texttt{rubikpatternsLIST.pdf}
+% from the source file (\texttt{rubikpatternsLIST.tex}) you will require
+% the \textsc{rubikcube} and \textsc{rubikrotation} packages to be installed,
+% and will also need to use the \verb!--shell-escape! command-line
+% option (see Section~\ref{sec:rubikrotation} for details).
+%
+%
+%
+%
+%
+% \subsection{Usage}
+% \label{sec:usage}
+% Load the packages \textsc{rubikcube},
+% \textsc{rubikrotation} and \textsc{rubikpatterns} in the \TeX\ file preamble \textit{after} loading
+% the TikZ package; for example, as follows:
+%\begin{quote}
+% \begin{verbatim}
+% \usepackage{tikz}
+% \usepackage{rubikcube,rubikrotation,rubikpatterns}
+%\end{verbatim}
+%\end{quote}
+% Since the sequence macros made available by this package are accessed using commands
+% provided by the \textsc{rubikcube} and \textsc{rubikrotation} packages, please read the
+% documentation of these packages.
+%
+%
+%
+% \section{Rubik patterns}
+%
+% A Rubik pattern is the configuration generated by a sequence of rotations
+% (or `moves') from some initial starting configuration (typically a `solved'
+% configuration). For example, `sixspot' is a well known pattern generated
+% from a solved Rubik cube by the rotation sequence
+% \texttt{U,Dp,R,Lp,F,Bp,U,Dp}, as follows:
+%
+% \bigskip
+%
+% \noindent\begin{minipage}{\textwidth}
+% \centering
+% \ifpdf
+% \includegraphics[height=3cm]{rubikpatterns-doc-figA.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+% \bigskip
+%
+% {\noindent}The code for the above image is as follows:
+%
+%\begin{verbatim}
+% \noindent\hfil%
+% \RubikCubeSolvedWB%
+% \ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+% \RubikRotation{\SixSpot}%
+% \quad\SequenceBraceA{sixspot}{\ShowSequence{}{\Rubik}{\SequenceLong}}\quad%
+% \ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+% \hfil%
+%\end{verbatim}
+%
+% \bigskip
+%
+% Note that the appearance of a pattern generated by a given
+% rotation sequence is, of course, sensitive to (a)~the particular colour
+% configuration of the solved cube used, and (b)~the initial orientation of
+% the Rubik cube.
+%
+%
+% Consequently the appearance generated by a given sequence
+% may appear slightly different from
+% that on some websites, although the colour configuration (pattern's \textit{geometry})
+% will, of course, be the same (isomorphic). You may therefore need
+% to adjust the pre- (and possibly the post-) x,y,z rotations in
+% order to obtain a particular configuration as displayed elsewhere.
+%
+%
+% \subsection{Sequence macros}
+%
+% Each of the rotation sequences of `patterns' made available by the
+% \textsc{rubikpatterns} package is defined in the file \texttt{rubikpatterns.sty}
+% in the following compact macro form.
+% For~example, the rotation sequence associated with the pattern known
+% as `SixSpot' (shown in the figure above) is defined as follows:
+%\begin{verbatim}
+%\newcommand{\SixSpot}{[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*, 8f*)>}
+%\newcommand{\sixspot}{\SixSpot}
+%\end{verbatim}
+% The macro name is \verb!\SixSpot! (the lower-case version \verb!\sixspot! can also be used).
+% Note that the second argument which
+% includes the rotation sequence, also includes the pattern name in
+% square brackets \verb![SixSpot]! as the first element in the sequence.
+% Additional metadata (held by the macro \verb!\SequenceInfo!) is appended
+% in angle brackets (separated by a comma) as follows: \verb!<(8q*, 8f*)>!.
+% For details see the \textsc{rubikrotation} package documentation.
+%
+%
+%
+% \subsection{List of macros}
+%
+% The following is a list of the macro names of all the Rubik patterns supplied by
+% the \textsc{rubikpatterns} package. Note that for convenience each macro-name listed
+% has an equivalent lower-case version. See the companion file \texttt{rubikpatternsLIST.pdf}
+% for a detailed list showing each pattern and its associated
+% sequence\,\footnote{We show all these images in a separate
+% file (\texttt{rubikpatternsLIST.pdf}) purely because generating them requires
+% using the \LaTeX\ command-line option \texttt{--shell-escape} in conjunction
+% with the \textsc{rubikrotation} package.}.
+%
+% All the pattern names encoded here (as macros) are well-known and widely available.
+% However, some pattern names have been slightly modified
+% in order to avoid spaces and to keep them as similar to the original as possible.
+% On finding different sequences which generate the same pattern, then the
+% shortest sequence has been selected (they can be readily distinguished by their metadata).
+%
+% Finally, we note that there is a serious need for a standardised one-word nomenclature
+% in order to avoid confusion, and to facilitate computerisation and an electronic database.
+% Such a notation also needs to accommodate those sequence variations which generate the same pattern.
+% We welcome suggestions and/or help for improvement.
+
+%
+%\begin{verbatim}
+% \PonsAsinorum
+% \CheckerboardsThree
+% \CheckerboardsSix
+% \Stripes
+% \CubeInCube
+% \CubeInCubeInCube
+% \ChristmasCross
+% \PlummersCross
+% \Anaconda
+% \Python
+% \BlackMamba
+% \GreenMamba
+% \FemaleRattlesnake
+% \MaleRattlesnake
+% \FemaleBoa
+% \MaleBoa
+% \FourSpot
+% \SixSpot
+% \OrthogonalBars
+% \SixTs
+% \SixTwoOne
+% \ExchangedPeaks
+% \TwoTwistedPeaks
+% \FourTwistedPeaks
+% \ExchangedChickenFeet
+% \TwistedChickenFeet
+% \ExchangedRings
+% \TwistedRings
+% \EdgeHexagonTwo
+% \EdgeHexagonThree
+% \TomParksPattern
+% \RonsCubeInCube
+% \TwistedDuckFeet
+% \ExchangedDuckFeet
+% \Superflip
+%\end{verbatim}
+%
+% Note that the particular superflip sequence made available by this package
+% (shown in \texttt{rubikpatternsLIST.pdf}) is due to Reid (1995), and is detailed
+% on the Kociemba webpage \texttt{http://www.kociemba.org/math/oh.htm}. Indeed, this was the
+% first sequence to define the `20-move' (HTM) upper boundary for solving a Rubik cube
+% (see Rokicki \textit{et~al.}, 2013).
+%
+% The superflip configuration is also significant since it is its own inverse.
+% For example, the following two \verb!\RubikRotation! commands will generate the same
+% configuration (starting from a solved cube):
+%\begin{verbatim}
+% \RubikRotation{\superflip}
+% \RubikRotation{\superflip,<inverse>}
+%\end{verbatim}
+% This property is shown as one of the examples in the Rubik bundle file \texttt{rubikexamples.pdf}.
+%
+%
+%
+% \section{Change history}
+%
+% \begin{itemize}
+%
+% \item Version 4.0 (March 2017)
+%
+% --- First release of this package.
+%
+% \end{itemize}
+%
+%
+%
+% \section{References}
+% \label{sec:references}
+%
+%\begin{itemize}
+%
+% \item Fridrich website (Fridrich J).
+% See the `Pretty patterns' webpage \url{http://www.ws.binghamton.edu/fridrich/ptrns.html}
+%
+% \item Kociemba website (Kociemba H). \url{http://www.kociemba.org/cube.htm}
+% {\newline}---for superflip see: \url{http://www.kociemba.org/math/oh.htm}
+%
+% \item Randelshofer website (Randelshofer W). Pretty patterns.
+% \url{http://www.randelshofer.ch/rubik/patterns/U080.01.html}
+%
+% \item Reid M. \ Patterns. \url{http://www.cflmath.com/Rubik/patterns.html}
+%
+% \item Reid M. (1995). Superflip requires 20 face turns. (January 1995)
+% \url{http://www.math.ucf.edu/~reid/Rubik/CubeLovers/}
+% (see Section~\ref{sec:superflip})
+% {\newline}[cited from Rokicki \textit{et~al.}, 2013].
+% {\newline}(Note: easier to use is the following html indexed version of the
+% archive of the Cube-Lovers usenet group (1982--1997)
+% \url{http://www.math.rwth-aachen.de/~Martin.Schoenert/Cube-Lovers/})
+%
+% \item Rokicki T, Kociemba H, Davidson M and Dethridge J (2013). The diameter of the Rubik's
+% cube is twenty. \textit{SIAM.\ J.\ Discrete Math.}, \textbf{27}, 1082--1105.
+% \url{http://tomas.rokicki.com/rubik20.pdf}
+%
+%\end{itemize}
+%
+%
+%
+%
+% ^^A ==================================================
+% \StopEventually{\PrintIndex}
+%
+%
+%
+% \section[The code]{The code (\texttt{rubikpatterns.sty})}
+%
+%
+% \subsection{Package heading}
+% \label{sec:CodePackageHeading}
+%
+% \begin{macrocode}
+%<*rubikpatterns>
+\def\RPfileversion{5.0}%
+\def\RPfiledate{2018/02/25}% 25 February 2018
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rubikpatterns}[\RPfiledate\space (v\RPfileversion)]
+% \end{macrocode}
+%
+%
+% \begin{macro}{\rubikpatterns}
+% First we create a suitable logo
+% \begin{macrocode}
+\newcommand{\rubikpatterns}{\textsc{rubikpatterns}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Patterns}
+% \label{sec:patternscode}
+%
+%
+%
+%
+% \subsubsection{Superflip}
+% \label{sec:superflip}
+%
+% This particular superflip sequence is from the Kociemba website (his Oh webpage).
+% It is due to Reid (1995).
+% \begin{macrocode}
+\newcommand{\Superflip}{[Superflip],Dp,R2,Fp,D2,F2,U2,Lp,R,Dp,R2,B,F,Rp,%
+U2,Lp,F2,Rp,U2,Rp,Up,<(20f*)>}%
+\newcommand{\superflip}{\Superflip}
+% \end{macrocode}
+%
+%
+% \subsubsection{Reid data}
+%
+% These named sequences are derived from the Reid website.
+% \begin{macrocode}
+\newcommand{\PonsAsinorum}{[PonsAsinorum],F2,B2,R2,L2,U2,D2,%
+ <(12q*, 6f*)>}%
+\newcommand{\ponsasinorum}{\PonsAsinorum}%
+\newcommand{\CheckerboardsThree}%
+ {[CheckerboardsThree],F,B2,Rp,D2,B,R,U,Dp,R,Lp,Dp,Fp,R2,D,F2,Bp,%
+ <(20q*, 16f*), order 3>}%
+\newcommand{\checkerboardsthree}{\CheckerboardsThree}%
+\newcommand{\CheckerboardsSix}%
+ {[CheckerboardsSix],R2,L2,U,B,L2,Dp,F,B2,R,Lp,Fp,B,R,D,F2,Lp,Up,%
+ <(17f*, 22q), order 6>}%
+\newcommand{\checkerboardssix}{\CheckerboardsSix}%
+\newcommand{\Stripes}{[Stripes],F,U,F,R,L2,B,Dp,R,D2,L,Dp,B,R2,L,F,U,F,%
+ <(20q*, 17f*)>}%
+\newcommand{\stripes}{\Stripes}%
+\newcommand{\CubeInCube}{[CubeInCube],F,L,F,Up,R,U,F2,L2,Up,Lp,B,Dp,Bp,L2,U,%
+ <(18q*, 15f*)>}%
+\newcommand{\cubeincube}{\CubeInCube}%
+\newcommand{\CubeInCubeInCube}%
+ {[CubeInCubeInCube],Fp,U,Bp,Rp,U,F2,U2,Fp,Up,F,U2,D,Bp,Dp,R2,B2,Up,%
+ <(17f*, 22q)>}%
+\newcommand{\cubeincubeincube}{\CubeInCubeInCube}%
+\newcommand{\ChristmasCross}{[ChristmasCross],U,F,Bp,L2,U2,L2,Fp,B,U2,L2,U,%
+ <(16q*, 11f*)>}%
+\newcommand{\christmascross}{\ChristmasCross}%
+\newcommand{\PlummersCross}%
+ {[PlummersCross],R2,Lp,D,F2,Rp,Dp,Rp,L,Up,D,R,D,B2,Rp,U,D2,%
+ <(20q*, 16f*)>}%
+\newcommand{\plummerscross}{\PlummersCross}%
+\newcommand{\Anaconda}{[Anaconda],L,U,Bp,Up,R,Lp,B,Rp,F,Bp,D,R,Dp,Fp,%
+ <(14q*, 14f*)>}%
+\newcommand{\anaconda}{\Anaconda}%
+\newcommand{\Python}{[Python],F2,Rp,Bp,U,Rp,L,Fp,L,Fp,B,Dp,R,B,L2,%
+ <(16q*, 14f*)>}%
+\newcommand{\python}{\Python}%
+\newcommand{\BlackMamba}{[BlackMamba],R,D,L,Fp,R,Lp,D,Rp,U,Dp,B,Up,Rp,Dp,%
+ <(14q*, 14f*)>}%
+\newcommand{\blackmamba}{\BlackMamba}%
+\newcommand{\GreenMamba}{[GreenMamba],R,D,R,F,Rp,Fp,B,D,Rp,Up,Bp,U,D2,%
+ <(14q*, 13f*)>}%
+\newcommand{\greenmamba}{\GreenMamba}%
+\newcommand{\FemaleRattlesnake}%
+ {[FemaleRattlesnake],U2,Dp,L2,D,B,U,Bp,Rp,L2,U2,F,Up,F,R,%
+ <(18q*, 14f*)>}%
+\newcommand{\femalerattlesnake}{\FemaleRattlesnake}%
+\newcommand{\MaleRattlesnake}%
+ {[MaleRattlesnake],Rp,Fp,U,Fp,U2,R,L2,B,Up,Bp,Dp,L2,U2,D,%
+ <(18q*, 14f*)>}%
+\newcommand{\malerattlesnake}{\MaleRattlesnake}%
+\newcommand{\FemaleBoa}{[FemaleBoa],R,Up,R2,U2,F,D2,R2,Up,Dp,R,Dp,Fp,%
+ <(16q*, 12f*)>}%
+\newcommand{\femaleboa}{\FemaleBoa}%
+\newcommand{\MaleBoa}{[MaleBoa],F,D,Rp,U,D,R2,D2,Fp,U2,R2,U,Rp,%
+ <(16q*, 12f*)>}%
+\newcommand{\maleboa}{\MaleBoa}%
+\newcommand{\FourSpot}{[FourSpot],F2,B2,U,Dp,R2,L2,U,Dp,%
+ <(12q*, 8f*)>}%
+\newcommand{\fourspot}{\FourSpot}%
+\newcommand{\SixSpot}{[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,%
+ <(8q*, 8f*)>}%
+\newcommand{\sixspot}{\SixSpot}%
+\newcommand{\OrthogonalBars}%
+ {[OrthogonalBars],F,Rp,U,L,Fp,Lp,F,Up,R,U,Lp,Up,L,Fp,%
+ <(14q*, 14f*)>}%
+\newcommand{\orthogonalbars}{\OrthogonalBars}%
+\newcommand{\SixTs}{[SixTs],F2,R2,U2,Fp,B,D2,L2,F,B,%
+ <(14q*, 9f*)>}%
+\newcommand{\sixts}{\SixTs}%
+\newcommand{\SixTwoOne}{[SixTwoOne],U,B2,D2,L,Bp,Lp,Up,Lp,B,D2,B2,%
+ <(15q*, 11f*)>}%
+\newcommand{\sixtwoone}{\SixTwoOne}%
+\newcommand{\ExchangedPeaks}%
+ {[ExchangedPeaks],F2,R2,D,R2,U,D,F2,Dp,Rp,Dp,F,L2,Fp,D,R,Up,%
+ <(16f*, 21q)>}%
+\newcommand{\exchangedpeaks}{\ExchangedPeaks}%
+\newcommand{\TwoTwistedPeaks}%
+ {[TwoTwistedPeaks],F,D2,B,R,Bp,Lp,F,Dp,L2,F2,R,Fp,Rp,F2,Lp,Fp,%
+ <(16f*, 20q)>}%
+\newcommand{\twotwistedpeaks}{\TwoTwistedPeaks}%
+\newcommand{\FourTwistedPeaks}%
+ {[FourTwistedPeaks],Up,D,B,Rp,F,R,Bp,Lp,Fp,B,L,F,Rp,Bp,R,Fp,Up,D,%
+ <(18q*, 18f*)>}%
+\newcommand{\fourtwistedpeaks}{\FourTwistedPeaks}%
+\newcommand{\ExchangedChickenFeet}%
+ {[ExchangedChickenFeet],F,Lp,Dp,Bp,L,F,U,Fp,Dp,F,L2,Bp,Rp,U,L2,Dp,F,%
+ <(19q*, 17f*)>}%
+\newcommand{\exchangedchickenfeet}{\ExchangedChickenFeet}%
+\newcommand{\TwistedChickenFeet}%
+ {[TwistedChickenFeet],F,Lp,D,Fp,Up,B,U,F,Up,F,Rp,F2,L,Up,Rp,D2,%
+ <(18q*, 16f*)>}%
+\newcommand{\twistedchickenfeet}{\TwistedChickenFeet}%
+\newcommand{\ExchangedRings}%
+ {[ExchangedRings],F,U,Dp,Lp,B2,L,Up,D,F,U,R2,L2,Up,L2,F2,%
+ <(15f*, 20q)>}%
+\newcommand{\exchangedrings}{\ExchangedRings}%
+\newcommand{\TwistedRings}%
+ {[TwistedRings],F,D,Fp,D2,Lp,Bp,U,L,D,R,U,Lp,Fp,U,L,U2,%
+ <(18q*, 16f*)>}%
+\newcommand{\twistedrings}{\TwistedRings}%
+\newcommand{\EdgeHexagonTwo}%
+ {[EdgeHexagonTwo],U,B2,Up,Fp,Up,D,Lp,D2,L,U,Dp,F,Dp,L2,B2,Dp,%
+ <(20q*, 16f*) order2>}%
+\newcommand{\edgehexagontwo}{\EdgeHexagonTwo}%
+\newcommand{\EdgeHexagonThree}%
+ {[EdgeHexagonThree],F,L,B,U,L,F2,B2,Rp,F2,B2,Up,Bp,Lp,Fp,%
+ <(14f*, 18q) order 3>}%
+\newcommand{\edgehexagonthree}{\EdgeHexagonThree}%
+\newcommand{\TomParksPattern}%
+ {[TomParksPattern],L,U,F2,R,Lp,U2,Bp,U,D,B2,L,F,Bp,Rp,L,Fp,R,%
+ <(20q*, 17f*)>}%
+\newcommand{\tomparkspattern}{\TomParksPattern}%
+\newcommand{\RonsCubeInCube}%
+ {[RonsCubeInCube],L2,D2,Lp,D2,B2,L2,B2,Lp,D2,L2,B2,Lp,B2,%
+ <(13f*, 23q)>}%
+\newcommand{\ronscubeincube}{\RonsCubeInCube}%
+\newcommand{\TwistedDuckFeet}%
+ {[TwistedDuckFeet],F,Rp,B,R,U,Fp,Lp,Fp,U2,Lp,Up,D2,B,Dp,F,Bp,U2,%
+ <(20q*, 17f*)>}%
+\newcommand{\twistedduckfeet}{\TwistedDuckFeet}%
+\newcommand{\ExchangedDuckFeet}%
+ {[ExchangedDuckFeet],U,F,R2,Fp,Dp,R,U,B2,U2,Fp,R2,F,D,B2,R,Bp,%
+ <(21q*, 16f*)>}%
+\newcommand{\exchangedduckfeet}{\ExchangedDuckFeet}%
+% \end{macrocode}
+% --------------------------
+% End of this package
+% --------------------------
+% \begin{macrocode}
+%</rubikpatterns>
+% \end{macrocode}
+%
+%
+%
+%
+% \Finale
+%
+\endinput
+
+
+
+
+
diff --git a/macros/latex/contrib/rubik/rubikpatterns.ins b/macros/latex/contrib/rubik/rubikpatterns.ins
new file mode 100644
index 0000000000..d5ebcf3e60
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatterns.ins
@@ -0,0 +1,64 @@
+%% rubikpatterns.ins
+%%
+%%
+%% --- automatic overwriting of .sty is disabled-------
+%% =========================================================
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{rubikpatterns.ins}
+\input docstrip.tex
+
+\preamble
+
+-----------------------------------------------------------------
+ Authors: RWD Nickalls (dick@nickalls.org)
+ and Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ Copyright February 25, 2018 RWD Nickalls and A Syropoulos
+
+ VERSION 5.0
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3c of this license or (at your option) any
+ later version: <http://www.latex-project.org/lppl.txt>
+
+ This work consists of the files listed in the README file.
+-----------------------------------------------------------------
+
+ This is a LaTeX/TikZ package for drawing Rubik cubes
+ Please report errors or suggestions for improvement to
+
+ RWD Nickalls (dick@nickalls.org)
+ Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ This package requires the basic TikZ package to be loaded already
+------------------------------------------------------------------
+\endpreamble
+
+\keepsilent %%disables most of the screen output
+%% \askforoverwritefalse %%enables automatic overwriting of .sty
+\generate{\file{rubikpatterns.sty}{\from{rubikpatterns.dtx}{rubikpatterns}}}
+
+%%now write a screen message for the user
+\obeyspaces
+\Msg{*******************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* rubikpatterns.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* rubikpatterns.dtx through LaTeX. *}
+\Msg{* For an index, process any filename.idx file by *}
+\Msg{* makeindex -s gind.ist filename *}
+\Msg{* For list of changes, process any filename.glo file *}
+\Msg{* makeindex -s gglo.ist -o filename.gls filename.glo *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{*******************************************************}
+
+\endbatchfile
+%%------------EOF---------------
diff --git a/macros/latex/contrib/rubik/rubikpatterns.pdf b/macros/latex/contrib/rubik/rubikpatterns.pdf
new file mode 100644
index 0000000000..ffd3a312b3
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatterns.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikpatternsLIST.bat b/macros/latex/contrib/rubik/rubikpatternsLIST.bat
new file mode 100644
index 0000000000..a8e9b92cd1
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatternsLIST.bat
@@ -0,0 +1,3 @@
+ pdflatex --shell-escape rubikpatternsLIST.tex
+
+
diff --git a/macros/latex/contrib/rubik/rubikpatternsLIST.pdf b/macros/latex/contrib/rubik/rubikpatternsLIST.pdf
new file mode 100644
index 0000000000..aad724979b
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatternsLIST.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikpatternsLIST.sh b/macros/latex/contrib/rubik/rubikpatternsLIST.sh
new file mode 100644
index 0000000000..4aa4a07ae4
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatternsLIST.sh
@@ -0,0 +1,10 @@
+
+## rubikpatternsLIST.sh
+## rubik bundle v5.0, 2018
+## run twice to get hyperref-links correct
+
+ pdflatex --shell-escape rubikpatternsLIST.tex
+ pdflatex --shell-escape rubikpatternsLIST.tex
+
+## echo "...checking error file"
+## grep ERROR ./rubikstateERRORS.dat
diff --git a/macros/latex/contrib/rubik/rubikpatternsLIST.tex b/macros/latex/contrib/rubik/rubikpatternsLIST.tex
new file mode 100644
index 0000000000..56f6663ae9
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikpatternsLIST.tex
@@ -0,0 +1,283 @@
+%%
+%% rubikpatternsLIST.tex
+%% part of the rubikpatterns package v5.0
+%% authors: RWD Nickalls & A Syropoulos
+%% 25 February 2018
+%% Rubik bundle v5.0
+%%------------------------
+%% this file requires the rubikrotation and rubkpatterns packages
+%% run this file as : $ pdflatex --shell-escape rubikpatternsLIST.tex
+%%------------------------
+
+\documentclass[a4paper]{article}
+
+\usepackage{tikz}
+\usepackage{rubikcube,rubikrotation,rubikpatterns}
+
+%--------------------------
+\usepackage{url,ifpdf}
+%---------------------
+\ifpdf
+ \usepackage[verbose]{microtype}
+ \usepackage{cmap}
+ \usepackage[pdfencoding=auto]{hyperref}
+
+ \hypersetup{%
+ pdftitle={rubikpatternsLIST.pdf},
+ pdfsubject={Rubik cube, Rubik bundle},
+ pdfkeywords={Rubik cube LaTeX}
+ }
+\fi
+%%------------------
+\pagestyle{myheadings}
+\markright{\texttt{rubikpatternsLIST.pdf} \ (Rubik bundle v5.0) \ \texttt{www.ctan.org/pkg/rubik}}
+%-------------------------------------
+%% need to use a negthinspace $\!$ before \ShowSequence
+%% to adjust for the first [ char in the cs string
+%% this makes the first line align correctly
+\newcommand{\ShowPattern}[1]{%
+\noindent%
+ \RubikCubeSolvedWB
+ \RubikRotation{#1}
+ \ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}
+ \hspace{0.5cm}% was 1cm
+\begin{minipage}{9cm}
+\noindent$\!$\ShowSequence{,\ }{\texttt}{\SequenceShort},
+\newline\noindent\texttt{\SequenceInfo}.
+\end{minipage}
+}
+
+%======================
+\begin{document}
+
+
+\ifpdf\pdfbookmark[1]{Title}{Title}\fi
+\title{List of Rubik patterns\\%
+\smallskip\normalsize\texttt{www.ctan.org/tex-archives/macros/latex/contrib/rubik/rubikpatternsLIST.pdf}%
+\footnote{This file is part of the Rubik bundle v5.0, 2018.
+To generate this file, use the following command:
+\newline \texttt{\$ pdflatex --shell-escape rubikpatternsLIST.tex}}}
+\author{RWD Nickalls\,\footnote{email: \textsf{dick@nickalls.org}}%
+ \ \ \& A Syropoulos\,\footnote{email: \textsf{asyropoulos@yahoo.com}}}
+\date{25 February 2018 (Rubik bundle v5.0)}
+\maketitle
+
+
+%==========================================
+\section{Rubik patterns}
+
+A Rubik pattern is the configuration generated by a sequence of rotations
+(or `moves') from some initial starting configuration (typically a `solved'
+configuration). For example, `sixspot' is a well known pattern generated
+from a solved Rubik cube by the rotation sequence
+ \texttt{U,Dp,R,Lp,F,Bp,U,Dp}, as follows:
+
+\bigskip
+
+\noindent\hfil%
+\RubikCubeSolvedWB
+\ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot}%
+\quad\SequenceBraceA{sixspot}{\ShowSequence{}{\Rubik}{\SequenceLong}}\quad%
+\ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+\hfil%
+
+\bigskip
+
+\medskip
+{\noindent}The code for this image is as follows:
+
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz}
+\usepackage{rubikcube,rubikrotation,rubikpatterns}
+...
+\noindent\hfil%
+\RubikCubeSolvedWB%
+\ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+\RubikRotation{\sixspot}%
+\quad\SequenceBraceA{sixspot}{%
+ \ShowSequence{}{\Rubik}{\SequenceLong}%
+ }%
+\quad\ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}%
+\hfil%
+\end{verbatim}
+\end{quote}
+
+
+Note that the appearance of a pattern generated by a given
+rotation sequence is, of course, sensitive to
+(a)~the particular colour configuration of the solved
+cube used, and (b)~the initial orientation of the cube.
+
+The initial condition associated with all the pattern images
+shown in this document is the solved form of the `WB' colour
+configuration (White opposite Blue), since this is the solved
+cube colour configuration used by the Reid website, from which
+nearly all these patterns are drawn.
+
+The following image shows the WB cube form (set up using the command
+\verb!\RubikCubeSolvedWB!) displayed in a semi-flat (SF) mode
+(\verb!\DrawRubikCubeSF!) so we can see all the faces
+---see the \textsc{rubikcube} documentation for details.
+
+\bigskip
+
+ \RubikCubeSolvedWB%
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeSF}%
+\hspace{3mm}%
+\begin{minipage}{5cm}
+\begin{verbatim}
+\usepackage{tikz}
+\usepackage{rubikcube,rubikrotation}
+...
+\RubikCubeSolvedWB%
+\ShowCube{2cm}{0.5}{\DrawRubikCubeSF}%
+\end{verbatim}
+\end{minipage}
+
+%====================
+\section{Typesetting}
+
+The remainder of this document just displays the various patterns
+made available with the \textsc{rubikpatterns} package. We display
+the patterns using the following \verb!\ShowPattern! command, which
+uses the \verb!\RubikRotation! command (from the \textsc{rubikrotation}
+package), and takes the pattern macro-name as the argument:
+This command draws the cube from the right-upper (RU) viewpoint,
+and shows the rotation sequence and metadata.
+
+Note that since each sequence starts with a \verb![name],! we include
+a negative thin space (\verb[$\![) just before the \verb!\ShowSequence!
+command to adjust the position of the narrow initial \verb![! character
+ in order to align it correctly with the subsequent line.
+
+\begin{verbatim}
+%----------------------------------------
+\usepackage{tikz}
+\usepackage{rubikcube,rubikrotation,rubikpatterns}
+...
+\newcommand{\ShowPattern}[1]{%
+\noindent%
+ \RubikCubeSolvedWB
+ \RubikRotation{#1}
+ \ShowCube{2.4cm}{0.6}{\DrawRubikCubeRU}
+ \hspace{0.5cm}%
+\begin{minipage}{9cm}
+\noindent$\!$\ShowSequence{,\ }{\texttt}{\SequenceShort},
+\newline\noindent\texttt{\SequenceInfo}.
+\end{minipage}
+}
+%------------------------------------------
+\end{verbatim}
+
+
+For example, the first pattern below (Pons Asinorum) is typeset
+using the following command:
+
+\begin{verbatim}
+\bigskip\ShowPattern{\ponsasinorum}
+\end{verbatim}
+
+
+%-----------------------------
+\section{List of Patterns}
+
+\bigskip\ShowPattern{\PonsAsinorum}
+
+\bigskip\ShowPattern{\CheckerboardsThree}
+
+\bigskip\ShowPattern{\CheckerboardsSix}
+
+\bigskip\ShowPattern{\Stripes}
+
+\bigskip\ShowPattern{\CubeInCube}
+
+\bigskip\ShowPattern{\CubeInCubeInCube}
+
+\bigskip\ShowPattern{\ChristmasCross}
+
+\bigskip\ShowPattern{\PlummersCross}
+
+\bigskip\ShowPattern{\Anaconda}
+
+\bigskip\ShowPattern{\Python}
+
+\bigskip\ShowPattern{\BlackMamba}
+
+\bigskip\ShowPattern{\GreenMamba}
+
+\bigskip\ShowPattern{\FemaleRattlesnake}
+
+\bigskip\ShowPattern{\MaleRattlesnake}
+
+\bigskip\ShowPattern{\FemaleBoa}
+
+\bigskip\ShowPattern{\MaleBoa}
+
+\bigskip\ShowPattern{\FourSpot}
+
+\bigskip\ShowPattern{\sixspot}
+
+\bigskip\ShowPattern{\OrthogonalBars}
+
+\bigskip\ShowPattern{\SixTs}
+
+\bigskip\ShowPattern{\SixTwoOne}
+
+\bigskip\ShowPattern{\ExchangedPeaks}
+
+\bigskip\ShowPattern{\TwoTwistedPeaks}
+
+\bigskip\ShowPattern{\FourTwistedPeaks}
+
+\bigskip\ShowPattern{\ExchangedChickenFeet}
+
+\bigskip\ShowPattern{\TwistedChickenFeet}
+
+\bigskip\ShowPattern{\ExchangedRings}
+
+\bigskip\ShowPattern{\TwistedRings}
+
+\bigskip\ShowPattern{\EdgeHexagonTwo}
+
+\bigskip\ShowPattern{\EdgeHexagonThree}
+
+\bigskip\ShowPattern{\TomParksPattern}
+
+\bigskip\ShowPattern{\RonsCubeInCube}
+
+\bigskip\ShowPattern{\TwistedDuckFeet}
+
+\bigskip\ShowPattern{\ExchangedDuckFeet}
+
+\bigskip\ShowPattern{\Superflip}
+
+\bigskip
+
+
+%------------------------
+\section{References}
+
+\begin{itemize}
+\item Fridrich website (Fridrich J).
+\ \ \url{http://www.ws.binghamton.edu/fridrich/}
+See the `Pretty patterns' webpage
+\url{http://www.ws.binghamton.edu/fridrich/ptrns.html}
+
+\item Kociemba website (Kociemba H). \url{http://www.kociemba.org/cube.htm}
+ {\newline}---for superflip see: \url{http://www.kociemba.org/math/oh.htm}
+
+\item Randelshofer website (Randelshofer W). Pretty patterns. \url{http://www.randelshofer.ch/rubik/patterns/U080.01.html}
+
+\item Reid patterns web page (Reid M).
+\url{http://www.cflmath.com/~reid/Rubik/patterns.html}
+
+\end{itemize}
+
+
+\begin{center}
+------ END ------
+\end{center}
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/rubik/rubikrot-doc-figA.pdf b/macros/latex/contrib/rubik/rubikrot-doc-figA.pdf
new file mode 100644
index 0000000000..b399229915
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrot-doc-figA.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikrot-doc-figB.pdf b/macros/latex/contrib/rubik/rubikrot-doc-figB.pdf
new file mode 100644
index 0000000000..7478436a27
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrot-doc-figB.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikrot-doc-figC.pdf b/macros/latex/contrib/rubik/rubikrot-doc-figC.pdf
new file mode 100644
index 0000000000..7ca1fe2db2
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrot-doc-figC.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikrot-doc-figD.pdf b/macros/latex/contrib/rubik/rubikrot-doc-figD.pdf
new file mode 100644
index 0000000000..8cda23314e
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrot-doc-figD.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikrotation.1 b/macros/latex/contrib/rubik/rubikrotation.1
new file mode 100644
index 0000000000..17a03ab2e0
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotation.1
@@ -0,0 +1,61 @@
+.\" copyright (c) 2014--2018 A Syropoulos and RWD Nickalls
+.\" rubikrotation.1
+.\" place this file in: /usr/share/man/man1/
+..
+.TH rubikrotation.1
+.SH NAME
+.B rubikrotation (v5.0)
+.SH AUTHORS
+A. Syropoulos and R.W.D. Nickalls (25 February 2018)
+
+ dick[at]<nickalls><org>
+ asyropoulos[at]<yahoo><com>
+
+
+.SH DESCRIPTION
+.B rubikrotation
+is a Perl script for processing Rubik cube rotations (3x3x3 and 2x2x2). It is part of the LaTeX rubikrotation package, and is typically CALLed by rubikrotation.sty, in response to the RubikRotation{} command: see the package manual (rubikrotation.pdf) for details. The rubikrotation package is part of the LaTeX Rubik `bundle'. The latest version can be downloaded from
+.PP
+CTAN: mirror.ctan.org/macros/latex/contrib/rubik/
+.PP
+rubikrotation reads Rubik state data and commands (sequence of rotations) from an input file, and writes the new state data to an output file. The input and output filenames can be specified as command-line arguments (see: command-line use).
+
+If a configuration file exists (rubikrotation.cfg) then it will be automatically be read by rubikrotation.sty.
+
+.SH COMMAND-LINE USE
+rubikrotation [-h|--help|-v|--version] [-o <outfile>] -i <infile>
+
+.B -h
+displays the help info and exits.
+
+.B -v
+displays the version info and exits.
+
+.B -i
+defines the input filename.
+The default input filename set by the rubikrotation package is rubikstate.dat, and this is generated by the LaTeX RubikRotation{} command (see the rubikrotation LaTeX package manual rubikrotation.pdf). Note that the rubikrotation perl script expects the input file to have a certain structure, as described in rubikrotation.pdf and rubikrotationPL.pdf).
+
+.B -o
+defines the output filename.
+If no output filename is given then the default filename rubikOUT.txt is used.
+
+.SH SEE ALSO
+The rubikrotation Perl script manual (rubikrotationPL.pdf), the rubikrotation LaTeX package manual (rubikrotation.pdf), examples (rubikexamples.pdf), the rubikcube LaTeX package manual (rubikcube.pdf), and the rubikpatterns LaTeX package manuals (rubikpatterns.pdf and rubikpatternsLIST.pdf).
+
+To view rubikrotation.pdf, type: texdoc rubikrotation
+
+To view rubikrotationPL.pdf, type: texdoc rubikrotationPL
+
+To view rubikcube.pdf, type: texdoc rubikcube
+
+To view rubiktwocube.pdf, type: texdoc rubiktwocube
+
+To view rubikexamples.pdf, type: texdoc rubikexamples
+
+To view rubikpatterns.pdf, type: texdoc rubikpatterns
+
+To view rubikpatternsLIST.pdf, type: texdoc rubikpatternsLIST
+
+.SH BUGS
+Please report bugs to Dick Nickalls or to Apostolos Syropoulos.
+
diff --git a/macros/latex/contrib/rubik/rubikrotation.dtx b/macros/latex/contrib/rubik/rubikrotation.dtx
new file mode 100644
index 0000000000..33103cfc54
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotation.dtx
@@ -0,0 +1,1697 @@
+% \iffalse meta-comment
+% rubikrotation.dtx
+%
+% version 5.0
+%
+%
+% Authors: RWD Nickalls (dick@nickalls.org)
+% and Apostolos Syropoulos (asyropoulos@yahoo.com)
+%
+% Copyright 25 February 2018 RWD Nickalls + A Syropoulos
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any
+% later version. The latest version of this licence is in
+%
+% http://www.latex-project.org/lppl.txt
+%
+%<*readme>
+%
+% The rubikrotation package provides a collection of LaTeX commands and macros
+% for the typesetting of Rubik cube configurations and rotation
+% sequences using the TikZ graphic language.
+%
+% Please report errors or suggestions for improvement to
+%
+% Dick Nickalls or Apostolos Syropoulos
+%
+% This package requires the basic TikZ package to be loaded already
+%</readme>
+%
+%<*driver>
+\listfiles
+\documentclass{ltxdoc}
+\IfFileExists{rubikrotation.sty}{\usepackage{rubikrotation}}{%
+ \GenericWarning{rubikrotation.dtx}{Package file rubikrotation.sty not found.
+ Documentation will be messed up!^^J
+ (Generate rubikrotation.sty by (La)TeXing rubikrotation.ins, and then^^J
+ process rubikrotation.dtx again)^^J}\stop
+}%
+\pagestyle{myheadings}
+\markright{\texttt{rubikrotation} \ \ (Rubik bundle v5.0, 2018) \ \ \texttt{www.ctan.org/pkg/rubik}}
+\usepackage{ifpdf}
+\usepackage{url,path} %% for references and paths
+\usepackage{graphicx} %% for the two pdf figs
+\usepackage{hypdoc} %% for pdf bookmarks + hyperref documenting of packages
+%%\OnlyDescription
+\EnableCrossrefs
+\PageIndex
+\CodelineIndex
+\CodelineNumbered
+\RecordChanges
+\setcounter{StandardModuleDepth}{1}
+\begin{document}
+ \DocInput{rubikrotation.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+%%% \CheckSum{332}
+%
+%%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+%
+%
+% \title{%
+% \ifpdf\pdfbookmark[1]{Title}{Title}\else\fi%
+% The \rubikrotation\ package}
+%
+% \author{
+% RWD Nickalls (dick@nickalls.org) \\
+% A Syropoulos (asyropoulos@yahoo.com)
+% }
+% \date{This file describes version \RRfileversion\ (\RRfiledate)\\
+% \texttt{www.ctan.org/pkg/rubik}}
+% \maketitle
+%
+% \begin{abstract}
+% The \rubikrotation\ package is a dynamic extension for the
+% \textsc{rubikcube} package (both are part of the Rubik `bundle').
+% This package provides the \cmd{\RubikRotation} command which
+% processes a sequence of Rubik rotation moves on-the-fly (using the Perl script
+% \texttt{rubikrotation.pl}), and returns the new Rubik cube state (configuration).
+% The \rubikrotation\ package also provides commands for saving the cube state
+% to a file (\cmd{\SaveRubikState}), and for displaying any
+% errors (\cmd{\ShowErrors}).
+% \end{abstract}
+%
+%
+% \begin{minipage}{11cm}
+% \centering
+% \ifpdf
+% \strut\hspace{6mm}\includegraphics[width=10cm]{rubikrot-doc-figD.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+%
+% \vspace{-1\baselineskip}
+%
+% \tableofcontents
+%
+% \pagebreak
+%
+% \section{Introduction}
+%
+% The \rubikrotation\ package is a dynamic extension to the \textsc{rubikcube}
+% and \textsc{rubiktwocube} packages.
+% It consists of a style option (\texttt{rubikrotation.sty}), a
+% Perl script (\texttt{rubikrotation.pl}).
+%
+% The primary role of the \rubikrotation\ package is to implement a sequence of
+% Rubik rotation moves on-the-fly using the \cmd{\RubikRotation} command.
+% Consequently the \rubikrotation\ package requires access to the \TeX\ \texttt{write18}
+% facility, which is enabled by using the \texttt{--shell-escape} command-line switch.
+% This allows command-line control of the Perl script, which is really the `engine' of
+% this package.
+%
+% The \rubikrotation\ package has been road-tested on a Microsoft
+% platform (MiKTeX and Strawberry Perl\,\footnote{`Strawberry Perl'
+% (\texttt{http://strawberryperl.com}) is a free Perl
+% environment for MS Windows, designed to be as close as possible to the Perl
+% environment of Unix/Linux systems.}), on a Linux platform (Debian v8.2.0,
+% {\TeX}Live 2017, and Perl v5.20.2), and on a Solaris platform (OpenIndiana).
+%
+% The following commands are made available by \texttt{rubikrotation.sty}:
+% \begin{quote}
+% \begin{verbatim}
+% \RubikRotation[]{}
+% \SaveRubikState
+% \CheckState
+% \ShowErrors
+% \SequenceName
+% \SequenceInfo
+% \SequenceShort
+% \SequenceLong
+%\end{verbatim}
+% \end{quote}
+% Note that the \textsc{rubiktwocube} package makes available the (equivalent)
+% \verb!\TwoRotation[]{}! and \verb!\SaveTwoState! commands.
+%
+% \section{Requirements}
+%
+% The \rubikrotation\ package requires the TikZ and the \textsc{rubikcube} packages.
+%
+%
+% \section{Installation}
+%
+% \subsection{Generating the files}
+%
+% Place the file \texttt{rubikrotation.zip} into a temporary directory, and unzip it.
+% This will generate the following files:
+%\begin{quote}
+% \begin{verbatim}
+% rubikrotation.ins
+% rubikrotation.dtx
+% rubikrotation.pdf --this document
+% rubikrotation.pl --Perl script
+% rubikrotationPL.pdf --documentation of rubikrotation.pl
+% rubikrotation.1 --manual file for rubikrotation.pl (`man' file)
+% rubikrot-doc-figA.pdf
+% rubikrot-doc-figB.pdf
+% rubikrot-doc-figC.pdf
+% rubikrot-doc-figD.pdf
+%\end{verbatim}
+%\end{quote}
+% The main package documentation is the file \texttt{rubikrotation.pdf}.
+% The documentation of the Perl program \texttt{rubikrotation.pl} is the file \texttt{rubikrotationPL.pdf}
+%
+% The style option \texttt{rubikrotation.sty} is generated by running (pdf)\LaTeX\ on
+% the file \texttt{rubikrotation.ins} as follows:
+%\begin{quote}
+%\begin{verbatim}
+% pdflatex rubikrotation.ins
+%\end{verbatim}
+%\end{quote}
+% The documentation file (\texttt{rubikrotation.pdf}) is then generated using the following
+% sequence of steps\,\footnote{Since the documentation includes a complicated indexing
+% system as well as an index and hyperef links (the package \texttt{hypdoc}
+% is used), then a lot of pdflatex runs are required. Prior to the first run it is
+% a good idea to delete any relevant \texttt{.toc}, \texttt{.aux}, \texttt{.out} files.}:
+%\begin{quote}
+% \begin{verbatim}
+% pdflatex rubikrotation.dtx
+% pdflatex rubikrotation.dtx
+% makeindex -s gind.ist rubikrotation
+% makeindex -s gglo.ist -o rubikrotation.gls rubikrotation.glo
+% pdflatex rubikrotation.dtx
+% pdflatex rubikrotation.dtx
+%\end{verbatim}
+%\end{quote}
+%
+%
+%
+% \subsection{Placing the files}
+% \label{sec:placingfiles}
+%
+% Place the files either in a working directory, or where your system
+% will find them, e.g.,~in the `\textsc{path}'. The \texttt{/texmf-local/} directory tree
+% is often a good place; for example, on a Linux platform with a
+% standard \TeX\ Directory Structure (TDS), then:
+%
+%\medskip
+%{\noindent}*.sty $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/tex/latex/rubik/}
+%{\newline}*.cfg $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/tex/latex/rubik/}
+%{\newline}*.pdf $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/doc/rubik/}
+%{\newline}*.pl $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/scripts/rubik/}
+%
+%\medskip
+%{\noindent}\textsc{perl script}:\ \ Make the perl script executable
+% (\texttt{chmod +x rubikrotation.pl}), and then
+% rename the file as `rubikrotation' (i.e.,~with no file extension), and then place
+% the executable script in the `\textsc{path}', or possibly, directly into your
+% {\TeX}Live binary directory, e.g.,~\path!/user/local/texlive/YYYY/bin/i386-linux!.
+%
+% Sometimes the setting up of a simple one or two-line plain-text
+% configuration-file may be useful or even necessary, depending on your system
+% (see Section~\ref{sec:configfile} below). Such a file (if one exists) will
+% automatically be read by \texttt{rubikrotation.sty} providing the
+% file is named \texttt{rubikrotation.cfg}.
+%
+%\medskip
+%{\noindent}\textsc{the `man' file}:\ \ On a Linux platform the manual file
+% (\texttt{rubikrotation.1}) is typically located in
+% either \verb!/usr/local/man/man1! or \verb!/usr/local/share/man/man1!.
+% \TeX{Live} typically places such files in the directory
+% \verb!/texmf-dist/doc/man/man1!.
+%
+%\medskip
+%{\noindent}\textsc{file database}:\ \ Finally, (depending on your system) update the
+% \TeX\ file database.
+% For example, on a Linux platform this is achieved using the \texttt{texhash} command,
+% or by using the {\TeX}Live Manager (\texttt{tlmgr}).
+%
+%\medskip
+%{\noindent}\textsc{quick test}:\ \ To test that your system can now run the perl
+% script, just type at the command-line
+%\begin{quote}
+% \begin{verbatim}
+% rubikrotation -h
+%\end{verbatim}
+%\end{quote}
+% which should generate something like the following:
+% \begin{verbatim}
+% This is rubikrotation version ...
+% Usage: rubikrotation [-h] -i <input file> [-o <out file>]
+% where,
+% [-h|--help] gives this help listing
+% [-v|--version] gives version
+% [-i] creates specified input file
+% [-o] creates specified output file
+% For documentation see: rubikrotation.pdf,
+% rubikrotationPL.pdf and rubikcube.pdf
+%\end{verbatim}
+%
+%
+% \section{Usage}
+% \label{sec:usage}
+% Load the packages \texttt{rubikcube.sty},
+% \texttt{rubikrotation.sty}, \texttt{rubikpatterns.sty}
+% and \texttt{rubiktwocube.sty} in the \TeX\ file
+% preamble \textit{after} loading the TikZ package (all the Rubik packages
+% require the TikZ package). Load the \texttt{rubikcube.sty} \textit{before} the other
+% Rubik bundle packages; for example, as follows:
+%\begin{quote}
+% \begin{verbatim}
+% \usepackage{tikz}
+% \usepackage{rubikcube,rubikrotation,rubikpatterns,rubiktwocube}
+%\end{verbatim}
+%\end{quote}
+% and run (pdf)\LaTeX\ using the \texttt{--shell-escape} command-line option
+% (see the following section).
+%
+%
+%
+% \subsection{Enabling the \TeX\ `shell' facility}
+% \label{sec:shellescape}
+%
+% In order to access the \TeX\ \cmd{\write18} syntax (so we can access system commands,
+% and hence run the Perl script),
+% it is necessary to invoke the \LaTeX\ engine (e.g.,~(pdf)\LaTeX\ or Lua\LaTeX)
+% using the \texttt{--shell-escape} command-line option; for example:
+%\begin{quote}
+% \begin{verbatim}
+% pdflatex --shell-escape filename.tex
+%\end{verbatim}
+%\end{quote}
+% In practice, it is probably most convenient to run this command via a
+% bash/batch file. For example, on a Linux platform the following bash file
+% will run the file, show any errors, and open the \textsc{pdf} using AcrobatReader.
+%\begin{quote}
+% \begin{verbatim}
+% pdflatex --shell-escape filename.tex
+% echo "...checking error file"
+% grep ERROR ./rubikstateERRORS.dat
+% acroread filename.pdf &
+%\end{verbatim}
+%\end{quote}
+% If the \LaTeX\ engine is Lua\LaTeX, e.g.,
+%\begin{quote}
+% \begin{verbatim}
+% lualatex --shell-escape filename.tex
+%\end{verbatim}
+%\end{quote}
+%then \texttt{rubikrotation.sty} will automatically load
+% the recently developed \textsf{shellesc} package in order to facilitate system access to Perl
+% (see Section~\ref{sec:CodePackageHeading}). See \textit{\LaTeX\ News}, issue~24,
+% Feb~2016 for further details of the \textsf{shellesc} package.
+% Consequently, if you intend to use Lua\LaTeX\ then you will need to ensure your system
+% has access to the \textsf{shellesc} package (it can always be downloaded from CTAN directly).
+%
+%
+% \subsection{Configuration-file}
+% \label{sec:configfile}
+%
+% It is important to realise that the default action of \texttt{rubikrotation.sty} is to
+% access the Perl script as an executable file. This is because the~default definitions
+% in \texttt{rubikrotation.sty} are as follows: (they are detailed in
+% Section~\ref{sec:usefulcommands})
+%\begin{quote}
+%\begin{verbatim}
+% \newcommand{\rubikperlname}{rubikrotation}
+% \newcommand{\rubikperlcmd}{\rubikperlname\space%
+% -i rubikstate.dat -o rubikstateNEW.dat}
+%\end{verbatim}
+%\end{quote}
+% Note the need here (in the second macro) to use \cmd{\space} on the end of
+% (\cmd{\rubikperlname}) in order to force a following
+% space---i.e.,~before the first command-line argument.
+%
+% If the Perl script has not been made executable, or if you wish to alter how
+% the \textsc{rubikrotation} package accesses the Perl script,
+% then you need to create a plain-text configuration file in order to redefine one
+% or both of the above commands, as described below.
+%
+% A plain-text configuration-file with the name \texttt{rubikrotation.cfg}
+% (if one exists) will automatically be read by \texttt{rubikrotation.sty}.
+% The \rubikrotation\ package's facility to use a configuration-file allows the
+% user to change not only (a)~the filename of the Perl script (\texttt{rubikrotation.pl}),
+% but also (b)~the command-line code used by \texttt{rubikrotation.sty} for calling the
+% Perl script. This~sort of fine-tuning can be very useful, and sometimes may
+% even be necessary (depending on your system) for running the Perl script.
+%
+% For example, on some systems it maybe preferable to use a different \textsc{path},
+% file-name and/or a different command-line code to call the script.
+% Such~a configuration-file can also facilitate testing a new Perl script having
+% a different name and location.
+%
+% \DescribeMacro{\rubikperlname}
+% \DescribeMacro{\rubikperlcmd}
+% The configuration-file is essentially a convenient software vehicle for feeding
+% additional \LaTeX\ code to the style option \texttt{rubikrotation.sty}, and hence
+% allows the contents of some commands to be easily adjusted and/or fine-tuned.
+% For~the \rubikrotation\ package there are two particular macros we may wish to adjust
+% (see above).
+% The~first is that holding the filename of the Perl script, namely
+% \cmd{\rubikperlname}. The second is that holding the command-line call,
+% namely \cmd{\rubikperlcmd}.
+% The following examples illustrate how the configuration-file may be used.
+%
+% \medskip
+% {\noindent}\textsc{example~1}:\ \ Suppose we wish to test out
+% a slightly modified Perl script
+% with the working (executable) name \texttt{rubikrotationR77}. In this case we
+% simply create, in the local working directory, a plain-text configuration-file
+% (it \textit{must} be named exactly \texttt{rubikrotation.cfg}) containing just
+% the following line:
+%\begin{quote}
+%\begin{verbatim}
+%\renewcommand{\rubikperlname}{rubikrotationR77}
+%\end{verbatim}
+%\end{quote}
+%
+% \medskip
+% {\noindent}\textsc{example~2}:\ \ Alternatively, suppose we wish to test out
+% a new Perl script with the (non-executable) name \texttt{rubikrotationR55.pl}.
+% Now, in this particular case we will need to run the script using a
+% slightly different command, namely,
+% {\linebreak}\texttt{perl rubikrotationR55.pl ...}, and consequently we
+% need to implement \textit{both} these changes (of name and command) in
+% the configuration-file, as follows:
+%\begin{quote}
+%\begin{verbatim}
+%\renewcommand{\rubikperlname}{rubikrotationR55.pl}
+%\renewcommand{\rubikperlcmd}{perl \rubikperlname\space\%
+% -i rubikstate.dat -o rubikstateNEW.dat}
+%\end{verbatim}
+%\end{quote}
+%{\noindent}Remember to make sure the PATH associated with the command is also correct.
+%
+% \medskip
+%{\noindent\textsc{placing the configuration-file}:\ \ The simplest arrangement is
+% just to include the \texttt{.cfg} file in the working directory.
+% Alternatively, the \texttt{.cfg} file could be placed in the \texttt{/texmf-local/}
+% directory tree (say, in \path!/usr/local/texlive/texmf-local/tex/latex/rubik/!),
+% but in this case one would then have to be careful to specify the
+% correct PATH for everything in order to enable your system to find all the
+% various components etc.
+%
+% Note that you can, of course, have several \texttt{.cfg} files, since the system will
+% read only one such file (the first one it finds starting with the current working
+% directory). Consequently, it may be useful to have one \texttt{.cfg} file in
+% your \texttt{/texmf-local/} dir (for running the standard Rubik package),
+% and another (different) \texttt{.cfg} file in your `test' directory.
+%
+%
+% \section{Commands}
+%
+% The \textit{only} `Rubik bundle' commands which \textit{must} be used inside a TikZ picture
+% environment are the \cmd{\Draw...} commands (these are all provided by
+% the \textsc{rubikcube} package), although most commands can be placed
+% inside a TikZ environment if you wish.
+%
+% Using commands which influence the Rubik colour state
+% (e.g.,~\cmd{\RubikFace..}, \cmd{\RubikCubeSolvedWY} etc.) outside the \texttt{tikzpicture},
+% \texttt{minipage} or \texttt{figure} environments
+% generally offers maximum flexibility, since the effects of such commands when
+% used inside these environments remain `local' to the environment, and are not
+% therefore accessible outside that \textit{particular} environment
+% (see also Section~4.1 in the \textsc{rubikcube} documentation).
+%
+% Conversely, the only \rubikrotation\ command which should \textit{not}
+% be used inside a TikZ environment is the \cmd{\ShowErrors} command
+% (see the notes on this command below).
+%
+%
+%
+%
+% \subsection[RubikRotation]{\cmd{\RubikRotation} command}
+% \label{sec:rubikrotationcmd}
+%
+% \DescribeMacro{\RubikRotation}
+% The \cmd{\RubikRotation}\oarg{integer}\marg{comma-separated sequence}
+% command processes a sequence of rotation codes, and returns
+% the final state. The inverse sequence can also be
+% implemented (see \textbf{Inverse} below). Note that the equivalent \cmd{\TwoRotation}
+% command (see the \textsc{rubiktwocube} package) behaves in the same way as the
+% \cmd{\RubikRotation} command in all respects.
+%
+%
+% The first (optional) argument \oarg{integer} of the \cmd{\RubikRotation} command is the number
+% of times the whole command itself should be repeated; for example
+% as follows: \verb!\RubikRotation[2]{...}!.
+%
+% The second (mandatory) argument consists of a comma-separated sequence
+% of rotation codes, e.g.,~\texttt{U, D2}, which may be encoded as a macro. In addition, there
+% may be additional comma-separated macros and optional \verb![name]!,
+% `repeat blocks' and `info blocks' (see below).
+% The general structure of the second argument is as follows:
+% \verb!\RubikRotation{[name],...,\macro,...,(repeat)n,...,<info>}!.
+% These elements are now described in detail.
+%
+%
+%
+% \textbf{Square brackets}: \ This is an optional `sequence name' facility.
+% The contents of square brackets are not processed
+% as rotations, and can therefore be used as a `name' of the sequence, e.g.,~\verb![CrossSeq]!,
+% or as a tag, to be visible in the log file. The contents must \textit{not} include commas, but
+% can have other separators, e.g.,~spaces, semicolons etc. Importantly, the contents of the
+% first square bracket will be designated the sequence name and will be held as the
+% macro \cmd{\SequenceName}. Square brackets can also be used in repeat blocks (see below).
+% Square brackets must be separated by a comma from adjacent codes.
+%
+%
+% \textbf{Repeat block}: \ This is an optional comma-separated sequence of rotation
+% codes which is to be repeated a specified number of times. It must be delimited
+% by balanced curved brackets, and an optional terminal integer $n$ (repeat number)
+% can be used. For example, \verb!(F,B3)2,! where the `2' indicates that the rotation
+% sequence \verb!F,B3! is to be processed twice. If the repeat number is omitted
+% then $n=1$ is assumed. Repeat blocks must be separated by a comma from adjacent codes,
+% and can include balanced square brackets (see below).
+%
+%
+% \textbf{Info block}: \
+% This is an optional block of meta information, and must be
+% delimited by balanced angle-brackets \verb!<..>!. An info-block typically carries
+% information regarding the sequence itself; typically, something
+% like \verb!<(20f*) //C2(a)>!. If an infoblock includes the keyword `inverse' then
+% the program will implement the inverse sequence of rotations (see below).
+% An info-block must be separated by a comma from the adjacent codes.
+% The contents of all info blocks will be held collectively as the macro \cmd{\SequenceInfo}.
+%
+%
+% \textbf{Inverse sequence}: \
+% The (mathematically) inverse sequence of the given sequence can be implemented by including
+% the keyword `inverse' (or INVERSE) in an infoblock,
+% as follows \verb!\RubikRotation{<inverse>, ... }!. The keyword can be either in its
+% own separate infoblock, or inside a larger infoblock. The program simply checks for the
+% string `inverse', which can be either lower-case or upper-case. The implemented sequence
+% can be checked by looking at (or printing) the contents of the macro
+% \cmd{\SequenceLong} (see section on \textit{Sequence strings} below). Note that the macro
+% \cmd{\SequenceLong} is also shown (expanded) in the log file.
+%
+%
+% \subsubsection{Examples}
+%
+% Some examples of the use of the \cmd{\RubikRotation} command are as follows; the commas are important and brackets must
+% be balanced and not nested:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation[2]{x,R2,U}
+% \RubikRotation{\sixspot}
+% \RubikRotation{<inverse>,[myseqB],U,D,L,R2,(M,U)3,D2}
+% \RubikRotation{[K32466],U,F,U2,F,L2,B,U2,F,Lp,Rp,F2,D,R2,U2,L2,B,Fp,
+% L,F2,D,<(20f*) //Oh{I}>}
+%\end{verbatim}
+%\end{quote}
+%
+% \noindent\textbf{Inverse sequence}
+%
+% Inverting a sequence involves (a)~reversing the order, and (b)~inverting each element.
+% Thus, the inverse of the sequence \verb!(Up,D,L2,Rp)! is \verb!(R,Lp,Lp,Dp,U)!.
+% But~\verb!(Lp,Lp)! $\equiv$ \verb!L2!, and so the inverse
+% of \verb!(Up,D,L2,Rp)! would generally be expressed as \verb!(R,L2,Dp,U)!.
+% However, since the macro \cmd{\SequenceLong} records the individual elements as they are processed,
+% when a sequence is inverted notational compressions such as \verb!Lp,Lp! $\rightarrow$ \verb!L2!
+% are not made.
+% For example, processing the command \verb!\RubikRotation{<inverse>,Up,D,L2,Rp}! results in the macro
+% \cmd{\SequenceLong} being displayed in the subsequent \texttt{rubikstateNEW.dat} file as
+%\begin{quote}
+% \begin{verbatim}
+% \renewcommand\SequenceLong{R,Lp,Lp,Dp,U}%
+%\end{verbatim}
+%\end{quote}
+% A more extensive example is given at the end of Section~\ref{sec:sequencestrings}.
+%
+%
+% \medskip\noindent\textbf{Repetitions}
+%
+% Repetitions can be achieved in various ways. First, all the rotations in the second argument
+% can be repeated multiple times, say $n$ times, by
+% using the optional \verb![n]! argument of the \cmd{\RubikRotation[]\{\}} command;
+% i.e.,~the whole of the mandatory argument of the \cmd{\RubikRotation} command is then
+% executed $n$ times.
+%
+% Second, a sub-sequence of rotations can be repeated within the main
+% argument multiple times, by delimiting such groups with curved brackets
+% and a trailing integer (i.e.,~in a repeat-block), as described above.
+% If no integer is given, then $n=1$ is assumed, and hence curved brackets can also be used
+% simply to highlight particular sequences.
+% For example, the following five commands are equivalent:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation[3]{x,R2,U}
+% \RubikRotation{(x,R2,U)3}
+% \RubikRotation{(x,R2,U)2,x,R2,U}
+% \RubikRotation{x,R2,U,x,R2,U,x,R2,U}
+% \RubikRotation{(x,R2,U),(x,R2,U),(x,R2,U)}
+%\end{verbatim}
+%\end{quote}
+%
+%
+% \medskip\noindent\textbf{Macros}
+%
+% Note also that macros representing a rotation sequence can also appear as part of the main argument.
+% So, extending the previous example, if we were to define \verb!\newcommand{\ShortSeq}{x,R2,U}!, then
+% the following three commands would also be equivalent to the five previous ones:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation[3]{\ShortSeq}
+% \RubikRotation{(\ShortSeq)3}
+% \RubikRotation{(x,R2,U),\ShortSeq,\ShortSeq}
+%\end{verbatim}
+%\end{quote}
+%
+%
+% \medskip\noindent\textbf{Process overview}
+%
+% The \cmd{\RubikRotation} command results in \LaTeX\ first writing
+% the current Rubik state to a text file (\texttt{rubikstate.dat}),
+% and then calling the Perl script \texttt{rubikrotation.pl}. The Perl
+% script then reads the current Rubik state from the (\texttt{rubikstate.dat})
+% file, performs all the rotations, and then writes the new Rubik state,
+% and the four \cmd{\Sequence...} macros (see below), and any error messages, all to the
+% file \texttt{rubikstateNEW.dat},
+% which is then input on-the-fly by the \texttt{.tex} file. This new Rubik state
+% can then be used either as the input for another \cmd{\RubikRotation} command, or used
+% to generate a graphic image of the cube. The \cmd{\Sequence...} macros can then
+% be used for typesetting the sequence of rotations in various formats.
+%
+%
+% \subsubsection{Sequence strings}
+% \label{sec:sequencestrings}
+%
+% \DescribeMacro{\SequenceName}
+% \DescribeMacro{\SequenceInfo}
+% \DescribeMacro{\SequenceShort}
+% \DescribeMacro{\SequenceLong}
+% The sequence of rotation codes used as the main argument for the \cmd{\RubikRotation}
+% command is also returned in the form of four macros, namely \cmd{\SequenceName} (contains the
+% `name' of the sequence if a \texttt{[name]} exists), \cmd{\SequenceInfo} (contains any sequence
+% meta data in `info-blocks'), \cmd{\SequenceShort} (contains the original
+% sequence of rotation codes), and \cmd{\SequenceLong} (contains the expanded or `Long' form of the
+% original sequence---i.e.,~in which any `short' rotation codes (e.g.,~\texttt{R2, L3}) in the original
+% sequence have been expanded into their separate codes---e.g.,~\texttt{R, R, L, L, L} etc.).
+%
+% For example, if we wanted to see the effect of the sequence associated with the `SixTs'
+% cube configuration
+% \verb![SixTs],F2,R2,U2,Fp,B,D2,L2,F,B,<(14q*,14f*)>!
+% on a solved Rubik cube (where `SixTs' is the `name' of the sequence),
+% we could use the following commands:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikCubeSolved % sets up the colours for a solved cube state
+% \RubikRotation{[SixTs],F2,R2,U2,Fp,B,D2,L2,F,B,<(14q*,14f*)>}
+% \ShowCube{2.8cm}{0.7}{\DrawRubikCubeRU}
+%\end{verbatim}
+%\end{quote}
+% Note (a)~contents of a square bracket [..] are not processed as rotations, (b)~the contents
+% of the first square bracket in a sequence is taken to be the `name' of the sequence
+% (see Section~\ref{sec:prefixedargument} for more details).
+% In this example the four \cmd{\Sequence..} macros described above would now hold
+% the following strings:
+%\begin{quote}
+% \cmd{\SequenceName} = SixTs
+%{\newline} \cmd{\SequenceInfo} = (14q*,14f*)
+%{\newline} \cmd{\SequenceShort} = [SixTs],F2,R2,U2,Fp,B,D2,L2,F,B
+%{\newline} \cmd{\SequenceLong} = F,F,R,R,U,U,Fp,B,D,D,L,L,F,B
+%\end{quote}
+%
+% As another example, we now show how to implement the inverse of the above \verb!SixTs!
+% sequence, by including the key word `inverse' in an infoblock, and, more conveniently,
+% using the macro \verb!\sixts! from the \textsc{rubikpatterns} package, as follows:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation{<inverse>,\sixts}
+%\end{verbatim}
+%\end{quote}
+% In this case, the log file would then show the associated \cmd{\Sequence..} macros as follows:
+%\begin{quote}
+% \begin{verbatim}
+%...SequenceName = SixTs
+%...SequenceInfo = inverse; (14q*; 9f*)
+%...SequenceShort = [SixTs],F2,R2,U2,Fp,B,D2,L2,F,B
+%...SequenceLong = Bp,Fp,Lp,Lp,Dp,Dp,Bp,F,Up,Up,Rp,Rp,Fp,Fp
+%\end{verbatim}
+%\end{quote}
+% showing that the macro \cmd{\SequenceShort} holds the \verb!\sixts! sequence, while
+% the macro \cmd{\SequenceLong} holds the inverse sequence which was actually implemented.
+%
+% For further details regarding the use of these \cmd{\Sequence..} macros for typesetting
+% the various components of a sequence, and why the \cmd{\SequenceLong} command is
+% particularly useful, see Section~10 in the \textsc{rubikcube} documentation
+% (the \cmd{\ShowSequence} command).
+%
+%
+%
+% \subsubsection{Sequences as macros}
+% \label{sec:seq-as-macros}
+%
+% Macros which are arguments of the \TeX\ \cmd{\write} command are expanded
+% on writing (Eijkhout 1992, \S\,30.2.3, p.\,238)[\,see references Section~\ref{sec:references}\,].
+% Consequently we are able to use a sequence-defining macro as an argument for
+% the \cmd{\RubikRotation} command. In fact this is very convenient, since it allows
+% one to store lots of different rotation sequences by name alone. Note that
+% \texttt{rubikpatterns.sty} (part of the Rubik bundle) is a collection/database
+% of many such well-known named sequences.
+%
+% For example, by installing the \textsc{rubikpatterns} package we are able to use the
+% name `sixspot' for a macro denoting the rotation sequence
+% which generates the well known `sixspot' configuration (see the `patterns' page on the
+% Reid website)[\,see references Section~\ref{sec:references}\,]. The `sixspot' sequence is
+% defined as follows:
+%\begin{quote}
+% \begin{verbatim}
+% \newcommand{\sixspot}{U,Dp,R,Lp,F,Bp,U,Dp,<(8q*, 8f*)>}
+%\end{verbatim}
+%\end{quote}
+% Armed with the \cmd{\sixspot} macro we are now able to generate the graphic (sixspot cube)
+% very easily using the following code---this time we demonstrate the use of the more convenient
+% \cmd{\ShowCube} command (which includes the \texttt{tikzpicture} environment):
+%
+% \medskip
+%
+% \begin{minipage}{7cm}
+% \begin{verbatim}
+% \usepackage{rubikcube,rubikrotation}
+% \usepackage{rubikpatterns}
+% ...
+% \RubikCubeSolved
+% \RubikRotation{\sixspot}
+% \ShowCube{3cm}{0.7}{\DrawRubikCubeRU}
+%\end{verbatim}
+% \end{minipage}
+% \begin{minipage}{3.4cm}
+% \centering
+% \ifpdf
+% \includegraphics[height=3cm]{rubikrot-doc-figA.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+% \medskip
+% Providing such macros (when used as arguments) are comma separated (as the rotation codes
+% must be), then the \cmd{\RubikRotation} command can accommodate both rotation codes
+% and macros; for example, \verb!\RubikRotation{x,y,\sixspot,x}!.
+%
+%
+% \subsubsection{Arguments in square brackets }
+% \label{sec:prefixedargument}
+%
+% The contents of a square bracket are not processed as rotations, but are simply
+% interpreted as an inactive `string'. This feature therefore
+% allows the contents to be used as a label, which can be very useful.
+% Note the contents of square brackets must not include commas, but spaces and semicolons
+% are allowed.
+%
+% For example, we can use this facility to `name' the `SixSpot' configuration mentioned above,
+% as follows:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation{[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp}
+%\end{verbatim}
+%\end{quote}
+% In practice, it is quite useful to go one step further and include
+% the [\,] label-name feature in the \cmd{\sixspot} command, as follows,
+%\begin{quote}
+% \begin{verbatim}
+% \newcommand{\sixspot}{[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp}
+%\end{verbatim}
+%\end{quote}
+% Note that using the \texttt{[name]} facility has the great advantage of making the
+% label-name visible in the log-file.
+% For example, the following command, which uses the rotations \textbf{x2},
+% and \textbf{y} to rotate the Rubik cube after applying
+% the `sixspot' sequence of rotations:
+%\begin{quote}
+% \begin{verbatim}
+% \RubikRotation{\sixspot,x2,y}
+%\end{verbatim}
+%\end{quote}
+% will then be represented in the log file as
+%\begin{quote}
+% \begin{verbatim}
+% ...dataline = rotation,[SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,<(8q*; 8f*)>,x2,y
+% ...[SixSpot] is a label OK
+% ...rotation U, OK
+% ...rotation Dp, OK
+% ...rotation R, OK
+% ...rotation Lp, OK
+% ...rotation F, OK
+% ...rotation Bp, OK
+% ...rotation U, OK
+% ...rotation Dp, OK
+% ...Expanding x2 ...
+% ...rotation x, OK (= x = R + Sr + Lp)
+% ...rotation x, OK (= x = R + Sr + Lp)
+% ...rotation y, OK (= y = U + Su + Dp)
+% ...writing new Rubik state to file rubikstateNEW.dat
+% ...SequenceName = SixSpot
+% ...SequenceInfo = (8q*; 8f*)
+% ...SequenceShort = [SixSpot],U,Dp,R,Lp,F,Bp,U,Dp,x2,y
+% ...SequenceLong = U,Dp,R,Lp,F,Bp,U,Dp,x,x,y
+%\end{verbatim}
+%\end{quote}
+% Note that the \verb!\sixspot! macro, as held in the \textsc{rubikpatterns} package, includes a terminal
+% infoblock holding the `SequenceInfo' as indicated in the above example.
+%
+% Also, note that the square bracket feature allows for several named rotation sequences
+% to be easily distinguished in the log file from adjacent rotation sequences.
+% This feature is also useful when typesetting a sequence of rotation codes, since the first
+% element will then appear in the form \verb![name]!, obviating the need to typeset the
+% name of the sequence separately.
+%
+% See also the \cmd{\ShowSequence} command (in the \textsc{rubikcube} package)
+% for a convenient way of displaying a sequence of rotations in various formats.
+%
+%
+% \subsubsection{Groups}
+%
+% The \cmd{\RubikRotation} command is a convenient tool for
+% illustrating how Rubik rotations and sequences of rotations are elements
+% of groups and subgroups.
+% For~example, using the \rubikrotation\ package it is easy to
+% show that three cycles of the `sixspot' sequence return the Rubik cube to its
+% original state. More formally this is equivalent to
+% $($\cmd{\sixspot}$)3 \equiv e$\,\footnote{$e$ is the `identity' element},
+% and can be nicely illustrated by implementing the following pseudocode:
+%\begin{verbatim}
+% \RubikCubeSolved . \RubikRotation[3]{\sixspot} = \RubikCubeSolved
+%\end{verbatim}
+%
+% \begin{minipage}{11cm}
+% \centering
+% \ifpdf
+% \includegraphics[width=10cm]{rubikrot-doc-figC.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+%
+% \subsubsection{Random rotations}
+%
+% The \cmd{\RubikRotation} command can also be used to scramble the
+% cube using a random sequence of rotations. If the first argument
+% is the word `random' \textsc{and} the second argument
+% is an integer $n$, ($1\leq n \leq 200$), then a random sequence
+% of $n$ rotations will be performed.
+% If $n > 200$ then the currently set maximum value $n=200$ will be used.
+%
+% As a safety feature the maximum $n$ can be changed only by editing the
+% set value of the Perl variable \verb!$maxn! in the Perl script
+% \texttt{rubikrotation.pl}, where we currently have
+% (see the `random' subroutine in the document \texttt{rubikrotationPL.pdf})
+%\begin{quote}
+%\begin{verbatim}
+% my $maxn=200;
+%\end{verbatim}
+%\end{quote}
+%
+% For example, the following commands scramble a solved cube using a
+% sequence of 120 random rotations, and display the state in the form of
+% a semi-flat (SF) cube.
+%
+
+% \begin{minipage}{3.4cm}
+% \centering
+% \ifpdf
+% \includegraphics[height=4cm]{rubikrot-doc-figB.pdf}
+% \else
+% \fi
+% \end{minipage}
+% \begin{minipage}{6cm}
+% \vspace{1.6cm}
+%\begin{verbatim}
+% \RubikCubeSolved%
+% \RubikRotation{random,120}%
+% \ShowCube{5.5cm}{0.5}{\DrawRubikCubeSF}
+%\end{verbatim}
+% \end{minipage}
+%
+% Note that in this particular example (above), only
+% the \cmd{\Draw..} command is inside the TikZ picture environment (i.e.,~inside
+% the \cmd{\ShowCube} command). Note also that when Rubik
+% commands are outside a TikZ picture environment, they should have a
+% trailing \% to stop additional white space being included.
+%
+% \medskip
+%
+% The randomisation procedure is as follows: all the possible rotations are first allocated
+% a different cardinal number (positive integer) and collected into an array.
+% Then a sequence of $n$ randomised numbers is generated and mapped to
+% the array to generate the associated sequence of random rotations.
+% The sequence used is detailed in the \texttt{.log} file.
+%
+%
+% \subsection[SaveRubikState]{\cmd{\SaveRubikState} command}
+% \label{saverubikstate}
+%
+% \DescribeMacro{\SaveRubikState}
+% The command \cmd{\SaveRubikState}\marg{filename} saves the state (configuration)
+% of the Rubik cube to the file \marg{filename} in the standard \cmd{\RubikFace...}
+% format so that it can be read by \LaTeX. Consequently such a file can then be input
+% so it can be drawn or processed in the usual way. The output file is `closed' immediately
+% following the `write' in order to allow it to be available for input later by the same
+% file if required.
+%
+% For example, the following commands would save the so-called `sixspot' configuration
+% (generated by the rotations \textbf{U, Dp, R, Lp, F, Bp, U, Dp})
+% to the file \verb!sixspot.tex!.
+%\begin{quote}
+%\begin{verbatim}
+% \RubikCubeSolved%
+% \RubikRotation{U,Dp,R,Lp,F,Bp,U,Dp}%
+% \SaveRubikState{sixspot.tex}%
+%\end{verbatim}
+%\end{quote}
+% The form of the file \verb!sixspot.tex! will then be as follows---the
+% filename (commented out) is automatically written to the top of the
+% file for convenience.
+%\begin{quote}
+%\begin{verbatim}
+% % filename: sixspot.tex
+% \RubikFaceUp{O}{O}{O}{O}{W}{O}{O}{O}{O}%
+% \RubikFaceDown{R}{R}{R}{R}{Y}{R}{R}{R}{R}%
+% \RubikFaceLeft{Y}{Y}{Y}{Y}{B}{Y}{Y}{Y}{Y}%
+% \RubikFaceRight{W}{W}{W}{W}{G}{W}{W}{W}{W}%
+% \RubikFaceFront{G}{G}{G}{G}{O}{G}{G}{G}{G}%
+% \RubikFaceBack{B}{B}{B}{B}{R}{B}{B}{B}{B}%
+%\end{verbatim}
+%\end{quote}
+% We can therefore access and draw this configuration in a Semi-Flat format
+% later, when required, simply by inputting the file as follows:
+%\begin{quote}
+%\begin{verbatim}
+%\input{sixspot.tex}
+%\ShowCube{7cm}{0.7}{\DrawRubikCubeSF}
+%\end{verbatim}
+%\end{quote}
+%
+%
+% \subsection[CheckState]{\cmd{\CheckState} command}
+% \label{sec:checkstate}
+%
+% \DescribeMacro{\CheckState}
+% Since it is easy to inadvertently define an invalid Rubik cube
+% (e.g.,~enter an invalid number of, say, yellow facelets), this command
+% simply checks the current colour state of all the cubies
+% of a 3x3x3 Rubik cube, and shows the number of facelets of each colour.
+% An ERROR: code is issued if the number of facelets having a given colour
+% exceeds~9 for a 3x3x3 cube (Rubik cube), or exceeds 4 for a 2x2x2 cube (Two cube).
+% The results are written to the the \texttt{.log} file, and displayed at the point
+% the \cmd{\ShowErrors} command is used (for code see Section~\ref{sec:checkstatecode}).
+%
+% One can check the current Rubik state (for errors) by issuing the command
+%\begin{quote}
+%\begin{verbatim}
+% \CheckState%
+%\end{verbatim}
+%\end{quote}
+% Note (1)~that such a check is implemented automatically with each \cmd{\RubikRotation} and
+% \cmd{\TwoRotation} command, and (2)~and makes only a very superficial check---simply counting the number
+% of cubies of each colour.
+%
+% Note that the \cmd{\CheckState} command replaces the earlier \cmd{\CheckRubikState}, but
+% we retain the old command for backwards compatibility (for the moment).
+%
+%
+% \subsection[ShowErrors]{\cmd{\ShowErrors} command}
+% \label{sec:showerrors}
+%
+%
+% \DescribeMacro{\ShowErrors}
+% Any errors which arise can be made visible using the
+% command \cmd{\ShowErrors}.
+% This command places a copy of the `error' file (\texttt{rubikstateERRORS.dat})
+% underneath the graphic image so you can see any errors if there are any (note that
+% details of all errors are are written by default to the \texttt{.log} file)
+% (for code see Section~\ref{sec:showerrorscode}).
+%
+% Consequently, the \cmd{\ShowErrors} command must be placed \textit{after} a TikZ picture
+% environment---it cannot be used inside a TikZ environment. In fact this command
+% is probably best placed at the end of the document where it will reveal all
+% rotation errors generated while processing the whole document.
+% Once the document is free of errors this command can be removed or just commented out.
+% The file \texttt{rubikexamples.pdf} shows an example of the use of this command.
+%
+% Note that the \cmd{\ShowErrors} command replaces the original \cmd{\ShowRubikErrors} command,
+% which will be retained for backward compatibility.
+%
+%
+% \section{Files generated}
+%
+%
+% Whenever the \cmd{\RubikRotation} or \cmd{\CheckRubikState} commands are used,
+% three small temporary plain-text files for holding data are generated as
+% follows (they are refreshed with each \LaTeX\ run, and are not actively deleted).
+% \begin{itemize}
+% \item \LaTeX\ writes Rubik state data to the file \texttt{rubikstate.dat}.
+%
+% \item The Perl script \texttt{rubikrotation.pl} reads the file
+% \texttt{rubikstate.dat} and then writes
+% the new rubik state to the file \texttt{rubikstateNEW.dat}.
+%
+% \item The Perl script \texttt{rubikrotation.pl} also writes error data
+% to the file \texttt{rubikstateERRORS.dat}. A copy of this file is displayed
+% under the graphic image when the command
+% \cmd{\ShowErrors} is used after the TikZ picture environment.
+%
+% \end{itemize}
+%
+%
+% \section{General overview}
+% \label{generaloverview}
+%
+% When \LaTeX\ processes \texttt{rubikrotation.sty} the following steps
+% are implemented (see Section~\ref{sec:thecode}):
+% \begin{itemize}
+%
+% \item[1.] A check is made to see if \texttt{fancyvrb.sty} is loaded: if not
+% then this package is loaded (this package supplies the command \cmd{\VerbatimInput} which
+% is required for inputting the file \texttt{rubikstateERRORS.dat} in verbatim form).
+%
+% \item[2.] A check is made to see if a configuration-file (\texttt{rubikrotation.cfg})
+% exists: if so then this file is input.
+%
+% \item[3.] The text file \texttt{rubikstateNEW.dat} is overwritten (if it exists),
+% otherwise the file is created (this prevents an `old' version of the file being
+% used by \LaTeX).
+%
+% \item[4.] The plain-text file \texttt{rubikstateERRORS.dat} is created.
+% This file collects error messages generated by the Perl script.
+%
+% \end{itemize}
+%
+%
+% When a \cmd{\RubikRotation} command is processed
+% (see Section~\ref{sec:rubikrotationcode}, line~102), it first writes the current
+% colour configuration of each face (the `rubik state') to the temporary file
+% \texttt{rubikstate.dat} (this will be read by the Perl script \texttt{rubikrotation.pl}).
+% The \cmd{\RubikRotation} command also appends the keyword `\texttt{checkrubik}'
+% as well as a copy of the string of Rubik rotations.
+% It~then calls the Perl script \texttt{rubikrotation.pl}.
+%
+% For example, if we use the command \cmd{\RubikCubeSolved}
+% followed by the command \verb!\RubikRotation[2]{U,D,L,R}!, then the associated
+% \texttt{rubikstate.dat} file will be written as follows:
+%\begin{quote}
+% \begin{verbatim}
+% % filename: rubikstate.dat
+% cubesize,three
+% up,W,W,W,W,W,W,W,W,W
+% down,Y,Y,Y,Y,Y,Y,Y,Y,Y
+% left,B,B,B,B,B,B,B,B,B
+% right,G,G,G,G,G,G,G,G,G
+% front,O,O,O,O,O,O,O,O,O
+% back,R,R,R,R,R,R,R,R,R
+% checkstate
+% rotation,U,D,L,R
+% rotation,U,D,L,R
+%\end{verbatim}
+%\end{quote}
+% Note that the \cmd{\RubikRotation} option \texttt{[2]} results in the string ``\texttt{rotation,U,D,L,R}''
+% being written twice to the \texttt{rubikstate.dat} file, as shown above.
+%
+% Alternatively, if we used the command
+% \verb!\RubikRotation{random, 45}! then the last line written to the file
+% would be the string ``\texttt{rotation,random,45}'', as follows:
+%\begin{quote}
+% \begin{verbatim}
+% % filename: rubikstate.dat
+% cubesize,three
+% up,W,W,W,W,W,W,W,W,W
+% down,Y,Y,Y,Y,Y,Y,Y,Y,Y
+% left,B,B,B,B,B,B,B,B,B
+% right,G,G,G,G,G,G,G,G,G
+% front,O,O,O,O,O,O,O,O,O
+% back,R,R,R,R,R,R,R,R,R
+% checkstate
+% rotation,random,45
+%\end{verbatim}
+%\end{quote}
+% A \cmd{\CheckState} command triggers the same sequence of events except
+% that no ``\texttt{rotation,....}'' line is written.
+%
+% The action of the Perl script \texttt{rubikrotation.pl} is controlled by
+% the keywords (first argument of
+% each line) associated with each line of the file \texttt{rubikstate.dat}.
+% When control passes from \LaTeX\ to Perl, the script \texttt{rubikrotation.pl} starts
+% by loading the current rubikstate (prompted by the keywords `\texttt{up}', `\texttt{down}',
+% `\texttt{left}', `\texttt{right}', `\texttt{front}', `\texttt{back}'), and performing
+% a syntax check---significant syntax errors at this stage
+% will cause the program to issue appropriate error messages and then terminate cleanly.
+% Next, the Perl script performs some basic cube checks
+% (prompted by the key word `\texttt{checkstate}'), and then the program processes
+% the sequence of Rubik rotations (prompted by the keyword
+% `\texttt{rotation}'). If, instead, the second argument of the `\texttt{rotation,...}' string
+% is the keyword `\texttt{random}', and provided this is followed by a valid integer, say $n$,
+% then the Perl script performs a sequence of $n$ random rotations.
+% Finally, the Perl script writes the final rubikstate to the text file
+% \texttt{rubikstateNEW.dat}. All error messages are written to the
+% text file \texttt{rubikstateERRORS.dat} and also to the \LaTeX\ log-file.
+% The Perl script now closes all open files and terminates.
+%
+% Control then passes back to \LaTeX\ (still in \texttt{rubikrotation.sty} processing
+% the \cmd{\RubikRotation} command---see Section~\ref{sec:rubikrotationcode}, line~115);
+% its next action is to input the file
+% \texttt{rubikstateNEW.dat}. If there are more \cmd{\RubikRotation} commands
+% (in the \texttt{.tex} file) then this cycle repeats accordingly.
+% Eventually a \cmd{\Draw...} command is reached (in the \texttt{.tex} file) and
+% the final rubikstate is drawn in a TikZ picture environment.
+%
+% If the TikZ picture environment is followed by a \cmd{\ShowErrors} command,
+% then a `verbatim' copy of the \texttt{rubikstateERRORS.dat} file is displayed
+% immediately under the graphic. Once the graphic is error-free, then the
+% \cmd{\ShowErrors} command can be removed or commented out.
+%
+% Alternatively, when processing a long document, it can be useful to place
+% a \cmd{\ShowErrors} command at the end of the document, where it will list
+% all errors which occurred. Once any errors have been fixed, this command can be
+% removed or commented out.
+%
+% Note that if a \textsc{bash} file is used to coordinate the process then it is often
+% convenient to use the Linux \texttt{grep} utility to alert the user to any run-time errors,
+% by using \texttt{grep} to scan the \texttt{rubikstateERRORS.dat} file at the end of
+% the run; for example, as follows:
+%\begin{quote}
+%\begin{verbatim}
+% pdflatex --shell-escape myfile.tex
+% echo "...checking error file"
+% grep ERROR ./rubikstateERRORS.dat
+%\end{verbatim}
+%\end{quote}
+%
+%
+%
+%
+% \section{Change history}
+%
+% \begin{itemize}
+%
+% \item Version 5.0 (February 2018)
+%
+% --- minor bugfixes and better syntax checking in the Perl program.
+% The cube size being processed (ie 3x3x3 or 2x2x2) is now detected by the program.
+%
+% --- the command \cmd{\CheckState} replaces the earlier
+% \cmd{\CheckRubikState} command in order
+% to avoid confusion, now that we are able to process both the 3x3x3 cube (Rubik cube)
+% and also the 2x2x2 cube (Two cube)
+% (see Sections~\ref{sec:checkstate} and \ref{sec:checkstatecode} (code)).
+% The original command is retained (for now) for backward compatibility.
+% \verb!\CheckRubikState! $\rightarrow$ \verb!\CheckState!
+%
+% --- the command \cmd{\ShowErrors} replaces the earlier
+% \cmd{\ShowRubikErrors} command in order
+% to avoid confusion now, that we are able to process both the 3x3x3 cube (Rubik cube)
+% and also the 2x2x2 cube (Two cube)
+% (see Sections~\ref{sec:showerrors} and \ref{sec:showerrorscode} (code)).
+% The original command is retained (for now) for
+% backward compatibility. \verb!\ShowRubikErrors! $\rightarrow$ \verb!\ShowErrors!
+%
+%
+%
+%
+%
+% \item Version 4.0 (March 2017)
+%
+% --- The \cmd{\RubikRotation} command has been enhanced to allow its argument to include
+% so-called repeat-blocks (rotation-sequences which can be repeated multiple times), and
+% info-blocks for holding sequence metadata (see Section~\ref{sec:rubikrotationcmd}).
+% Syntax checking of the \cmd{\RubikRotation} argument is much improved
+% (see \texttt{rubikrotationPL.pdf} for details of the Perl script).
+%
+% --- Four new macros which hold derived data (see Section~\ref{sec:rubikrotationcmd}).
+% \begin{quote}
+% \cmd{\SequenceName}
+% \newline\cmd{\SequenceInfo}
+% \newline\cmd{\SequenceShort}
+% \newline\cmd{\SequenceLong}
+% \end{quote}
+%
+% --- Better syntax checking of the \cmd{\RubikRotation} argument by the Perl program \texttt{rubikrotation.pl}.
+%
+%
+%
+% \item Version 3.0 (25 September 2015)
+%
+% --- The \cmd{\RubikRotation} command now actions multiple instances of its argument
+% as determined by an optional `repeat' \oarg{integer}. For example the command
+% \cmd{\RubikRotation[3]\{R,x\}} is equivalent to the command \cmd{\RubikRotation\{R,x,R,x,R,x\}}
+% (see Sections~\ref{sec:rubikrotationcmd} and \ref{sec:rubikrotationcode}).
+%
+% --- If a comma separated element used as an argument for the \cmd{\RubikRotation}
+% command is prefixed with either a * or [ or ] character then it is not actioned
+% as a rotation (see Section~\ref{sec:prefixedargument}).
+%
+% --- The Perl script \texttt{rubikrotation.pl} now has command-line switches,
+% including \texttt{-h} to show some `help' and `usage' information
+% (see Section~\ref{sec:placingfiles}).
+%
+% --- A `man' file (manual file) for the Perl script \texttt{rubikrotation.pl} is now
+% included in the package.
+%
+% --- The Perl script \texttt{rubikrotation.pl} now uses as input and output file-names
+% those specified in the command-line of the CALLing program. This now allows the
+% script \texttt{rubikrotation.pl} to be used as a stand-alone tool (see the
+% \texttt{rubikrotation} `man' file for details).
+%
+% --- The documentation for the Perl script \texttt{rubikrotation.pl} is in the
+% accompanying file \texttt{rubikrotationPL.pdf}.
+%
+% --- Fixed typos, index and minor errors in the documentation.
+%
+%
+% \item Version 2.0 (5 February, 2014)
+%
+% --- First release.
+%
+% \end{itemize}
+%
+%
+%
+%
+%
+% \section{References}
+% \label{sec:references}
+%
+%\begin{itemize}
+%
+% \item Abrahams PW, Berry K and Hargreaves KA (1990). \textit{\TeX\ for the impatient}
+% (Addison-Wesley Publishing Company), page~292.
+% {\newline}Available from: \url{http://www.ctan.org/pkg/impatient}
+% {\newline}[\,re:~\cmd{\rubikpercentchar} and \cmd{\@comment} in Section~\ref{sec:abrahams}\,]
+%
+%
+% \item Eijkhout V (1992). \textit{\TeX\ by topic: a {\TeX}nician's reference}.
+% (Addison-Wesley Publishing Company), pages~232 \&~238.
+% {\newline}Available from: \url{https://bitbucket.org/VictorEijkhout/tex-by-topic/}
+% [\,re:~\cmd{\string} in Section~\ref{sec:eijkhout}\,]
+% [\,re:~\cmd{\write} in Section~\ref{sec:seq-as-macros}\,]
+%
+%
+% \item Feuers\"{a}nger C (2015). Notes on programming in \TeX.
+% {\newline}(revision: 1.12.1-32-gc90572c; 2015/07/29)
+% \newline\url{http://pgfplots.sourceforge.net/TeX-programming-notes.pdf}
+% {\newline}[\,re:~loop macros in Section~\ref{sec:feuersanger}\,]
+%
+% \item Kociemba website (Kociemba H). \url{http://www.kociemba.org/cube.htm}
+%
+% \item Nickalls RWD and Syropoulos A (2015). The \textsc{rubikcube} package, v3.0.
+% \newline\url{http://www.ctan.org/pkg/rubik},
+%
+%
+% \item Randelshofer website (Randelshofer W). \url{http://www.randelshofer.ch/rubik/}
+% \ [\,re:~sequences and supersetENG notation\,]
+%
+%
+% \item Reid website (Reid M). \ Patterns. \url{http://www.cflmath.com/Rubik/patterns.html}
+% \ [\,re:~sequences as macros; in Section~\ref{sec:seq-as-macros}\,]
+%
+%
+% \item Tellechea C and Segletes SB (2016). The \textsf{listofitems} package, v1.2
+% \newline\url{http://www.ctan.org/pkg/listofitems}
+%
+%\end{itemize}
+%
+%
+%
+%
+%
+% ^^A ==================================================
+% \StopEventually{\PrintIndex}
+%
+%
+%
+% \section[The code]{The code (\texttt{rubikrotation.sty})}
+% \label{sec:thecode}
+%
+% {\noindent}In the following, the term `Perl script' denotes the script
+% \texttt{rubikrotation.pl}. Useful information regarding the
+% \TeX\ \cmd{\write} command is given in Eijkhout (1992), \S\,30.2.3 (page~238).
+% For the means of including a `\%' character in the token list of \cmd{\write} see
+% Abrahams \textit{et.~al} (1990).
+%
+% \subsection{Package heading}
+% \label{sec:CodePackageHeading}
+%
+% \begin{macrocode}
+%<*rubikrotation>
+\def\RRfileversion{5.0}%
+\def\RRfiledate{2018/02/25}% 25 February 2018
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rubikrotation}[\RRfiledate\space (v\RRfileversion)]
+% \end{macrocode}
+%
+%
+% {\noindent}The package requires \texttt{rubikcube.sty}. However \texttt{rubikcube.sty}
+% is not automatically loaded (for the moment at least) since this makes it difficult
+% to errorcheck new versions.
+% \begin{macrocode}
+\@ifpackageloaded{rubikcube}{}{%
+ \typeout{---rubikrotation requires the rubikcube package.}%
+ }%
+% \end{macrocode}
+%
+%
+%
+% {\noindent}The \rubikrotation\ package requires access to the \textsf{fancyvrb} package
+% for the \cmd{\VerbatimInput\{\}} command which we use for inputting and displaying
+% the error file (see Section~\ref{sec:showerrors}).
+% \begin{macrocode}
+\@ifpackageloaded{fancyvrb}{}{%
+ \typeout{---rubikrotation requires the fancyvrb package%
+ for VerbatimInput{} command.}%
+ \RequirePackage{fancyvrb}}
+% \end{macrocode}
+%
+%
+% {\noindent}For the \cmd{\write18} syntax to work with
+% Lua\TeX\ (so we can access system commands) we require
+% the recent \textsf{shellesc} package, which we load using the
+% \textsf{ifluatex} conditional (see Section~\ref{sec:shellescape}).
+% \begin{macrocode}
+\@ifpackageloaded{ifluatex}{}{%
+ \typeout{---rubikrotation requires the ifluatex package.}%
+ \RequirePackage{ifluatex}}
+\ifluatex%
+ \@ifpackageloaded{shellesc}{}{%
+ \typeout{---rubikrotation requires the shellesc package
+ to run using Lua\LaTeX.}%
+ \RequirePackage{shellesc}}
+\fi%
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsection{Some useful commands}
+% \label{sec:usefulcommands}
+%
+% \begin{macro}{\rubikrotation}
+% First we create a suitable logo
+% \begin{macrocode}
+\newcommand{\rubikrotation}{\textsc{rubikrotation}}
+\newcommand{\Rubikrotation}{\textsc{Rubikrotation}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@print}
+% We need a simple print command to facilitate writing output to a file.
+% \begin{macrocode}
+\newcommand{\@print}[1]{\immediate\write\outfile{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\@comment}
+% \begin{macro}{\@commentone}
+% We also require access to the `\%' character so we can (a)~write comments to
+% files, including the log file, and (b)~place a trailing `\%' in a line of code
+% written to a file.
+%
+% To achieve this we define the `\%' character as \cmd{\rubikpercentchar}
+% (modified from: Abrahams PW, Berry K and Hargreaves KA (1990), p~292)
+% [see refs Section~\ref{sec:references}]\label{sec:abrahams},
+% and also two `comment' commands which implement it. This `workaround'
+% is necessary because \TeX\ does not allow the use of the \cmd{\%} command
+% for placing a `\%' character in the token list of \cmd{\write}.
+% See Abrahams \textit{et.~al} (1990) for details.
+% \begin{macrocode}
+{\catcode`\%=12 \global\def\rubikpercentchar{%}}%
+\newcommand{\@comment}{\rubikpercentchar\rubikpercentchar\space}%
+\newcommand{\@commentone}{\rubikpercentchar}%
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \begin{macro}{\rubikperlname}
+% This holds the name of the Perl script. A configuration-file
+% (\verb!rubikrotation.cfg!) can be used to change the default name of the
+% Perl script using a renewcommand (see Section~\ref{sec:configfile}).
+% \begin{macrocode}
+\newcommand{\rubikperlname}{rubikrotation}
+% \end{macrocode}
+% \end{macro}
+% Note that here we are assuming that the script is an executable file.
+%
+% \begin{macro}{\rubikperlcmd}
+% This holds the command-line code for calling the Perl script
+% Note that the command-line requires a mandatory input filename preceded
+% by the \texttt{-i}~switch. An optional output filename (preceded by the
+% \texttt{-o}~switch) may be used, otherwise the default output filename of
+% \texttt{rubik-OUT.dat} will be used.
+%
+% Note that it is very important that we do actually specify an
+% output filename (for receiving data from the Perl script). This is because
+% (a)~The Perl script \texttt{rubikrotation.pl} is currently configured to read its
+% output filename as an argument from the command-line (so it can be flexibly
+% used as a stand-alone script for processing a given Rubik state through a
+% sequence of rotations), and (b)~\texttt{rubikrotation.sty} is currently
+% configured to read its input (i.e.,~data generated by the Perl script)
+% from the file \texttt{rubikstateNEW.dat}.
+% \begin{macrocode}
+\newcommand{\rubikperlcmd}{\rubikperlname\space%
+ -i rubikstate.dat -o rubikstateNEW.dat}
+% \end{macrocode}
+% Remember to use the \cmd{\space} macro following the \cmd{\rubikperlname} macro
+% in order to generate the mandatory space before the first
+% command-line argument.
+%
+% A plain-text configuration-file \verb!rubikrotation.cfg! can be used to
+% change the default command-line code using a renewcommand
+% (see Section~\ref{sec:configfile}).
+% \end{macro}
+%
+%
+% \subsection{Configuration file}
+%
+% If a configuration file exists (\texttt{rubikrotation.cfg}) then input it here,
+% i.e.,~\textit{after} defining the \cmd{\rubikperlname} and \cmd{\rubikperlcmd}
+% macros and \textit{before} creating the \texttt{rubikstateERRORS.dat} file.
+% \begin{macrocode}
+\typeout{---checking for config file (rubikrotation.cfg)...}
+\IfFileExists{rubikrotation.cfg}{%
+ \input{rubikrotation.cfg}%
+ }{\typeout{---no config file available}%
+}%
+% \end{macrocode}
+%
+%
+% \subsection{Clean file rubikstateNEW.dat}
+%
+% {\noindent}We need to clean out any existing (old) rubikstateNEW.dat file,
+% since if the TeX shell command-line switch is accidentally not used then the Perl script
+% \texttt{rubikrotation.pl} will not be CALLed, and hence this file will not be renewed
+% (i.e.,~an `old' image may be used).
+% \begin{macrocode}
+\typeout{---cleaning file rubikstateNEW.dat}%
+\newwrite\outfile%
+\immediate\openout\outfile=rubikstateNEW.dat%
+\@print{\@comment rubikstateNEW.dat}%
+\immediate\closeout\outfile%
+% \end{macrocode}
+%
+%
+% \subsection{rubikstateERRORS.dat}
+%
+% {\noindent}We first open the file \texttt{rubikstateERRORS.dat} which is used
+% by the Perl script \texttt{rubikrotation.pl} for writing its error-messages to.
+% This file is displayed by the command
+% \cmd{\ShowErrors}.
+%
+% \textsc{important note}: this file is created fresh each time LaTeX is run,
+% and hence the Perl script only appends data to it during the \LaTeX\ run,
+% so this file just grows until either it is destroyed or recreated---this is
+% a useful feature since the file accumulates all error messages as the
+% \texttt{.tex} file is processed.
+% We can't make the Perl script create the file since the Perl script is only
+% CALLed if we use a \cmd{\RubikRotation} or \cmd{\CheckRubikState}
+% command (which we may not\,!)---so it has to be created here.
+% \begin{macrocode}
+\typeout{---creating file rubikstateERRORS.dat}%
+\newwrite\outfile%
+\immediate\openout\outfile=rubikstateERRORS.dat%
+\@print{\@comment ShowErrors (rubikstateERRORS.dat)}%
+\@print{\@comment ---------------------------------}%
+\immediate\closeout\outfile%
+% \end{macrocode}
+%
+%
+% \subsection{Setting up file-access for new files}
+%
+% Having set up all the primary files, we now need to set up a newwrite for
+% all subsequent file openings (e.g.,~for \texttt{rubikstate.dat} and saving
+% to arbitrary file-names by the \cmd{\SaveRubikState} command). Otherwise, we
+% can easily exceed the LaTeX limit of 15. From here-on \TeX\ will use
+% \texttt{openout7} when opening and writing to files. We will implement new
+% openings using the command \verb!\@openstatefile! (see below).
+% \begin{macrocode}
+\typeout{---setting up newwrite for rubikrotation.sty to use...}%
+\newwrite\outfile%
+% \end{macrocode}
+%
+%
+% \begin{macro}{\@openstatefile}
+% \begin{macro}{\@closestatefile}
+% We also need commands for easy file opening and closing
+% for new instances of the file \texttt{rubikstate.dat} etc.
+% Note that for this we are therefore using the same outfile number as set up
+% by the \verb!\newwrite...! above.
+% \begin{macrocode}
+\newcommand{\@openstatefile}{\immediate\openout\outfile=rubikstate.dat}
+\newcommand{\@closestatefile}{\immediate\closeout\outfile}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{Saving the Rubik state}
+%
+% \begin{macro}{\@printrubikstate}
+% This internal command writes the Rubik configuration to
+% the file \texttt{rubikstate.dat}, and is used by the \cmd{\RubikRotation} command
+% (see Sections~\ref{saverubikstate} and \ref{generaloverview}).
+% The file \texttt{rubikstate.dat} is read by the Perl script, and represents
+% the state on which the new \cmd{\RubikRotation} command acts.
+% Note that we include the line \texttt{cubesize,three} to inform the Perl script
+% that the cube is a 3x3x3 cube (this is used in the `random' subroutine).
+%
+% The actual state (colour state) is simply an ordered sequence of the faces and the colours
+% associated with each facelet of a face. The colour associated with a particular facelet
+% is held by the variable for that facelet. For example, the top-left facelet associated with
+% the \textsc{front} face is held in the variable \cmd{\Flt} (see Section~\ref{saverubikstate}).
+% Further relevant documentation is in the \textsc{rubikcube} package.
+% \begin{macrocode}
+\newcommand{\@printrubikstate}{%
+ \@print{cubesize,three}%
+ \@print{up,\Ult,\Umt,\Urt,\Ulm,\Umm,\Urm,\Ulb,\Umb,\Urb}%
+ \@print{down,\Dlt,\Dmt,\Drt,\Dlm,\Dmm,\Drm,\Dlb,\Dmb,\Drb}%
+ \@print{left,\Llt,\Lmt,\Lrt,\Llm,\Lmm,\Lrm,\Llb,\Lmb,\Lrb}%
+ \@print{right,\Rlt,\Rmt,\Rrt,\Rlm,\Rmm,\Rrm,\Rlb,\Rmb,\Rrb}%
+ \@print{front,\Flt,\Fmt,\Frt,\Flm,\Fmm,\Frm,\Flb,\Fmb,\Frb}%
+ \@print{back,\Blt,\Bmt,\Brt,\Blm,\Bmm,\Brm,\Blb,\Bmb,\Brb}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{SaveRubikState command}
+% \label{sec:eijkhout}
+%
+% \begin{macro}{\SaveRubikState}
+% The command \cmd{\SaveRubikState}\marg{filename} saves the Rubik state
+% to a named file in the format of a Rubik command (so it can then be processed
+% by \LaTeX). Note that in order to actually write a LaTeX
+% command to a file without a trailing space one must prefix the command with the
+% \cmd{\string} command (see Eijkhout (1992), p~238)
+% [see refs Section~\ref{sec:references}]\label{sec:eijkhout}.
+%
+% Note that this macro uses the internal commands \cmd{\@comment} (`\%\%'),
+% \cmd{\@commentone} (`\%') and \cmd{\@print}. \#1 is the output filename.
+% We use several \cmd{\typeout} commands to write to the log file.
+% An example of one of the lines of code we are trying to output to the
+%\texttt{rubikstateNEW.dat} file is as follows:
+% {\newline}\verb!\RubikFaceUp{W}{W}{G}{W}{W}{G}{B}{B}{Y}%!
+% \begin{macrocode}
+\newcommand{\SaveRubikState}[1]{%
+\typeout{---NEW save command------------------}%
+\typeout{---command = SaveRubikState{#1}}%
+\typeout{---saving Rubik state data to file #1}%
+\immediate\openout\outfile=#1%
+\@print{\@comment filename: #1\@commentone}%
+\@print{\string\RubikFaceUp%
+ {\Ult}{\Umt}{\Urt}{\Ulm}{\Umm}{\Urm}{\Ulb}{\Umb}{\Urb}\@commentone}%
+\@print{\string\RubikFaceDown%
+ {\Dlt}{\Dmt}{\Drt}{\Dlm}{\Dmm}{\Drm}{\Dlb}{\Dmb}{\Drb}\@commentone}%
+\@print{\string\RubikFaceLeft%
+ {\Llt}{\Lmt}{\Lrt}{\Llm}{\Lmm}{\Lrm}{\Llb}{\Lmb}{\Lrb}\@commentone}%
+\@print{\string\RubikFaceRight%
+ {\Rlt}{\Rmt}{\Rrt}{\Rlm}{\Rmm}{\Rrm}{\Rlb}{\Rmb}{\Rrb}\@commentone}%
+\@print{\string\RubikFaceFront%
+ {\Flt}{\Fmt}{\Frt}{\Flm}{\Fmm}{\Frm}{\Flb}{\Fmb}{\Frb}\@commentone}%
+\@print{\string\RubikFaceBack%
+ {\Blt}{\Bmt}{\Brt}{\Blm}{\Bmm}{\Brm}{\Blb}{\Bmb}{\Brb}\@commentone}%
+\immediate\closeout\outfile%
+\typeout{-----------------------------------------}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{RubikRotation command}
+% \label{sec:rubikrotationcode}
+%
+% \begin{macro}{\RubikRotation}
+% The \cmd{\RubikRotation}\oarg{integer}\marg{comma separated sequence}
+% command (a)~writes the current Rubik state to the file \texttt{rubikstate.dat},
+% (b)~writes the rotation sequence (either once or multiple times depending
+% on the value of the optional integer argument), and then (c)~CALLs the
+% Perl script \texttt{rubikrotation.pl}. It~also writes comments to the
+% data file and also to the log file.
+%
+% The way we allow the user to (optionally) process the main argument multiple
+% times is simply by writing the associated output command multiple
+% times to the output data-file. Consequently, we require the \cmd{\RubikRotation}
+% command to allow a square-bracket optional
+% argument (a non-negative integer) to specify the number of such repeats.
+% In order to implement this optional argument facility we use two macros
+% (countingloop and loopcounter) detailed by Feuers\"{a}nger (2015)
+% [\,see refs Section~\ref{sec:references}\,]\label{sec:feuersanger},
+% as follows:
+% \begin{macrocode}
+%% Two macros detailed by Feuersaenger (2015)
+\long\def\@countingloop#1 in #2:#3#4{%
+ #1=#2 %
+ \@loopcounter{#1}{#3}{#4}%
+}
+%%--------------------------
+\long\def\@loopcounter#1#2#3{%
+ #3%
+ \ifnum#1=#2 %
+ \let\next=\relax%
+ \else
+ \advance#1 by1 %
+ \def\next{\@loopcounter{#1}{#2}{#3}}%
+ \fi
+ \next
+}
+% \end{macrocode}
+% Having defined the above two macros we can now implement an optional
+% argument (a repeat number) indicating the number of times we want
+% the command to write the main argument to the output data file.
+% \begin{macrocode}
+\newcommand{\RubikRotation}[2][1]{%
+ \typeout{---TeX process---------------------------}%
+ \typeout{---script = rubikrotation.sty v\RRfileversion\space (\RRfiledate)}%
+ \typeout{---NEW rotation command}%
+ \typeout{---command = RubikRotation[#1]{#2}}%
+ \typeout{---writing current cube state to file rubikstate.dat}%
+ \@openstatefile% open data file
+ \@print{\@comment filename: rubikstate.dat}%
+ \@print{\@comment written by rubikrotation.sty%
+ =v\RRfileversion\space (\RRfiledate)}%
+ \@printrubikstate%
+%% countingloop code from Feuersaenger (2015)
+ \newcount\ourRRcounter%
+ \@countingloop{\ourRRcounter} in 1:{#1}{%
+ \immediate\write\outfile{rotation,#2}}%
+ \@closestatefile% close data file
+ \typeout{---CALLing Perl script (rubikrotation.pl)}%
+ \immediate\write18{\rubikperlcmd}%
+ \typeout{---inputting NEW datafile (data written by Perl script)}%
+ \input{rubikstateNEW.dat}%
+ \typeout{-----------------------------------------}%
+ }
+% \end{macrocode}
+% \end{macro}
+% Note that the new \cmd{\ShellEscape} command implemented by the recent
+% \textsf{shellesc} package is equivalent to \cmd{\immediate}\cmd{\write18} (see above),
+% and so we probably ought to use \cmd{\ShellEscape} instead in future (and hence load
+% \textsf{shellesc} automatically). At present, however, we leave the user to make
+% sure that the \textsf{shellesc} package is actually available on their system.
+%
+%
+%
+% \subsection{ShowErrors command}
+% \label{sec:showerrorscode}
+%
+% \begin{macro}{\ShowErrors}
+% This command inputs the file \texttt{rubikstateERRORS.dat}
+% (output by the Perl program).
+% \begin{macrocode}
+\newcommand{\ShowErrors}{%
+ \typeout{---ShowErrors: inputting file rubikstateERRORS.dat}%
+ \VerbatimInput{rubikstateERRORS.dat}%
+ }
+% \end{macrocode}
+% Since this command replaces the original command = \cmd{\ShowRubikErrors}, we will
+% retain the original command for backward compatibility (for the moment at least).
+% \begin{macrocode}
+\newcommand{\ShowRubikErrors}{\ShowErrors}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% \subsection{CheckState command}
+% \label{sec:checkstatecode}
+%
+% \begin{macro}{\CheckState}
+% This command triggers the Perl script to implement
+% some simple error checking of the Rubik configuration (state).
+% This command (a)~writes the current Rubik state to the file
+% \texttt{rubikstate.dat}, (b)~writes the keyword `checkstate' to the
+% same file, and then (c)~CALLs the Perl script.
+% It also writes comments to the data file and also to the log file.
+%
+% Note (1)~that the command \cmd{\@printrubikstate} actually writes the
+% current state to the file \texttt{rubikstate.dat}, (2)~the keyword `checkstate'
+% triggers the Perl program to do a simple numerical check on the number
+% of facelets with each colour.
+%
+% Note also that the \cmd{\CheckState} command replaces the earlier
+% \cmd{\CheckRubikState}, but we retain the old command for backwards
+% compatibility (for the moment).
+% \begin{macrocode}
+\newcommand{\CheckState}{%
+ \typeout{---NEW check command------------------}%
+ \typeout{---command = CheckState}%
+ \typeout{---writing current cube state to file rubikstate.dat}%
+ \@openstatefile% opens data file
+ \@print{\@comment filename: rubikstate.dat}%
+ \@printrubikstate%
+ \immediate\write\outfile{checkstate}%
+ \@closestatefile% close data file
+ \typeout{---running Perl script (rubikrotation.pl)}%
+ \immediate\write18{\rubikperlcmd}%
+ \typeout{---inputting NEW datafile (data written by Perl script)}%
+ \input{rubikstateNEW.dat}%
+ \typeout{-----------------------------------------}%
+ }
+\newcommand{\CheckRubikState}{\CheckState}
+% \end{macrocode}
+% \end{macro}
+%
+%
+% --------------------------
+% End of this package
+% --------------------------
+% \begin{macrocode}
+%</rubikrotation>
+% \end{macrocode}
+%
+%
+%
+%
+% \Finale
+%
+\endinput
+
+
+
+
+
diff --git a/macros/latex/contrib/rubik/rubikrotation.ins b/macros/latex/contrib/rubik/rubikrotation.ins
new file mode 100644
index 0000000000..655f68e31a
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotation.ins
@@ -0,0 +1,65 @@
+%% rubikrotation.ins
+%%
+%%
+%%
+%% --- automatic overwriting of .sty is disabled-------
+%% =========================================================
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{rubikrotation.ins}
+\input docstrip.tex
+
+\preamble
+
+-----------------------------------------------------------------
+ Authors: RWD Nickalls (dick@nickalls.org)
+ and Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ Copyright February 25, 2018 RWD Nickalls and A Syropoulos
+
+ VERSION 5.0
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3c of this license or (at your option) any
+ later version: <http://www.latex-project.org/lppl.txt>
+
+ This work consists of the files listed in the README file.
+-----------------------------------------------------------------
+
+ This is a LaTeX/TikZ package for drawing Rubik cubes
+ Please report errors or suggestions for improvement to
+
+ RWD Nickalls (dick@nickalls.org)
+ Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ This package requires the basic TikZ package to be loaded already
+------------------------------------------------------------------
+\endpreamble
+
+\keepsilent %%disables most of the screen output
+%% \askforoverwritefalse %%enables automatic overwriting of .sty
+\generate{\file{rubikrotation.sty}{\from{rubikrotation.dtx}{rubikrotation}}}
+
+%%now write a screen message for the user
+\obeyspaces
+\Msg{*******************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* rubikrotation.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* rubikrotation.dtx through LaTeX. *}
+\Msg{* For an index, process any filename.idx file by *}
+\Msg{* makeindex -s gind.ist filename *}
+\Msg{* For list of changes, process any filename.glo file *}
+\Msg{* makeindex -s gglo.ist -o filename.gls filename.glo *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{*******************************************************}
+
+\endbatchfile
+%%------------EOF---------------
diff --git a/macros/latex/contrib/rubik/rubikrotation.pdf b/macros/latex/contrib/rubik/rubikrotation.pdf
new file mode 100644
index 0000000000..f7fbd7db06
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotation.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubikrotation.pl b/macros/latex/contrib/rubik/rubikrotation.pl
new file mode 100755
index 0000000000..d9b02d5a47
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotation.pl
@@ -0,0 +1,2926 @@
+#!/usr/bin/env perl
+##
+ use Carp;
+ use Fatal;
+ use warnings;
+ ##
+ our $version = "v5.0 (25 February 2018)";
+ ##
+ ## rubikrotation.pl
+ ## VERSION 5.0
+ ##
+ ## Copyright February 2018,
+ ## RWD Nickalls (dick@nickalls.org)
+ ## A Syropoulos (asyropoulos@yahoo.com)
+ ##
+ ## HISTORY
+ ##-------------------------------
+ ## v5.0 (25 February 2018)
+ ##-------------------------------
+ ##
+ ## 4.2h (07 February 2018)
+ ## --- adjusted the no of leading dots for the gprint command
+ ## when writing the up, down,.. colour state to the log file
+ ## so as to make the array form a square block (ie easier to read)
+ ## (in MAIN)
+ ##
+ ## 4.2g
+ ## --- 29 October 2017 added syntax checking for (( )) /inside/ squarebrackets
+ ## (in SUB checksyntax)
+ ## --- 24 October 2017 changed {};--> (), in SequenceNameNew (in SUB writestate)
+ ## this repairs these chars back to their original state.
+ ## --- 22 October 2017 minor adjustments to syntax checking (in SUB checksyntax)
+ ## to allow some extra chars in the [name] and <info> blocks.
+ ## Ideally, we want to be able to use /any/ chars inside these infoblocks.
+ ##
+ ## 4.2f
+ ## --- 05 Oct 2017 bugfix: added a ShowSequence [\space] bug fix in SUB checksyntax
+ ## --- 04 Oct 2017 adjusted brackets < > error messages (lines 2643--2659)
+ ##
+ ## 4.2e: (29 Sept 2017)
+ ## --- added a ``Western'' notation filter (provisional \& works)
+ ##
+ ## 4.2d: (10 August 2017)
+ ## --- placed a checkstate() command inside the rotation keyword
+ ## and stopped TEX writing the keyword checkstate to the rubikstate.dat file
+ ##
+ ## 4.2c: (2 August 2017)
+ ## --- added new rubikkeyword "cubesize" to hold cube size (three or two)
+ ## so we can tell which sort of cube is being processed
+ ## We can use this to detect when using the TwoRotation command
+ ## (for the TWOcube) vs when using the RubikRotation command
+ ## (for the THREEcube); for eample with regard to random rotations
+ ## (see random SUB; see RubikTwoCube.sty)
+ ##
+ ## 4.2b: (1 Aug 2017)
+ ## --- Removed the random,0 option --> n=50 (random SUB)
+ ## a zero or missing integer now generates an error message.
+ ##
+ ## 4.2a: (28 July 2017)
+ ## --- bugfix: error if spaces in RubikRotation{random,n} string from LaTeX.
+ ## Fixed to accommodate spaces, and uppercase random (lines 366 -- 388 approx)
+ ##
+ ##-------------------------------
+ ## v4.0 (3 March 2017)
+ ##-------------------------------
+ ## changes in v3.6 (January 2017)
+ ## --- included Jaap Rm and Rc notation
+ ## --- new sub for improved expansion of mod-4 multiples of rotations (Oct 2016)
+ ## --- restructured to facilitate processing arrays through the rotation sub
+ ## --- included option for an <info> block
+ ## --- included Randelshofer superset ENG 3x3 notation
+ ## --- implemented an `inverse' mode
+ ## --- improved syntax checking
+ ## --- used perltidy to polish the program layout
+ ## (but only when making the pdf documentation-- see file rubikrotationPL.pdf)
+ ## --- included a lot of new subroutines
+ ##--------------------------------
+ ## changes in v3.2:
+ ## v3.2h: (2 Oct 2016)
+ ## improved the mod 4 routine using SUB rubikmod()
+ ## improved comments to log file re: rotation processing
+ ##
+ ## v3.2e:(25 Sept 2016)
+ ## changed some command names: use short & long for the Rubik R2 --> R,R code
+ ## (more intuitive than Clean)
+ ## \Sequence{} --> SecquenceShort{}
+ ## \SequenceClean{} --> SecquenceLong{}
+ ## removed the [ and ] around [name] variable
+ ##
+ ## v3.2d: changed the returned command names (removed the Rotation part to keep it simple)
+ ## \Sequence{} = orig seq + NO NAME
+ ## \SequenceName{} = NAME only
+ ## \SequenceClean{} = clean seq + NO NAME
+ ##
+ ## v3.2c: added new commands:
+ ## \RotationSequenceName{}
+ ## \RotationSequenceClean{}
+ ##
+ ## v3.2a: added a \RubikSeqNEW{...} output line in the output file
+ ## to facilitate typesetting the rotation sequence (works OK just now)
+ ##
+ ## v3.2: --- added leading ... to the comments written by the <writestate> sub
+ ## (the ... code indicates that comments are written by the Perl script)
+ ## --- changed the word program, prog --> script
+ ##--------------------------------
+ ## changes in v3.0:
+ ## --- accepts command-line arguments for input (mandatory) and output (optional) filenames
+ ## default output filename is: rubikOUT.txt
+ ## --- included the symbols [ and ] to denote a rotation-name label (ie as well as *)
+ ## --- fixed some of the variable definitions (as highlighted by <use strict> pragma)
+ ##--------------------------------
+ ## changes in v2.3:
+ ## --- accepts a single commandline argument (datafilename)
+ ## --- uses the standard modules Carp and Fatal (give extra line info on error)
+ ##--------------------------------
+ ## changes in v2.2:
+ ## --- changed licence --> LatexPP
+ ## --- included random n errors in ERROR messages (lines 492--495)
+ ## --- included version number in error message
+ ##------------------------------
+ #
+ # This file is part of the LaTeX rubikrotation package, and
+ # requires rubikcube.sty and rubikrotation.sty
+ #
+ # rubikrotation.pl is a Perl-5 program and free software:
+ # This program can be redistributed and/or modified under the terms
+ # of the LaTeX Project Public License Distributed from CTAN
+ # archives in directory macros/latex/base/lppl.txt; either
+ # version 1 of the License, or any later version.
+ #
+ # rubikrotation.pl is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ # GNU General Public License for more details.
+
+ ##---------------------------------------------------------------------
+ ## OVERVIEW
+ ## This program is part of the rubikrotation package, and is complementary to
+ ## the LaTeX rubikcube package. It processes Rubik rotation sequences on-the-fly.
+ ## The program reads a datafile (rubikstate.dat) output by the rubikcube package
+ ## and writes the new state to the file rubikstateNEW.dat, which is then input
+ ## by the TeX file. Further documentation accompanies the rubikrotation package.
+
+ ## Note that all possible state changing rotations of a 3x3x3 cube are
+ ## either combinations of, or the inverse of, just 9 different rotations,
+ ## three associated with each XYZ axis.
+ ##----------------------------------------------------------------------
+
+ ##==MAIN==
+ ##
+ ## This main module opens three files, and
+ ## sets up an array for collecting all errors (%error), and sets an error flag to "",
+ ## reads in the rubik state data file =rubikstate.dat (written by rubikrotation.sty),
+ ## and calls subs to write the TeX_OUT_FILE,
+ ## and finally closes all files.
+ ## Each line of the input file (rubikstate.dat) is a comma separated list of arguments.
+ ## The first argument in each line of the file rubikstate.dat is a rubikkeyword.
+ ##
+ ##---------------
+ ## set autoflush for outputs
+ ## $|=1;
+ ##--------------
+ our $source_file="";
+ our $out_file="rubikOUT.txt"; #default
+ our $argc=@ARGV;
+ our $commandLineArgs = join(" ", @ARGV);
+ our $showargs="\tcommandline args = $commandLineArgs\n";
+ our $usage="\tUsage: rubikrotation [-h|--help|-v|--version] -i <input file> [-o <out file>]\n";
+ our $rubikversion="\tVersion: this is rubikrotation version $version\n";
+ #
+ ## check for correct number of commandline arguments and allocate filenames
+ #
+ if ($argc == 0||$argc > 4 ){ # croak if 0 or more than 4 arguments
+ croak $rubikversion,$showargs,
+ "\tWrong no of arguments\n",
+ $usage;
+ }
+ else {
+ SWITCHES:
+ while($_ = $ARGV[0]) {
+ shift;
+ if (/^-h$/ || /^--help$/ ) {
+ die $rubikversion,$usage,
+ "\twhere,\n" .
+ "\t[-h|--help]\tgives this help listing\n" .
+ "\t[-v|--version]\tgives version\n" .
+ "\t[-i] \tcreates specified input file\n",
+ "\t[-o] \tcreates specified output file\n",
+ "\tFor documentation see: rubikrotation.pdf,\n",
+ "\trubikrotationPL.pdf and rubikcube.pdf.\n\n";
+ }
+ elsif (/^-v$/ || /^--version$/ ) {die $rubikversion;}
+ elsif (/^-i$/) {
+ if (!@ARGV){
+ croak $showargs,
+ "\tNo input file specified!\n",
+ $usage;
+ }
+ else {
+ $source_file = $ARGV[0],
+ shift;
+ }
+ }
+ elsif (/^-o$/) {
+ if (!@ARGV) {
+ croak $showargs,
+ "\tNo output file specified!\n",
+ $usage;
+ }
+ else {
+ $out_file = $ARGV[0],
+ shift;
+ }
+ }
+ elsif (/^-\w+/) {
+ croak $showargs,
+ "\t$_: Illegal command line switch!\n",
+ $usage;
+ }
+ else {
+ croak $showargs,
+ "\tmissing filenames or ? missing -i or -o switch!\n",
+ $usage;
+ }
+ } # end of while
+ }; # end of else
+
+ #================================
+
+ open(IN_FILE, "<$source_file") ||croak "\tCan't open source file: $source_file\n";
+ open(TeX_OUT_FILE, ">$out_file")||croak "\tCan't open output file: $out_file\n";
+
+ ## create error file (for append)
+ open (ERROR_OUT_FILE, ">>rubikstateERRORS.dat")||croak "ERROR: can't open file rubikstateERRORS.dat\n";
+
+
+ ## use dots for Perl messages (I have used dashes for LaTeX messages in the .sty)
+ ## gprint sub prints its argument (message) to both the screen and to the TeX_OUT_FILE
+
+ gprint (""); # newline
+ gprint ("...PERL process..................................");
+ gprint ("...script = rubikrotation.pl $version");
+
+ ## setup global error parameters, so we can write all the errors to a file as an array
+ our %error = (); # setup an array for error messages (was %)
+ our $erroralert = ""; # error flag
+ our $errornumber = 0; #set number of errors to zero
+
+ gprint ("...reading the current cube state (from File: $source_file)");
+
+ our $dataline = "";
+ our $newdataline ="";
+ our $rubikkeyword = "";
+ our $cubesize = ""; ## to hold the size, as three (Rubik) or two (twocube)
+ our $rotationcommand = "";
+ our @data=();
+
+ our $Sequence=""; ## will hold the original (SHORT) sequence
+ our $rotationseqNEW = ""; ## will hold the LONG sequence
+ our $RotationSequenceName="";
+
+ our $SequenceName="";
+ our $SequenceShort="";
+ our $SequenceLong="";
+ our $SequenceInfo="";
+
+
+ our $jrcode = 0; ## We initialise a loop counter for use in the rotation sub
+ ## (see line 624)
+
+ #---------inverse mode------------
+ # a keyword INVERSE or inverse in an infoblock <..>
+ # FLAG is set (line 400) in response to detecting an infloblock.
+ # A set FLAG triggers (a) reversing rotation sequence (line 484),
+ # and (b) inverting each rotation (to generate the inverse sequence).
+ # Here we define direction FLAG for the INVERSE sequence of rotations.
+ # The conditional test is in the SUB rotation
+ our $inverse="INV";
+ our $directionflag="";
+ #-------------------------
+
+
+ LINE: while (<IN_FILE>){
+ next LINE if /^#/; #skip comments
+ next LINE if /^%/; #skip comments
+ next LINE if /^$/; #skip blank lines
+
+
+ print " \n TOP --------- (new line)\n\n";
+
+ $dataline = $_; # grab the whole line as a string
+ chomp $dataline; # remove the line-ending character
+
+ ## clean leading and trailing whitespace
+ $dataline = cleanstring($dataline);
+
+
+ #check syntax of the string
+ $rotationcommand=$dataline; ## needed for error messages
+ CheckSyntax($dataline);
+
+ ## form an array so we can process the (rubik)keywords.
+ @data=split (/,/, $dataline); # create an array called data
+
+ print " dataline array = @data\n";
+ #-------------------------
+
+ ## we have 10 fields (0--9)
+ ## check for rubikkeyword= cubesize, up,down,left,right,front,back,checkstate,rotation:
+ $rubikkeyword=$data[0];
+
+ ##--------------------------------
+ ## RWDN 2 August 2017
+ ## introduced keyword cubesize so prog can distinguish
+ ## between a TWOcube and an THREEcube.
+ ## Here we check for the rubikkeyword `cubesize'
+ ## cubesize is currently only being used to change the array size in random SUB
+ if ($rubikkeyword eq 'cubesize') {
+ gprint ("...");
+ $rotationcommand=$dataline; ## used in output message
+ gprint ("...command = $rotationcommand");
+ $cubesize = RemoveAllSpaces($data[1]);
+ if ($cubesize eq "two") {gprint ("...cube = TWOcube")};
+ if ($cubesize eq "three") {gprint ("...cube = THREEcube")};
+ gprint ("...");
+ next LINE ;
+ };
+ ## ------------------------------------
+
+ ## RWDN 7 February 2018
+ ## we vary the number of leading dots for the gprint command
+ ## so as to make the array of colour codes (X,W,Y, etc) form
+ ## a nice square when printed to the log file (the standard no is 3 dots)
+
+ if ($rubikkeyword eq 'up') { gprint ("......$dataline");
+ $Ult[0]=$data[1], $Umt[0]=$data[2],$Urt[0]=$data[3],
+ $Ulm[0]=$data[4], $Umm[0]=$data[5],$Urm[0]=$data[6],
+ $Ulb[0]=$data[7], $Umb[0]=$data[8],$Urb[0]=$data[9];
+ next LINE;
+ };
+
+ if ($rubikkeyword eq 'down') { gprint ("....$dataline");
+ $Dlt[0]=$data[1], $Dmt[0]=$data[2],$Drt[0]=$data[3],
+ $Dlm[0]=$data[4], $Dmm[0]=$data[5],$Drm[0]=$data[6],
+ $Dlb[0]=$data[7], $Dmb[0]=$data[8],$Drb[0]=$data[9];
+ next LINE;
+ };
+
+ if ($rubikkeyword eq 'left') { gprint ("....$dataline");
+ $Llt[0]=$data[1], $Lmt[0]=$data[2],$Lrt[0]=$data[3],
+ $Llm[0]=$data[4], $Lmm[0]=$data[5],$Lrm[0]=$data[6],
+ $Llb[0]=$data[7], $Lmb[0]=$data[8],$Lrb[0]=$data[9];
+ next LINE;
+ };
+
+ if ($rubikkeyword eq 'right') { gprint ("...$dataline");
+ $Rlt[0]=$data[1], $Rmt[0]=$data[2],$Rrt[0]=$data[3],
+ $Rlm[0]=$data[4], $Rmm[0]=$data[5],$Rrm[0]=$data[6],
+ $Rlb[0]=$data[7], $Rmb[0]=$data[8],$Rrb[0]=$data[9];
+ next LINE;
+ };
+
+ if ($rubikkeyword eq 'front') { gprint ("...$dataline");
+ $Flt[0]=$data[1], $Fmt[0]=$data[2],$Frt[0]=$data[3],
+ $Flm[0]=$data[4], $Fmm[0]=$data[5],$Frm[0]=$data[6],
+ $Flb[0]=$data[7], $Fmb[0]=$data[8],$Frb[0]=$data[9];
+ next LINE;
+ };
+
+ if ($rubikkeyword eq 'back') { gprint ("....$dataline");
+ $Blt[0]=$data[1], $Bmt[0]=$data[2],$Brt[0]=$data[3],
+ $Blm[0]=$data[4], $Bmm[0]=$data[5],$Brm[0]=$data[6],
+ $Blb[0]=$data[7], $Bmb[0]=$data[8],$Brb[0]=$data[9];
+ next LINE;
+ };
+
+ ## if the rubikkeyword is `checkstate'
+ ## we just check the state and write the output data to a file.
+ if ($rubikkeyword eq 'checkstate') {
+ gprint ("...");
+ $rotationcommand=$dataline; ## used in output message
+ gprint ("...command = $rotationcommand");
+ checkstate();
+ next LINE ;
+ };
+
+ ## IF the rubikkeyword is `rotation'
+ ## we first check to see if the second argument=random.
+ ## ---if so, then we check that the third argument is an integer,
+ ## ---if it is an integer n --> random => random(n)
+ ## ELSE it must be a rotation sequence --> send elements to rotation sub.
+
+
+ if ($rubikkeyword eq 'rotation')
+
+ { ## this IF runs down to near end of MAIN
+
+ ##RWDN 10 Aug 2017
+ ## moved checkstate to be inside rotation (so a next LINE will terminate prog)
+ gprint ("...");
+ gprint ("...rotation keyword");
+ checkstate();
+
+
+ gprint ("..."); ## logfile marker for begining of `rotation/random' process
+
+ # we now grab a copy of the dataline, and we shall use this
+ # in the ErrorMessage SUB to indicate which command
+ # an error is in.
+ $rotationcommand=$dataline; ## used in output message
+ gprint ("...command = $rotationcommand");
+
+
+ # need to check that a second argument exists (else --> ErrorMessage).
+ # ---should be either `random',
+ # ---or a macroname for a rotation sequence,
+ # ---or the first element of a rotation sequence.
+
+ if ($data[1] eq "")
+ { # no second argument
+ gprint ("..*missing second argument");
+ ErrorMessage ("QUITTING PERL PROGRAM --- missing second argument:");
+ ErrorMessage ("--- ? bad rotation macro-name");
+ quitprogram();
+ };
+
+
+
+ ##---------keyword = random-----------------
+ ## (command used for scrambling the cube)
+ ## if second argument in $dataline = random
+ ## THEN we also need to check if third argument is an integer;
+ ## if so send integer --> random sub.
+
+ ##----------------------------
+ ## (28 July 2017: RWDN) : bugfix:
+ ## better syntax checking required for the <random,n> command
+ ## as spaces before or after commas caused errors.
+ ##-----------------------------
+
+
+ ## allow upper and lowercase keyword random
+ if ( lc( $data[1] ) =~ m/random/ )
+ {
+ ## the string contains the keyword random
+
+ ## now check for missing comma after the keyword
+ if ( lc( RemoveAllSpaces($data[1]) ) ne "random" )
+ {## error, ? missing comma
+ ErrorMessage("[$data[1]] --- missing comma after `random' ");
+ next LINE;
+ };
+
+ ## now check for the trailing integer
+
+ if ( ( lc( RemoveAllSpaces($data[1]) ) eq "random") and ($data[2] eq "") )
+ {
+ ## missing integer
+ ErrorMessage("[$data[2]] --- missing integer after `random,'");
+ next LINE;
+ };
+
+
+ if (RemoveAllSpaces($data[2]) =~ /\D/)
+ {
+ ## Note that the \D operator sees , 23, as a word not an integer.
+ ## so if true then cannot be a number (D matches word and space elements)
+ ErrorMessage("[$data[2]] --- this is not an integer");
+ next LINE;
+ }
+ else {## string consists of one or more integers
+ ## check to see if more than one integer exists
+ ## by seeing if the string changes if we remove all the spaces
+ ## (note we have to use a string with the m operator)
+ my $RAS = RemoveAllSpaces($data[2]);
+ if ($data[2] =~ m/$RAS/ )
+ {
+ ## OK so this must be a single integer
+ ## so we can now do n random rotations
+ ## by sending the integer to the random SUB
+ random($data[2]);
+ next LINE;
+ }
+ else {## there must be spaces separating several integers;
+ ErrorMessage("[$data[2]] --- only one integer allowed");
+ next LINE;
+ };
+ }; ## end of else
+ } ## end of IF
+ ##-----------------------------------------------------------
+
+ else {
+ ## -----rotation sequence---------
+ ## the line must be a rotation sequence line, so send the sequence
+ # to the rotation sub;
+
+ # Note that a copy of the rotation command is already held in the
+ # variable rotationcommand (see above). It is used in the
+ # ErrorMessage SUB.
+
+
+ #----<infoblocks>---------------------------
+
+ # infoblocks are strings bounded by angle brackets <..>
+ # and are designed for holding metadata.
+ #
+ # Multiple comma separated infoblocks are allowed (but NOT nested).
+ # All infoblocks are eventually concaternated into a colon separated string, and
+ # returned into the OUT file (= rubikstateNEW.dat) as the macro \SequenceInfo.
+ #
+ # We process and then remove any infoblocks which exist.
+ # infoblocks are chars delimited by <...>
+ #
+ # The SUB infoblockcolon replaces any commas with a colon (so as to
+ # facilitate string manipulation, and allows us to distinguish between
+ # a string and a data array), and returns a new string (= $newdataline).
+ #
+ # The RubikRotation argument allows <infoblocks> for carrying special
+ # keywords, eg <inverse> which can be used to influence the process.
+ # If several infoblocks exist, then we collect the contents into
+ # variable SequenceInfo, and separate them with a colon;
+ #
+ # The SUB cutinfoblock returns TWO strings:
+ # (1) the name of the new revised string = newdataline, (with infoblocks removed)
+ # (2) the contents of the infoblock = $SequenceInfo
+
+
+ infoblockcolon($dataline);
+
+ ## rename the returned newdataline string to dataline
+ ## and reinitialise the string newdataline so it can be used again.
+ $dataline=$newdataline;
+ $newdataline=""; ## reset the variable
+
+
+ gprint ("...dataline = $dataline");
+
+
+ ## now pass the string to cutinfoblock
+ local @seq=();
+
+
+ while ( (index $dataline, '<') !=-1 ){
+
+ cutinfoblock($dataline);
+ # best to use the whole word <inverse> to avoid errors
+ # best to force lowercase so users can type the word as they want
+
+ if ( lc($SequenceInfo) =~ m/(inverse)/) {
+ ## set a FLAG
+ $directionflag=$inverse;
+ print " FLAG set to = $inverse\n";
+ };
+ # append each infoblock to an array
+ push @seq, $SequenceInfo;
+ $dataline = $newdataline;
+ };
+
+ # finally, we join the seqInfo array into a string so we can print it
+ $SequenceInfo = join ("; ", @seq);
+
+
+
+ #--------repeat blocks--------------------------
+
+ ## there are now no more infoblocks, so we now look for repeat-blocks.
+ ## these are embedded inside the rotation sequence
+
+ ## we first reformulate any repeat blocks (,) --> {;} if they exist
+ ## this is to allow us to process any repeat blocks as separate elements
+ ## so we look for curved brackets ie indicating a repeat block, and
+ ## if we find a ( we then send the dataline to the SUB fixrepeatelement()
+ ## the SUB fixrepeatelement() then returns the new revised dataline string
+ ## containing the FIRST repeat block which has been expanded.
+ ## If there is another ( then we repeat the procedure until all
+ ## repeat blocks have been expanded, and incorporated into the mail rotation string.
+
+ while ( (index $dataline, '(') !=-1 ){
+ fixrepeatelement ($dataline);
+ $dataline=$newdataline;
+ $newdataline=""; ## reset the variable
+ };
+
+ ## rename remaining dataline string as SequenceShortBrace
+ ## since if there are any repeat blocks, they are now reformulated with braces and semicolons
+ ## ie (,) --> {;} etc
+ $SequenceShortBrace=$dataline;
+
+
+ ## clean leading and trailing whitespace
+ $SequenceShortBrace = cleanstring($SequenceShortBrace);
+
+ ##----------------
+ ## form a new array from $SequenceShortBrace (since we have changed the format
+ ## slightly; ie some commands may have been reformulated as semicolons).
+ @data=split (/,/, $SequenceShortBrace);
+
+
+ ## need to remove keyword <rotation> (= first element in the array)
+ ## removing it late like this is convenient for error checking purposes,
+ ## as then the keyword `rotation' is on the string
+ shift (@data);
+
+
+
+ ## now need to recreate the string from the array @data for use later
+ ## (as rotation keyword has been removed)
+
+ $SequenceShortBrace = join (",", @data);
+
+
+ #-----create SequenceShort, so we can output it later----
+
+ # since the `rotating' keyword has been removed from the string,
+ # we can replace (repair to original state) any braces or or semicolons
+ # around repeat strings (if exist) and then rename it as SequenceShort
+ # which we will output at the end (in SUB writestate).
+
+ if ( (index $SequenceShortBrace, '{') !=-1 )
+ {
+ print " repairing braces and semicolon--> ()\n";
+ ## swap: BBook p 138--139
+ $SequenceShortBrace =~ tr/\{/(/; # swap { --> (
+ $SequenceShortBrace =~ tr/\}/)/; # swap } --> )
+ $SequenceShortBrace =~ tr/;/,/; # swap ; --> ,
+ };
+
+ #rename to SequenceShort
+ $SequenceShort = $SequenceShortBrace;
+
+ print " SequenceShort = $SequenceShort\n";
+ ##----------------------------
+
+
+ ## now we continue processing the array "data"
+
+ my $n = 0; ##total no of array elements in "data"
+ $n = ($#data +1);
+ print " processing rotation arguments: = @data (n= $n)\n";
+
+
+
+ ## --------check for state of direction flag----------------------
+ ## FLAG defined in line 224.
+ ## FLAG is set in line 400 on detecting <..> delimeters = infoblock
+ ## if flag set (by inverse keyword) then reverse the sequence array
+ if ( $directionflag eq $inverse){
+ # FLAG is set, so we need to inverse the array
+ gprint ("...directionFLAG set; reversing array...");
+ # but before reversing, look at the first array element
+ # to see if it is a square bracket element = NAME element
+ # so check the first char to see if it is [
+ if (substr ($data[0], 0,1) eq '[') {
+ $SequenceName=$data[0];
+ print " SequenceName (inv) = $SequenceName \n";
+ };
+
+ @data = reverse @data;
+ print " processing rotation arguments: = @data (n= $n)\n";
+ };
+
+ # send each rotation element to the sub rotation()
+ print " CALLing SUB rotation\n";
+
+ foreach $element (@data) {
+ ## clean leading and trailing white space
+ $element = cleanstring($element);
+ ## send element to rotation SUB
+ rotation($element);
+ };
+
+ } # end of else
+ }; # end of IF ( re: rotation keyword)
+
+ #----------------------------------------------
+ ## place any new keywords for processing here
+ ##---------------------------------------------
+
+ }; ## end of while
+
+ ## we have now finished reading in all the lines from the source file,
+ ## and processing all the rotations etc,
+ ## so we now just write the new cube state
+ ## to the output file = TeX_OUT_FILE (so LaTeX can read it)
+ ## plus any ErrorMessages
+ ## -- all these are handled by the quitprogram sub
+
+ quitprogram();
+
+##==============end of main==========================
+
+ sub rotation {
+
+
+print " SUB rotation\n";
+
+ ## here we process the array @data (from main) consisting of all
+ ## the rotation commands associated with
+ ## a single RubikRotation command -- the `rotation' key word has already been removed
+ ## so we start here with [name] if it exists.
+
+ ##---------------------------
+ ## variables used in SUBs rotation() and rubikmod()
+ ## need to be defined outside the SUBs
+
+ $modnumber=-1; #multiple associated with the char, eg D2 etc
+ $rotcode="";
+ $rotnumber=0;
+ #------------------
+ my @repeatcode = ();
+
+ my $m=-1;
+ my $originalrcode="";
+ my $j; ## used with m below
+ my $numberofchars; ## length of a string
+ my $nfrontchars;
+
+ ##-----------------
+
+ ## grab the rotation code passed to this sub from MAIN
+ my $rcode = $_[0];
+
+
+ ## now we start a big loop processing each cs-element (= rcode),
+ ## and collecting these elements into two cs-strings
+ ## ($Sequence --> original string output as SHORT string (has codes like R2,L3 etc),
+ ## and $rotationseqNEW --> output as LONG string -- all short codes expanded)
+
+
+ ## first, clean leading and trailing white space (eg between, R ,)
+ $rcode = cleanstring($rcode);
+
+
+ ## grab a copy of the element (char) for use if m Mod4=0
+ $originalrcode=$rcode;
+
+
+ ## increment the LOOP counter
+ ## (initialised using <our> in MAIN = line 226)
+ ## for use in the rotation SUB.
+ ## This counter is used to identify the first element (rcode)
+ ## and used to grab [name] --> SequenceName.
+ $jrcode=$jrcode+1; ## increment rotation element (char) counter
+
+
+ ## -----check for [nameblocks]-----------------------------
+ ##
+ ## We look at the first character of each element in the sequence
+ ## if an element has a leading [ then it is a label (not a rotation)
+ ## If this is the case, then jump to next element in the array
+
+ ## BUT if trailing comma is missing, then (error as next rotation will be included
+ ## as part of the label) so need to trap this and
+ ## make the test: is first AND last char a sq bracket?
+ ## (strictly only need to look at /first/ char, as the early syntax check will have
+ ## detected any unbalanced brackets already)
+
+ if ( (substr ($rcode,0,1) =~ /\[/) and (substr ($rcode,-1) ) =~ /\]/) {
+
+ gprint ("...$rcode is a label OK");
+
+ if ($directionflag eq $inverse) {
+ # do nothing
+ }
+
+ else{
+ ## if this `label' is also the FIRST element, then label = nameblock
+ if ($jrcode ==1) {$SequenceName=$rcode};
+ }; # end of IF
+
+ ## now get next rotation element
+ next;
+ }; ## end of if
+
+ ##--------------
+
+
+ ## the rcode must therefore be either a rotation code or a repeat-block.
+
+ ##-------check for (repeatblocks)---------------------------------
+ ##
+ ## we have already replaced any repeat chars (,) with {;}
+ ## so we now check for elements with leading { and then expand them
+ ## the appropriate number of times.
+ ## Note that the actual expansion is done by SUB repeat()
+
+ ## Note that if there is NO comma before the {} of a {repeat block}, then
+ ## the true repeat block will not be recognised by the
+ ## usual test -- since the test is looking for a leading { etc.
+ ## However, in this event, the string being handled (not a true element)
+ ## will be processed as if it were a rotation, and an
+ ## error will be thrown, so it will get picked up OK.
+
+ if (substr ($rcode,0,1) =~ /\{/ )
+ {
+ print " repeat block found = $rcode \n";
+
+ ## since we now want to send each rotation element in the repeat block to
+ ## the rotation sub, we need to replace any ; with commas
+ ## therefore translate ; --> , but retain the {}
+ $rcode =~ tr/;/,/;
+
+ print " repeat block reformulated = $rcode \n";
+
+
+ #-------log file message--------
+ ## log file: we want to show the repeat string in the users original form
+ ## so we translate it back to the user's orig form {,} --> (,)
+ $origrcode=$rcode;
+ $origrcode =~ tr/\{/(/;
+ $origrcode =~ tr/\}/)/;
+ gprint ("...Expanding: $origrcode ...");
+ #-------------
+
+
+ #-----------
+ ## expand the code in the repeat block
+ print " CALLing SUB: repeat($rcode)\n";
+
+ repeat($rcode); # this expands the repeated elements in the block
+
+ ## this sub returns the expanded form as $insert
+ $expanded_repeatcode=$insert;
+
+ print " expanded_repeatcode = $expanded_repeatcode\n\n";
+ #------------
+
+ #----------------
+ # process each new element in the expanded_repeatcode --> rotation
+ # make expanded_repeatcode into an array, and send each element on
+
+ @repeatcode = split (/,/, $expanded_repeatcode) ;
+
+
+ ## -----------check for direction flag-----------------
+ ## if flag set then reverse the array
+ if ( $directionflag eq $inverse){@repeatcode = reverse @repeatcode};
+
+
+ # send each element to rotation SUB for processing
+ print " CALLing SUB rotation\n";
+ foreach $E (@repeatcode) {
+ print " sending repeat element $E to rotation SUB\n";
+ rotation($E)
+ };
+
+ # when this foreach is finished, then get next rotation element from
+ # the original @data array (see foreach.. near end of MAIN)
+ next;
+
+ }; ## end of if
+
+ ##================================
+
+ ## if an element has got this far, it must be a single rotation code
+ ## (maybe with a trailing digit), so it needs processing as a rotation
+ ## and appending the code to what will become the SequenceLONG string.
+
+ ##------------------------
+
+ ## CALL the sub rubikmod to process the rotation element,
+ ## and to return the front code (= $rotcode), orig no = $rotnumber,
+ ## and mod4 value (= $modnumber).
+
+ rubikmod($rcode);
+
+ ## update rcode <--- rotcode (returned by the SUB rubikmod() )
+ ## collect $m <--- modnumber (returned by the SUB rubikmod() )
+ $rcode = $rotcode;
+ $m = $modnumber;
+
+ ## we collect all the new versions of rcode into a cs-string = $SequenceLong
+ ## which will finally be output as the LONG string
+
+#-----------------------
+# check with directionflag
+ if ($directionflag eq $inverse) {$rcode = inverse ($rcode)};
+#-------------------------
+
+ ##--------------------
+ if ( $m == 0 )
+ {
+ ## do NOT implement the rotation code, and do NOT append to SequenceLong
+ ## print the /original/ rcode (eg R4, or D0 etc)
+ gprint ("..*rotation ,$originalrcode, ERROR ($rotnumber = 0 mod 4) not implemented");
+ ErrorMessage(",$originalrcode, -- ($rotnumber = 0 mod 4) not implemented");
+ next;
+ };
+
+ if ( $m == 1 )
+ {
+ if($rotnumber >=5)
+ {gprint ("...Expanding $originalrcode ($rotnumber = $m mod 4) ...")};
+ $SequenceLong=$SequenceLong.$rcode.",";
+ }
+ else {
+ # m = 2 or 3
+ if($rotnumber >=5)
+ {gprint ("...Expanding $originalrcode ($rotnumber = $m mod 4) ...")}
+ else {gprint ("...Expanding $originalrcode ...")};
+
+ for($j=1; $j<=$m; $j++)
+ {## append rcode m times to sequenceLONG
+ $SequenceLong=$SequenceLong.$rcode.","
+ };
+ }; ## end of else
+
+ ##-------------------
+
+ ## if single trailing digit present,
+ ## then we implement the rotation command m times.
+ ## if more than one trailing digit
+ ## then the error is trapped at the end (as frontstring will not be recognised
+ ## ie will not be in the following list, and hence will be trapped as an error, eg R3)
+
+
+
+##-----------------------
+## RWDN Sept29 2017 testing to fix WESTERN notation problem
+## arrange for user to be able to include <western> in metadata etc
+## -- as this will mean that one can store these algorithms as a macro
+
+ if ( lc($SequenceInfo) =~ m/(western)/ ) {
+
+ if ($rcode eq "l") {$rcode = "Lw"; gprint ("...WESTERN NOTATION: rotation l --> Lw, OK") };
+ if ($rcode eq "lp") {$rcode = "Lwp"; gprint ("...WESTERN NOTATION: rotation lp --> Lwp, OK") };
+ if ($rcode eq "r") {$rcode = "Rw"; gprint ("...WESTERN NOTATION: rotation r --> Rw, OK") };
+ if ($rcode eq "rp") {$rcode = "Rwp"; gprint ("...WESTERN NOTATION: rotation rp --> Rwp, OK") };
+ if ($rcode eq "f") {$rcode = "Fw"; gprint ("...WESTERN NOTATION: rotation f --> Fw, OK") };
+ if ($rcode eq "fp") {$rcode = "Fwp"; gprint ("...WESTERN NOTATION: rotation fp --> Fwp, OK") };
+ if ($rcode eq "b") {$rcode = "Bw"; gprint ("...WESTERN NOTATION: rotation b --> Bw, OK") };
+ if ($rcode eq "bp") {$rcode = "Bwp"; gprint ("...WESTERN NOTATION: rotation bp --> Bwp, OK") };
+ if ($rcode eq "u") {$rcode = "Uw"; gprint ("...WESTERN NOTATION: rotation u --> Uw, OK") };
+ if ($rcode eq "up") {$rcode = "Uwp"; gprint ("...WESTERN NOTATION: rotation up --> Uwp, OK") };
+ if ($rcode eq "d") {$rcode = "Dw"; gprint ("...WESTERN NOTATION: rotation d --> Dw, OK") };
+ if ($rcode eq "dp") {$rcode = "Dwp"; gprint ("...WESTERN NOTATION: rotation dp --> Dwp, OK") };
+
+ };
+##-----------------------
+
+
+
+ if ($rcode eq "L") {for($j=1;$j<=$m;$j++) {gprint ("...rotation L, OK (= Lp3)"); &rrL}}
+ elsif ($rcode eq "Lp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lp, OK"); &rrLp}}
+ elsif ($rcode eq "Lw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lw, OK (= Lp3 + Srp)"); &rrLw}}
+ elsif ($rcode eq "Lwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lwp, OK (= Lp + Sr)"); &rrLwp}}
+ elsif ($rcode eq "Ls") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ls, OK (= L + Rp)"); &rrLs}}
+ elsif ($rcode eq "Lsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lsp, OK (= Lp + R)"); &rrLsp}}
+ elsif ($rcode eq "La") {for($j=1;$j<=$m;$j++) {gprint ("...rotation La, OK (= L + R)"); &rrLa}}
+ elsif ($rcode eq "Lap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lap, OK (= Lp + Rp)"); &rrLap}}
+ ####
+ elsif ($rcode eq "R") {for($j=1;$j<=$m;$j++) {gprint ("...rotation R, OK"); &rrR}}
+ elsif ($rcode eq "Rp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rp, OK (= R3)"); &rrRp}}
+ elsif ($rcode eq "Rw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rw, OK (= R + Sr)"); &rrRw}}
+ elsif ($rcode eq "Rwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rwp, OK (= Rp + Srp)"); &rrRwp}}
+ elsif ($rcode eq "Rs") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rs, OK (= R + Lp)"); &rrRs}}
+ elsif ($rcode eq "Rsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rsp, OK (= Rp + L)"); &rrRsp}}
+ elsif ($rcode eq "Ra") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ra, OK (= R + L)"); &rrRa}}
+ elsif ($rcode eq "Rap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Rap, OK (= Rp + Lp)"); &rrRap}}
+ ####
+ elsif ($rcode eq "U") {for($j=1;$j<=$m;$j++) {gprint ("...rotation U, OK"); &rrU}}
+ elsif ($rcode eq "Up") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Up, OK (= U3)"); &rrUp}}
+ elsif ($rcode eq "Uw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uw, OK (= U + Su)"); &rrUw}}
+ elsif ($rcode eq "Uwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uwp, OK (= Up + Sup)"); &rrUwp}}
+ elsif ($rcode eq "Us") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Us, OK (= U + Dp)"); &rrUs}}
+ elsif ($rcode eq "Usp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Usp, OK (= Up + D)"); &rrUsp}}
+ elsif ($rcode eq "Ua") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ua, OK (= U + D)"); &rrUa}}
+ elsif ($rcode eq "Uap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uap, OK (= Up + Dp)"); &rrUap}}
+ ####
+ elsif ($rcode eq "D") {for($j=1;$j<=$m;$j++) {gprint ("...rotation D, OK (= Dp3)"); &rrD}}
+ elsif ($rcode eq "Dp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dp, OK "); &rrDp}}
+ elsif ($rcode eq "Dw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dw, OK (= Dp3 + Sup)"); &rrDw}}
+ elsif ($rcode eq "Dwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dwp, OK (= Dp + Su)"); &rrDwp}}
+ elsif ($rcode eq "Ds") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ds, OK (= D + Up)"); &rrDs}}
+ elsif ($rcode eq "Dsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dsp, OK (= Dp + U)"); &rrDsp}}
+ elsif ($rcode eq "Da") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Da, OK (= D + U)"); &rrDa}}
+ elsif ($rcode eq "Dap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dap, OK (= Dp + Up)"); &rrDap}}
+ ####
+ elsif ($rcode eq "F") {for($j=1;$j<=$m;$j++) {gprint ("...rotation F, OK"); &rrF}}
+ elsif ($rcode eq "Fp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fp, OK (= F3)"); &rrFp}}
+ elsif ($rcode eq "Fw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fw, OK (= F + Sf)"); &rrFw}}
+ elsif ($rcode eq "Fwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fwp, OK (= Fp + Sfp)"); &rrFwp}}
+ elsif ($rcode eq "Fs") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fs, OK (= F + Bp)"); &rrFs}}
+ elsif ($rcode eq "Fsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fsp, OK (= Fp + B)"); &rrFsp}}
+ elsif ($rcode eq "Fa") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fa, OK (= F + B)"); &rrFa}}
+ elsif ($rcode eq "Fap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fap, OK (= Fp + Bp)"); &rrFap}}
+ ####
+ elsif ($rcode eq "B") {for($j=1;$j<=$m;$j++) {gprint ("...rotation B, OK (= Fp3)"); &rrB}}
+ elsif ($rcode eq "Bp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bp, OK"); &rrBp}}
+ elsif ($rcode eq "Bw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bw, OK (= Fp3 + Sfp)"); &rrBw}}
+ elsif ($rcode eq "Bwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bwp, OK (= Fp + Sf)"); &rrBwp}}
+ elsif ($rcode eq "Bs") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bs, OK (= B + Fp)"); &rrBs}}
+ elsif ($rcode eq "Bsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bsp, OK (= Bp + F)"); &rrBsp}}
+ elsif ($rcode eq "Ba") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ba, OK (= B + F)"); &rrBa}}
+ elsif ($rcode eq "Bap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bap, OK (= Bp + Fp)"); &rrBap}}
+
+ #### --------------------------------------
+
+ #### inner-slice (= middle slice)
+ ## need to include MES (middle slice) notation
+ elsif ($rcode eq "M") {for($j=1;$j<=$m;$j++) {gprint ("...rotation M, OK (= Sl) "); &rrSl}}
+ elsif ($rcode eq "Mp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Mp, OK (= Sr) "); &rrSr}}
+ elsif ($rcode eq "E") {for($j=1;$j<=$m;$j++) {gprint ("...rotation E, OK (= Sd) "); &rrSd}}
+ elsif ($rcode eq "Ep") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ep, OK (= Su) "); &rrSu}}
+ elsif ($rcode eq "S") {for($j=1;$j<=$m;$j++) {gprint ("...rotation S, OK (= Sf) "); &rrSf}}
+ elsif ($rcode eq "Sp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sp, OK (= Sb) "); &rrSb}}
+
+ #### middle slice rotations (Singmaster)
+ elsif ($rcode eq "Su") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Su, OK "); &rrSu}}
+ elsif ($rcode eq "Sup") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sup, OK (= Su3)"); &rrSup}}
+ elsif ($rcode eq "Sd") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sd, OK (= Sup)"); &rrSd}}
+ elsif ($rcode eq "Sdp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sdp, OK (= Su)"); &rrSdp}}
+ elsif ($rcode eq "Sl") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sl, OK (= Srp)"); &rrSl}}
+ elsif ($rcode eq "Slp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Slp, OK (= Sr)"); &rrSlp}}
+ elsif ($rcode eq "Sr") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sr, OK"); &rrSr}}
+ elsif ($rcode eq "Srp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Srp, OK (= Sr3)"); &rrSrp}}
+ elsif ($rcode eq "Sf") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sf, OK"); &rrSf}}
+ elsif ($rcode eq "Sfp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sfp, OK (= Sf3)"); &rrSfp}}
+ elsif ($rcode eq "Sb") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sb, OK (= Sfp)"); &rrSb}}
+ elsif ($rcode eq "Sbp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sbp, OK (= Sf)"); &rrSbp}}
+
+ ## need to include Jaap Puzzles website for middle slice notation (Lm, Lmp)
+ ## also include Randelshofer website middle slice notation (ML,MLp..)
+
+ elsif ($rcode eq "ML" or $rcode eq "MRp" or $rcode eq "Lm" or $rcode eq "Rmp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Lm = M = Sl) "); &rrSl}}
+
+ elsif ($rcode eq "MR" or $rcode eq "MLp" or $rcode eq "Rm" or $rcode eq "Lmp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Rm = Mp = Sr) "); &rrSr}}
+
+ elsif ($rcode eq "MU" or $rcode eq "MDp" or $rcode eq "Um" or $rcode eq "Dmp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Um = Ep = Su) "); &rrSu}}
+
+ elsif ($rcode eq "MD" or $rcode eq "MUp" or $rcode eq "Dm" or $rcode eq "Ump")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Dm = E = Sd) "); &rrSd}}
+
+ elsif ($rcode eq "MF" or $rcode eq "MBp" or $rcode eq "Fm" or $rcode eq "Bmp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Fm = S = Sf) "); &rrSf}}
+
+ elsif ($rcode eq "MB" or $rcode eq "MFp" or $rcode eq "Bm" or $rcode eq "Fmp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Bm = Sp = Sb) "); &rrSb}}
+ ##----------------------------------
+
+ #### double outer slice (wide) notation
+ #### need to include Randelshofer TL, TLp double outer slice notation
+ #### (equiv to the w wide notation)
+ elsif ($rcode eq "TL") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TL, OK (= Lw = Lp3 + Srp)"); &rrLw}}
+ elsif ($rcode eq "TLp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TLp, OK (= Lwp = Lp + Sr)"); &rrLwp}}
+ elsif ($rcode eq "TR") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TR, OK (= Rw = R + Sr)"); &rrRw}}
+ elsif ($rcode eq "TRp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TRp, OK (= Rwp = Rp + Srp)"); &rrRwp}}
+ elsif ($rcode eq "TU") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TU, OK (= Uw = U + Su)"); &rrUw}}
+ elsif ($rcode eq "TUp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TUp, OK (= Uwp = Up + Sup)"); &rrUwp}}
+ elsif ($rcode eq "TD") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TD, OK (= Dw = Dp3 + Sup)"); &rrDw}}
+ elsif ($rcode eq "TDp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TDp, OK (= Dwp = Dp + Su)"); &rrDwp}}
+ elsif ($rcode eq "TF") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TF, OK (= Fw = F + Sf)"); &rrFw}}
+ elsif ($rcode eq "TFp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TFp, OK (= Fwp = Fp + Sfp)"); &rrFwp}}
+ elsif ($rcode eq "TB") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TB, OK (= Bw = Fp3 + Sfp)"); &rrBw}}
+ elsif ($rcode eq "TBp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation TBp, OK (= Bwp = Fp + Sf)"); &rrBwp}}
+
+
+ ## ---------------------------
+ ## opposite slice notation of Randelshofer (SR, SRp) (= standard Rs, Rsp)
+ ## opposite outer slices rotated in SAME direction as the FACE
+
+ elsif ($rcode eq "SL") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Ls = L + Rp)"); &rrLs}}
+ elsif ($rcode eq "SLp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Lsp = Lp + R)"); &rrLsp}}
+
+ elsif ($rcode eq "SR") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Rs = R + Lp)"); &rrRs}}
+ elsif ($rcode eq "SRp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Rsp = Rp + L)"); &rrRsp}}
+
+ elsif ($rcode eq "SU") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Us = U + Dp)"); &rrUs}}
+ elsif ($rcode eq "SUp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Usp = Up + D)"); &rrUsp}}
+
+ elsif ($rcode eq "SD") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Ds = D + Up)"); &rrDs}}
+ elsif ($rcode eq "SDp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Dsp = Dp + U)"); &rrDsp}}
+
+
+ elsif ($rcode eq "SF") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Fs = F + Bp)"); &rrFs}}
+ elsif ($rcode eq "SFp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Fsp = Fp + B)"); &rrFsp}}
+
+ elsif ($rcode eq "SB") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Bs = B + Fp)"); &rrBs}}
+ elsif ($rcode eq "SBp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= Bsp = Bp + F)"); &rrBsp}}
+
+
+ ## -------------------------
+
+ ## whole cube rotations
+ ## need to include x,y,z (upper and lowercase) and also u,d,l,r,f,b (lowercase only) equivalents
+ elsif ($rcode eq "X" or $rcode eq "x" or $rcode eq "r" or $rcode eq "lp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= x = R + Sr + Lp)"); &rrR;&rrSr;&rrLp}}
+ elsif ($rcode eq "Xp" or $rcode eq "xp" or $rcode eq "l" or $rcode eq "rp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= xp = Rp + Srp + L)");&rrRp;&rrSrp;&rrL}}
+ elsif ($rcode eq "Y" or $rcode eq "y" or $rcode eq "u" or $rcode eq "dp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= y = U + Su + Dp)"); &rrU;&rrSu;&rrDp}}
+ elsif ($rcode eq "Yp" or $rcode eq "yp" or $rcode eq "d" or $rcode eq "up")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= yp = Up + Sup + D)");&rrUp;&rrSup;&rrD}}
+ elsif ($rcode eq "Z" or $rcode eq "z" or $rcode eq "f" or $rcode eq "bp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= z = F + Sf + Bp)"); &rrF;&rrSf;&rrBp}}
+ elsif ($rcode eq "Zp" or $rcode eq "zp" or $rcode eq "b" or $rcode eq "fp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode, OK (= zp = Fp + Sfp + B)");&rrFp;&rrSfp;&rrB}}
+
+ ## more whole cube notation
+ ## need to include Jaap website whole cube Lc notation
+ ## also include Randelshofer C notation (CL, CLp.)
+
+ elsif ($rcode eq "CL" or $rcode eq "CRp" or $rcode eq "Lc" or $rcode eq "Rcp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Lc = xp = Rp + Srp + L)");&rrRp;&rrSrp;&rrL}}
+
+ elsif ( $rcode eq "CR" or $rcode eq "CLp" or $rcode eq "Rc" or $rcode eq "Lcp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Rc = x = R + Sr + Lp)"); &rrR;&rrSr;&rrLp}}
+
+ elsif ($rcode eq "CU" or $rcode eq "CDp" or $rcode eq "Uc" or $rcode eq "Dcp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Uc = y = U + Su + Dp)"); &rrU;&rrSu;&rrDp}}
+
+ elsif ($rcode eq "CD" or $rcode eq "CUp" or $rcode eq "Dc" or $rcode eq "Ucp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Dc = yp = Up + Sup + D)");&rrUp;&rrSup;&rrD}}
+
+ elsif ($rcode eq "CF" or $rcode eq "CBp" or $rcode eq "Fc" or $rcode eq "Bcp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Fc = z = F + Sf + Bp)"); &rrF;&rrSf;&rrBp}}
+
+ elsif ($rcode eq "CB" or $rcode eq "CFp" or $rcode eq "Bc" or $rcode eq "Fcp")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $rcode OK (= Bc = zp = Fp + Sfp + B)");&rrFp;&rrSfp;&rrB}}
+
+ ## -----------------------------
+
+ ## check empty string --> missing rotation
+ elsif ($rcode eq "") {for($j=1;$j<=$m;$j++)
+ {
+ gprint ("..*rotation ,$rcode, ERROR ? typo or missing rotation");
+ ErrorMessage(",$rcode, -- ? typo or missing rotation");
+ }
+ }
+ ## finally ----------------------
+ else {
+ ## to fall this far then the rotation (char) must be undefined
+ ## but before we can send these rotation code strings out in ErrorMessages
+ ## we need to check that they are in the original format.
+ ## ie., do not have any {;} chars etc. If they do, then we need to
+ ## translate them back, ie {;} --> (,) etc
+
+ ## we use `originalcode' in the ErrorMessage because the user needs to be
+ ## shown the `bad' code as it was originally input by the RubikRotation{} command.
+
+
+ ## check for code with { ; } and restore to normal syntax
+ if ( $rcode =~ m/(\{|;|\}|\])/ ) {
+ $rcode = restorebrackets($rcode);
+ $originalrcode = restorebrackets($originalrcode);
+ };
+
+
+ if ( $rcode =~ m/(\(|\)|\[|\])/) {
+ gprint ("..*rotation $rcode ERROR -- code not known ? missing comma or nested brackets");
+ ErrorMessage("$originalrcode -- code not known ? missing comma or nested brackets");
+ ## DO NOT --> (next LINE;) here as need to check /all/ the rotation codes in the string.
+ }
+ else{
+ gprint ("..*rotation $rcode ERROR -- code not known ? typo or missing comma");
+ ErrorMessage("$originalrcode -- code not known ? typo or missing comma");
+ ## DO NOT --> (next LINE;) here as need to check /all/ the rotation codes in the string.
+ };
+
+ #-----------------------------
+ next;
+ }; #end of else
+
+ next;
+ } # end of sub
+
+
+
+#======================================
+
+ sub random {
+
+print " SUB random\n";
+
+
+## scramble randomly using n rotations
+## example command = RubikRotation{random,74}
+## if no n given (second argument = ""), then use default n=50
+## if second argument is some string (not integer) then --> ERROR
+##
+## assign numbers to the minimal set of rotations to be used using a hash array list
+## (perl 5 book page 68)
+## ? maybe we should only use the 18 rotations mentioned in Rokicki 2013 paper?
+## but here I have included all the slice (Xm) ones as well.
+
+
+ ## initialise the array for the random rotations
+ my @rrlist = ();
+
+
+ ## (RWDN 2 Aug 2017):
+ ## now check to see if TWOcube or Rubikcube being used
+ ## use cubesize as the filter
+
+ if ($cubesize eq 'two')
+ {
+ ## using the TwoRotation command (from RubikTwoCube.sty)
+ ## no slice rotations
+ ##
+ @rrlist = ("U", "Up",
+ "D", "Dp",
+ "L", "Lp",
+ "R", "Rp",
+ "F", "Fp",
+ "B", "Bp");
+ }
+
+ else {
+ ## using the RubikRotation command (from RubikRotation.sty)
+ @rrlist = ("U", "Up", "Um", "Ump",
+ "D", "Dp", "Dm", "Dmp",
+ "L", "Lp", "Lm", "Lmp",
+ "R", "Rp", "Rm", "Rmp",
+ "F", "Fp", "Fm", "Fmp",
+ "B", "Bp", "Bm", "Bmp");
+ };
+
+
+my $rrlistnumber=$#rrlist;
+print " rrlistnumber = $rrlistnumber\n";
+ gprint ("...random SUB: rrlistnumber (array size) = $rrlistnumber");
+# these are numbered 0--$rrlistnumber,
+
+## let default no of random rotations for scrambling = 50
+my $defaultn = 50; ## RWDN (1 Aug 2017): not being used any more
+my $maxn = 200;
+
+ ## grab the integer passed from the random() command in main
+ my $s = $_[0];
+
+ if ($s >= $maxn) {$s = $maxn;
+ gprint ("..*WARNING: maximum n = 200");
+ ErrorMessage ("random: max n = 200 (n=200 was used)")}
+ elsif ($s == 0) {## $s = $defaultn;
+ gprint ("..*ERR: integer n = 0 (invalid)");
+ ErrorMessage (" --- integer n = 0 (invalid)");
+ next LINE;
+ };
+
+ my @rr; ## array to hold all the random rotations
+ print " randomising the available rotations\n";
+
+
+ ## set the seed for the randomisation (Perl BlackBook p 235)
+ srand;
+
+## now select s numbers at random (with replacement) from range 0--listnumber+1
+## Since we are using int(rand x), and using nos from 0--lastindex number,
+## then max rand vaue = (lastindexnumber -1).99999, the integer of which
+## = (lastindexnumber -1). Therefore we need to use the range 0--(lastindexnumber+1)
+## in order to randomise all posibilities on our list.
+
+my $j;
+
+for ($j = 1; $j <=$s; $j=$j+1)
+ {
+ my $p= int(rand ($rrlistnumber +1));
+ print "Rotation = $p, $rrlist[$p] \n";
+ ## push rotation code $rrlist[$p] on to END of array @rr
+ push (@rr, $rrlist[$p]);
+ };
+
+ ## we assume the user is starting from a solved cube (ie use the state given by user)
+ gprint ("...scrambling cube using $s random rotations");
+
+ ## now send the array off to the rotation sub
+
+ my $E;
+
+ foreach $E (@rr) { rotation($E) };
+
+ } ##end of sub
+
+
+#======================================
+
+ sub writestate {
+
+print " SUB writestate\n";
+
+## this writes the final state to the TeX_OUT_FILE (= rubikstateNEW.dat) will be read by latex.
+
+print (TeX_OUT_FILE "\%\% ...output datafile=$out_file\n");
+print (TeX_OUT_FILE "\%\% ...PERL script=rubikrotation.pl version $version\n");
+print (TeX_OUT_FILE "\\typeout{...writing new cube state to file $out_file}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceUp\{$Ult[0]\}\{$Umt[0]\}\{$Urt[0]\}\{$Ulm[0]\}\{$Umm[0]\}\{$Urm[0]\}\{$Ulb[0]\}\{$Umb[0]\}\{$Urb[0]\}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceDown\{$Dlt[0]\}\{$Dmt[0]\}\{$Drt[0]\}\{$Dlm[0]\}\{$Dmm[0]\}\{$Drm[0]\}\{$Dlb[0]\}\{$Dmb[0]\}\{$Drb[0]\}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceLeft\{$Llt[0]\}\{$Lmt[0]\}\{$Lrt[0]\}\{$Llm[0]\}\{$Lmm[0]\}\{$Lrm[0]\}\{$Llb[0]\}\{$Lmb[0]\}\{$Lrb[0]\}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceRight\{$Rlt[0]\}\{$Rmt[0]\}\{$Rrt[0]\}\{$Rlm[0]\}\{$Rmm[0]\}\{$Rrm[0]\}\{$Rlb[0]\}\{$Rmb[0]\}\{$Rrb[0]\}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceFront\{$Flt[0]\}\{$Fmt[0]\}\{$Frt[0]\}\{$Flm[0]\}\{$Fmm[0]\}\{$Frm[0]\}\{$Flb[0]\}\{$Fmb[0]\}\{$Frb[0]\}\%\n");
+print (TeX_OUT_FILE "\\RubikFaceBack\{$Blt[0]\}\{$Bmt[0]\}\{$Brt[0]\}\{$Blm[0]\}\{$Bmm[0]\}\{$Brm[0]\}\{$Blb[0]\}\{$Bmb[0]\}\{$Brb[0]\}\%\n");
+
+##-----RWDN 2016---create four new holder commands for separate strings----------
+
+## these four names are defined in the rubikrotation.sty file so they can be renewed etc
+## SequenceInfo
+## SequenceName
+## SequenceShort
+## SequenceLong
+
+
+## ----RWDN 25 Sept 2016 ----------------------
+## now remove the first and last chars of [name] to output just NAME without [ and ]
+
+## initialise some variables we shall need
+ $numberofcharsinstring=0;
+ $nmiddlecharsinstring=0;
+
+
+##----------SequenceName----------------------------
+
+## the SequenceName currently includes the [..]
+## need to remove the [] before senting it to LaTeX,
+## so need to detect when NAME string itself is empty, eg []
+## so create a variable:
+ $SequenceNameNew="";
+
+ $numberofcharsinstring = length $SequenceName;
+
+
+## NEED to create error message if [] and empty string etc
+
+if ($numberofcharsinstring <= 2)
+ {$SequenceNameNew = $SequenceName}
+ else {
+
+ $nmiddlecharsinstring = ($numberofcharsinstring - 2);
+ ## reassign the string without first and last chars
+ ### format of substr = (origstring, start possn, no of chars to use)
+ $SequenceNameNew = substr($SequenceName,1,$nmiddlecharsinstring);
+ };
+
+ ## RWDN 24 October 2017
+ ## swap char changes back before writing output string
+ ## only swap the brackets
+ ## (do NOT swap ; --> , as ONLY use commas /outside/ infoblocks and between rotation sequences)
+ ## swap: BBook p 138--139
+
+ $SequenceNameNew =~ tr/\{/(/; # swap { --> (
+ $SequenceNameNew =~ tr/\}/)/; # swap } --> )
+
+
+print (TeX_OUT_FILE "\\renewcommand\\SequenceName\{$SequenceNameNew\}\%\n");
+
+print (TeX_OUT_FILE "\\typeout{...SequenceName = $SequenceNameNew}\%\n");
+#-----------------
+
+
+
+#----------SequenceInfo----------------
+## we need to preserve any {} structures in the info string (as used by Kociemba),
+## so we have to change { } --> [ ] since otherwise they will disappear
+## or cause an error when printed in LaTeX
+
+ $SequenceInfo=~ tr/\{/\[/; ## swap { --> [
+ $SequenceInfo=~ tr/\}/\]/; ## swap } --> ]
+
+print (TeX_OUT_FILE "\\renewcommand\\SequenceInfo\{$SequenceInfo\}\%\n");
+
+print (TeX_OUT_FILE "\\typeout{...SequenceInfo = $SequenceInfo}\%\n");
+#-----------------
+
+
+
+##---------SequenceShort------------------
+## generated in MAIN
+## SequenceShort = original argument of \RubikRotation{} /without/ any infoblocks
+## therefore it may contain square brackets
+
+print (TeX_OUT_FILE "\\renewcommand\\SequenceShort\{$SequenceShort\}\%\n");
+
+print (TeX_OUT_FILE "\\typeout{...SequenceShort = $SequenceShort}\%\n");
+##-----------------------
+
+##-----------SequenceLong-------------------
+## now prepare the new LONG rotation sequence for output =(LONG sequence + NO NAME)
+## BUT before outputting the string, we need to remove the terminal comma
+
+$numberofcharsinstring = length $SequenceLong;
+$nfrontcharsinstring = $numberofcharsinstring -1;
+## reassign the string except the terminal comma
+$SequenceLong = substr($SequenceLong,0,$nfrontcharsinstring);
+
+
+#----------
+print (TeX_OUT_FILE "\\renewcommand\\SequenceLong\{$SequenceLong\}\%\n");
+
+print (TeX_OUT_FILE "\\typeout{...SequenceLong = $SequenceLong}\%\n");
+
+
+
+##-----------------------
+
+## now include any error messages generated
+## (these are all in an array waiting to be printed out)
+
+ if ($erroralert eq "YES")
+ {
+ ## write errors to a separate file (just for errors---we append the errrors to end of file)
+ ## the error file (rubikstateERRORS.dat) was created by the TeX file
+ my $ne; #number of errors
+ $ne=$#error; ## number of errors= largest index num since we started at zero
+
+ ## do not attach error to a <checkstate> command, since we really want
+ ## to see the checkstate errors (in the ERROR file) printed AFTER the `rotation' command.
+ if ($rotationcommand eq "checkstate") {}
+ else {print (ERROR_OUT_FILE "*ERR cmd= $rotationcommand\n") };
+
+ ## last index number or array = $#arrayname (Black book p 62)
+ my $k;
+
+ for ($k=0; $k<=$ne; $k=$k+1) {
+
+ ## restore correct brackets etc before outputting to Latex
+ my $errorstring = $error[$k];
+ $errorstring = restorebrackets($errorstring);
+
+ print (TeX_OUT_FILE "\\typeout{$errorstring}\%\n");
+ print (ERROR_OUT_FILE "$errorstring\n");
+
+ }; # end of for
+ }; # end of IF
+ print " Perl output file written OK\n";
+
+ } #end of sub
+
+
+#======================================
+
+ sub ErrorMessage {
+
+ ## writes the argument as a standard error message to out file
+
+ my $errormess = $_[0]; ## parameter passed to sub
+
+ ## restore correct brackets etc before outputting to Latex
+ $errormess = restorebrackets($errormess);
+
+ $erroralert = "YES"; ## set error alert flag (for use in out message)
+ $error[$errornumber] = "*ERR $errormess";
+ $errornumber++; ## increment number
+ };
+
+
+#======================================
+
+ sub gprint {
+
+## prints argument (comments) to screen and also to TeX_OUT_FILE.
+## The typeout commands will find its way into the log file when read by latex
+## Important to include trailing % for messages written to the TeX_OUT_FILE
+## to stop extra <spaces> being seen by TeX.
+
+ my $gmess=$_[0];
+ print "$gmess\n";
+ print (TeX_OUT_FILE "\\typeout{$gmess}\%\n");
+ };
+
+
+#======================================
+
+ sub checkstate{
+
+print " SUB checkstate\n";
+
+## only a simple check -- to see if wrong no of colours being used etc
+## uses the cubie colours as used by rubikcube package= ROYGBWX
+
+ gprint ("...checking state of cube");
+
+ my @cubies=($Ult[0],$Umt[0],$Urt[0], $Ulm[0],$Umm[0],$Urm[0], $Ulb[0],$Umb[0],$Urb[0],
+ $Dlt[0],$Dmt[0],$Drt[0], $Dlm[0],$Dmm[0],$Drm[0], $Dlb[0],$Dmb[0],$Drb[0],
+ $Llt[0],$Lmt[0],$Lrt[0], $Llm[0],$Lmm[0],$Lrm[0], $Llb[0],$Lmb[0],$Lrb[0],
+ $Rlt[0],$Rmt[0],$Rrt[0], $Rlm[0],$Rmm[0],$Rrm[0], $Rlb[0],$Rmb[0],$Rrb[0],
+ $Flt[0],$Fmt[0],$Frt[0], $Flm[0],$Fmm[0],$Frm[0], $Flb[0],$Fmb[0],$Frb[0],
+ $Blt[0],$Bmt[0],$Brt[0], $Blm[0],$Bmm[0],$Brm[0], $Blb[0],$Bmb[0],$Brb[0]);
+
+ my $R=0,my $O=0,my $Y=0,my $G=0,my $B=0,my $W=0,my $X=0;
+
+ my $cubiecolour = "";
+
+ foreach $cubiecolour (@cubies)
+ {
+ if ($cubiecolour eq R) {$R = $R+1}
+ elsif ($cubiecolour eq O) {$O = $O+1}
+ elsif ($cubiecolour eq Y) {$Y = $Y+1}
+ elsif ($cubiecolour eq G) {$G = $G+1}
+ elsif ($cubiecolour eq B) {$B = $B+1}
+ elsif ($cubiecolour eq W) {$W = $W+1}
+ elsif ($cubiecolour eq X) {$X = $X+1}
+ else {
+ gprint ("..*cubie-colour counting ERROR");
+ }
+ };
+
+ my $cubiesum=0;
+ $cubiesum = $R+$O+$Y+$G+$B+$W+$X;
+ gprint ("...cubiesum = $cubiesum (Red=$R, Or=$O, Ye=$Y, Gr=$G, Bl=$B, Wh=$W, X=$X)");
+
+ # only generate ErrorMessages if n>9 (as may be using a Grey cube)
+ if ($cubiesum != 54) {
+ ErrorMessage ("cubiesum not = 54");
+ gprint ("..*cubiesum not = 54") };
+
+ if ($R >9){
+ ErrorMessage("red cubies > 9 (=$R)");
+ gprint ("..*red cubies > 9 (=$R)");
+ };
+
+ if ($O >9){
+ ErrorMessage("orange cubies > 9 (=$O)");
+ gprint ("..*orange cubies > 9 (=$O)");
+ };
+
+ if ($Y >9){
+ ErrorMessage("yellow cubies > 9 (=$Y)");
+ gprint ("..*yellow cubies > 9 (=$Y)");
+ # next LINE
+ };
+
+ if ($G >9){
+ ErrorMessage("green cubies > 9 (=$G)");
+ gprint ("..*green cubies > 9 (=$G)");
+ };
+
+ if ($B >9){
+ ErrorMessage("blue cubies > 9 (=$B)");
+ gprint ("..*blue cubies > 9 (=$B)");
+ };
+
+ if ($W >9){
+ ErrorMessage("white cubies > 9 (=$W)");
+ gprint ("..*white cubies > 9 (=$W)");
+ };
+
+ if ($X == 54){
+ ErrorMessage("no colours allocated (X=54)");
+ gprint ("..*no colours allocated (X=54)") };
+
+ print " done\n\n";
+ };
+
+
+#======================================
+
+## Overview of rotation transform subs
+
+#======================================
+## The following 9 (90 degree) rotation transformations are used
+## to generate all the rotations used in the `rotation sub'
+## each of these is a permutation for both colours and numbers
+## of the cubie facelets.
+## The following 9 subroutines are named as follows:
+## (about X-axis) rrR, rrSr, rrLp
+## (about Y-axis) rrU, rrSu, rrDp
+## (about Z-axis) rrF, rrSf, rrBp
+## see the rubikcube package documentation for full details regarding
+## rotation notation and commands.
+## METHOD & NOTATION
+## each sub (below) starts by making an array[0] for the cubie colour
+## and an array[1] for the cubie number.
+## Each of the face rotations (rrR, rrLp, rrU, rrDp, rrF, rrBp) is involved with
+## two pairs of connected but different permutations/transformations as follows:
+## (a) one pair for the 12 Side cubies (arrays = @Xs0 (for Side colours), @Xs1 (for Side numbers)), and
+## (b) one pair for the 9 Face cubies (arrays = @Xf0 (for Face colours), @Xf1 (for Face numbers)).
+## Each of the middle slice rotations (rrSr, rrSu, rrSf) is involved with just one pair of
+## permutations for the 12 Side cubies (arrays = @Xs0 (for Side colours), @Xs1 (for Side numbers)).
+## We document only the side and face of the first sub (rrR) in detail, since
+## the other subs are of similar form.
+#======================================
+
+
+#======================================
+
+ sub rrR {
+
+## the RIGHT (slice + face) transform
+## R = RIGHT, s = side; 0=colour, 1= number
+## make the clockwise rotation permutation
+## In this permutation the Front-right-bottom (Frb) (side)facelet rotates to
+## the new position of Up-right-bottom (Urb) (side)facelet.
+##-----------SIDE-------
+## 12 side cubie facelets in arrays @Rs0 (colours) and @Rs1 (numbers)
+## these are the initial positions
+
+@Rs0=($Frb[0],$Frm[0],$Frt[0],
+ $Urb[0],$Urm[0],$Urt[0],
+ $Blt[0],$Blm[0],$Blb[0],
+ $Drb[0],$Drm[0],$Drt[0]);
+
+@Rs1=($Frb[1],$Frm[1],$Frt[1],
+ $Urb[1],$Urm[1],$Urt[1],
+ $Blt[1],$Blm[1],$Blb[1],
+ $Drb[1],$Drm[1],$Drt[1]);
+
+## now we reallocate the initial array elements to the new
+## post (90 degree clockwise) rotation position.
+## Cube is viewed from FRONT.
+## Positions of side facelets of Right slice are numbered 0-11 in clockwise direction,
+## (as seen from Right face) starting with Up-right-bottom facelet.
+## First line example:
+## variable $Urb[0] (Upface-right-bottom colour) <-- colour of first element in @Rs0 (=Frb[0])
+## variable $Urb[1] (Upface-right-bottom number) <-- number of first element in @Rs1 (=Frb[1])
+
+$Urb[0]=$Rs0[0]; $Urb[1]=$Rs1[0];
+$Urm[0]=$Rs0[1]; $Urm[1]=$Rs1[1];
+$Urt[0]=$Rs0[2]; $Urt[1]=$Rs1[2];
+
+$Blt[0]=$Rs0[3]; $Blt[1]=$Rs1[3];
+$Blm[0]=$Rs0[4]; $Blm[1]=$Rs1[4];
+$Blb[0]=$Rs0[5]; $Blb[1]=$Rs1[5];
+
+$Drb[0]=$Rs0[6]; $Drb[1]=$Rs1[6];
+$Drm[0]=$Rs0[7]; $Drm[1]=$Rs1[7];
+$Drt[0]=$Rs0[8]; $Drt[1]=$Rs1[8];
+
+$Frb[0]=$Rs0[9]; $Frb[1]=$Rs1[9];
+$Frm[0]=$Rs0[10]; $Frm[1]=$Rs1[10];
+$Frt[0]=$Rs0[11]; $Frt[1]=$Rs1[11];
+
+##-------------Right FACE---------------------
+## RIGHT FACE (9 cubies in each array)
+## (numbered in rows: 1,2,3/4,5,6/7,8,9 from top left(1) to bottom right(9))
+## R=Right, f = face; 0=colour, 1= number
+## do the Rface (90 degree) rotation transform
+## here the Right-left-bottom (Rlb) facelet rotates to the possn of Right-left-top (Rlt)
+## we start with two arrays (one for colours @Rf0, one for numbers @Rf1) with 9 elements each.
+
+@Rf0=($Rlb[0], $Rlm[0], $Rlt[0], $Rmb[0], $Rmm[0], $Rmt[0], $Rrb[0], $Rrm[0], $Rrt[0]);
+@Rf1=($Rlb[1], $Rlm[1], $Rlt[1], $Rmb[1], $Rmm[1], $Rmt[1], $Rrb[1], $Rrm[1], $Rrt[1]);
+
+## now we reallocate the array elements to the new
+## post (90 degree clockwise) rotation facelet position.
+## Right face is viewed from RIGHT.
+## First line example:
+## variable $Rlt[0] (=Right-left-top colour) <-- colour of first element in @Rf0 (=Rlb[0])
+## variable $Rlt[1] (=Right-left-top number) <-- number of first element in @Rf1 (=Rlb[1])
+
+$Rlt[0]=$Rf0[0]; $Rlt[1]=$Rf1[0];
+$Rmt[0]=$Rf0[1]; $Rmt[1]=$Rf1[1];
+$Rrt[0]=$Rf0[2]; $Rrt[1]=$Rf1[2];
+
+$Rlm[0]=$Rf0[3]; $Rlm[1]=$Rf1[3];
+$Rmm[0]=$Rf0[4]; $Rmm[1]=$Rf1[4];
+$Rrm[0]=$Rf0[5]; $Rrm[1]=$Rf1[5];
+
+$Rlb[0]=$Rf0[6]; $Rlb[1]=$Rf1[6];
+$Rmb[0]=$Rf0[7]; $Rmb[1]=$Rf1[7];
+$Rrb[0]=$Rf0[8]; $Rrb[1]=$Rf1[8];
+
+}
+
+
+#======================================
+
+ sub rrSr {
+
+## Sr = RIGHT middle SLICE rotation (only 12 side facelets)
+## modified from rrR (change the U,D,F, r --> m and Back Bl-->Bm; Rs--> ?Srs)
+## change only the slice
+## s = side; 0=colour, 1= number
+## make the post rotation permutation
+
+@SRs0=($Fmb[0],$Fmm[0],$Fmt[0],
+ $Umb[0],$Umm[0],$Umt[0],
+ $Bmt[0],$Bmm[0],$Bmb[0],
+ $Dmb[0],$Dmm[0],$Dmt[0]);
+
+@SRs1=($Fmb[1],$Fmm[1],$Fmt[1],
+ $Umb[1],$Umm[1],$Umt[1],
+ $Bmt[1],$Bmm[1],$Bmb[1],
+ $Dmb[1],$Dmm[1],$Dmt[1]);
+
+
+$Umb[0]=$SRs0[0]; $Umb[1]=$SRs1[0];
+$Umm[0]=$SRs0[1]; $Umm[1]=$SRs1[1];
+$Umt[0]=$SRs0[2]; $Umt[1]=$SRs1[2];
+
+$Bmt[0]=$SRs0[3]; $Bmt[1]=$SRs1[3];
+$Bmm[0]=$SRs0[4]; $Bmm[1]=$SRs1[4];
+$Bmb[0]=$SRs0[5]; $Bmb[1]=$SRs1[5];
+
+$Dmb[0]=$SRs0[6]; $Dmb[1]=$SRs1[6];
+$Dmm[0]=$SRs0[7]; $Dmm[1]=$SRs1[7];
+$Dmt[0]=$SRs0[8]; $Dmt[1]=$SRs1[8];
+
+$Fmb[0]=$SRs0[9]; $Fmb[1]=$SRs1[9];
+$Fmm[0]=$SRs0[10]; $Fmm[1]=$SRs1[10];
+$Fmt[0]=$SRs0[11]; $Fmt[1]=$SRs1[11];
+
+}
+
+
+#======================================
+
+ sub rrLp {
+
+## LEFT slice (side + face) anticlockwise rotation
+## s = side; 0=colour, 1= number
+##-------------side-----------
+
+@LPs0=($Flb[0],$Flm[0],$Flt[0],
+ $Ulb[0],$Ulm[0],$Ult[0],
+ $Brt[0],$Brm[0],$Brb[0],
+ $Dlb[0],$Dlm[0],$Dlt[0]);
+
+@LPs1=($Flb[1],$Flm[1],$Flt[1],
+ $Ulb[1],$Ulm[1],$Ult[1],
+ $Brt[1],$Brm[1],$Brb[1],
+ $Dlb[1],$Dlm[1],$Dlt[1]);
+
+
+$Ulb[0]=$LPs0[0]; $Ulb[1]=$LPs1[0];
+$Ulm[0]=$LPs0[1]; $Ulm[1]=$LPs1[1];
+$Ult[0]=$LPs0[2]; $Ult[1]=$LPs1[2];
+
+$Brt[0]=$LPs0[3]; $Brt[1]=$LPs1[3];
+$Brm[0]=$LPs0[4]; $Brm[1]=$LPs1[4];
+$Brb[0]=$LPs0[5]; $Brb[1]=$LPs1[5];
+
+$Dlb[0]=$LPs0[6]; $Dlb[1]=$LPs1[6];
+$Dlm[0]=$LPs0[7]; $Dlm[1]=$LPs1[7];
+$Dlt[0]=$LPs0[8]; $Dlt[1]=$LPs1[8];
+
+$Flb[0]=$LPs0[9]; $Flb[1]=$LPs1[9];
+$Flm[0]=$LPs0[10]; $Flm[1]=$LPs1[10];
+$Flt[0]=$LPs0[11]; $Flt[1]=$LPs1[11];
+
+
+##---------------Left FACE-------------
+## do the LEFT face transform (in rows: 1,2,3//4,5,6//7,8,9)
+## f = face; 0=colour, 1= number
+## NOTES: not same as for R
+
+@LPf0=($Lrt[0], $Lrm[0], $Lrb[0], $Lmt[0], $Lmm[0], $Lmb[0], $Llt[0], $Llm[0], $Llb[0]);
+@LPf1=($Lrt[1], $Lrm[1], $Lrb[1], $Lmt[1], $Lmm[1], $Lmb[1], $Llt[1], $Llm[1], $Llb[1]);
+
+$Llt[0]=$LPf0[0]; $Llt[1]=$LPf1[0];
+$Lmt[0]=$LPf0[1]; $Lmt[1]=$LPf1[1];
+$Lrt[0]=$LPf0[2]; $Lrt[1]=$LPf1[2];
+
+$Llm[0]=$LPf0[3]; $Llm[1]=$LPf1[3];
+$Lmm[0]=$LPf0[4]; $Lmm[1]=$LPf1[4];
+$Lrm[0]=$LPf0[5]; $Lrm[1]=$LPf1[5];
+
+$Llb[0]=$LPf0[6]; $Llb[1]=$LPf1[6];
+$Lmb[0]=$LPf0[7]; $Lmb[1]=$LPf1[7];
+$Lrb[0]=$LPf0[8]; $Lrb[1]=$LPf1[8];
+
+}
+
+
+#======================================
+
+ sub rrU {
+
+## UP slice (side + face)
+## do the Uside transform
+## s = side; 0=colour, 1= number
+## ----------SIDE--------------
+
+@Us0=($Lrt[0],$Lmt[0],$Llt[0],
+ $Brt[0],$Bmt[0],$Blt[0],
+ $Rrt[0],$Rmt[0],$Rlt[0],
+ $Frt[0],$Fmt[0],$Flt[0]);
+
+@Us1=($Lrt[1],$Lmt[1],$Llt[1],
+ $Brt[1],$Bmt[1],$Blt[1],
+ $Rrt[1],$Rmt[1],$Rlt[1],
+ $Frt[1],$Fmt[1],$Flt[1]);
+
+
+$Brt[0]=$Us0[0]; $Brt[1]=$Us1[0];
+$Bmt[0]=$Us0[1]; $Bmt[1]=$Us1[1];
+$Blt[0]=$Us0[2]; $Blt[1]=$Us1[2];
+
+$Rrt[0]=$Us0[3]; $Rrt[1]=$Us1[3];
+$Rmt[0]=$Us0[4]; $Rmt[1]=$Us1[4];
+$Rlt[0]=$Us0[5]; $Rlt[1]=$Us1[5];
+
+$Frt[0]=$Us0[6]; $Frt[1]=$Us1[6];
+$Fmt[0]=$Us0[7]; $Fmt[1]=$Us1[7];
+$Flt[0]=$Us0[8]; $Flt[1]=$Us1[8];
+
+$Lrt[0]=$Us0[9]; $Lrt[1]=$Us1[9];
+$Lmt[0]=$Us0[10]; $Lmt[1]=$Us1[10];
+$Llt[0]=$Us0[11]; $Llt[1]=$Us1[11];
+
+##-------------Up FACE-------------------
+## do the Rface transform (in rows: 1,2,3//4,5,6//7,8,9)
+## f = face; 0=colour, 1= number
+
+@Uf0=($Ulb[0], $Ulm[0], $Ult[0], $Umb[0], $Umm[0], $Umt[0], $Urb[0], $Urm[0], $Urt[0]);
+@Uf1=($Ulb[1], $Ulm[1], $Ult[1], $Umb[1], $Umm[1], $Umt[1], $Urb[1], $Urm[1], $Urt[1]);
+
+$Ult[0]=$Uf0[0]; $Ult[1]=$Uf1[0];
+$Umt[0]=$Uf0[1]; $Umt[1]=$Uf1[1];
+$Urt[0]=$Uf0[2]; $Urt[1]=$Uf1[2];
+
+$Ulm[0]=$Uf0[3]; $Ulm[1]=$Uf1[3];
+$Umm[0]=$Uf0[4]; $Umm[1]=$Uf1[4];
+$Urm[0]=$Uf0[5]; $Urm[1]=$Uf1[5];
+
+$Ulb[0]=$Uf0[6]; $Ulb[1]=$Uf1[6];
+$Umb[0]=$Uf0[7]; $Umb[1]=$Uf1[7];
+$Urb[0]=$Uf0[8]; $Urb[1]=$Uf1[8];
+
+}
+
+
+#======================================
+
+ sub rrSu {
+
+## middle slice rotation (side only 12 facelets)
+## s = side; 0=colour, 1= number
+## make the post rotation permutation
+##-----------SIDE-------------------
+
+@SUs0=($Lrm[0],$Lmm[0],$Llm[0],
+ $Brm[0],$Bmm[0],$Blm[0],
+ $Rrm[0],$Rmm[0],$Rlm[0],
+ $Frm[0],$Fmm[0],$Flm[0]);
+
+@SUs1=($Lrm[1],$Lmm[1],$Llm[1],
+ $Brm[1],$Bmm[1],$Blm[1],
+ $Rrm[1],$Rmm[1],$Rlm[1],
+ $Frm[1],$Fmm[1],$Flm[1]);
+
+
+$Brm[0]=$SUs0[0]; $Brm[1]=$SUs1[0];
+$Bmm[0]=$SUs0[1]; $Bmm[1]=$SUs1[1];
+$Blm[0]=$SUs0[2]; $Blm[1]=$SUs1[2];
+
+$Rrm[0]=$SUs0[3]; $Rrm[1]=$SUs1[3];
+$Rmm[0]=$SUs0[4]; $Rmm[1]=$SUs1[4];
+$Rlm[0]=$SUs0[5]; $Rlm[1]=$SUs1[5];
+
+$Frm[0]=$SUs0[6]; $Frm[1]=$SUs1[6];
+$Fmm[0]=$SUs0[7]; $Fmm[1]=$SUs1[7];
+$Flm[0]=$SUs0[8]; $Flm[1]=$SUs1[8];
+
+$Lrm[0]=$SUs0[9]; $Lrm[1]=$SUs1[9];
+$Lmm[0]=$SUs0[10]; $Lmm[1]=$SUs1[10];
+$Llm[0]=$SUs0[11]; $Llm[1]=$SUs1[11];
+
+}
+
+
+#======================================
+
+ sub rrDp {
+
+## Down Face anticlockwise rotation (side and face)
+## s = side; 0=colour, 1= number
+## make the post rotation permutation
+##--------------SIDE----------------
+
+@DPs0=($Lrb[0],$Lmb[0],$Llb[0],
+ $Brb[0],$Bmb[0],$Blb[0],
+ $Rrb[0],$Rmb[0],$Rlb[0],
+ $Frb[0],$Fmb[0],$Flb[0]);
+
+@DPs1=($Lrb[1],$Lmb[1],$Llb[1],
+ $Brb[1],$Bmb[1],$Blb[1],
+ $Rrb[1],$Rmb[1],$Rlb[1],
+ $Frb[1],$Fmb[1],$Flb[1]);
+
+$Brb[0]=$DPs0[0]; $Brb[1]=$DPs1[0];
+$Bmb[0]=$DPs0[1]; $Bmb[1]=$DPs1[1];
+$Blb[0]=$DPs0[2]; $Blb[1]=$DPs1[2];
+
+$Rrb[0]=$DPs0[3]; $Rrb[1]=$DPs1[3];
+$Rmb[0]=$DPs0[4]; $Rmb[1]=$DPs1[4];
+$Rlb[0]=$DPs0[5]; $Rlb[1]=$DPs1[5];
+
+$Frb[0]=$DPs0[6]; $Frb[1]=$DPs1[6];
+$Fmb[0]=$DPs0[7]; $Fmb[1]=$DPs1[7];
+$Flb[0]=$DPs0[8]; $Flb[1]=$DPs1[8];
+
+$Lrb[0]=$DPs0[9]; $Lrb[1]=$DPs1[9];
+$Lmb[0]=$DPs0[10]; $Lmb[1]=$DPs1[10];
+$Llb[0]=$DPs0[11]; $Llb[1]=$DPs1[11];
+
+##---------------Down FACE-------------------
+## f = face; 0=colour, 1= number
+
+@DPf0=($Dlt[0], $Dlm[0], $Dlb[0], $Dmt[0], $Dmm[0], $Dmb[0], $Drt[0], $Drm[0], $Drb[0]);
+@DPf1=($Dlt[1], $Dlm[1], $Dlb[1], $Dmt[1], $Dmm[1], $Dmb[1], $Drt[1], $Drm[1], $Drb[1]);
+
+$Dlb[0]=$DPf0[0]; $Dlb[1]=$DPf1[0];
+$Dmb[0]=$DPf0[1]; $Dmb[1]=$DPf1[1];
+$Drb[0]=$DPf0[2]; $Drb[1]=$DPf1[2];
+
+$Dlm[0]=$DPf0[3]; $Dlm[1]=$DPf1[3];
+$Dmm[0]=$DPf0[4]; $Dmm[1]=$DPf1[4];
+$Drm[0]=$DPf0[5]; $Drm[1]=$DPf1[5];
+
+$Dlt[0]=$DPf0[6]; $Dlt[1]=$DPf1[6];
+$Dmt[0]=$DPf0[7]; $Dmt[1]=$DPf1[7];
+$Drt[0]=$DPf0[8]; $Drt[1]=$DPf1[8];
+
+}
+
+
+#======================================
+
+ sub rrF {
+
+## do the Fside transform (side and face)
+## s = side; 0=colour, 1= number
+## -----------SIDE-----------------
+
+@Fs0=($Lrb[0],$Lrm[0],$Lrt[0],
+ $Ulb[0],$Umb[0],$Urb[0],
+ $Rlt[0],$Rlm[0],$Rlb[0],
+ $Drt[0],$Dmt[0],$Dlt[0]);
+
+@Fs1=($Lrb[1],$Lrm[1],$Lrt[1],
+ $Ulb[1],$Umb[1],$Urb[1],
+ $Rlt[1],$Rlm[1],$Rlb[1],
+ $Drt[1],$Dmt[1],$Dlt[1]);
+
+$Ulb[0]=$Fs0[0]; $Ulb[1]=$Fs1[0];
+$Umb[0]=$Fs0[1]; $Umb[1]=$Fs1[1];
+$Urb[0]=$Fs0[2]; $Urb[1]=$Fs1[2];
+
+$Rlt[0]=$Fs0[3]; $Rlt[1]=$Fs1[3];
+$Rlm[0]=$Fs0[4]; $Rlm[1]=$Fs1[4];
+$Rlb[0]=$Fs0[5]; $Rlb[1]=$Fs1[5];
+
+$Drt[0]=$Fs0[6]; $Drt[1]=$Fs1[6];
+$Dmt[0]=$Fs0[7]; $Dmt[1]=$Fs1[7];
+$Dlt[0]=$Fs0[8]; $Dlt[1]=$Fs1[8];
+
+$Lrb[0]=$Fs0[9]; $Lrb[1]=$Fs1[9];
+$Lrm[0]=$Fs0[10]; $Lrm[1]=$Fs1[10];
+$Lrt[0]=$Fs0[11]; $Lrt[1]=$Fs1[11];
+
+## -------Front FACE-------------------
+## f = face; 0=colour, 1= number
+
+@Lf0=($Flb[0], $Flm[0], $Flt[0], $Fmb[0], $Fmm[0], $Fmt[0], $Frb[0], $Frm[0], $Frt[0]);
+@Lf1=($Flb[1], $Flm[1], $Flt[1], $Fmb[1], $Fmm[1], $Fmt[1], $Frb[1], $Frm[1], $Frt[1]);
+
+$Flt[0]=$Lf0[0]; $Flt[1]=$Lf1[0];
+$Fmt[0]=$Lf0[1]; $Fmt[1]=$Lf1[1];
+$Frt[0]=$Lf0[2]; $Frt[1]=$Lf1[2];
+
+$Flm[0]=$Lf0[3]; $Flm[1]=$Lf1[3];
+$Fmm[0]=$Lf0[4]; $Fmm[1]=$Lf1[4];
+$Frm[0]=$Lf0[5]; $Frm[1]=$Lf1[5];
+
+$Flb[0]=$Lf0[6]; $Flb[1]=$Lf1[6];
+$Fmb[0]=$Lf0[7]; $Fmb[1]=$Lf1[7];
+$Frb[0]=$Lf0[8]; $Frb[1]=$Lf1[8];
+
+}
+
+
+#======================================
+
+ sub rrSf {
+
+## do the FRONT middle slice Fm transform (side only)
+## s = side; 0=colour, 1= number
+##----------SIDE---------------
+
+@SFs0=($Lmb[0],$Lmm[0],$Lmt[0],
+ $Ulm[0],$Umm[0],$Urm[0],
+ $Rmt[0],$Rmm[0],$Rmb[0],
+ $Drm[0],$Dmm[0],$Dlm[0]);
+
+@SFs1=($Lmb[1],$Lmm[1],$Lmt[1],
+ $Ulm[1],$Umm[1],$Urm[1],
+ $Rmt[1],$Rmm[1],$Rmb[1],
+ $Drm[1],$Dmm[1],$Dlm[1]);
+
+$Ulm[0]=$SFs0[0]; $Ulm[1]=$SFs1[0];
+$Umm[0]=$SFs0[1]; $Umm[1]=$SFs1[1];
+$Urm[0]=$SFs0[2]; $Urm[1]=$SFs1[2];
+
+$Rmt[0]=$SFs0[3]; $Rmt[1]=$SFs1[3];
+$Rmm[0]=$SFs0[4]; $Rmm[1]=$SFs1[4];
+$Rmb[0]=$SFs0[5]; $Rmb[1]=$SFs1[5];
+
+$Drm[0]=$SFs0[6]; $Drm[1]=$SFs1[6];
+$Dmm[0]=$SFs0[7]; $Dmm[1]=$SFs1[7];
+$Dlm[0]=$SFs0[8]; $Dlm[1]=$SFs1[8];
+
+$Lmb[0]=$SFs0[9]; $Lmb[1]=$SFs1[9];
+$Lmm[0]=$SFs0[10]; $Lmm[1]=$SFs1[10];
+$Lmt[0]=$SFs0[11]; $Lmt[1]=$SFs1[11];
+}
+
+
+#======================================
+
+ sub rrBp {
+
+## Back rotation anticlockwise (side + face)
+## do the Bp side transform
+## s = side; 0=colour, 1= number
+## --------------Side-----------------
+
+@BPs0=($Llb[0],$Llm[0],$Llt[0],
+ $Ult[0],$Umt[0],$Urt[0],
+ $Rrt[0],$Rrm[0],$Rrb[0],
+ $Drb[0],$Dmb[0],$Dlb[0]);
+
+@BPs1=($Llb[1],$Llm[1],$Llt[1],
+ $Ult[1],$Umt[1],$Urt[1],
+ $Rrt[1],$Rrm[1],$Rrb[1],
+ $Drb[1],$Dmb[1],$Dlb[1]);
+
+$Ult[0]=$BPs0[0]; $Ult[1]=$BPs1[0];
+$Umt[0]=$BPs0[1]; $Umt[1]=$BPs1[1];
+$Urt[0]=$BPs0[2]; $Urt[1]=$BPs1[2];
+
+$Rrt[0]=$BPs0[3]; $Rrt[1]=$BPs1[3];
+$Rrm[0]=$BPs0[4]; $Rrm[1]=$BPs1[4];
+$Rrb[0]=$BPs0[5]; $Rrb[1]=$BPs1[5];
+
+$Drb[0]=$BPs0[6]; $Drb[1]=$BPs1[6];
+$Dmb[0]=$BPs0[7]; $Dmb[1]=$BPs1[7];
+$Dlb[0]=$BPs0[8]; $Dlb[1]=$BPs1[8];
+
+$Llb[0]=$BPs0[9]; $Llb[1]=$BPs1[9];
+$Llm[0]=$BPs0[10]; $Llm[1]=$BPs1[10];
+$Llt[0]=$BPs0[11]; $Llt[1]=$BPs1[11];
+
+##-----------------Back FACE-------------
+## do the B face transform (in rows: 1,2,3/4,5,6/7,8,9)
+## f = face; 0=colour, 1= number
+
+@BPf0=($Brb[0], $Brm[0], $Brt[0], $Bmb[0], $Bmm[0], $Bmt[0], $Blb[0], $Blm[0], $Blt[0]);
+
+@BPf1=($Brb[1], $Brm[1], $Brt[1], $Bmb[1], $Bmm[1], $Bmt[1], $Blb[1], $Blm[1], $Blt[1]);
+
+$Brt[0]=$BPf0[0]; $Brt[1]=$BPf1[0];
+$Bmt[0]=$BPf0[1]; $Bmt[1]=$BPf1[1];
+$Blt[0]=$BPf0[2]; $Blt[1]=$BPf1[2];
+
+$Brm[0]=$BPf0[3]; $Brm[1]=$BPf1[3];
+$Bmm[0]=$BPf0[4]; $Bmm[1]=$BPf1[4];
+$Blm[0]=$BPf0[5]; $Blm[1]=$BPf1[5];
+
+$Brb[0]=$BPf0[6]; $Brb[1]=$BPf1[6];
+$Bmb[0]=$BPf0[7]; $Bmb[1]=$BPf1[7];
+$Blb[0]=$BPf0[8]; $Blb[1]=$BPf1[8];
+}
+
+
+#======================================
+
+
+#======================================
+
+## Overview of derivative transform subs
+
+#======================================
+
+##---------------------------------------------
+## Note that we have defined (as rotation SUBs above) just 9 primary rotation transforms:
+## (x axis): rrR, rrSr, rrLp
+## (y axis): rrU, rrSu, rrDp
+## (z axis): rrF, rrSf, rrBp
+## and since all remaining possible rotations are simply combinations of these 9
+## we now define all the other rotation subs in terms of these 9 primary rotations.
+## Do NOT use multiples here: write each rotation separately
+## ----------------
+## NB: the Sr, Su, Sf are the middle slice rotations (= Rm, Um, Fm respectively)
+## (the `m' notation is much more intuitive than the S., but too late to change notation now)
+## -------------
+
+## ----derivative subs from R and Sr and Lp----
+sub rrRp{&rrR;&rrR;&rrR}; # (=rrR3)
+sub rrRw{&rrR; &rrSr}; # (= rrR + rrSr)
+sub rrRwp{&rrR;&rrR;&rrR; &rrSr;&rrSr;&rrSr}; # (= rrRp + rrSrp)
+sub rrRs{&rrR;&rrLp};
+sub rrRsp{&rrRp;&rrL};
+sub rrRa{&rrR;&rrL};
+sub rrRap{&rrRp;&rrLp};
+
+## ---------------------
+sub rrL{&rrLp;&rrLp;&rrLp}; # (= rrLp3)
+sub rrLw{&rrLp;&rrLp;&rrLp;&rrSrp}; # (=rrLp3 + rrSrp)
+sub rrLwp{&rrLp;&rrSr};
+sub rrLs{&rrL;&rrRp};
+sub rrLsp{&rrLp;&rrR};
+sub rrLa{&rrL;&rrR};
+sub rrLap{&rrLp;&rrRp};
+
+## ----derivative subs from U ----
+sub rrUp{&rrU;&rrU;&rrU}; # (=rrU3)
+sub rrUw{&rrU;&rrSu}; #
+sub rrUwp{&rrUp;&rrSup};
+sub rrUs{&rrU;&rrDp};
+sub rrUsp{&rrUp;&rrD};
+sub rrUa{&rrU;&rrD};
+sub rrUap{&rrUp;&rrDp};
+
+## ---------------------
+sub rrD{&rrDp;&rrDp;&rrDp}; # (= rrDp3)
+sub rrDw{&rrDp;&rrDp;&rrDp;&rrSup}; # (=rrDp3 + rrSup)
+sub rrDwp{&rrDp;&rrSu};
+sub rrDs{&rrD;&rrUp};
+sub rrDsp{&rrDp;&rrU};
+sub rrDa{&rrD;&rrU};
+sub rrDap{&rrDp;&rrUp};
+
+## ----derivative subs from F ----
+sub rrFw{&rrF; &rrSf}; # (= rrF + rrSf)
+sub rrFp{ &rrF;&rrF;&rrF}; # (=rrF3)
+sub rrFwp{&rrF;&rrF;&rrF; &rrSf;&rrSf;&rrSf}; # (= rrF3 + rrSf3)
+sub rrFs{&rrF;&rrBp};
+sub rrFsp{&rrFp;&rrB};
+sub rrFa{&rrF;&rrB};
+sub rrFap{&rrFp;&rrBp};
+
+## ---------------------
+sub rrB{&rrBp;&rrBp;&rrBp}; # (= rrBp3)
+sub rrBw{&rrBp;&rrBp;&rrBp; &rrSfp}; # (=rrBp3 + rrSfp)
+sub rrBwp{&rrBp;&rrSf};
+sub rrBs{&rrB;&rrFp};
+sub rrBsp{&rrBp;&rrF};
+sub rrBa{&rrB;&rrF};
+sub rrBap{&rrBp;&rrFp};
+
+## ----bring all the S versions together ----
+sub rrSup{&rrSu;&rrSu;&rrSu}; # (=rrSu3)
+sub rrSd{&rrSup}; # (=rrSup)
+sub rrSdp{&rrSu}; # (=rrSu)
+sub rrSl{&rrSrp}; # (=rrSrp)
+sub rrSlp{&rrSr}; # (=rrSr)
+sub rrSrp{&rrSr;&rrSr;&rrSr}; # (=rrSr3)
+sub rrSfp{&rrSf;&rrSf;&rrSf}; # (=rrSf3)
+sub rrSb{&rrSfp}; # (=rrSfp)
+sub rrSbp{&rrSf}; # (=rrSf)
+
+
+
+#======================================
+
+ sub rubikmod {
+
+ ## for MODifying (MOD 4)
+print " SUB rubikmod\n";
+ ## passing one RotationElement as a parameter, & return a modified one
+ ## make local variables
+
+
+ my $rot="";
+ my $lencode="";
+ my $char="";
+ my $m4=-1;
+ my $num=-1;
+ my $p=0;
+
+
+ # grab the parameter string
+ # $code = @_[0];
+ $code = $_[0]; ## Perl says this is better
+
+ $lencode=length $code;
+
+ ## we want to split the code string into the front (Rubikcode) and terminal number
+ ## so grab 1 char sequentially starting from the end of the string
+ ## and identify the position of the first non-digit char we get to
+ ## example: $lastchar = substr $code,-1,1 ;
+ for ($p=-1; $p>-$lencode-1; $p=$p-1){
+ $char = substr $code,$p,1 ;
+ if ($char =~ /\d/) {}
+ else{
+ ## this char is the first non-digit from the end"
+ ## its position = $p
+ last;
+ };
+ };
+
+ ## now use the value of $p to split the code string
+ ## into front part (= $rot) and back part (= $num)
+
+ ## get $rot
+ $rot = substr $code, 0, ($lencode + $p + 1);
+
+ ## get $num
+ $num = substr $code, $lencode +$p +1, ($lencode -(length $rot));
+
+ ##--------------
+ ## if no number at all (eg D) then this Rubikcode needs to be implemented just once
+ ## so allocate its num to have value = 1
+
+ ## if ($num == ""){$num=1}; ## BUT this gives an ErrorMessage when num="" etc
+ ## so I have rewritten [if numlength --> 0 then..] then it works OK
+
+ $numlength = ($lencode -(length $rot));
+ if ($numlength == 0) {$num=1};
+ ##---------------------
+
+ ## determine mod 4 of the value num
+ $m4 = $num % 4;
+
+ ## now return the results
+ $rotcode=$rot;
+ $rotnumber=$num; ## we return this so we can use it as a check
+ $modnumber=$m4;
+
+ return $rotcode, $rotnumber, $modnumber;
+
+ } #end of sub
+
+
+#======================================
+
+ sub cleanstring {
+
+ # to clean leading and trailing whitespace from a string
+ # from Black Book page 147
+
+ my $line="";
+
+ $line = $_[0]; # copied from my RubikMOD()
+
+ #clean leading & trailing whitespace
+
+ $line =~ s/^\s+//; ## clean leading whitespace
+ $line =~ s/\s+$//; ## clean trailing whitespace
+
+ return $line;
+ }
+
+
+#======================================
+
+ sub cutinfoblock {
+
+ ## remove each <infoblock> if any exists
+
+ ## pass the whole dataline
+
+ print " SUB cutinfoblock\n";
+
+ my $dataline = $_[0];
+
+ ## we know all brackets are balanced - as this has been checked already.
+
+ print " dataline = $dataline\n";
+ my $Langle=0;
+ my $Rangle=0;
+ my $angleblock="";
+ my $lenangleblock=0;
+
+ ## first see if there is a terminal infoblock
+ $Langle = index $dataline, '<'; ## <
+ $Rangle = index $dataline, '>'; ## <
+ $lenangleblock = $Rangle - $Langle +1;
+
+ ##-----------------
+ ## angleblock is the whole block <...> including both angles
+ ## check both angles exist
+ if ( ($Langle !=-1) and ($Rangle !=-1) )
+ {
+
+ my $angleblock = substr ($dataline, $Langle, $lenangleblock);
+ print " infoblock(s) present: first = $angleblock\n";
+
+ my $lenangleblock = length $angleblock;
+ my $lendataline = length $dataline;
+
+
+ # now need to remove the infoblock from $dataline
+ # need to get front and back strings
+ my $frontstring="";
+ my $newfrontstring="";
+ my $backstring="";
+
+ $lenbackstring= $lendataline - $Rangle -1;
+ $frontstring = substr ($dataline,0, $Langle); # string before Langle
+ $backstring = substr ($dataline,$Rangle +1); # string beyond Rangle
+
+ print " Langle possn = $Langle\n";
+ print " Rangle possn = $Rangle\n";
+ print " lenangleblock (diff + 1) = $lenangleblock\n";
+ print " lendataline = $lendataline\n";
+ print " lenbackstring = $lenbackstring\n";
+ print " frontstring = $frontstring\n";
+
+ #remove the terminal comma from front string
+ $newfrontstring = substr($frontstring, 0, $Langle -1);
+ print " new frontstring = $newfrontstring\n";
+ print " backstring = $backstring\n";
+
+ ##-------
+ # remove angleblock from dataline (join front and back strings)
+ $newdataline =$newfrontstring.$backstring;
+
+ $SequenceInfo = substr ($angleblock, 1, $lenangleblock -2);
+
+ print " new dataline = $newdataline\n";
+ print " SequenceInfo = $SequenceInfo\n";
+ print " newdataline = $newdataline\n";
+ print " done\n\n";
+
+ return $SequenceInfo, $newdataline;
+ }
+
+ else{
+ # no infoblock, so need to make newdataline same as orig dataline
+ $newdataline=$dataline;
+ print " no <infoblock> to remove.\n\n";
+ return $newdataline;
+ };
+ #-----------------
+
+
+ } ## end of sub
+
+
+#======================================
+
+ sub fixrepeatelement {
+
+ print " SUB fixrepeatelement\n";
+
+ print " reformatting any repeat elements...\n";
+
+ ## this sub replaces ,-->; and (--> { and ) --> } for the repeat element
+ ## and inserts it back into the original rotation sequence, where it now
+ ## appears as a separate rotation element.
+
+ my $repeatstring="";
+ my $lenrepeatstring="";
+ my $newrepeatstring="";
+ my $frontstring="";
+ my $backstring="";
+ my $p=0;
+ my $q=0;
+ my $len = 0;
+ my $k1=0;
+ my $k2 = 0;
+
+
+ ## pass the whole dataline without the keyword
+ my $dataline = $_[0]; # copied from my RubikMOD()
+
+
+ $p = index $dataline, '(';
+ $q = index $dataline, ')';
+
+ print " p = $p, q = $q\n";
+
+
+ $lenrepeatstring = $q -$p +1 ;
+ $repeatstring = substr ($dataline, $p, $lenrepeatstring);
+
+ print " first repeat string = $repeatstring\n";
+ print " length of repeat string = $lenrepeatstring\n";
+
+ ## translate the chars
+ $repeatstring =~ tr/,/;/; ## swap , --> ; Black book page 138--139
+ $repeatstring =~ tr/\(/\{/; ## swap ( --> {
+ $repeatstring =~ tr/\)/\}/; ## swap ) --> }
+
+ $newrepeatstring = $repeatstring;
+
+ print "...new repeat string = $newrepeatstring\n";
+
+ #------------
+ $k1=$p; #start of cut
+ $k2= $p + $lenrepeatstring; #end of cut
+ $frontstring = substr ($dataline,0, $k1);
+ $backstring = substr ($dataline,$k2);
+ print " frontstring = $frontstring\n";
+ print " backstring = $backstring\n";
+
+ # add insert
+ $newdataline =$frontstring.$newrepeatstring.$backstring;
+ print " new dataline = $newdataline\n";
+
+
+ print " done\n\n";
+
+ } # end of sub
+
+
+#======================================
+
+ sub repeat {
+
+ print " SUB repeat\n";
+
+ ## this SUB expand the repeating elements
+ ## this SUB receives a repeat string in the form {L,R, }3
+ ## The original () were converted (above) into {} so we can distinguish the brackets.
+ ## we than extract the code sequence and the terminal repeat number
+ ## Then we join n copies of the code string to form a long cs string.
+ ## then we insert this new long string into the main rotation sequence without the {}
+ ## Ultimately the fully expanded rotation sequence is fed into SUB rotation for processing.
+
+
+
+ ## grab the whole repeatstring = {...}n
+ my $repeatstring = $_[0];
+
+ # the string ={code}n
+ # get the code sequence and the terminal digit
+
+ my $p=0;
+ my $q=0;
+ my $repeatnumber=0;
+ my $repeatcode="";
+ my $lenrepeatcode =0;
+
+ $p = index $repeatstring, '{';
+ $q = index $repeatstring, '}';
+ $lenrepeatcode = $q - $p -1;
+
+
+
+ $repeatcode = substr ($repeatstring,1,$lenrepeatcode);
+ print " repeatcode = $repeatcode\n"; ## correct
+
+
+ $lenrepeatstring= length $repeatstring;
+
+
+ print " lenrepeatstring = $lenrepeatstring\n";
+ print " lenrepeatcode = $lenrepeatcode\n";
+ print " p = $p\n";
+ print " q = $q\n";
+
+ ##-----------------------
+ ## now get the repeat number
+
+ if ($lenrepeatcode == ($lenrepeatstring-2)) {
+ print " there is no trailing number --> 1\n";
+ $repeatnumber=1;
+ print " set repeatnumber = $repeatnumber\n";
+ }
+ else{
+ $repeatnumber= substr ($repeatstring, $q + 1); # correct
+ print " repeatnumber = $repeatnumber\n";
+
+ ## need to check that repeatnumber is a valid integer
+ if ($repeatnumber =~ /\D/){
+ # not a valid number
+
+ ## renormalise brackets etc before outputting to LaTeX
+ $repeatnumber= restorebrackets($repeatnumber);
+
+ gprint ("..*repeat-no. ERROR: $repeatnumber not numeric");
+ ErrorMessage ("repeat-no. $repeatnumber not numeric ?missing comma or nested ()");
+ };
+
+ }; #end of else
+ ##-------------------
+
+ ## now make n copies of repeatcode and name the string = $insert
+ ## (which is then used by another part of the prog)
+ ## we need commas only between elements (not at end)
+
+ $insert=""; ## $insert = global
+ $insert=$repeatcode;
+ for ($t=1; $t < $repeatnumber; $t=$t+1) {$insert=$insert.",".$repeatcode};
+
+ print " insert = $insert\n";
+ print " done\n\n";
+
+ } # end sub
+
+
+#======================================
+
+ sub quitprogram {
+
+ ## exiting the program cleanly
+ print " closing down: writing state...\n";
+ writestate(); ## write to the output files
+ close; ## close all files
+ exit;
+ }
+
+
+#======================================
+
+ sub showarray {
+
+ # show the array as a string
+
+ my @newarray = @_; # copied from my RubikMOD()
+ my $arraystring= join (",",@newarray);
+ print " the array = *$arraystring*\n\n";
+ }
+
+
+#======================================
+
+ sub cleanarray {
+
+ # cleans array elements of leading and trailing whitespace
+
+ my @cleanset=();
+ my @line = @_;
+ my $E;
+
+ foreach $E (@line) {
+ $E =~ s/^\s+//; ## clean leading whitespace
+ $E =~ s/\s+$//; ## clean trailing whitespace
+ push @cleanset, $E;
+ };
+
+ return @cleanset;
+
+}
+
+
+#======================================
+
+ sub restorebrackets {
+
+ my $line = $_[0];
+
+ ## translate the chars
+ $line =~ tr/;/,/; ## swap , --> ; Black book page 138--139
+ $line =~ tr/\{/\(/; ## swap ( --> {
+ $line =~ tr/\}/\)/; ## swap ) --> }
+
+ return $line;
+
+}
+
+
+#======================================
+
+ sub infoblockcolon {
+
+ print "...SUB InfoblockColon\n";
+
+ ## pass the whole dataline without the keyword
+ my $line = $_[0]; # copied from my RubikMOD()
+
+ if ( (index $line, '<' ) == -1) {
+ # no infoblock, so need to make newdataline same as orig dataline
+ print " no <infoblock> found.\n\n";
+ $newdataline=$dataline;
+ return $newdataline;
+ }
+ else{
+ print " infoblock(s) present\n";
+
+ print " start-string = $line\n";
+
+ # look at each char
+ my $j=0;
+ my $char="";
+
+ my $lenstring = 0;
+ $lenstring= length $line;
+
+ # set initial state of inout-flag
+ my $inoutflag="outside";
+
+ #------------------------
+ for ($j=0; $j<=$lenstring; $j=$j+1) {
+ $char = substr ($line,$j,1);
+
+ if ( ($char eq ',') and ($inoutflag eq 'inside')) {
+ # replace the char with ;
+ substr ($line, $j, 1, ";");
+ print " colon-string = $line\n";
+ };
+
+ ## need these at end of the loop
+ if ($char eq '<'){$inoutflag = "inside"};
+ if ($char eq '>'){$inoutflag = "outside"};
+
+ }; # end of for
+
+ #---------------------------
+
+ # -- repeat for [ ] brackets------
+ $inoutflag="outside";
+
+ for ($j=0; $j<=$lenstring; $j=$j+1) {
+ $char = substr ($line,$j,1);
+
+ if ( ($char eq ',') and ($inoutflag eq 'inside')) {
+ # replace the char with ;
+ substr ($line, $j, 1, ";");
+ print " colon-string = $line\n";
+ };
+
+ ## need these at end of the loop
+ if ($char eq '['){$inoutflag = "inside"};
+ if ($char eq ']'){$inoutflag = "outside"};
+
+ }; # end of for
+
+
+ #----------------------------------
+ ## make an array from the string so we can manipulate the elements
+ our @linedata=();
+ @linedata= split (/,/, $line);
+
+#----------clean the array-------
+ my $E;
+ my @cleandata=();
+
+ foreach $E (@linedata) {
+ $E =~ s/^\s+//; ## clean leading whitespace
+ $E =~ s/\s+$//; ## clean trailing whitespace
+ push @cleandata, $E;
+ };
+
+ print " colon-array = @cleandata\n";
+
+#=================
+
+# Because <infoblocks> can be located inside curved brackets
+# as for example, (\sixspot)2, [\sixspot macro contains an infoblock].
+# Consequently, we need to remove
+# the <..> blocks as parts of a string, not as elements in an array.
+# --otherwise, removing the terminal infoblock associated with \sixspot
+# will result in also removing the right-hand curved bracket --> error.
+# So we return the data as a string, and then send it to sub cutinfoblock later.
+
+ $newdataline = join (",", @cleandata);
+ print "...done\n\n";
+
+ return $newdataline;
+
+ } ## end of else
+ } ## end of sub
+
+
+#======================================
+
+ sub RemoveAllSpaces {
+
+ # remove all spaces in a string
+ # from Black book page 143
+
+ my $string=$_[0];
+
+ $string =~ s/\s//g; # OK
+
+ return $string;
+
+}
+
+#======================================
+
+sub CheckSyntax {
+
+ ## this check is used at an early stage in the program, so we can terminate early
+ ## if necessary. We check that all () {} <> are matched (if any exist),
+ ## missing commas, illegal combinations of chars etc.
+ ## if any serious errors (eg brackets not balanced), then we SET an errorflag,
+ ## and terminate the program.
+
+ print " SUB CheckSyntax\n";
+
+ my $dataline = $_[0];
+
+ ## first clean out all spaces in a string
+ ## so we can then look for specific combinations of characters
+ $dataline=RemoveAllSpaces($dataline);
+
+ print " dataline = $dataline\n";
+
+ ##-------------------------------------
+ ## first we check for unbalanced brackets
+ ## count brackets; Angle, Square, Curved
+ my ($nleftA, $nrightA) = 0;
+ my ($nleftS, $nrightS) = 0;
+ my ($nleftC, $nrightC) = 0;
+ my ($leftsum, $rightsum) =0;
+
+ ## Blackbook p 139 - counting chars in a string
+ $nleftA = ($dataline =~ tr/</</);
+ $nrightA = ($dataline =~ tr/>/>/);
+
+ $nleftS = ($dataline =~ tr/[/[/);
+ $nrightS = ($dataline =~ tr/]/]/);
+
+ $nleftC = ($dataline =~ tr/(/(/);
+ $nrightC = ($dataline =~ tr/)/)/);
+
+ print " left and right <> = $nleftA, $nrightA\n";
+ print " left and right [] = $nleftS, $nrightS\n";
+ print " left and right () = $nleftC, $nrightC\n";
+
+ $leftsum = $nleftA + $nleftS + $nleftC;
+ $rightsum =$nrightA + $nrightS + $nrightC;
+
+ print " leftsum, rightsum = $leftsum, $rightsum\n";
+
+
+ my $errorflag = "";
+
+ if ($leftsum != $rightsum)
+ {
+
+ if ( $nleftS != $nrightS )
+ ## Square brackets
+ {
+ gprint ("..*brackets ERROR [ ] Left [$nleftS not equal to Right ]$nrightS");
+ ErrorMessage ("brackets [ ]: Left [$nleftS not equal to Right ]$nrightS");
+ $errorflag="SET";
+ }
+
+ if ( $nleftC != $nrightC )
+ ## Curved brackets
+ {
+ gprint ("..*brackets ERROR ( ) Left ($nleftC not equal to Right )$nrightC");
+ ErrorMessage ("brackets ( ): Left ($nleftC not equal to Right )$nrightC");
+ $errorflag="SET";
+ }
+
+ if ( $nleftA != $nrightA )
+ ## Angle brackets
+ {
+ gprint ("..*brackets ERROR < > Left <$nleftA not equal to Right >$nrightA");
+ ErrorMessage ("brackets < >: Left <$nleftA not equal to Right >$nrightA");
+ $errorflag="SET";
+ }
+
+ };
+
+ ##--------------------------
+
+
+
+ ## check for other bad syntax, eg illegal pairings of characters
+ ## BlackBook p136
+
+ my ($char1, $char2, $charpair) = "";
+ my ($j, $lenstring) = 0;
+ $lenstring= length $dataline;
+ print " lenstring = $lenstring\n";
+
+
+ ## we set up a system which allows us to know whether or not we are
+ ## inside a set of brackets. To do this we increment / decrement counters
+ ## each time we pass through a bracket.
+ ## If sum NOT equal to zero, then we are inside etc.
+
+ ## first initialise each left and right variable.
+ ## seems important that these initialisations are done separately.
+
+ my $angleNumLeft = 0;
+ my $angleNumRight = 0;
+ my $angleNumSum = 0;
+
+ my $squareNumLeft = 0;
+ my $squareNumRight = 0;
+ my $squareNumSum = 0;
+
+ my $curvedNumLeft = 0;
+ my $curvedNumRight = 0;
+ my $curvedNumSum = 0;
+
+
+ ## look at each char, and each pair of chars
+ ## with brackets, we increment (right) and decrement (left) the count
+ ## so we can tell if we are inside or outside a set of nested brackets.
+ ## (we need to detect errors in the rotation sequence itself
+ ## and also inside squarebrackets] since these can occur anywhere,
+ ## but not in the angle infoblocks <..> where we want to be able to write anything)
+
+ for ($j=0; $j<= $lenstring; $j=$j+1) {
+ $charpair = substr ($dataline,$j,2);
+ $char1 = substr ($dataline,$j,1);
+ $char2 = substr ($dataline,$j+1,1);
+
+ ## at top of FOR loop
+ if ($char1 eq '<'){ $angleNumLeft = $angleNumLeft+1};
+ if ($char1 eq '>'){$angleNumRight = $angleNumRight-1};
+
+ if ($char1 eq '['){$squareNumLeft = $squareNumLeft+1};
+ if ($char1 eq ']'){$squareNumRight = $squareNumRight-1};
+
+ if ($char1 eq '('){$curvedNumLeft = $curvedNumLeft+1};
+ if ($char1 eq ')'){$curvedNumRight = $curvedNumRight-1};
+
+
+ $angleNumSum = $angleNumLeft + $angleNumRight;
+ $squareNumSum = $squareNumLeft + $squareNumRight;
+ $curvedNumSum = $curvedNumLeft + $curvedNumRight;
+
+ ##RWDN 22 Oct 2017
+
+ ##------------
+ ## need to trap nested (( )) inside squarebrackets
+
+ if ($squareNumSum != 0) {
+ if ( $charpair =~ m/(\(\(|\)\))/ )
+ { # nested curved brackets inside sq brackets
+ gprint ("..*syntax error: $charpair -- nested ((..)) in [ ]");
+ ErrorMessage("$charpair -- syntax error: nested ((..)) not allowed in [ ]");
+ $errorflag="SET";
+ };
+ };
+ ##--------------
+
+ ## if outside angle brackets AND outside square brackets
+ ## then we are checking ONLY the rotation sequence codes
+
+ if ( ($angleNumSum == 0) and ($squareNumSum == 0) ) {
+
+ ## A-Za-z< A-Za-z[ A-Za-z( )A-Za-z >A-Za-z ]A-Za-z
+ ## ]< ][ ]( ]) ]< )< )[ )( >< >[ >( d( d[ d<
+
+ if ( $charpair =~ m/([A-Za-z]\<|[A-Za-z]\[|[A-Za-z]\(|\)[A-Za-z]|\>[A-Za-z]|\][A-Za-z]|\]\<|\]\[|\]\(|\]\)|\]\<|\)\<|\)\[|\)\(|\>\<|\>\[|\>\(|\d\(|\d\[|\d\<|\[\[|\<\<|\(\(|\)\)|\]\]|\>\>)/ )
+ {
+ gprint ("..*syntax error: $charpair -- missing comma");
+ ErrorMessage("$charpair -- syntax error: missing comma");
+ $errorflag="SET";
+ next;
+ };
+
+ # trap nested curved brackets (= inside)
+ if ( ($char2 eq "(" ) and ($curvedNumSum != 0) ) {
+ ## nested curved brackets
+ gprint ("..*syntax error: $charpair -- nested ((..))");
+ ErrorMessage("$charpair -- syntax error: nested ((..)) not allowed");
+ $errorflag="SET";
+ };
+
+ #-----remove--------------------------------------
+ # trap comma inside [ ] ( eq inside)
+ # if ($squareNumSum != 0){
+ # if ($char1 eq ",") {
+ # gprint ("..*syntax error: $charpair -- comma not allowed in [ ]");
+ # ErrorMessage("$charpair -- syntax error: comma not allowed in [ ]");
+ # $errorflag="SET";
+ # next;
+ # };
+ # }; # end of if
+ #-------------------------------------------------
+
+ ## detect end of string
+ if ($j == $lenstring -1) {last};
+
+
+ }; # end of if
+
+ }; # end of for
+ #---------------------------
+
+
+ if ($errorflag eq "SET") {
+
+ ## closing down
+ gprint ("..*Quiting Perl program -- syntax error");
+ ErrorMessage ("QUITTING PERL PROGRAM -- syntax error");
+
+ ##------bug fix-----------------------
+ ## RWDN 5 October 2017
+ ## problem = since we are here checking syntax (ie before processing any
+ ## output SequenceXX strings) all four SequenceXX strings will be empty just now.
+ ## This then causes an error if the Rubik user code includes a ShowSequence command,
+ ## since the ForEachX macro used by ShowSequence macro cannot handle an empty string
+ ## when dealing with SequenceShort and SequenceLong.
+ ## So we heve to force these two strings to be just a [\space] before they are output
+ ## by the SUB writestate.
+ ## ie we set SequenceShort and SequenceLong strings to \space here before
+ ## CALLing the SUB quitprogram().
+ ## (to avoid a Rubikcube ShowSequence{}{}{} error if argument is empty
+ ## or is an expandable macro)
+ ## This problem arises because the ShowSequence macro uses the ForEachX macro
+ ## to process each cs element in a string.
+ ## Also need to add at least one empty char or comma at end of SequenceLong string,
+ ## as final char (comma) is removed when writing to the out file in SUB writestate
+ ## (CALLed by SUB quitprogram) just prior to closing down.
+ ## NB: if there is no extra terminal char for SequenceLong string,
+ ## then \space --> \spac --> TEX error message
+ ##
+ ## This issue does not seem to be a problem for SequenceInfo and SequenceName,
+ ## as they are not returned as cs strings.
+
+ $SequenceShort="\\space";
+ $SequenceLong= "\\space,";
+
+ ##---------------------------
+
+ print " closing down -- writing state........... OK\n";
+
+ quitprogram();
+
+ }
+ else{
+ print " syntax OK; brackets balanced OK\n";
+ print " done\n\n";
+ };
+
+
+} ## end sub
+
+
+
+#====================
+
+sub inverse {
+
+my $E = $_[0];
+
+ my $lastchar = substr ($E, -1,1);
+ my $frontchars = substr ($E, 0,-1); # correct
+
+ if ($lastchar eq "2") {$newE = $E}
+
+ elsif ($lastchar eq "p") { $newE = $frontchars}
+
+ else { $newE = $E."p"};
+
+return $newE;
+}
+
+##======================
+##EOF
+
diff --git a/macros/latex/contrib/rubik/rubikrotationPL.pdf b/macros/latex/contrib/rubik/rubikrotationPL.pdf
new file mode 100644
index 0000000000..c94465bd1a
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubikrotationPL.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubiktwo-doc-figA.pdf b/macros/latex/contrib/rubik/rubiktwo-doc-figA.pdf
new file mode 100644
index 0000000000..59f451f349
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubiktwo-doc-figA.pdf
Binary files differ
diff --git a/macros/latex/contrib/rubik/rubiktwocube.dtx b/macros/latex/contrib/rubik/rubiktwocube.dtx
new file mode 100644
index 0000000000..3e243cd802
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubiktwocube.dtx
@@ -0,0 +1,2478 @@
+% \iffalse meta-comment
+% rubiktwocube.dtx
+%
+% version v5.0
+% February 25, 2018
+%
+%
+% Copyright 2018
+% RWD Nickalls (dick@nickalls.org) and
+% A Syropoulos (asyropoulos@yahoo.com)
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%
+%
+% This work consists of the files rubiktwocube.dtx and rubiktwocube.ins
+% and the derived file rubiktwocube.sty.
+%
+%<*readme>
+%
+% The rubikcube package provides a collection of LaTeX commands and macros
+% for the typesetting of Rubik cube configurations and rotation
+% sequences using the TikZ graphic language.
+%
+% Please report errors or suggestions for improvement to
+%
+% Dick Nickalls or Apostolos Syropoulos
+%
+% This package requires the basic TikZ package to be loaded already
+%</readme>
+%
+%<*driver>
+\listfiles
+\documentclass{ltxdoc}
+\IfFileExists{rubiktwocube.sty}{\usepackage{rubiktwocube}}{%
+ \GenericWarning{rubiktwocube.dtx}{Package file rubiktwocube.sty not found.
+ Documentation will be messed up!^^J
+ (Generate rubiktwocube.sty by (La)TeXing rubiktwocube.ins, and then^^J
+ process rubiktwocube.dtx again)^^J}\stop
+}%
+\pagestyle{myheadings}
+\markright{\texttt{rubiktwocube} \ \ (Rubik bundle v5.0, 2018) \ \ \texttt{www.ctan.org/pkg/rubik}}
+\usepackage{rubikcube} %% we require macros @join and rubikfont
+\usepackage{ifpdf}
+\usepackage{url,path} %% for references
+\usepackage{supertabular} %% for Notation table
+\usepackage{hypdoc} %% for hyperref documenting of LaTeX packages
+%%\OnlyDescription
+\EnableCrossrefs
+\PageIndex
+\CodelineIndex
+\CodelineNumbered
+\RecordChanges
+\setcounter{StandardModuleDepth}{1}
+\begin{document}
+ \DocInput{rubiktwocube.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+%%% \CheckSum{2308}
+%
+%%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+%
+% \title{%
+% \ifpdf\pdfbookmark[1]{Title}{Title}\else\fi%
+% The \rubiktwocube\ package}
+%
+% \author{
+% RWD Nickalls (dick@nickalls.org) \\
+% A Syropoulos (asyropoulos@yahoo.com)
+% }
+% \date{This file describes version \RTCfileversion\ (\RTCfiledate)\\
+% \texttt{www.ctan.org/pkg/rubik}}
+% \maketitle
+%
+% \begin{abstract}
+% The \rubiktwocube\ package provides LaTeX commands and macros
+% for typesetting TwoCube (2x2x2) notation, configurations, and
+% rotation sequences using the TikZ graphic language. It is part of the
+% Rubik `bundle'.
+% \end{abstract}
+%
+%
+% \begin{minipage}{12cm}
+% \centering
+% \ifpdf
+% \strut\hspace{5mm}\includegraphics[width=12cm]{rubiktwo-doc-figA.pdf}
+% \else
+% \fi
+% \end{minipage}
+%
+%
+% \tableofcontents
+%
+% \pagebreak
+%
+% \section{Introduction}
+%
+% The \rubiktwocube\ package (part of the \textsc{rubik} `bundle') provides a
+% collection of \LaTeX\ commands
+% and macros for typesetting Rubik 2x2x2 cube configurations using the
+% PGF/TikZ graphic languages.
+% This package is a minor extension of the \textsc{rubikcube} package, and users are
+% therefore assumed to be familiar with both the \textsc{rubikcube} and \textsc{rubikrotation}
+% packages. For examples of use see the file \texttt{rubikexamples.pdf}.
+%
+%
+% \subsection{Requirements}
+%
+% The \rubiktwocube\ package requires the TikZ package (since it makes
+% use of the TikZ picture environment), and also the
+% \textsc{rubikcube} package.
+%
+% For full functionality the complementary packages \textsc{rubikrotation} and
+% \textsc{rubikpatterns} also need to be loaded.
+% Note that the \textsc{rubikrotation} package requires Perl to be installed.
+% See the `Installation' section in the \textsc{rubikcube} package documentation
+% (\texttt{rubikcube.pdf}) for more details.
+
+%
+%
+%
+% \subsection{Copyright}
+% Copyright 2014--2018 RWD Nickalls and A Syropoulos.
+%
+% \medskip
+% {\noindent}This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or any
+% later version. The latest version of this licence is in
+% |www.latex-project.org/lppl.txt|
+%
+%
+% \section{Installation}
+%
+% The Rubik bundle consists of the four packages \textsc{rubikcube}, \textsc{rubikrotation},
+% \textsc{rubikpatterns} and \textsc{rubiktwocube}.
+%
+% Here we describe only the installation of the \textsc{rubiktwocube} package,
+% which consists of the following files:
+%\begin{verbatim}
+% rubiktwocube.ins
+% rubiktwocube.dtx
+% rubiktwocube.pdf --documentation of the rubiktwocube package
+% rubiktwo-doc-figA.pdf
+%\end{verbatim}
+% Before installing the \textsc{rubiktwocube} package make sure the following packages
+% are already installed (TikZ graphics system and the \textsc{rubikcube} package).
+%
+%
+% \subsection{\texttt{rubiktwocube.sty}}
+%
+% The style option \texttt{rubiktwocube.sty} is generated by running (pdf)\LaTeX\ on
+% the file \texttt{rubiktwocube.ins} as follows:
+%\begin{verbatim}
+% pdflatex rubiktwocube.ins
+%\end{verbatim}
+%
+%
+% \subsection{\texttt{rubiktwocube.pdf}}
+%
+% The documentation file (\texttt{rubiktwocube.pdf}) is then generated using the following
+% steps\,\footnote{Several pdflatex runs are required, since the documentation includes
+% an index as well as hyperef links (the package \texttt{hypdoc}
+% is used). Prior to the first run it is
+% a good idea to delete any relevant \texttt{.toc}, \texttt{.aux}, \texttt{.out} files.}:
+%\begin{verbatim}
+% pdflatex rubiktwocube.dtx
+% pdflatex rubiktwocube.dtx
+% makeindex -s gind.ist rubiktwocube
+% makeindex -s gglo.ist -o rubiktwocube.gls rubiktwocube.glo
+% pdflatex rubiktwocube.dtx
+% pdflatex rubiktwocube.dtx
+%\end{verbatim}
+%
+%
+% \subsection{Placing the files}
+%
+% Place the files either in the local working directory, or where your system
+% will find them. For a Linux system with a standard \TeX\ Directory Structure (TDS), then:
+%
+%\medskip
+%{\noindent}*.sty $\rightarrow$
+% \texttt{/usr/local/texlive/texmf-local/tex/latex/rubik/}
+%{\newline}*.pdf $\rightarrow$ \texttt{/usr/local/texlive/texmf-local/doc/rubik/}
+%
+% \medskip
+% {\noindent}Finally, (depending on your system) update the \TeX\ file database.
+% For~example, on a Linux system one uses the \texttt{texhash} command.
+%
+%
+% \subsection{Usage}
+%
+% Load the package by using the command \cmd{\usepackage\{rubiktwocube\}}.
+% Note that the \rubiktwocube\ package requires the TikZ package, and so always load TikZ
+% before \rubiktwocube\ as follows:
+% \begin{quote}
+%\begin{verbatim}
+% \usepackage{tikz}
+% \usepackage{rubikcube,rubikrotation,rubikpatterns,rubiktwocube}
+%\end{verbatim}
+% \end{quote}
+%
+%
+%
+% \subsection{\texttt{rubikexamples.pdf}}
+%
+% The Rubik bundle includes a `RubikExamples' file (\texttt{rubikexamples.pdf})
+% as well as associated \texttt{.sh} (Linux) and \texttt{.bat} (Microsoft) batch
+% files which can be used to facilitate processing the source file (\texttt{rubikexamples.tex}).
+% See the `Installation' section in the \textsc{rubikcube} package documentation
+% (\texttt{rubikcube.pdf}) for details regarding processing the examples source file.
+%
+%
+%
+% \pagebreak
+%
+% \section{Command conventions}
+% \label{sec:conventions}
+%
+% The examples given in the file \texttt{rubikexamples.pdf} present a good overview of
+% the commands and how to use them.
+%
+%
+%
+% \subsection[Keywords Two and Rubik]{The keywords Two and Rubik in commands}
+%
+% In order to try and keep commands intuitive\,\footnote{This is a tricky problem
+% given the large number of commands, so any feedback or ideas on how to avoid ambiguity,
+% including pruning or revising `bad' commands, is always welcome.}
+% we adopt the convention that the word `Two' in a command reflects the fact that
+% the command relates to a 2x2x2 cube (a `Two' cube). Similarly, commands which relate
+% to a 3x3x3 cube (a `Rubik' cube) ---see the \textsc{rubikcube} package---
+% use instead the word `Rubik'.
+%
+%
+%
+% It is assumed that users are familiar with the \textsc{rubikcube}
+% and \textsc{rubikrotation} packages, since virtually all \rubiktwocube\
+% commands mirror the Rubik (3x3x3) cube commands, such that the word `Rubik'
+% is replaced by the word `Two' (exceptions are highlighted).
+% For example, the commands for drawing a 2x2x2 cube and a 3x3x3 cube from a RU viewpoint
+% are respectively \cmd{\DrawTwoCubeRU} and \cmd{\DrawRubikCubeRU}.
+% The examples given in the file \texttt{rubikexamples.pdf} present a good overview of
+% the commands and how to use them.
+%
+% For more detailed information see (a)~the `code' section (Section~\ref{sec:thecode}),
+% or (b)~see the equivalent 3x3x3 commands in the \textsc{rubikcube} package.
+%
+%
+%
+%
+%
+% \section{Colour commands}
+% \label{sec:listofcolourcommands}
+%
+% The following list shows the \rubiktwocube\ colour commands paired
+% (for convenience) with the equivalent 3x3x3 version from the
+% \textsc{rubikcube} package. The \texttt{..} indicates that mandatory arguments are required.
+%
+%
+%\begin{verbatim}
+% RubikCube TwoCube
+% 3x3x3 2x2x2
+%
+% \RubikCubeSolved \TwoCubeSolved
+% \RubikCubeSolvedWY \TwoCubeSolvedWY
+% \RubikCubeSolvedWB \TwoCubeSolvedWB
+% \RubikCubeGrey \TwoCubeGrey
+% \RubikCubeGray \TwoCubeGray
+% \RubikCubeGreyWY
+% \RubikCubeGrayWY
+% \RubikCubeGreyWB
+% \RubikCubeGrayWB
+% \RubikCubeGreyAll \TwoCubeGreyAll
+% \RubikCubeGrayAll \TwoCubeGrayAll
+% \RubikSolvedConfig.. \TwoSolvedConfig..
+%
+% \RubikFaceUp.. \TwoFaceUp..
+% \RubikFaceDown.. \TwoFaceDown..
+% \RubikFaceLeft.. \TwoFaceLeft..
+% \RubikFaceRight.. \TwoFaceRight..
+% \RubikFaceFront.. \TwoFaceFront..
+% \RubikFaceBack.. \TwoFaceBack..
+% \RubikFaceUpAll.. \TwoFaceUpAll..
+% \RubikFaceDownAll.. \TwoFaceDownAll..
+% \RubikFaceLeftAll.. \TwoFaceLeftAll..
+% \RubikFaceRightAl.. \TwoFaceRightAll..
+% \RubikFaceFrontAl.. \TwoFaceFrontAll..
+% \RubikFaceBackAll.. \TwoFaceBackAll..
+%
+% \RubikSidebarWidth.. \TwoSidebarWidth..
+% \RubikSidebarLength.. \TwoSidebarLength..
+% \RubikSidebarSep.. \TwoSidebarSep..
+%
+% \RubikSliceTopL.. \TwoSliceTopL..
+% \RubikSliceTopR.. \TwoSliceTopR..
+% \RubikSliceBottomL.. \TwoSliceBottomL..
+% \RubikSliceBottomR.. \TwoSliceBottomR..
+%\end{verbatim}
+%
+%
+%
+% \section{Draw commands}
+% \label{sec:listofdrawcommands}
+%
+% The following list shows the \rubiktwocube\ Draw commands paired
+% (for convenience) with the equivalent 3x3x3 version from the
+% \textsc{rubikcube} package. Commands in round brackets show short-hand
+% equivalents.
+%
+%
+%\begin{verbatim}
+% RubikCube TwoCube
+% 3x3x3 2x2x2
+%
+% \DrawRubikCubeRU \DrawTwoCubeRU
+% \DrawRubikCubeRD \DrawTwoCubeRD
+% \DrawRubikCubeLU \DrawTwoCubeLU
+% \DrawRubikCubeLD \DrawTwoCubeLD
+% \DrawRubikCubeF \DrawTwoCubeF
+% \DrawRubikCubeSF \DrawTwoCubeSF
+%
+% \DrawRubikCubeSidebarFL.. \DrawTwoCubeSidebarFL..
+% \DrawRubikCubeSidebarFR.. \DrawTwoCubeSidebarFR..
+% \DrawRubikCubeSidebarFU.. \DrawTwoCubeSidebarFU..
+% \DrawRubikCubeSidebarFD.. \DrawTwoCubeSidebarFD..
+% \DrawRubikCubeSidebarBL.. \DrawTwoCubeSidebarBL..
+% \DrawRubikCubeSidebarBR.. \DrawTwoCubeSidebarBR..
+% \DrawRubikCubeSidebarBU.. \DrawTwoCubeSidebarBU..
+% \DrawRubikCubeSidebarBD.. \DrawTwoCubeSidebarBD..
+%
+% \DrawRubikFaceUp \DrawTwoFaceUp (= \DrawTwoFaceU )
+% \DrawRubikFaceDown \DrawTwoFaceDown (= \DrawTwoFaceD )
+% \DrawRubikFaceLeft \DrawTwoFaceLeft (= \DrawTwoFaceL )
+% \DrawRubikFaceRight \DrawTwoFaceRight (= \DrawTwoFaceR )
+% \DrawRubikFaceFront \DrawTwoFaceFront (= \DrawTwoFaceF )
+% \DrawRubikFaceBack \DrawTwoFaceBack (= \DrawTwoFaceB )
+%
+% \DrawRubikFaceUpSide \DrawTwoFaceUpSide (= \DrawTwoFaceUS )
+% \DrawRubikFaceDownSide \DrawTwoFaceDownSide (= \DrawTwoFaceDS )
+% \DrawRubikFaceLeftSide \DrawTwoFaceLeftSide (= \DrawTwoFaceLS )
+% \DrawRubikFaceRightSide \DrawTwoFaceRightSide (= \DrawTwoFaceRS )
+% \DrawRubikFaceFrontSide \DrawTwoFaceFrontSide (= \DrawTwoFaceFS )
+% \DrawRubikFaceBackSide \DrawTwoFaceBackSide (= \DrawTwoFaceBS )
+%
+% \DrawRubikFlatUp.. \DrawTwoFlatUp..
+% \DrawRubikFlatDown.. \DrawTwoFlatDown..
+% \DrawRubikFlatLeft.. \DrawTwoFlatLeft..
+% \DrawRubikFlatRight.. \DrawTwoFlatRight..
+% \DrawRubikFlatFront.. \DrawTwoFlatFront..
+% \DrawRubikFlatBack.. \DrawTwoFlatBack..
+%
+%\end{verbatim}
+%
+%
+%
+%
+% \section{Rotation commands}
+% \label{sec:rotationcommands}
+%
+% \bigskip
+%
+%
+%\begin{verbatim}
+% RubikCube TwoCube
+% 3x3x3 2x2x2
+%
+% \RubikRotation.. \TwoRotation..
+% \SaveRubikState.. \SaveTwoState..
+% \ShowErrors \ShowErrors
+% \CheckState \CheckState
+%\end{verbatim}
+%
+%
+% \subsection{List of rotation commands}
+% \label{sec:listofrotationcommands}
+%
+%
+% All the commands presented here also have a \cmd{\Two\{\}} equivalent form which
+% typesets both the hieroglyph and its lettercode in a vertical format.
+% These have been omitted here owing to the difficulty of including this form easily
+% in the following table.
+%
+% 2x2x2 \textsc{changes}: Note that all these command names mirror their 3x3x3 equivalents in
+% the \textsc{rubikcube} package; the changes in the command prefixes
+% are as follows:
+%
+% \cmd{\tr} $\leftarrow$ \cmd{\rr}
+%
+% \cmd{\trh} $\leftarrow$ \cmd{\rrh}
+%
+% \cmd{\Two} $\leftarrow$ \cmd{\Rubik}
+%
+% \cmd{\textTwo} $\leftarrow$ \cmd{\textRubik}
+%
+% \pagebreak
+%
+% \subsubsection{Face rotations}
+% \label{sec:facerotations}
+%
+%
+% \newcommand{\dnstrut}{\rule{0pt}{17pt}}
+% \newcommand{\dns}{\hspace{2mm}}
+% \newcommand{\dnsp}{\hspace{2mm}}
+%
+% \newcommand{\dnTwo}[1]{%
+% \dnstrut\tr{#1}\dns\cmd{\tr\{#1\}}%
+% & \trh{#1}\dns\cmd{\trh\{#1\}}%
+% & \Two{#1}\dns\cmd{\Two\{#1\}} \nonumber\\%
+% }%
+%
+% \newcommand{\dntextTwo}[1]{%
+% \dnstrut\tr{#1}\dns\cmd{\tr\{#1\}}%
+% & \trh{#1}\dns\cmd{\trh\{#1\}}%
+% & \textTwo{#1}\dns\cmd{\textTwo\{#1\}} \nonumber\\%
+% }%
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dntextTwo{U}
+% \dntextTwo{Up}
+% \dntextTwo{D}
+% \dntextTwo{Dp}
+% \dntextTwo{L}
+% \dntextTwo{Lp}
+% \dntextTwo{R}
+% \dntextTwo{Rp}
+% \dntextTwo{F}
+% \dntextTwo{Fp}
+% \dntextTwo{B}
+% \dntextTwo{Bp}
+% \end{supertabular}
+%
+%
+%
+% \subsubsection{Axis rotations}
+% \label{sec:listofaxisrotations}
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnTwo{x}
+% \dnTwo{xp}
+% \dnTwo{y}
+% \dnTwo{yp}
+% \dnTwo{z}
+% \dnTwo{zp}
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnTwo{u}
+% \dnTwo{up}
+% \dnTwo{d}
+% \dnTwo{dp}
+% \dnTwo{l}
+% \dnTwo{lp}
+% \dnTwo{r}
+% \dnTwo{rp}
+% \dnTwo{f}
+% \dnTwo{fp}
+% \dnTwo{b}
+% \dnTwo{bp}
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnTwo{Uc}
+% \dnTwo{Ucp}
+% \dnTwo{Dc}
+% \dnTwo{Dcp}
+% \dnTwo{Lc}
+% \dnTwo{Lcp}
+% \dnTwo{Rc}
+% \dnTwo{Rcp}
+% \dnTwo{Fc}
+% \dnTwo{Fcp}
+% \dnTwo{Bc}
+% \dnTwo{Bcp}
+% \end{supertabular}
+%
+%
+% \begin{supertabular}[lll]{p{3cm} p{3cm} p{4.5cm}}
+% \dnTwo{CR}
+% \dnTwo{CRp}
+% \dnTwo{CL}
+% \dnTwo{CLp}
+% \dnTwo{CU}
+% \dnTwo{CUp}
+% \dnTwo{CD}
+% \dnTwo{CDp}
+% \dnTwo{CF}
+% \dnTwo{CFp}
+% \dnTwo{CB}
+% \dnTwo{CBp}
+% \end{supertabular}
+%
+%
+%
+% \section{References}
+%
+% See the \textsc{rubikcube} package documentation for a full list of references.
+%
+%
+% \section{Change history}
+%
+% \begin{itemize}
+%
+% \item Version 5.0 (February 2018)
+%
+% ---First release.
+%
+% \end{itemize}
+%
+%
+%
+%
+% ^^A =======================
+% \StopEventually{\PrintIndex}
+%
+% \bigskip\bigskip\bigskip\bigskip
+%
+% \section{The code}
+% \label{sec:thecode}
+%
+% All the 2x2x2 code here is essentially a cut-down version of the
+% 3x3x3 code (\textsc{rubikcube} package); i.e.,~we have mostly just
+% removed the 3x3x3 code relating to middle columns and rows, exchanged the
+% word `Rubik' for the word `Two' in command names, and refashioned some of the commands
+% involved in writing the temporary file \texttt{rubikstate.dat}.
+% We assume that users are familiar with the \textsc{rubikcube} and
+% \textsc{rubikrotation} package documentation.
+%
+% In order to avoid much repetition, we describe here only the
+% essential details for understanding the relatively minor changes made in order to
+% transform the earlier 3x3x3 \textsc{rubikcube} package code into
+% working 2x2x2 code. In the following, the various instances of the
+% heading `\textsc{changes:}' imply that more extensive details will be found
+% with the equivalent `Rubik' commands in the \textsc{rubikcube} or \textsc{rubikrotation}
+% package documentation.
+%
+% Relatively few 2x2x2 square hieroglyphs are required; some needed
+% reformulating from their 3x3x3 cousins, ie those associated
+% with \texttt{L,\,Lp,\,R,\,Rp,\,U,\,Up,\,D,\,Dp}.
+% The axis rotations and the rotations \texttt{F,\,Fp,\,B,\,Bp} simply required
+% renaming; for~example, as a `TwoRotationHieroglyph' (\cmd{\trh..}) instead of
+% the 3x3x3 `RubikRotationHieroglyph (\cmd{\rrh..}).
+%
+%
+%
+%
+% \subsection{Package heading}
+%
+% The `RTC' in the following refers to the package name RubikTwoCube.
+%
+% \begin{macrocode}
+%<*rubiktwocube>
+\def\RTCfileversion{5.0}%
+\def\RTCfiledate{2018/02/25}% February 25, 2018
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{rubiktwocube}[\RTCfiledate\space (v\RTCfileversion)]
+% \end{macrocode}
+% The package requires TikZ (we use the pgfmathsetmacro command)
+% ---so we load it if not already loaded.
+% \begin{macrocode}
+\@ifpackageloaded{tikz}{}{%
+ \typeout{---rubiktwocube requires the TikZ package.}%
+ \RequirePackage{tikz}}%
+% \end{macrocode}
+%
+%
+%
+% {\noindent}The package requires \texttt{rubikcube.sty}. However \texttt{rubikcube.sty}
+% is not automatically loaded (for the moment at least) since this makes it difficult
+% to errorcheck new versions, so we just write a message.
+% \begin{macrocode}
+\@ifpackageloaded{rubikcube}{}{%
+ \typeout{---rubiktwocube requires the rubikcube package.}%
+ }%
+\@ifpackageloaded{rubikrotation}{}{%
+ \typeout{---rubiktwocube requires the rubikrotation package.}%
+ }%
+% \end{macrocode}
+%
+% \begin{macro}{\rubiktwocube}
+% First we create a suitable logo
+% \begin{macrocode}
+\newcommand{\rubiktwocube}{\textsc{rubiktwocube}}%
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{Saving the Two-cube state}
+% \label{sec:codesavingtwostate}
+%
+% Note that this package writes this state data to the same `output' file
+% (\texttt{rubikstate.dat}) as used by the 3x3x3 \textsc{rubikrotation} package,
+% since there is no need to change this (since the TwoCube corners will be processed in
+% exactly the same way as for 3x3x3 cube corners).
+%
+% \begin{macro}{\@printTWOstate}
+% This internal command writes the TwoCube state data to
+% the `output' file \texttt{rubikstate.dat}, and is used by the \cmd{\TwoRotation} command
+% (see also \textsc{rubikrotation} package documentation Sections on \textit{save rubikstate}
+% and \textit{general overview} for further details).
+% The file \texttt{rubikstate.dat} is read by the Perl script, and represents
+% the state on which the \cmd{\TwoRotation} command acts.
+%
+% \textsc{changes}: Since this is a TwoCube all the non-corner facelets
+% (ie those in middle rows \& columns) are filled with X (grey).
+% We have also introduced a new line in the output file (\texttt{rubikstate.dat})
+% namely \texttt{cubesize,two} which is used to inform the Perl program that we
+% are dealing with a TwoCube.
+% \begin{macrocode}
+\newcommand{\@printTWOstate}{%
+ \@print{cubesize,two}%
+ \@print{\space \space up,\Ult,\Umt,\Urt,\Ulm,\Umm,\Urm,\Ulb,\Umb,\Urb}%
+ \@print{down,\Dlt,\Dmt,\Drt,\Dlm,\Dmm,\Drm,\Dlb,\Dmb,\Drb}%
+ \@print{left,\Llt,\Lmt,\Lrt,\Llm,\Lmm,\Lrm,\Llb,\Lmb,\Lrb}%
+ \@print{right,\Rlt,\Rmt,\Rrt,\Rlm,\Rmm,\Rrm,\Rlb,\Rmb,\Rrb}%
+ \@print{front,\Flt,\Fmt,\Frt,\Flm,\Fmm,\Frm,\Flb,\Fmb,\Frb}%
+ \@print{back,\Blt,\Bmt,\Brt,\Blm,\Bmm,\Brm,\Blb,\Bmb,\Brb}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{SaveTwoState command}
+% \label{sec:codesavetwostate}
+%
+% \begin{macro}{\SaveTwoState}
+% We create a TwoCube version of the existing \cmd{\SaveRubikState} command
+% (\textsc{rubikrotation} package), simply for symmetry and convenience.
+% This command is identical to the `Rubik' version, and will require
+% the \textsc{rubikrotation} package to be loaded already (as does the following
+% \cmd{\TwoRotation} command.
+% \begin{macrocode}
+\newcommand{\SaveTwoState}{\SaveRubikState}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+% \subsection{TwoRotation command}
+% \label{sec:codetworotation}
+%
+% Note that this command writes the data to the same file
+% (\texttt{rubikstate.dat}) as that output by the equivalent 3x3x3
+% \cmd{\RubikRotation} command, since there is no need to change this.
+%
+% Note that although the system works perfectly well even if we just continue to use the
+% 3x3x3 \cmd{\RubikRotation} command, it was felt appropriate to implement a special
+% TwoCube version of this command, since this allows the Perl script to be aware
+% (via the \texttt{cubesize,two} line written to the \texttt{rubikstate.dat} file)
+% which sort of cube it is dealing with, and hence allows the option for the program to
+% adjust its action accordingly (for example, with regard to the randomisation procedure
+% which is different for different cubes).
+%
+%
+% \begin{macro}{\TwoRotation}
+% The \cmd{\TwoRotation}\oarg{integer}\marg{comma separated sequence}
+% command (a)~writes the current TwoCube state to the file \texttt{rubikstate.dat},
+% (b)~writes the rotation sequence (either once or multiple times depending
+% on the value of the optional integer argument), and then (c)~CALLs the
+% Perl script \texttt{rubikrotation.pl}. It~also writes comments to the
+% data file and also to the log file.
+%
+% The way we allow the user to (optionally) process the main argument multiple
+% times is simply by writing the associated output command multiple
+% times to the output data-file. Consequently, we require the \cmd{\TwoRotation}
+% command to allow a square-bracket optional
+% argument (a non-negative integer) to specify the number of such repeats.
+%
+% \textsc{2x2x2 changes}: (1)~We have replaced `Rubik' by `Two' in the command-name
+% (2)~we use the command \cmd{\@printTWOstate} (see above) to write the current state data,
+% (3)~the \texttt{RTC} in the fileversion and filedate names denotes `RubikTwoCube'.
+% \begin{macrocode}
+\newcommand{\TwoRotation}[2][1]{%
+ \typeout{---TeX process}%
+ \typeout{---script = TwoRotation cmd (rubiktwocube.sty)%
+ v\RTCfileversion\space (\RTCfiledate)}%
+ \typeout{---NEW rotation command}%
+ \typeout{---command = TwoRotation[#1]{#2}}%
+ \typeout{---writing current TWOcube state to file rubikstate.dat}%
+ \@openstatefile% open data file
+ \@print{\@comment filename: rubikstate.dat}%
+ \@print{\@comment written by TwoRotation cmd (rubiktwocube.sty)%
+ v\RTCfileversion\space (\RTCfiledate)}%
+ \@printTWOstate%
+ %% countingloop code from Feuersaenger (2015)
+ \newcount\ourRRcounter%
+ \@countingloop{\ourRRcounter} in 1:{#1}{%
+ \immediate\write\outfile{rotation,#2}}%
+ \@closestatefile% close data file
+ \typeout{---CALLing Perl script (rubikrotation.pl)}%
+ \immediate\write18{\rubikperlcmd}%
+ \typeout{---inputting NEW datafile (data written by Perl script)}%
+ \input{rubikstateNEW.dat}%
+ \typeout{-----------------------------------------}%
+ }
+% \end{macrocode}
+% \end{macro}
+% As usual we require the \texttt{--shell-escape} command-line option to be used.
+% This is provided by the \textsf{shellesc} package, and is equivalent
+% to \cmd{\immediate}\cmd{\write18}.
+% In the future we may need to replace the \verb!\immediate\write18! with \verb!\ShellEscape!
+% ---see the \textsf{shellesc} package documentation.
+%
+%
+%
+%
+% \subsection{TwoFaceX macros}
+% \label{sec:codetwoface}
+%
+% Allocate the four facelet colours to each face
+% (only four facelets now).
+% \begin{macrocode}
+\newcommand{\TwoFaceUp}[4]{%
+ \def\Ult{#1}\def\Urt{#2}\def\Ulb{#3}\def\Urb{#4}}
+\newcommand{\TwoFaceFront}[4]{%
+ \def\Flt{#1}\def\Frt{#2}\def\Flb{#3}\def\Frb{#4}}
+\newcommand{\TwoFaceRight}[4]{%
+ \def\Rlt{#1}\def\Rrt{#2}\def\Rlb{#3}\def\Rrb{#4}}
+\newcommand{\TwoFaceDown}[4]{%
+ \def\Dlt{#1}\def\Drt{#2}\def\Dlb{#3}\def\Drb{#4}}
+\newcommand{\TwoFaceLeft}[4]{%
+ \def\Llt{#1}\def\Lrt{#2}\def\Llb{#3}\def\Lrb{#4}}
+\newcommand{\TwoFaceBack}[4]{%
+ \def\Blt{#1}\def\Brt{#2}\def\Blb{#3}\def\Brb{#4}}
+\newcommand{\TwoFaceUpAll}[1]{%
+ \def\Ult{#1}\def\Urt{#1}\def\Ulb{#1}\def\Urb{#1}}
+\newcommand{\TwoFaceFrontAll}[1]{%
+ \def\Flt{#1}\def\Frt{#1}\def\Flb{#1}\def\Frb{#1}}
+\newcommand{\TwoFaceRightAll}[1]{%
+ \def\Rlt{#1}\def\Rrt{#1}\def\Rlb{#1}\def\Rrb{#1}}
+\newcommand{\TwoFaceLeftAll}[1]{%
+ \def\Llt{#1}\def\Lrt{#1}\def\Llb{#1}\def\Lrb{#1}}
+\newcommand{\TwoFaceDownAll}[1]{%
+ \def\Dlt{#1}\def\Drt{#1}\def\Dlb{#1}\def\Drb{#1}}
+\newcommand{\TwoFaceBackAll}[1]{%
+ \def\Blt{#1}\def\Brt{#1}\def\Blb{#1}\def\Brb{#1}}
+% \end{macrocode}
+%
+%% set the default colour = grey = X
+% \begin{macrocode}
+\TwoFaceUpAll{X}%
+\TwoFaceDownAll{X}%
+\TwoFaceLeftAll{X}%
+\TwoFaceRightAll{X}%
+\TwoFaceFrontAll{X}%
+\TwoFaceBackAll{X}%
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\newcommand{\TwoSolvedConfig}[6]{%
+ \TwoFaceRightAll{#1}%
+ \TwoFaceLeftAll{#2}%
+ \TwoFaceUpAll{#3}%
+ \TwoFaceDownAll{#4}%
+ \TwoFaceFrontAll{#5}%
+ \TwoFaceBackAll{#6}%
+}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{Grey cube}
+% \label{sec:greycube}
+%
+%
+% \begin{macro}{\TwoCubeGrey}
+% \begin{macro}{\TwoCubeGreyAll}
+% This command sets up an all-grey Twocube. We accommodate both spellings
+% `grey' and `gray' (as used by TikZ). We include \cmd{\TwoCubeGreyAll}
+% (exactly the same) to complement the 3x3x3 version just for convenience.
+%
+% Note that we include the \cmd{\RubikCubeGreyAll} command immediately before
+% the \cmd{\TwoSolvedConfig} in order to first initialise all facelets to grey (X),
+% (since the \cmd{..Config..} command only sets the corner cubies)
+% \begin{macrocode}
+\newcommand{\TwoCubeGrey}{\RubikCubeGreyAll\TwoSolvedConfig{X}{X}{X}{X}{X}{X}}%
+\newcommand{\TwoCubeGreyAll}{\TwoCubeGrey}
+\newcommand{\TwoCubeGray}{\TwoCubeGrey}
+\newcommand{\TwoCubeGrayAll}{\TwoCubeGrey}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+% Note that we include the \cmd{\RubikCubeGreyAll} command immediately before
+% the \cmd{\TwoSolvedConfig} in order to first initialise all facelets to grey (X),
+% (since the \cmd{..Config..} command only sets the corner cubies)
+% \begin{macrocode}
+\newcommand{\TwoCubeSolvedWY}{\RubikCubeGreyAll\TwoSolvedConfig{G}{B}{W}{Y}{O}{R}}%
+\newcommand{\TwoCubeSolved}{\TwoCubeSolvedWY}%
+\newcommand{\TwoCubeSolvedWB}{\RubikCubeGreyAll\TwoSolvedConfig{R}{O}{W}{B}{G}{Y}}%
+% \end{macrocode}
+%
+%
+%
+% \subsection{Slice macros}
+% \label{sec:slice}
+%
+%
+%
+% Only top and bottom horizontal slices,
+% as viewed from TopR, TopL,BottomR,BottomL.
+% \begin{macrocode}
+\newcommand{\TwoSliceTopR}[4]{%
+ \def\Flt{#1}\def\Frt{#2}\def\Rlt{#3}\def\Rrt{#4}}
+\newcommand{\TwoSliceTopL}[4]{%
+ \def\Llt{#1}\def\Lrt{#2}\def\Flt{#3}\def\Frt{#4}}
+\newcommand{\TwoSliceBottomR}[4]{%
+ \def\Flb{#1}\def\Frb{#2}\def\Rlb{#3}\def\Rrb{#4}}
+\newcommand{\TwoSliceBottomL}[4]{%
+ \def\Llb{#1}\def\Lrb{#2}\def\Flb{#3}\def\Frb{#4}}
+%%---------------------
+\newcommand{\DrawTwoCubeFrontFace}{%
+\draw[line join=round,line cap=round,ultra thick,fill=\Flt]%
+(0,1) -- (0, 2) -- (1,2) -- (1,1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Frt]%
+(1,1) -- (1, 2) -- (2,2) -- (2,1) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Flb]%
+(0,0) -- (0, 1) -- (1,1) -- (1,0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Frb]%
+(1,0) -- (1, 1) -- (2,1) -- (2,0) -- cycle;
+}
+% \end{macrocode}
+%
+%
+%
+%
+% \subsection{DrawTwoCube.. macros}
+% \label{sec:drawtwocube}
+%
+%
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeRU}{%
+%%-----------Front face----------
+\DrawTwoCubeFrontFace %% frontface
+%%-----------Up face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(0.33,2.33) -- (0.66,2.66) -- (1.66,2.66) -- (1.33,2.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(1.33,2.33) -- (1.66,2.66) -- (2.66,2.66) -- (2.33,2.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(0,2) -- (0.33,2.33) -- (1.33,2.33) -- (1,2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(1,2) -- (1.33,2.33) -- (2.33,2.33) -- (2,2) -- cycle;
+%%-----------Right face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(2,1) -- (2, 2) -- (2.33,2.33) -- (2.33,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(2.33,1.33) -- (2.33, 2.33) -- (2.66,2.66) -- (2.66,1.66) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(2,0) -- (2, 1) -- (2.33,1.33) -- (2.33,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(2.33,0.33) -- (2.33, 1.33) -- (2.66,1.66) -- (2.66,0.66) -- cycle;
+}
+%%
+\newcommand{\DrawTwoCube}{\DrawTwoCubeRU}
+%%
+\newcommand{\DrawTwoCubeRD}{%
+\DrawTwoCubeFrontFace %% frontface
+%%----------Right face--------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(2,1) -- (2, 2) -- (2.33,1.66) -- (2.33,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(2.33,0.66) -- (2.33, 1.66) -- (2.66,1.33) -- (2.66,0.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(2,0) -- (2, 1) -- (2.33,0.66) -- (2.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(2.33,-0.33) -- (2.33, 0.66) -- (2.66,0.33) -- (2.66,-0.66) -- cycle;
+%%-----------Down face---------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(0.33,-0.33) -- (0, 0) -- (1,0) -- (1.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(1.33,-0.33) -- (1, 0) -- (2,0) -- (2.33,-0.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(0.66,-0.66) -- (0.33, -0.33) -- (1.33,-0.33) -- (1.66,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(1.66,-0.66) -- (1.33, -0.33) -- (2.33,-0.33) -- (2.66,-0.66) -- cycle;
+}
+%%
+\newcommand{\DrawTwoCubeLD}{%
+\DrawTwoCubeFrontFace %% frontface
+%%------------Left face--------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(-0.66,0.33) -- (-0.66, 1.33) -- (-0.33,1.66) -- (-0.33,0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(-0.33,0.66) -- (-0.33, 1.66) -- (0,2) -- (0,1) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(-0.66,-0.66) -- (-0.66, 0.33) -- (-0.33,0.66) -- (-0.33,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(-0.33,-0.33) -- (-0.33, 0.66) -- (0,1) -- (0,0) -- cycle;
+%%------------Down face----------
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(-0.33,-0.33) -- (0, 0) -- (1,0) -- (0.66,-0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(0.66,-0.33) -- (1, 0) -- (2,0) -- (1.66,-0.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(-0.66,-0.66) -- (-0.33, -0.33) -- (0.66,-0.33) -- (0.33,-0.66) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(0.33,-0.66) -- (0.66, -0.33) -- (1.66,-0.33) -- (1.33,-0.66) -- cycle;
+}
+%%
+\newcommand{\DrawTwoCubeLU}{%
+\DrawTwoCubeFrontFace %% frontface
+%%-----------Left face-----------
+%%------top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(-0.66,1.66) -- (-0.66, 2.66) -- (-0.33,2.33) -- (-0.33,1.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(-0.33,1.33) -- (-0.33, 2.33) -- (0,2) -- (0,1) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(-0.66,0.66) -- (-0.66, 1.66) -- (-0.33,1.33) -- (-0.33,0.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(-0.33,0.33) -- (-0.33, 1.33) -- (0,1) -- (0,0) -- cycle;
+%%-----------Up face---------
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(-0.33,2.33) -- (-0.66, 2.66) -- (0.33,2.66) -- (0.66,2.33) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(0.66,2.33) -- (0.33, 2.66) -- (1.33,2.66) -- (1.66,2.33) -- cycle;
+%%---bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(0,2) -- (-0.33, 2.33) -- (0.66,2.33) -- (1,2) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(1,2) -- (0.66, 2.33) -- (1.66,2.33) -- (2,2) -- cycle;
+}
+% \end{macrocode}
+%
+%
+% \subsection{DrawTwoFlat.. macros}
+% \label{sec:drawtwoflat}
+%
+% These `Flat' macros draw a specified face with its origin
+% (left bottom corner of the face) at a specified $(x,y)$ coordinate.
+% They allow USERS to place the image of a face at a specific location.
+%
+%
+% \begin{macrocode}
+%%----------------------
+\newcommand{\DrawTwoFlatUp}[2]{%
+\pgfmathsetmacro{\ux}{#1}%
+\pgfmathsetmacro{\uy}{#2}%
+%%-----top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ult]%
+(\ux + 0,\uy + 1) -- (\ux + 0,\uy + 2) -- (\ux + 1,\uy + 2)%
+ -- (\ux + 1,\uy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urt]%
+(\ux + 1,\uy + 1) -- (\ux + 1,\uy + 2) -- (\ux + 2,\uy + 2)%
+ -- (\ux + 2,\uy + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Ulb]%
+(\ux + 0,\uy + 0) -- (\ux + 0,\uy + 1) -- (\ux + 1,\uy + 1)%
+ -- (\ux + 1,\uy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Urb]%
+(\ux + 1,\uy + 0) -- (\ux + 1,\uy + 1) -- (\ux + 2,\uy + 1)%
+ -- (\ux + 2,\uy + 0) -- cycle;
+}
+%%-------------------------
+\newcommand{\DrawTwoFlatDown}[2]{%
+\pgfmathsetmacro{\ddx}{#1}%
+\pgfmathsetmacro{\ddy}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlt]%
+(\ddx + 0,\ddy + 1) -- (\ddx + 0,\ddy + 2) -- (\ddx + 1,\ddy + 2)%
+ -- (\ddx + 1,\ddy + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drt]%
+(\ddx + 1,\ddy + 1) -- (\ddx + 1,\ddy + 2) -- (\ddx + 2,\ddy + 2)%
+ -- (\ddx + 2,\ddy + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Dlb]%
+(\ddx + 0,\ddy + 0) -- (\ddx + 0,\ddy + 1) -- (\ddx + 1,\ddy + 1)%
+ -- (\ddx + 1,\ddy + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Drb]%
+(\ddx + 1,\ddy + 0) -- (\ddx + 1,\ddy + 1) -- (\ddx + 2,\ddy + 1)%
+ -- (\ddx + 2,\ddy + 0) -- cycle;
+}
+%%-------------------------
+\newcommand{\DrawTwoFlatLeft}[2]{%
+\pgfmathsetmacro{\lx}{#1}%
+\pgfmathsetmacro{\ly}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llt]%
+(\lx + 0, \ly + 1) -- (\lx + 0, \ly + 2) -- (\lx + 1, \ly + 2)%
+ -- (\lx + 1, \ly + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrt]%
+(\lx + 1, \ly + 1) -- (\lx + 1, \ly + 2) -- (\lx + 2, \ly + 2)%
+ -- (\lx + 2, \ly + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Llb]%
+(\lx + 0, \ly + 0) -- (\lx + 0, \ly + 1) -- (\lx + 1, \ly + 1)%
+ -- (\lx + 1, \ly + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Lrb]%
+(\lx + 1, \ly + 0) -- (\lx + 1, \ly + 1) -- (\lx + 2, \ly + 1)%
+ -- (\lx + 2, \ly + 0) -- cycle;
+}
+%%--------------------------
+\newcommand{\DrawTwoFlatRight}[2]{%
+\pgfmathsetmacro{\rx}{#1}%
+\pgfmathsetmacro{\ry}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlt]%
+(\rx + 0, \ry + 1) -- (\rx + 0, \ry + 2) -- (\rx + 1, \ry + 2)%
+ -- (\rx + 1, \ry + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrt]%
+(\rx + 1, \ry + 1) -- (\rx + 1, \ry + 2) -- (\rx + 2, \ry + 2)%
+ -- (\rx + 2, \ry + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Rlb]%
+(\rx + 0, \ry + 0) -- (\rx + 0, \ry + 1) -- (\rx + 1, \ry + 1)%
+ -- (\rx + 1, \ry + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Rrb]%
+(\rx + 1, \ry + 0) -- (\rx + 1, \ry + 1) -- (\rx + 2, \ry + 1)%
+ -- (\rx + 2, \ry + 0) -- cycle;
+}
+%%--------------
+\newcommand{\DrawTwoFlatFront}{%
+%% This command is used /only/ by the \cmd{\DrawRubikFlat} command.
+%% NOTE: x, y variables not implemented as not required here
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Flt]%
+(0,1) -- (0, 2) -- (1,2) -- (1,1) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Frt]%
+(1,1) -- (1, 2) -- (2,2) -- (2,1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Flb]%
+(0,0) -- (0, 1) -- (1,1) -- (1,0) -- cycle;
+%%
+\draw[line join=round,line cap=round,ultra thick,fill=\Frb]%
+(1,0) -- (1, 1) -- (2,1) -- (2,0) -- cycle;
+}
+%%--------------------------
+\newcommand{\DrawTwoFlatBack}[2]{%
+\pgfmathsetmacro{\bx}{#1}%
+\pgfmathsetmacro{\by}{#2}%
+%%---top row
+\draw[line join=round,line cap=round,ultra thick,fill=\Blt]%
+(\bx + 0,\by + 1) -- (\bx + 0,\by + 2) -- (\bx + 1,\by + 2)%
+ -- (\bx + 1,\by + 1) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Brt]%
+(\bx + 1,\by + 1) -- (\bx + 1,\by + 2) -- (\bx + 2,\by + 2)%
+ -- (\bx + 2,\by + 1) -- cycle;
+%%----bottom row
+\draw[line join=round,line cap=round,ultra thick,fill=\Blb]%
+(\bx + 0,\by + 0) -- (\bx + 0,\by + 1) -- (\bx + 1,\by + 1)%
+ -- (\bx + 1,\by + 0) -- cycle;
+\draw[line join=round,line cap=round,ultra thick,fill=\Brb]%
+(\bx + 1,\by + 0) -- (\bx + 1,\by + 1) -- (\bx + 2,\by + 1)%
+ -- (\bx + 2,\by + 0) -- cycle;
+}
+%%------------------------------
+\newcommand{\DrawTwoCubeF}{%
+ \DrawTwoFlatUp{0}{2}%
+ \DrawTwoFlatDown{0}{-2}%
+ \DrawTwoFlatLeft{-2}{0}%
+ \DrawTwoFlatFront%
+ \DrawTwoFlatRight{2}{0}%
+ \DrawTwoFlatBack{4}{0}%
+}
+%%
+\newcommand{\DrawTwoCubeSF}{%
+ \DrawTwoCubeRU% RU
+ \DrawTwoFlatDown{0}{-2}%
+ \DrawTwoFlatLeft{-2}{0}%
+ \DrawTwoFlatBack{2.666}{0.66}%
+}
+% \end{macrocode}
+%
+%
+%
+%
+%
+%
+% \subsection{Sidebars (Face)}
+% \label{sec:sidebarsfacecode}
+%
+%
+% Making sidebar macros for a TwoCube (converting the 3x3x3x versions
+% to the 2x2x2 versions).
+% {\newline} (1) change name $\rightarrow$ \verb!TWOside@barX!
+% {\newline} (2) change the value \verb!(3 + \bs)! $\rightarrow$ \verb!(2 + \tbs)!
+% (as only two squares on a side).
+% {\newline} (3) change the Sidebar length parameter names by adding a \cmd{\t} prefix
+% to distinguish the TwoCube parameters from those of the RubikCube. Thus we change
+% the Rubik names (\cmd{\dx}, \cmd{\dy}, \cmd{\bw}, \cmd{\bl}, \cmd{\blh}, \cmd{\bs})
+% to their equivalent Two names (\cmd{\tdx}, \cmd{\tdy}, \cmd{\tbw}, \cmd{\tbl},
+% \cmd{\tblh}, \cmd{\tbs}).
+%
+% The coordinates of the bottom left corner of a TwoSidebar are (\cmd{\tdx}, \cmd{\tdy}).
+% The other parameters are width (\cmd{\tbw}), length (\cmd{\tbl}),
+% half length (\cmd{\tblh}), separation (\cmd{\tbs}).
+%
+% \begin{macro}{\TwoSidebarWidth}
+% \begin{macro}{\TwoSidebarLength}
+% \begin{macro}{\TwoSidebarSep}
+% These commands set the width, length and separation of the Sidebars.
+% Each takes a single scalar argument (no units).
+% \newline\textsc{usage}: \cmd{\TwoSidebarWidth}\marg{0.5}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\newcommand{\TwoSidebarWidth}[1]{\pgfmathsetmacro{\tbw}{#1}}
+\newcommand{\TwoSidebarLength}[1]{\pgfmathsetmacro{\tbl}{#1}}
+\newcommand{\TwoSidebarSep}[1]{\pgfmathsetmacro{\tbs}{#1}}
+% \end{macrocode}
+% We first set some default values. We have set the Sidebar
+% width and separation to 2/3 those of the Rubik 3x3x3 values
+% (so that when a 3x3x3 cube and a 2x2x2 cube
+% are scaled to be the same size, then the Sidebar width and sep will be the same)
+% These also seem to look good generally as well.
+% Of course, users can adjust these as they wish anyway. Any new values will
+% will of course act globally unless constrained (either by using curley brackets, or
+% by writing them into a \TeX\ environment).
+% \begin{macrocode}
+\TwoSidebarWidth{0.2}
+\TwoSidebarLength{1.0}
+\TwoSidebarSep{0.2}
+% \end{macrocode}
+%
+%
+% \begin{macro}{\NoSidebar}
+% This command \cmd{\NoSidebar}\marg{colour code} (defined in the \textsc{rubikcube} package)
+% defines the colour for which sidebars should \textit{not} be drawn
+% (particularly useful when drawing OLL configurations).
+% This idea was suggested by Robert Ma\v{r}\'{\i}k (May 2017).
+% {\newline}The principle is that we let the command \cmd{\NoSidebar} define a face colour,
+% and then we use the \verb!\ifthenelse{\equal{#2}{\no@sidebar}}{}{...}! structure to either
+% (a)~draw all sidebars as usual (if \cmd{\NoSidebar} is undefined),
+% or (b)~draw all sidebars \textit{except} those having the \cmd{\NoSidebar} colour
+% (if \cmd{\NoSidebar} colour = \verb!#2!).
+% \newline\textsc{usage}: \verb!\NoSidebar{X}! \ If this command in \textit{not} inside
+% an environment, then its action will continue until it is cancelled (undefined)
+% as follows: \verb!\NoSidebar{}!.
+% \end{macro}
+%
+% \medskip
+%
+% \begin{macro}{\TWOside@barL}
+% \begin{macro}{\TWOside@barR}
+% \begin{macro}{\TWOside@barT}
+% \begin{macro}{\TWOside@barB}
+
+% These commands \cmd{\TWOside@barX}\marg{position no}\marg{facelet location} (where
+% X is one of L~(Left), R~(Right), T~(Top), B~(Bottom), which denote the side of the
+% 2x2 square representing a face), draw a single small bar in a position (1, or 2),
+% having the colour of a specified facelet. The integers 1, 2 denote the facelet number
+% (measured from the grid origin = bottom left corner of the face)
+% adjacent to which the bar is positioned.
+%
+% These macros are used in the various `Sidebar' commands which draw pairs of
+% these small bars adjacent to specified faces.
+% \newline\textsc{changes}: Rubik $\rightarrow$ Two, \cmd{\bw} $\rightarrow$ \cmd{\tbw},
+% \cmd{\bl} $\rightarrow$ \cmd{\tbl}, \cmd{\bs} $\rightarrow$ \cmd{\tbs},
+% \cmd{\dx} $\rightarrow$ \cmd{\tdx}, \cmd{\dy} $\rightarrow$ \cmd{\tdy}
+% (see Section~\ref{sec:sidebarscode} for details of these variables).
+% \newline\textsc{usage}: \verb!\TWOside@barL{2}{\Lrt}!
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barL}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{0 - \tbs - \tbw}%
+ \pgfmathsetmacro{\tdy}{#1-1+0.5-\tblh}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;
+}}
+%% changed Rubik value (3 + \bs) --> (2 + \tbs) (as only TWO squares)
+\newcommand{\TWOside@barR}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{2 + \tbs}%
+ \pgfmathsetmacro{\tdy}{#1 -1+0.5-\tblh}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;
+}}
+%% changed Rubik value (3 + \bs) --> (2 + \tbs) (as only TWO squares)
+\newcommand{\TWOside@barT}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh}%
+ \pgfmathsetmacro{\tdy}{2 +\tbs}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+\newcommand{\TWOside@barB}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh}%
+ \pgfmathsetmacro{\tdy}{0 -\tbs-\tbw}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+% \end{macrocode}
+%
+
+
+%
+% \subsubsection{DrawTwoFaceXSide macros}
+% \label{sec:drawtwofacexside}
+%
+% Only 2 bars on each side for a TwoCube.
+% Change from 3x3x3: we remove the middle cols \& row sections
+% change name DrawRubikLayerSide --> DrawTwoLayerSide
+%
+% RWDN 16 Feb 2018
+% v5: removed many (duplicated and unnecessary) macros, and replaced them
+% with these TwoFace.. macros using just the basic \cmd{\TWOside@bar..} macros
+% for drawing small single bars.
+%
+% These new macros draw a specified face (using the ..Flat.. commands)
+% as well as all the associated sidebars.
+% Note we continue to use the key-word `Side' here to indicate we are
+% drawing all the sidebars, since we are drawing a face.
+% (only for 3D cubes do we use the word `SidebarXX' for denoting a particular
+% Sidebar to be drawn etc.)
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoFaceUpSide}{%
+ \DrawTwoFlatUp{0}{0}%
+ \TWOside@barT{1}{\Brt}%
+ \TWOside@barT{2}{\Blt}%
+ \TWOside@barL{2}{\Llt}%
+ \TWOside@barL{1}{\Lrt}%
+ \TWOside@barR{2}{\Rrt}%
+ \TWOside@barR{1}{\Rlt}%
+ \TWOside@barB{1}{\Flt}%
+ \TWOside@barB{2}{\Frt}%
+}
+\newcommand{\DrawTwoFaceFrontSide}{%
+ \DrawTwoFlatFront{0}{0}%
+ \TWOside@barT{1}{\Ulb}%
+ \TWOside@barT{2}{\Urb}%
+ \TWOside@barL{2}{\Lrt}%
+ \TWOside@barL{1}{\Lrb}%
+ \TWOside@barR{2}{\Rlt}%
+ \TWOside@barR{1}{\Rlb}%
+ \TWOside@barB{1}{\Dlt}%
+ \TWOside@barB{2}{\Drt}%
+}
+\newcommand{\DrawTwoFaceRightSide}{%
+ \DrawTwoFlatRight{0}{0}%
+ \TWOside@barT{1}{\Urb}%
+ \TWOside@barT{2}{\Urt}%
+ \TWOside@barL{2}{\Frt}%
+ \TWOside@barL{1}{\Frb}%
+ \TWOside@barR{2}{\Blt}%
+ \TWOside@barR{1}{\Blb}%
+ \TWOside@barB{1}{\Drt}%
+ \TWOside@barB{2}{\Drb}%
+}
+\newcommand{\DrawTwoFaceLeftSide}{%
+ \DrawTwoFlatLeft{0}{0}%
+ \TWOside@barT{1}{\Ult}%
+ \TWOside@barT{2}{\Ulb}%
+ \TWOside@barL{2}{\Brt}%
+ \TWOside@barL{1}{\Brb}%
+ \TWOside@barR{2}{\Flt}%
+ \TWOside@barR{1}{\Flb}%
+ \TWOside@barB{1}{\Dlb}%
+ \TWOside@barB{2}{\Dlt}%
+}
+\newcommand{\DrawTwoFaceBackSide}{%
+ \DrawTwoFlatBack{0}{0}%
+ \TWOside@barT{1}{\Urt}%
+ \TWOside@barT{2}{\Ult}%
+ \TWOside@barL{2}{\Rrt}%
+ \TWOside@barL{1}{\Rrb}%
+ \TWOside@barR{2}{\Llt}%
+ \TWOside@barR{1}{\Llb}%
+ \TWOside@barB{1}{\Drb}%
+ \TWOside@barB{2}{\Dlb}%
+}
+\newcommand{\DrawTwoFaceDownSide}{%
+ \DrawTwoFlatDown{0}{0}%
+ \TWOside@barT{1}{\Flb}%
+ \TWOside@barT{2}{\Frb}%
+ \TWOside@barL{2}{\Lrb}%
+ \TWOside@barL{1}{\Llb}%
+ \TWOside@barR{2}{\Rlb}%
+ \TWOside@barR{1}{\Rrb}%
+ \TWOside@barB{1}{\Brb}%
+ \TWOside@barB{2}{\Blb}%
+}
+%%
+%% v5: made Face versions (for USER) without the (x,y) coordinates
+\newcommand{\DrawTwoFaceUp}{\DrawTwoFlatUp{0}{0}}
+\newcommand{\DrawTwoFaceDown}{\DrawTwoFlatDown{0}{0}}
+\newcommand{\DrawTwoFaceLeft}{\DrawTwoFlatLeft{0}{0}}
+\newcommand{\DrawTwoFaceRight}{\DrawTwoFlatRight{0}{0}}
+\newcommand{\DrawTwoFaceFront}{\DrawTwoFlatFront{0}{0}}
+\newcommand{\DrawTwoFaceBack}{\DrawTwoFlatBack{0}{0}}
+%%
+%% v5: made short forms --> abbreviations
+\newcommand{\DrawTwoFaceU}{\DrawTwoFlatUp{0}{0}}
+\newcommand{\DrawTwoFaceD}{\DrawTwoFlatDown{0}{0}}
+\newcommand{\DrawTwoFaceL}{\DrawTwoFlatLeft{0}{0}}
+\newcommand{\DrawTwoFaceR}{\DrawTwoFlatRight{0}{0}}
+\newcommand{\DrawTwoFaceF}{\DrawTwoFlatFront{0}{0}}
+\newcommand{\DrawTwoFaceB}{\DrawTwoFlatBack{0}{0}}
+%%
+%% v5: made short forms --> abbreviations
+\newcommand{\DrawTwoFaceUS}{\DrawTwoFaceUpSide}
+\newcommand{\DrawTwoFaceDS}{\DrawTwoFaceDownSide}
+\newcommand{\DrawTwoFaceLS}{\DrawTwoFaceLeftSide}
+\newcommand{\DrawTwoFaceRS}{\DrawTwoFaceRightSide}
+\newcommand{\DrawTwoFaceFS}{\DrawTwoFaceFrontSide}
+\newcommand{\DrawTwoFaceBS}{\DrawTwoFaceBackSide}
+% \end{macrocode}
+%
+%
+%
+%
+%
+% \subsection{Sidebars (Cube)}
+% \label{sec:sidebarscubecode}
+%
+%
+% In order to position sidebars adjacent to a TwoCube (ie in 3D)
+% requires that we first make some new \cmd{\TWOside@bar..}
+% commands which draw sidebars adjacent to the \textsc{back} face
+% (we have already made the macros for the front
+% face sidebars---see Section~\ref{sec:sidebarsfacecode}).
+% Furthermore, these new macros need to be tailored to each of the
+% four standard cube viewing directions RU, LU, RD, LD.
+%
+% Finally, the USER commands for drawing these sidebars need
+% to accommodate (a)~some code for identifying each set of sidebars,
+% and (b)~the viewing direction. So, for example, a USER command for
+% drawing the sidebars associated with the cube edge formed
+% by the \textsc{right} face and the \textsc{back} face
+% (lets define this as the RB sidebar) as viewed from the RU direction,
+% might be something like \cmd{\DrawTwoCubeSidebarRBRU}.
+% Since this is not particularly user-friendly,
+% we can improve on this slightly for the USER by
+% (a)~defining the sidebar as \texttt{SidebarRB}, and
+% (b)~appending the view direction in a curly bracket, say as \verb!{RU}!.
+% This allows a more intuitive command structure for the USER,
+% as follows: \verb!\DrawTwoCubeSidebarRB{RU}!.
+% We then use the \cmd{\@join} command to append the string \verb!RU! to the string
+% \verb!DrawTwoCubeSidebarRB! forming the (internal)
+% command \cmd{\DrawTwoCubeSidebarRBRU}.
+%
+% In the following we will group the development according to to the view direction.
+%
+%
+%
+% \subsubsection{Sidebars: RU view}
+%
+% \subsubsection*{Right-Back vert sidebar (RU view)}
+%
+% Need to write a new \cmd{\TWOside@barR..} command
+% (see Section~\ref{sec:sidebarsfacecode}).
+% This draws only a single small bar.
+% Each of the two small bars has a numbered position (1,2);
+% (dx,dy) = bottom Left corner of single bar
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barRbackRU}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% tdx --> tdx + (2/3)
+ %% tdy --> tdy + (2/3)
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{2 + \tbs +0.666}%
+ \pgfmathsetmacro{\tdy}{#1 -1+0.5-\tblh +0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;%
+}}
+% \end{macrocode}
+% Now make the RB (RightBack) vertical sidebar command;
+% ie bar~1 is at the bottom; bar~2 is at the top.
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarRBRU}{%
+ \TWOside@barRbackRU{2}{\Blt}%
+ \TWOside@barRbackRU{1}{\Blb}%
+}
+% \end{macrocode}
+% Now make the reverse command (BR) = RB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBRRU}{\DrawTwoCubeSidebarRBRU}
+% \end{macrocode}
+% Finally, make the join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarRB}[1]{\@join{\DrawTwoCubeSidebarRB}{#1}}
+\newcommand{\DrawTwoCubeSidebarBR}[1]{\@join{\DrawTwoCubeSidebarBR}{#1}}
+% \end{macrocode}
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Up-Back horiz sidebar (RU view)}
+%
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barTbackRU}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% tdx --> tdx + (2/3)
+ %% tdy --> tdy + (2/3)
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh +0.666}%
+ \pgfmathsetmacro{\tdy}{2 +\tbs +0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the UB (Up-Back) horizontal sidebar command;
+% ie bar~1 is on the left, bar~2 is on the right (as we look at the cube).
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarUBRU}{%
+ \TWOside@barTbackRU{1}{\Brt}%
+ \TWOside@barTbackRU{2}{\Blt}%
+}
+% \end{macrocode}
+% Now make the reverse command (BU) = UB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBURU}{\DrawTwoCubeSidebarUBRU}
+% \end{macrocode}
+% Now make the join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarUB}[1]{\@join{\DrawTwoCubeSidebarUB}{#1}}
+\newcommand{\DrawTwoCubeSidebarBU}[1]{\@join{\DrawTwoCubeSidebarBU}{#1}}
+% \end{macrocode}
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Left vert sidebar (RU view)}
+%
+% Since this is a front-face sidebar we can use the regular
+% \cmd{TWOside@barL..} command.
+% Now make the FL (Front-Left) vertical sidebar command;
+% ie bar~1 is at the bottom; bar~2 is at the top.
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFLRU}{%
+ \TWOside@barL{2}{\Lrt}%
+ \TWOside@barL{1}{\Lrb}%
+}
+% \end{macrocode}
+% Now do the reverse (LF)
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarLFRU}{\DrawTwoCubeSidebarFLRU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFL}[1]{\@join{\DrawTwoCubeSidebarFL}{#1}}
+\newcommand{\DrawTwoCubeSidebarLF}[1]{\@join{\DrawTwoCubeSidebarLF}{#1}}
+% \end{macrocode}
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Down horiz sidebar (RU view)}
+%
+% Since this is a front face sidebar we can use the regular
+% \cmd{TWOside@barL..} command.
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFDRU}{%
+ \TWOside@barB{1}{\Dlt}%
+ \TWOside@barB{2}{\Drt}%
+}
+% \end{macrocode}
+% Now do the reverse (DF) = FD
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarDFRU}{\DrawTwoCubeSidebarFDRU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFD}[1]{\@join{\DrawTwoCubeSidebarFD}{#1}}
+\newcommand{\DrawTwoCubeSidebarDF}[1]{\@join{\DrawTwoCubeSidebarDF}{#1}}
+% \end{macrocode}
+% But FD-LU is the same as FD-RU, so we need to make copies of each.
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarDFLU}{\DrawTwoCubeSidebarDFRU}
+\newcommand{\DrawTwoCubeSidebarFDLU}{\DrawTwoCubeSidebarFDRU}
+% \end{macrocode}
+%
+%
+%
+% \medskip
+%
+% \subsubsection{Sidebars: LU view}
+%
+%
+% \subsubsection*{Left-Back vert sidebar (LU view)}
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barLbackLU}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% tdx --> tdx - 2/3
+ %% tdy --> tdy + 2/3
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{0 - \tbs -\tbw -0.666}%
+ \pgfmathsetmacro{\tdy}{#1 -1+0.5-\tblh +0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the LB (LeftBack) vertical sidebar command;
+% bar~1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarLBLU}{%
+ \TWOside@barLbackLU{2}{\Brt}%
+ \TWOside@barLbackLU{1}{\Brb}%
+}
+% \end{macrocode}
+% Now do the reverse (BL) = LB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBLLU}{\DrawTwoCubeSidebarLBLU}
+% \end{macrocode}
+% Now make the join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarLB}[1]{\@join{\DrawTwoCubeSidebarLB}{#1}}
+\newcommand{\DrawTwoCubeSidebarBL}[1]{\@join{\DrawTwoCubeSidebarBL}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Up-Back horizontal sidebar (LU view)}
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barTbackLU}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% tdx --> tdx-2/3
+ %% tdy --> tdy+2/3
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh -0.666}%
+ \pgfmathsetmacro{\tdy}{2 +\tbs +0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the UB (Up-Back) version
+% bar~1 is at the left, 2 on the right.
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarUBLU}{%
+ \TWOside@barTbackLU{1}{\Brt}%
+ \TWOside@barTbackLU{2}{\Blt}%
+}
+% \end{macrocode}
+% Now do the reverse (BU) = UB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBULU}{\DrawTwoCubeSidebarUBLU}
+% \end{macrocode}
+% We do NOT need to make the join commands here
+% as the USER commands for BU and UB are the same as for the RU
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Right vertical sidebar (LU view)}
+%
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFRLU}{%
+ \TWOside@barR{2}{\Rlt}%
+ \TWOside@barR{1}{\Rlb}%
+}
+% \end{macrocode}
+% Now do the reverse (RF)
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarRFLU}{\DrawTwoCubeSidebarFRLU}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFR}[1]{\@join{\DrawTwoCubeSidebarFR}{#1}}
+\newcommand{\DrawTwoCubeSidebarRF}[1]{\@join{\DrawTwoCubeSidebarRF}{#1}}
+% \end{macrocode}
+%
+%
+% \subsubsection{Sidebars: RD view}
+%
+% \medskip
+%
+% \subsubsection*{Front-Up horizontal sidebar (RD view)}
+%
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFURD}{%
+ \TWOside@barT{1}{\Ulb}%
+ \TWOside@barT{2}{\Urb}%
+}
+% \end{macrocode}
+% Now do the reverse (UF) = FU
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarUFRD}{\DrawTwoCubeSidebarFURD}
+% \end{macrocode}
+% Now do the two join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFU}[1]{\@join{\DrawTwoCubeSidebarFU}{#1}}
+\newcommand{\DrawTwoCubeSidebarUF}[1]{\@join{\DrawTwoCubeSidebarUF}{#1}}
+% \end{macrocode}
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Left vertical sidebar (RD view)}
+%
+%
+% Only need to copy an earlier command here since FL, RD view = same as for RU view.
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFLRD}{\DrawTwoCubeSidebarFLRU}
+\newcommand{\DrawTwoCubeSidebarLFRD}{\DrawTwoCubeSidebarLFRU}
+% \end{macrocode}
+%
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Right-Back vertical sidebar (RD view)}
+%
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barRbackRD}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% tdx --> tdx + (2/3)
+ %% tdy --> tdy - (2/3)
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{2 + \tbs +0.666}%
+ \pgfmathsetmacro{\tdy}{#1 -1+0.5-\tblh -0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the RB (RightBack) version
+% bar~1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarRBRD}{%
+\TWOside@barRbackRD{2}{\Blt}%
+\TWOside@barRbackRD{1}{\Blb}%
+}
+% \end{macrocode}
+% now do the reverse (BR) = RB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBRRD}{\DrawTwoCubeSidebarRBRD}
+% \end{macrocode}
+% Do NOT need to make the join commands (as same as for the RU view)
+%
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Down-Back horizotal sidebar (RD view)}
+%
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barBbackRD}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% tdx --> tdx+2/3
+ %% tdy --> tdy-2/3
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh +0.666}%
+ \pgfmathsetmacro{\tdy}{0 -\tbs - \tbw -0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the DB (Down-Back) version
+% bar~1 is at the left, 2 on the right (as we look at the cube)
+%
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarDBRD}{%
+ \TWOside@barBbackRD{1}{\Brb}%
+ \TWOside@barBbackRD{2}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BD) = DB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBDRD}{\DrawTwoCubeSidebarDBRD}
+% \end{macrocode}
+%% Now make the join commands
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarDB}[1]{\@join{\DrawTwoCubeSidebarDB}{#1}}
+\newcommand{\DrawTwoCubeSidebarBD}[1]{\@join{\DrawTwoCubeSidebarBD}{#1}}
+% \end{macrocode}
+%
+%
+% \subsubsection{Sidebars: LD view}
+%
+%
+% \medskip
+%
+% \subsubsection*{Front-Up horizotal sidebar (LD view)}
+%
+% But FU (LD view) is the same as for (RU view), (see above)
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFULD}{\DrawTwoCubeSidebarFURD}
+\newcommand{\DrawTwoCubeSidebarUFLD}{\DrawTwoCubeSidebarUFRD}
+% \end{macrocode}
+%
+% \medskip
+%
+% \subsubsection*{Front-Right vertical sidebar (LD view)}
+%
+% But FR (LDview) is the same as for (LU view), (see above)
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarFRLD}{\DrawTwoCubeSidebarFRLU}
+\newcommand{\DrawTwoCubeSidebarRFLD}{\DrawTwoCubeSidebarRFLU}
+% \end{macrocode}
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Left-Back vertical sidebar (LD view)}
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barLbackLD}[2]{%
+ %% #1 = cubie possn no, #2 = colour
+ %% tdx --> tdx-2/3
+ %% tdy --> tdy-2/3
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{0 - \tbs -\tbw -0.666}%
+ \pgfmathsetmacro{\tdy}{#1 -1+0.5-\tblh -0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbl)
+ -- (\tdx+\tbw,\tdy+\tbl) -- (\tdx+\tbw,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the LB (LeftBack) version
+% bar~1 is at the bottom
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarLBLD}{%
+ \TWOside@barLbackLD{2}{\Brt}%
+ \TWOside@barLbackLD{1}{\Brb}%
+}
+% \end{macrocode}
+% Now do the reverse (BL) = LB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBLLD}{\DrawTwoCubeSidebarLBLD}
+% \end{macrocode}
+% Do NOT need to make the join commands (same as for the LU view)
+%
+%
+%
+% \medskip
+%
+% \subsubsection*{Down-Back horizontal sidebar (LD view)}
+%
+%
+%
+% \begin{macrocode}
+\newcommand{\TWOside@barBbackLD}[2]{%
+ %% #1 = cubie possn no; #2 = colour
+ %% tdx --> tdx-2/3
+ %% tdy --> tdy-2/3
+ \ifthenelse{\equal{#2}{\no@sidebar}}{}{%
+ \pgfmathsetmacro{\tblh}{\tbl*(0.5)}%
+ \pgfmathsetmacro{\tdx}{#1 -1+0.5-\tblh -0.666}%
+ \pgfmathsetmacro{\tdy}{0 -\tbs - \tbw -0.666}%
+ \draw[fill=#2] (\tdx,\tdy) -- (\tdx,\tdy + \tbw)
+ -- (\tdx+\tbl,\tdy+\tbw) -- (\tdx+\tbl,\tdy) -- cycle;
+}}
+% \end{macrocode}
+% Now make the DB (Down-Back) version
+% bar~1 is at the left, 2 on the right (as we look at the cube)
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarDBLD}{%
+\TWOside@barBbackLD{1}{\Brb}%
+\TWOside@barBbackLD{2}{\Blb}%
+}
+% \end{macrocode}
+% Now do the reverse (BD) = DB
+% \begin{macrocode}
+\newcommand{\DrawTwoCubeSidebarBDLD}{\DrawTwoCubeSidebarDBLD}
+% \end{macrocode}
+% Do NOT need to make any join commands (same as for the RD view)
+%
+%
+%
+%
+% \subsection{\hspace{3mm}Hieroglyphs}
+% \label{sec:codehieroglyphs}
+%
+% Not many changes to make (from rubikcube sty). In general we try to
+% keep things fairly intuitive by changing Rubik $\rightarrow$ Two,
+% and changing r $\rightarrow$ t.
+% Note that since this package uses a lot of commands defined in the
+% \texttt{rubikcube} package, eg the `join' utility and the rubikfont,
+% consequently rubikcube sty needs to be loaded when running this package.
+%
+% We only need to make significant changes to the
+% following hieroglyphs: L,R,U,D,Lp,Rp,Up,Dp.
+%
+% Unchanged are: axis rotations (eg Rc) and letter rotations (eg B),
+% so these hieroglyphs just need newdefs making for them;
+% eg trF $\leftarrow$ rrF, etc
+%
+% We need to rename some of the `square' furniture associated with the L,R,U,D etc face
+% rotation hieroglyphs: for example, the D heiroglyph requires the following:
+%{\newline} change rr $\rightarrow$ tr
+%{\newline} change SquareD $\rightarrow$ SquaretD
+%{\newline} change RubikD $\rightarrow$ TwoD
+%{\newline} change textRubikD $\rightarrow$ textTwoD
+%
+% For a TWOcube we only need to make two lines in a square;
+% ie we want to shift the top line down/sideways
+% and shift the bottom line up/sideways by
+% an amount which makes the final position = 1/3 of the square.
+% Since the top and bottom lines (and also the left and right lines)
+% are at 0.25 unit,
+% then the extra distance = 0.25/3 = 0.0833;
+% so for horiz lines we add/subtract @ty, and
+% for vertical lines we add/subtract @tx.
+%
+% \begin{macro}{\@tx}
+% \begin{macro}{\@ty}
+%\begin{macrocode}
+\pgfmathsetmacro{\@tx}{0.0833}
+\pgfmathsetmacro{\@ty}{0.0833}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% We continue to use the rubikfont.
+%
+% \begin{macro}{\@tr}
+% \begin{macro}{\@trp}
+% \begin{macrocode}
+\newcommand{\@tr}[1]{{\@rubikfont #1}}
+\newcommand{\@trp}[1]{{\@rubikfont #1\@rubikprime}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% We need to rename the basic `join' commands: ie change Rubik $\rightarrow$ Two, and
+% change r $\rightarrow$ t, as follows:
+%
+% \begin{macro}{\tr}
+% \begin{macro}{\trh}
+% \begin{macro}{\Two}
+% \begin{macro}{\textTwo}
+% \begin{macrocode}
+\newcommand*{\tr}[1]{\@join{\tr}{#1}}
+\newcommand*{\trh}[1]{\@join{\trh}{#1}}
+\newcommand*{\Two}[1]{\@join{\Two}{#1}}
+\newcommand*{\textTwo}[1]{\@join{\textTwo}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotation B}
+% \label{sec:coderotationB}
+%
+% \begin{macro}{\trB}
+% \begin{macro}{\trhB}
+% \begin{macro}{\TwoB}
+% \begin{macro}{\textTwoB}
+% \begin{macrocode}
+\newcommand{\trB}{\rrB}
+\newcommand{\trBp}{\rrBp}
+\newcommand{\trhB}{\rrhB}
+\newcommand{\trhBp}{\rrhBp}
+\newcommand{\TwoB}{\RubikB}
+\newcommand{\TwoBp}{\RubikBp}
+\newcommand{\textTwoB}{\textRubikB}
+\newcommand{\textTwoBp}{\textRubikBp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotation D}
+% \label{sec:coderotationD}
+%
+% We need to rename some of the items as follows:
+%{\newline} change rr $\rightarrow$ tr
+%{\newline} change SquareD $\rightarrow$ SquaretD
+%{\newline} change RubikD $\rightarrow$ TwoD
+%{\newline} change textRubikD $\rightarrow$ textTwoD
+%
+% \begin{macro}{\trD}
+% \begin{macro}{\SquaretD}
+% \begin{macro}{\trhD}
+% \begin{macro}{\TwoD}
+% \begin{macro}{\textTwoD}
+% These commands all draw forms which denote the D rotation.
+%
+% Feb 2017 (RWDN): \ added the \cmd{\@tlen} length to the \cmd{\trhD} command to improve the
+% spacing between two `arrow' square hieroglyphs; and also removed the terminal \cmd{\,}
+% space. The same changes were made to all the `arrow' hieroglyphs.
+% \begin{macrocode}
+%%
+\newcommand{\trD}{\@tr{D}}
+%%
+\newcommand{\SquaretD}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd - \@ty) -- (\@sbh, \@sddd - \@ty);
+\draw [thick, ->] (\@sb,\@sd + \@ty) -- (\@sbh, \@sd + \@ty);
+\end{tikzpicture}%
+}
+\newcommand{\trhD}{\raisebox{-0.333\height}{\@tlen\SquaretD\@tlen}}
+%%
+\newcommand{\TwoD}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretD\\
+\trD%
+\end{minipage}%
+}}
+\newcommand{\textTwoD}{\trD\,\trhD}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Dp}
+%
+% \begin{macro}{\trDp}
+% \begin{macro}{\SquaretDp}
+% \begin{macro}{\trhDp}
+% \begin{macro}{\TwoDp}
+% \begin{macro}{\textTwoDp}
+% These commands all draw forms which denote the Dp rotation.
+% \begin{macrocode}
+\newcommand{\trDp}{\@trp{D}}
+%%
+\newcommand{\SquaretDp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sb,\@sddd - \@ty) -- (\@sbh, \@sddd - \@ty);
+\draw [thick, <-] (\@sb,\@sd + \@ty) -- (\@sbh, \@sd + \@ty);
+\end{tikzpicture}%
+}
+\newcommand{\trhDp}{\raisebox{-0.333\height}{\@tlen\SquaretDp\@tlen}}
+%%
+\newcommand{\TwoDp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretDp\\
+\trDp%
+\end{minipage}%
+}}
+\newcommand{\textTwoDp}{\trDp\,\trhDp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{\hspace{3mm}Rotation F}
+%
+% \begin{macro}{\trF}
+% \begin{macro}{\trhF}
+% \begin{macro}{\TwoF}
+% \begin{macro}{\textTwoF}
+% \begin{macrocode}
+\newcommand{\trF}{\rrF}
+\newcommand{\trFp}{\rrFp}
+\newcommand{\trhF}{\rrhF}
+\newcommand{\trhFp}{\rrhFp}
+\newcommand{\TwoF}{\RubikF}
+\newcommand{\TwoFp}{\RubikFp}
+\newcommand{\textTwoF}{\textRubikF}
+\newcommand{\textTwoFp}{\textRubikFp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation L}
+%
+% \begin{macro}{\trL}
+% \begin{macro}{\SquaretL}
+% \begin{macro}{\trhL}
+% \begin{macro}{\TwoL}
+% \begin{macro}{\textTwoL}
+% These commands all draw forms which denote the L rotation.
+% \begin{macrocode}
+\newcommand{\trL}{\@tr{L}}
+%%
+\newcommand{\SquaretL}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sd + \@tx, \@sb) -- (\@sd + \@tx, \@sbh);
+\draw [thick] (\@sddd - \@tx, \@sb) -- (\@sddd - \@tx, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\trhL}{\raisebox{-0.333\height}{\@tlen\SquaretL\@tlen}}
+%%
+\newcommand{\TwoL}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretL\\
+\trL%
+\end{minipage}%
+}}
+\newcommand{\textTwoL}{\trL\,\trhL}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Lp}
+%
+% \begin{macro}{\trLp}
+% \begin{macro}{\SquaretLp}
+% \begin{macro}{\trhLp}
+% \begin{macro}{\TwoLp}
+% \begin{macro}{\textTwoLp}
+% These commands all draw forms which denote the Lp rotation.
+% \begin{macrocode}
+\newcommand{\trLp}{\@trp{L}}
+%%
+\newcommand{\SquaretLp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick,->] (\@sd + \@tx, \@sb) -- (\@sd + \@tx, \@sbh);
+\draw [thick] (\@sddd - \@tx, \@sb) -- (\@sddd - \@tx, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\trhLp}{\raisebox{-0.333\height}{\@tlen\SquaretLp\@tlen}}
+%%
+\newcommand{\TwoLp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretLp\\
+\trLp%
+\end{minipage}%
+}}
+\newcommand{\textTwoLp}{\trLp\,\trhLp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotation R}
+%
+% \begin{macro}{\trR}
+% \begin{macro}{\SquaretR}
+% \begin{macro}{\trhR}
+% \begin{macro}{\TwoR}
+% \begin{macro}{\textTwoR}
+% These commands all draw forms which denote the R rotation.
+% \begin{macrocode}
+\newcommand{\trR}{\@tr{R}}
+%%
+\newcommand{\SquaretR}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+%% draw three lines in the square, one with an arrow
+\draw [thick] (\@sd + \@tx, \@sb) -- (\@sd + \@tx, \@sbh);
+\draw [thick, ->] (\@sddd - \@tx, \@sb) -- (\@sddd - \@tx, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\trhR}{\raisebox{-0.333\height}{\@tlen\SquaretR\@tlen}}
+%%
+\newcommand{\TwoR}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretR\\
+\trR%
+\end{minipage}%
+}}
+\newcommand{\textTwoR}{\trR\,\trhR}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Rp}
+%
+% \begin{macro}{\trRp}
+% \begin{macro}{\SquaretRp}
+% \begin{macro}{\trhRp}
+% \begin{macro}{\TwoRp}
+% \begin{macro}{\textTwoRp}
+% These commands all draw forms which denote the Rp rotation.
+% \begin{macrocode}
+\newcommand{\trRp}{\@trp{R}}
+%%
+\newcommand{\SquaretRp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick] (\@sd + \@tx, \@sb) -- (\@sd + \@tx, \@sbh);
+\draw [thick, <-] (\@sddd - \@tx, \@sb) -- (\@sddd - \@tx, \@sbh);
+\end{tikzpicture}%
+}
+\newcommand{\trhRp}{\raisebox{-0.333\height}{\@tlen\SquaretRp\@tlen}}
+%%
+\newcommand{\TwoRp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretRp\\
+\trRp%
+\end{minipage}%
+}}
+\newcommand{\textTwoRp}{\trRp\,\trhRp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsubsection{\hspace{3mm}Rotation U}
+%
+% \begin{macro}{\trU}
+% \begin{macro}{\SquaretU}
+% \begin{macro}{\trhU}
+% \begin{macro}{\TwoU}
+% \begin{macro}{\textTwoU}
+% These commands all draw forms which denote the U rotation.
+% \begin{macrocode}
+\newcommand{\trU}{\@tr{U}}
+%%
+\newcommand{\SquaretU}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, <-] (\@sb,\@sddd - \@ty) -- (\@sbh, \@sddd - \@ty);
+\draw [thick] (\@sb,\@sd + \@ty) -- (\@sbh, \@sd + \@ty);
+\end{tikzpicture}%
+}
+\newcommand{\trhU}{\raisebox{-0.333\height}{\@tlen\SquaretU\@tlen}}
+%%
+\newcommand{\TwoU}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretU\\
+\trU%
+\end{minipage}%%
+}}
+\newcommand{\textTwoU}{\trU\,\trhU}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsubsection{\hspace{3mm}Rotation Up}
+%
+% \begin{macro}{\trUp}
+% \begin{macro}{\SquaretUp}
+% \begin{macro}{\trhUp}
+% \begin{macro}{\TwoUp}
+% \begin{macro}{\textTwoUp}
+% These commands all draw forms which denote the Up rotation.
+% \begin{macrocode}
+\newcommand{\trUp}{\@trp{U}}
+%%
+\newcommand{\SquaretUp}{%
+\begin{tikzpicture}[scale=0.5]
+\DrawNotationBox;
+\draw [thick, ->] (\@sb,\@sddd - \@ty) -- (\@sbh, \@sddd - \@ty);
+\draw [thick] (\@sb,\@sd + \@ty) -- (\@sbh, \@sd + \@ty);
+\end{tikzpicture}%
+}
+\newcommand{\trhUp}{\raisebox{-0.333\height}{\@tlen\SquaretUp\@tlen}}
+%%
+\newcommand{\TwoUp}{%
+{\@rubikfont%
+\begin{minipage}{0.6cm}
+\centering%
+\SquaretUp\\
+\trUp%
+\end{minipage}%%
+}}
+\newcommand{\textTwoUp}{\trUp\,\trhUp}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+% \subsection{\hspace{3mm}Axis rotations}
+% \label{sec:codeaxisversions}
+%
+% For completeness we include a \cmd{\textTwo} version of all the
+% axis rotation codes (making them equal to their hieroglyphic \cmd{\rrh} version).
+% Obviously this list must go at the end of this file. While these commands are perhaps
+% strictly unnecessary, the motivation is to allow users to include them in
+% a \cmd{\ShowSequence} command when using the \cmd{\textTwo} font argument.
+%
+%
+% \begin{macrocode}
+\newcommand{\trx}{\rrx}
+\newcommand{\trxp}{\rrxp}
+\newcommand{\try}{\rry}
+\newcommand{\tryp}{\rryp}
+\newcommand{\trz}{\rrz}
+\newcommand{\trzp}{\rrzp}
+\newcommand{\trl}{\rrl}
+ \newcommand{\trlp}{\rrlp} %%new
+\newcommand{\trr}{\rrr}
+ \newcommand{\trrp}{\rrrp} %%new
+\newcommand{\tru}{\rru}
+ \newcommand{\trup}{\rrup} %%new
+\newcommand{\trd}{\rrd}
+ \newcommand{\trdp}{\rrdp} %%new
+\newcommand{\trf}{\rrf}
+ \newcommand{\trfp}{\rrfp} %%new
+\newcommand{\trb}{\rrb}
+ \newcommand{\trbp}{\rrbp} %%new
+%
+\newcommand{\trLc}{\rrLc}
+\newcommand{\trLcp}{\rrLcp}
+\newcommand{\trRc}{\rrRc}
+\newcommand{\trRcp}{\rrRcp}
+\newcommand{\trUc}{\rrUc}
+\newcommand{\trUcp}{\rrUcp}
+\newcommand{\trDc}{\rrDc}
+\newcommand{\trDcp}{\rrDcp}
+\newcommand{\trFc}{\rrFc}
+\newcommand{\trFcp}{\rrFcp}
+\newcommand{\trBc}{\rrBc}
+\newcommand{\trBcp}{\rrBcp}
+\newcommand{\trCL}{\rrCL}
+\newcommand{\trCLp}{\rrCLp}
+\newcommand{\trCR}{\rrCR}
+\newcommand{\trCRp}{\rrCRp}
+\newcommand{\trCU}{\rrCU}
+\newcommand{\trCUp}{\rrCUp}
+\newcommand{\trCD}{\rrCD}
+\newcommand{\trCDp}{\rrCDp}
+\newcommand{\trCF}{\rrCF}
+\newcommand{\trCFp}{\rrCFp}
+\newcommand{\trCB}{\rrCB}
+\newcommand{\trCBp}{\rrCBp}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\newcommand{\trhx}{\rrhx}
+\newcommand{\trhxp}{\rrhxp}
+\newcommand{\trhy}{\rrhy}
+\newcommand{\trhyp}{\rrhyp}
+\newcommand{\trhz}{\rrhz}
+\newcommand{\trhzp}{\rrhzp}
+\newcommand{\trhl}{\rrhl}
+ \newcommand{\trhlp}{\rrhlp} % new
+\newcommand{\trhr}{\rrhr}
+ \newcommand{\trhrp}{\rrhrp} % new
+\newcommand{\trhu}{\rrhu}
+ \newcommand{\trhup}{\rrhup} % new
+\newcommand{\trhd}{\rrhd}
+ \newcommand{\trhdp}{\rrhdp} % new
+\newcommand{\trhf}{\rrhf}
+ \newcommand{\trhfp}{\rrhfp} % new
+\newcommand{\trhb}{\rrhb}
+ \newcommand{\trhbp}{\rrhbp} % new
+\newcommand{\trhLc}{\rrhLc}
+\newcommand{\trhLcp}{\rrhLcp}
+\newcommand{\trhRc}{\rrhRc}
+\newcommand{\trhRcp}{\rrhRcp}
+\newcommand{\trhUc}{\rrhUc}
+\newcommand{\trhUcp}{\rrhUcp}
+\newcommand{\trhDc}{\rrhDc}
+\newcommand{\trhDcp}{\rrhDcp}
+\newcommand{\trhFc}{\rrhFc}
+\newcommand{\trhFcp}{\rrhFcp}
+\newcommand{\trhBc}{\rrhBc}
+\newcommand{\trhBcp}{\rrhBcp}
+\newcommand{\trhCL}{\rrhCL}
+\newcommand{\trhCLp}{\rrhCLp}
+\newcommand{\trhCR}{\rrhCR}
+\newcommand{\trhCRp}{\rrhCRp}
+\newcommand{\trhCU}{\rrhCU}
+\newcommand{\trhCUp}{\rrhCUp}
+\newcommand{\trhCD}{\rrhCD}
+\newcommand{\trhCDp}{\rrhCDp}
+\newcommand{\trhCF}{\rrhCF}
+\newcommand{\trhCFp}{\rrhCFp}
+\newcommand{\trhCB}{\rrhCB}
+\newcommand{\trhCBp}{\rrhCBp}
+% \end{macrocode}
+%
+%
+% \begin{macrocode}
+\newcommand{\Twox}{\Rubikx}
+\newcommand{\Twoxp}{\Rubikxp}
+\newcommand{\Twoy}{\Rubiky}
+\newcommand{\Twoyp}{\Rubikyp}
+\newcommand{\Twoz}{\Rubikz}
+\newcommand{\Twozp}{\Rubikzp}
+\newcommand{\Twol}{\Rubikl}
+ \newcommand{\Twolp}{\Rubiklp} % new
+\newcommand{\Twor}{\Rubikr}
+ \newcommand{\Tworp}{\Rubikrp} % new
+\newcommand{\Twou}{\Rubiku}
+ \newcommand{\Twoup}{\Rubikup} % new
+\newcommand{\Twod}{\Rubikd}
+ \newcommand{\Twodp}{\Rubikdp} % new
+\newcommand{\Twof}{\Rubikf}
+ \newcommand{\Twofp}{\Rubikfp} % new
+\newcommand{\Twob}{\Rubikb}
+ \newcommand{\Twobp}{\Rubikbp} % new
+\newcommand{\TwoLc}{\RubikLc}
+\newcommand{\TwoLcp}{\RubikLcp}
+\newcommand{\TwoRc}{\RubikRc}
+\newcommand{\TwoRcp}{\RubikRcp}
+\newcommand{\TwoUc}{\RubikUc}
+\newcommand{\TwoUcp}{\RubikUcp}
+\newcommand{\TwoDc}{\RubikDc}
+\newcommand{\TwoDcp}{\RubikDcp}
+\newcommand{\TwoFc}{\RubikFc}
+\newcommand{\TwoFcp}{\RubikFcp}
+\newcommand{\TwoBc}{\RubikBc}
+\newcommand{\TwoBcp}{\RubikBcp}
+\newcommand{\TwoCL}{\RubikCL}
+\newcommand{\TwoCLp}{\RubikCLp}
+\newcommand{\TwoCR}{\RubikCR}
+\newcommand{\TwoCRp}{\RubikCRp}
+\newcommand{\TwoCU}{\RubikCU}
+\newcommand{\TwoCUp}{\RubikCUp}
+\newcommand{\TwoCD}{\RubikCD}
+\newcommand{\TwoCDp}{\RubikCDp}
+\newcommand{\TwoCF}{\RubikCF}
+\newcommand{\TwoCFp}{\RubikCFp}
+\newcommand{\TwoCB}{\RubikCB}
+\newcommand{\TwoCBp}{\RubikCBp}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\newcommand{\textTwox}{\rrhx}
+\newcommand{\textTwoxp}{\rrhxp}
+\newcommand{\textTwoy}{\rrhy}
+\newcommand{\textTwoyp}{\rrhyp}
+\newcommand{\textTwoz}{\rrhz}
+\newcommand{\textTwozp}{\rrhzp}
+\newcommand{\textTwol}{\rrhl}
+ \newcommand{\textTwolp}{\rrhlp} %new
+\newcommand{\textTwor}{\rrhr}
+ \newcommand{\textTworp}{\rrhrp} %new
+\newcommand{\textTwou}{\rrhu}
+ \newcommand{\textTwoup}{\rrhup} %new
+\newcommand{\textTwod}{\rrhd}
+ \newcommand{\textTwodp}{\rrhdp} %new
+\newcommand{\textTwof}{\rrhf}
+ \newcommand{\textTwofp}{\rrhfp} %new
+\newcommand{\textTwob}{\rrhb}
+ \newcommand{\textTwobp}{\rrhbp} %new
+\newcommand{\textTwoLc}{\rrhLc}
+\newcommand{\textTwoLcp}{\rrhLcp}
+\newcommand{\textTwoRc}{\rrhRc}
+\newcommand{\textTwoRcp}{\rrhRcp}
+\newcommand{\textTwoUc}{\rrhUc}
+\newcommand{\textTwoUcp}{\rrhUcp}
+\newcommand{\textTwoDc}{\rrhDc}
+\newcommand{\textTwoDcp}{\rrhDcp}
+\newcommand{\textTwoFc}{\rrhFc}
+\newcommand{\textTwoFcp}{\rrhFcp}
+\newcommand{\textTwoBc}{\rrhBc}
+\newcommand{\textTwoBcp}{\rrhBcp}
+\newcommand{\textTwoCL}{\rrhCL}
+\newcommand{\textTwoCLp}{\rrhCLp}
+\newcommand{\textTwoCR}{\rrhCR}
+\newcommand{\textTwoCRp}{\rrhCRp}
+\newcommand{\textTwoCU}{\rrhCU}
+\newcommand{\textTwoCUp}{\rrhCUp}
+\newcommand{\textTwoCD}{\rrhCD}
+\newcommand{\textTwoCDp}{\rrhCDp}
+\newcommand{\textTwoCF}{\rrhCF}
+\newcommand{\textTwoCFp}{\rrhCFp}
+\newcommand{\textTwoCB}{\rrhCB}
+\newcommand{\textTwoCBp}{\rrhCBp}
+% \end{macrocode}
+%
+% --------------------------
+% End of this package
+% --------------------------
+% \begin{macrocode}
+%</rubiktwocube>
+% \end{macrocode}
+%
+%
+% \Finale
+%
+\endinput
diff --git a/macros/latex/contrib/rubik/rubiktwocube.ins b/macros/latex/contrib/rubik/rubiktwocube.ins
new file mode 100644
index 0000000000..650d81b816
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubiktwocube.ins
@@ -0,0 +1,66 @@
+%% rubiktwocube.ins
+%%
+%% --- automatic overwriting of .sty is disabled-------
+%% =========================================================
+%% Authors: RWD Nickalls (dick@nickalls.org)
+%% and Apostolos Syropoulos (asyropoulos@yahoo.com)
+%%
+%%
+%% --------------- start of docstrip commands ------------------
+%%
+\def\batchfile{rubiktwocube.ins}
+\input docstrip.tex
+
+\preamble
+
+-----------------------------------------------------------------
+ Authors: RWD Nickalls (dick@nickalls.org)
+ and Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ Copyright February 25, 2018 RWD Nickalls and A Syropoulos
+
+ VERSION 5.0
+
+ This work may be distributed and/or modified under the
+ conditions of the LaTeX Project Public License, either
+ version 1.3c of this license or (at your option) any
+ later version: <http://www.latex-project.org/lppl.txt>
+
+ This work consists of the files listed in the README file.
+-----------------------------------------------------------------
+
+ This is a LaTeX/TikZ package for drawing Rubik cubes
+ Please report errors or suggestions for improvement to
+
+ RWD Nickalls (dick@nickalls.org)
+ Apostolos Syropoulos (asyropoulos@yahoo.com)
+
+ This package requires the basic TikZ package to be loaded already
+------------------------------------------------------------------
+\endpreamble
+
+\keepsilent %%disables most of the screen output
+%% \askforoverwritefalse %%enables automatic overwriting of .sty
+\generate{\file{rubiktwocube.sty}{\from{rubiktwocube.dtx}{rubiktwocube}}}
+
+%%now write a screen message for the user
+\obeyspaces
+\Msg{*******************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the *}
+\Msg{* following file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* rubiktwocube.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file *}
+\Msg{* rubiktwocube.dtx through LaTeX. *}
+\Msg{* For an index, process any filename.idx file by *}
+\Msg{* makeindex -s gind.ist filename *}
+\Msg{* For list of changes, process any filename.glo file *}
+\Msg{* makeindex -s gglo.ist -o filename.gls filename.glo *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{*******************************************************}
+
+\endbatchfile
+%%------------EOF---------------
diff --git a/macros/latex/contrib/rubik/rubiktwocube.pdf b/macros/latex/contrib/rubik/rubiktwocube.pdf
new file mode 100644
index 0000000000..f00d979c2f
--- /dev/null
+++ b/macros/latex/contrib/rubik/rubiktwocube.pdf
Binary files differ