summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/rubik
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-09-25 23:12:16 +0000
committerKarl Berry <karl@freefriends.org>2015-09-25 23:12:16 +0000
commit97e34175d0f5e100422fbd133cadfcf6f5e944e6 (patch)
tree11f29e6d9beb227b762da99c70f81b369733d71a /Master/texmf-dist/doc/latex/rubik
parentead3792e2d57305d0777008c5073968c36ec7ba3 (diff)
rubik (25sep15)
git-svn-id: svn://tug.org/texlive/trunk@38457 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/rubik')
-rw-r--r--Master/texmf-dist/doc/latex/rubik/README70
-rw-r--r--Master/texmf-dist/doc/latex/rubik/README.txt98
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figA.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubik_doc_figA.pdf)bin3929 -> 3929 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figB.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubik_doc_figB.pdf)bin4076 -> 4076 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figC.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubik_doc_figC.pdf)bin2799 -> 2799 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figD.pdfbin0 -> 2908 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figE.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubik_doc_figE.pdf)bin4064 -> 4064 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik-doc-figF.pdfbin0 -> 7033 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubik_doc_figD.pdfbin2968 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figA.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figA.pdf)bin1538 -> 1538 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figB.pdf (renamed from Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figB.pdf)bin1856 -> 1856 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figC.pdfbin0 -> 3864 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figD.pdfbin0 -> 9342 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-cube.pdfbin128323 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-cube.tex188
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-rot1.pdfbin104322 -> 0 bytes
-rwxr-xr-xMaster/texmf-dist/doc/latex/rubik/example-rot1.sh3
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-rot1.tex307
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-rot2.pdfbin40513 -> 0 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-rot2.sh1
-rw-r--r--Master/texmf-dist/doc/latex/rubik/example-rot2.tex42
-rw-r--r--Master/texmf-dist/doc/latex/rubik/examples.pdfbin0 -> 204366 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/examples.sh5
-rw-r--r--Master/texmf-dist/doc/latex/rubik/examples.tex467
-rw-r--r--Master/texmf-dist/doc/latex/rubik/rubikcube.pdfbin463727 -> 724329 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/rubikrotation.148
-rw-r--r--Master/texmf-dist/doc/latex/rubik/rubikrotation.pdfbin294467 -> 372478 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/rubikrotationPL.pdfbin0 -> 163436 bytes
-rw-r--r--Master/texmf-dist/doc/latex/rubik/rubikrotationPL.tex1333
29 files changed, 1951 insertions, 611 deletions
diff --git a/Master/texmf-dist/doc/latex/rubik/README b/Master/texmf-dist/doc/latex/rubik/README
deleted file mode 100644
index 29121a01cec..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/README
+++ /dev/null
@@ -1,70 +0,0 @@
-
-February 3, 2014
---------------------------------------------------------------------------
-the RUBIK bundle 2014/02/03
- - rubikcube package v2.0 -> macros and commands for typesetting
- - rubikrotation package v2.0 -> macros and Perl program for rotations
---------------------------------------------------------------------------
-
-The RUBIK bundle provides two complementary packages for documenting the
-Rubik cube (3x3x3) notation, configurations and rotation sequences.
-The two packages are (a) rubikcube package, and (b) rubikrotation package.
-
-(a) Rubikcube package
-
- 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.
- This is a stand-alone LaTeX package. However, it's scope is greatly enhanced
- by the rubikrotation package.
-
-(b) Rubikrotation package
-
- The rubikrotation package, is a dynamic extension to
- the rubikcube package. It consists of the Perl program
- rubikrotation.pl and style option rubikrotation.sty.
- The rubikrotation package implements rotation sequences and
- random scrambling of the Rubik cube on-the-fly using a
- \RubikRotation command. It returns the new state in a form
- which is then used for typesetting by the rubikcube package.
-
- Since the \RubikRotation command works by CALLing the
- Perl program rubikrotation.pl, it follows that the rubikrotation
- package requires (a)~Perl to be installed, and (b) LaTeX needs to
- be run using the --shell-escape commandline option.
-
---------------------------------------------------------------------------
-RWD Nickalls email: dick@nickalls.org
-A Syropoulos email: asyropoulos@yahoo.com
---------------------------------------------------------------------------
-Copyright 2014 RWD Nickalls & A Syropoulos
-
-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
- - rubikrotation.ins,
- - rubikrotation.dtx,
- - rubikrotation.pl (Perl program)
-image files:
- - pdf -files for the documentation (6 pictures)
-documentation, examples and README:
- - rubikcube.pdf
- - rubikrotation.pdf,
- - example-cube.pdf, example-cube.tex
- - example-rot1.pdf, example-rot1.tex
- - example-rot2.pdf, example-rot2.pdf
- - README (this file)
---------------------------------------------------------------------------
-If you have any ideas, questions, suggestions or bugs to report, please
-feel free to contact us.
---------------------------------------------------------------------------
diff --git a/Master/texmf-dist/doc/latex/rubik/README.txt b/Master/texmf-dist/doc/latex/rubik/README.txt
new file mode 100644
index 00000000000..73e4741a858
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/README.txt
@@ -0,0 +1,98 @@
+
+September 25, 2015
+--------------------------------------------------------------------------
+the RUBIK bundle 2015/09/25
+ - rubikcube package v3.0 -> macros and commands for typesetting
+ - rubikrotation package v3.0 -> macros and Perl program for rotations
+--------------------------------------------------------------------------
+
+The RUBIK bundle provides two complementary packages for documenting the
+Rubik cube (3x3x3) notation, configurations and rotation sequences.
+The two packages are (a) rubikcube package, and (b) rubikrotation package.
+
+ (1) Rubikcube package
+
+ 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.
+ This is a stand-alone LaTeX package. However, it is expected to be used in
+ conjunction with its complementary rubikrotation package.
+
+ (2) Rubikrotation package
+
+ The rubikrotation package, is a dynamic extension to
+ the rubikcube package. 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 a
+ RubikRotation command. It returns the new state in a form
+ which is then used for typesetting by the rubikcube package.
+
+ 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)LaTeX needs
+ to be run using the --shell-escape command-line switch.
+
+ (3) New features
+
+ (a) 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. The new rotation commands are:
+ \rr{<rotation-code>}
+ \rrh{<rotation-code>}
+ \Rubik{<rotation-code>}
+ \textRubik{<rotation-code>}
+ The original rotation command formats (e.g.,\rrD) are still supported
+ for backwards compatibility.
+
+ (b) \ShowCube and \ShowCubeF are new commands for displaying
+ a cube inside a minipage.
+
+ (c) \RubikCubeGrey is a new command for setting up a `starter cube'
+ for which the only allocated colours are those for the centre cubies
+ The colour configuration matches that of the \RubikCubeSolved command.
+
+--------------------------------------------------------------------------
+RWD Nickalls email: dick@nickalls.org
+A Syropoulos email: asyropoulos@yahoo.com
+--------------------------------------------------------------------------
+Copyright 2014 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,
+ - rubikrotation.ins,
+ - rubikrotation.dtx,
+ - rubikrotation.sty,
+ - rubikrotation.pl (Perl script)
+documentation and README:
+ - rubikcube.pdf
+ - rubikrotation.pdf,
+ - rubikrotationPL.pdf, Prel program documentation
+ - rubikrotationPL.tex
+ - rubikrotation.1, MAN file for perl script
+ - README.txt (this file)
+image files:
+ - pdf -files for the rubikcube documentation (6 pictures)
+ - pdf -files for the rubikrotation documentation (4 pictures)
+examples:
+ - example-rot.pdf,
+ - example-rot.tex
+bash and bat files (for running rotation examples)
+--------------------------------------------------------------------------
+If you have any ideas, questions, suggestions or bugs to report, please
+feel free to contact us.
+--------------------------------------------------------------------------
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figA.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figA.pdf
index 63be7621483..63be7621483 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figA.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figA.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figB.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figB.pdf
index 5bdd92967c5..5bdd92967c5 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figB.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figB.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figC.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figC.pdf
index 53dc10e8395..53dc10e8395 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figC.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figC.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figD.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figD.pdf
new file mode 100644
index 00000000000..26fb68fe62c
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figD.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figE.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figE.pdf
index 5d013ff25a6..5d013ff25a6 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figE.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figE.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figF.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figF.pdf
new file mode 100644
index 00000000000..cc59d3f62b0
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/Rubik-doc-figF.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figD.pdf b/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figD.pdf
deleted file mode 100644
index 1304c069452..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/Rubik_doc_figD.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figA.pdf b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figA.pdf
index 9154ba3075c..b3992299158 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figA.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figA.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figB.pdf b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figB.pdf
index 7478436a27f..7478436a27f 100644
--- a/Master/texmf-dist/doc/latex/rubik/Rubikrot_doc_figB.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figB.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figC.pdf b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figC.pdf
new file mode 100644
index 00000000000..7ca1fe2db2d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figC.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figD.pdf b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figD.pdf
new file mode 100644
index 00000000000..a5df718d3bc
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/Rubikrot-doc-figD.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/example-cube.pdf b/Master/texmf-dist/doc/latex/rubik/example-cube.pdf
deleted file mode 100644
index 39d91a7b135..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-cube.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/example-cube.tex b/Master/texmf-dist/doc/latex/rubik/example-cube.tex
deleted file mode 100644
index e923c805c9a..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-cube.tex
+++ /dev/null
@@ -1,188 +0,0 @@
-%%
-%% example-cube.tex
-%% package example using the rubikcube package
-%% Requires the tikz package
-%% January 20, 2014
-%%--------NOTE-------------------------------------------
-%% USAGE: (pdf)latex example-cube.tex
-%%-------------------------------------------------------
-\documentclass[a4paper]{article}
-\usepackage{tikz} %% load tikz before rubikcube
-\usepackage{rubikcube}
-\usepackage{url}
-\pagestyle{myheadings}
-\markright{\textsc{rubikcube} package; \hspace{2cm}file = example-cube.tex}
-%% increase textwidth to make room
-\addtolength{\oddsidemargin}{-1.5cm}
-\addtolength{\textwidth}{3cm}
-%% brace and bracket
-\newcommand{\Rubikbracket}[1]{$\left(\mbox{#1}\right)$}
-\newcommand{\Rubikbrace}[1]{$\left\{\mbox{#1}\right\}$}
-%%
-\begin{document}
-%%-------------------------
-\subsection*{Example---the `superflip' configuration}
-
-Once you have mastered 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.
-
-For the impatient, the superflip sequence of 24 quarter-turn rotations (listed on Randelshofer's website) is as follows. This converts the solved cube on the left into the configuration shown on the right.
-
-\bigskip
-
-\begin{center}
-\RubikU\RubikR\RubikR\RubikFp\RubikR\RubikDp\RubikL\RubikBp\RubikR%
-\RubikUp\RubikR\RubikUp\RubikD\RubikFp\RubikU\RubikFp\RubikUp\RubikDp%
-\RubikB\RubikLp\RubikFp\RubikBp\RubikDp\RubikLp
-\end{center}
-
-\medskip
-
-{\noindent}Surprisingly, this sequence is actually equivalent to
-\Rubikbrace{\Rubikbracket{\RubikM\RubikUp}4, \Rubiky, \Rubikxp}3
-
-
-\bigskip
-\begin{figure}[hbt]
-\centering
-\RubikCubeSolved%
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{5mm}$\Longrightarrow$\hspace{5mm}%
-\RubikFaceUp {W}{R}{W} {B}{W}{G} {W}{O}{W}%
-\RubikFaceDown {Y}{O}{Y} {B}{Y}{G} {Y}{R}{Y}%
-\RubikFaceLeft {B}{W}{B} {R}{B}{O} {B}{Y}{B}%
-\RubikFaceRight{G}{W}{G} {O}{G}{R} {G}{Y}{G}%
-\RubikFaceFront{O}{W}{O} {B}{O}{G} {O}{Y}{O}%
-\RubikFaceBack{R}{W}{R}
- {G}{R}{B}
- {R}{Y}{R}%
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{1cm}%
-\begin{minipage}{5cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeFlat
- \end{tikzpicture}
-\end{minipage}
-\caption{Two images of the superflip configuration.}
-\end{figure}
-
-The code for all this is given below---note that the facelet colours can be
-written in various ways. Note also the trailing \% at the end of each line which is not inside a TikZ picture environment, and the value of placing each TikZ picture environment inside a minipage.
-Since the default width of a Rubik cube is 4cm (see \S\,7 Fig~2 in \texttt{rubikcube.pdf}), then since the TikZ scale here is 0.5 then the required width of its minipage is equal to $0.5 \times 4\mbox{cm} = 2\mbox{cm}$.
-%%----------
-\begin{verbatim}
--------------------
-\newcommand{\Rubikbracket}[1]{$\left(\mbox{#1}\right)$}
-\newcommand{\Rubikbrace}[1]{$\left\{\mbox{#1}\right\}$}
-
-\begin{center}
-\RubikU\RubikR\RubikR\RubikFp\RubikR\RubikDp\RubikL\RubikBp\RubikR%
-\RubikUp\RubikR\RubikUp\RubikD\RubikFp\RubikU\RubikFp\RubikUp\RubikDp%
-\RubikB\RubikLp\RubikFp\RubikBp\RubikDp\RubikLp
-\end{center}
-
-\medskip
-
-{\noindent}Surprisingly, this sequence is actually equivalent to
-\Rubikbrace{\Rubikbracket{\RubikM\RubikUp}4, \Rubiky, \Rubikxp}3
-
-\bigskip
-
-\begin{figure}[hbt]
-\centering
-\RubikCubeSolved
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{5mm}$\Longrightarrow$\hspace{5mm}%
-\RubikFaceUp {Y}{B}{Y} {R}{Y}{O} {Y}{G}{Y}%
-\RubikFaceDown {W}{G}{W} {R}{W}{O} {W}{B}{W}%
-\RubikFaceLeft {R}{Y}{R} {B}{R}{G} {R}{W}{R}%
-\RubikFaceRight{O}{Y}{O} {G}{O}{B} {O}{W}{O}%
-\RubikFaceFront{G}{Y}{G} {R}{G}{O} {G}{W}{G}%
-\RubikFaceBack {B}{Y}{B}%
- {O}{B}{R}%
- {B}{W}{B}%
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{1cm}%
-\begin{minipage}{5cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeFlat
- \end{tikzpicture}
-\end{minipage}
-\caption{Two images of the superflip configuration.}
-\end{figure}
--------------------
-\end{verbatim}
-
-
-\subsection*{Using the rubikrotation package}
-
-This is just a note to show that if this file were run in conjunction with the \texttt{rubikrotation} package, using the \LaTeX\ commandline switch \texttt{--shell-escape}, then the above figure could be generated more simply by replacing
-\begin{verbatim}
-\RubikFaceUp {Y}{B}{Y} {R}{Y}{O} {Y}{G}{Y}%
-\RubikFaceDown {W}{G}{W} {R}{W}{O} {W}{B}{W}%
-\RubikFaceLeft {R}{Y}{R} {B}{R}{G} {R}{W}{R}%
-\RubikFaceRight{O}{Y}{O} {G}{O}{B} {O}{W}{O}%
-\RubikFaceFront{G}{Y}{G} {R}{G}{O} {G}{W}{G}%
-\RubikFaceBack {B}{Y}{B}%
- {O}{B}{R}%
- {B}{W}{B}%
-\end{verbatim}
-with the command
-\begin{verbatim}
-\RubikRotation{\superflip}%
-\end{verbatim}
-ie,~using instead the following code:
-\begin{verbatim}
------------------
-\newcommand{\superflip}{U,R2,Fp,R,Dp,L,Bp,R,Up,R,Up,D,%
-Fp,U,Fp,Up,Dp,B,Lp,Fp,Bp,Dp,Lp}
-
-\begin{figure}[hbt]
-\centering
-\RubikCubeSolved%
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{5mm}$\Longrightarrow$\hspace{5mm}%
-\RubikRotation{\superflip}%
-\begin{minipage}{2cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-\end{minipage}
-\hspace{1cm}%
-\begin{minipage}{5cm}
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeFlat
- \end{tikzpicture}
-\end{minipage}
-\caption{Two images of the superflip configuration.}
-\end{figure}
------------------
-\end{verbatim}
-
-
-\begin{center}
------- END ------
-\end{center}
-
-\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot1.pdf b/Master/texmf-dist/doc/latex/rubik/example-rot1.pdf
deleted file mode 100644
index d18a90284e8..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot1.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot1.sh b/Master/texmf-dist/doc/latex/rubik/example-rot1.sh
deleted file mode 100755
index b45c859559e..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot1.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/bash
-pdflatex --shell-escape example-rot1.tex
-pdflatex --shell-escape example-rot1.tex
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot1.tex b/Master/texmf-dist/doc/latex/rubik/example-rot1.tex
deleted file mode 100644
index 5f424bc6132..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot1.tex
+++ /dev/null
@@ -1,307 +0,0 @@
-%%
-%% example-rot1.tex
-%% package examples using the rubikrotation package
-%% Requires tikz and rubikcube packages
-%% January 20, 2014
-%%--------NOTE-------------------------------------------
-%% USAGE: (pdf)latex --shell-escape example-rot1.tex
-%% run three times to get all labels and fig nos correct
-%%-------------------------------------------------------
-\documentclass[a4paper]{article}
-\usepackage{tikz} %% load tikz before rubikcube
-\usepackage{rubikcube,rubikrotation}
-\usepackage{url}
-\pagestyle{myheadings}
-\markright{\textsc{rubikrotation} package; \hspace{2cm}file = example-rot1.tex}
-%-----------
-%% some well known sequences (see the web page of Reid)
-\newcommand{\sixTs}{*sixTs,F2,R2,U2,Fp,B,D2,L2,F,B}
-\newcommand{\CubeInCube}{*CubeInCube,F,L,F,Up,R,U,F2,L2,Up,Lp,B,Dp,Bp,L2,U}
-\newcommand{\sixspot}{*sixspot,U,Dp,R,Lp,F,Bp,U,Dp}
-%%==================
-\begin{document}
-
-%%------------------
-\section*{Example~1}
-
-In Figure~\ref{fig:cubeincube} we show the so-called ``sixspot'' configuration,
- generated from a solved cube using the rotation sequence
-\rrU, \rrDp, \rrR, \rrLp, \rrF, \rrBp, \rrU, \rrDp
-(see the website of Reid at \url{www.math.ucf.edu/~reid/Rubik/}).
-%%--------FIGURE 1 -----------
-\begin{figure}[hbt]
-\centering
-\begin{tikzpicture}[scale=0.7]
- \RubikCubeSolved
- \RubikRotation{*sixspot,U,Dp,R,Lp,F,Bp,U,Dp}
- \DrawRubikCubeFlat
-\end{tikzpicture}
-\caption{\label{fig:cubeincube}The so-called `sixspot' configuration (Reid).}
-\end{figure}
-%----------------
-\begin{verbatim}
-----------------
-\documentclass[a4paper]{article}
-\usepackage{tikz,rubikcube,rubikrotation}
-\thispagestyle{empty} %% disables pagenumbers
-\begin{document}
-\begin{tikzpicture}[scale=0.9]
- \RubikCubeSolved
- \RubikRotation{*sixspot,U,Dp,R,Lp,F,Bp,U,Dp}
- \DrawRubikCubeFlat
-\end{tikzpicture}
-\end{document}
---------------
-\end{verbatim}
-Note that a more flexible approach is to incorporate such rotation sequences into a `newcommand'. For example, in this case we can write
-\begin{verbatim}
-\newcommand{\sixspot}{*sixspot,U,Dp,R,Lp,F,Bp,U,Dp}
-\end{verbatim}
-which allows the code to Figure~\ref{fig:cubeincube} to be more easily written as:
-\begin{verbatim}
-\begin{tikzpicture}
- \RubikCubeSolved
- \RubikRotation{\sixspot}
- \DrawRubikCubeFlat
-\end{tikzpicture}
-\end{verbatim}
-
-
-
-\pagebreak
-%%-------------------------
-\section*{Example~2}
-
- In this example we show the use of the \verb!\ShowRubikErrors! command, 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 (in this example we have introduced a couple
- of errors). It is important to note that the \verb!\ShowRubikErrors! command must be
- placed \textit{after} the TikZ picture environment. Note also that full details of all
- errors are included in the .log file.
-
-%%--------FIGURE 2 -----------
-
-\RubikCubeSolved
-\RubikRotation{*sixspot,U,Dp,R,Lp,F,Bp,UU,Dpp}
-
-\begin{figure}[hbt]
-\centering
-\begin{tikzpicture}[scale=0.7]
- \DrawRubikCubeFlat
-\end{tikzpicture}
-\ShowRubikErrors
-\caption{\label{fig:cubeincubeE}The same `sixspot' sequence of rotations as before, but now with some typo errors in the rotation sequence (should be \texttt{U,Dp,R,Lp,F,Bp,U,Dp}.}
-\end{figure}
-Note that only `Draw' commands really need to be inside the TikZ picture environment---see the following code which we used for the above figure.
-%-----------------
-\begin{verbatim}
-----------------
-\RubikCubeSolved
-\RubikRotation{*sixspot,U,Dp,R,Lp,F,Bp,UU,Dpp}
-%
-\begin{tikzpicture}
- \DrawRubikCubeFlat
-\end{tikzpicture}
-\ShowRubikErrors
-----------------
-\end{verbatim}
-
-
-
-
-\pagebreak
-%-------------------------------
-\section*{Example~3}
-
-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{verbatim}
-\RubikRotation{random,120}
-\end{verbatim}
-In this example, we also save the final configuration (state) to a file
-(\texttt{exmpfig4.tex}) using the command
-\verb!\SaveRubikState{exmpfig4.tex}!
-so we can display the cube in the same state later (see Example~4) but
-in a different format.
-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 in both Figures~\ref{fig:randomone} and \ref{fig:randomtwo}.
-%%--------FIGURE 3 -----------
-\begin{figure}[hbt]
-\centering
-\begin{tikzpicture}[scale=0.7]
- \RubikCubeSolved
- \RubikRotation{random,120}
- \SaveRubikState{exmpfig4.tex}
- \DrawRubikFlat
-\end{tikzpicture}
-\caption{\label{fig:randomone}This shows a cube generated by 120 random rotations}
-\end{figure}
-%----------------
-\begin{verbatim}
--------------------
-\begin{figure}[hbt]
-\centering
-\begin{tikzpicture}[scale=0.8]
- \RubikCubeSolved
- \RubikRotation{random,120}
- \SaveRubikState{exmpfig4.tex}
- \DrawRubikFlat
-\end{tikzpicture}
-\end{figure}
-------------------
-\end{verbatim}
-
-
-
-\pagebreak
-%----------------------
-\section*{Example~4}
-
-In this example we display a cube having the same state as that shown in
-Figure~\ref{fig:randomone}. The configuration state was saved from
-Figure~\ref{fig:randomone} using the command
-\verb!\SaveRubikState{exmpfig4.tex}!, and then input here
-using \verb!\input{exmpfig4.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
-\begin{tikzpicture}[scale=0.8]
- \input{exmpfig4.tex}
- \DrawRubikCubeLD
-\end{tikzpicture}
-\caption{\label{fig:randomtwo}This shows a Rubik cube in exactly the same
-state as the one shown in Figure~\ref{fig:randomone}}
-\end{figure}
-%%---------------------------------
-\begin{verbatim}
--------------------
-\begin{figure}[hbt]
-\centering
-\begin{tikzpicture}[scale=0.8]
- \input{exmpfig4.tex}
- \DrawRubikCubeLD
-\end{tikzpicture}
-\end{figure}
-------------------
-\end{verbatim}
-
-
-
-\pagebreak
-%----------------------
-\section*{Example~5}
-
-Here we show a convenient way of displaying a series of small cubes showing
-a sequence of rotations (\rrU, \rrR, \rrF). Following each rotation
-we save the state to a file and then, finally, display each cube state in sequence,
-using a couple of useful macros (\verb!\showcube!, and \verb!\lift!),
-to `show' the cubes and to `lift' the rotation command slightly off the baseline.
-Note that embedding the TikZ picture environment in the \verb!\showcube! command brings
-considerable flexibility.
-%%-----------FIGURE 5 -----------
-\newcommand{\showcube}[1]{%
- \begin{tikzpicture}[scale=0.5]
- \input{#1}
- \DrawRubikCubeRU
- \end{tikzpicture}
-}
-\newcommand{\lift}[1]{\raisebox{8mm}{#1}\hspace{2mm}}
-%%
-\RubikCubeSolved \SaveRubikState{exmpfig5a.tex}
-\RubikRotation{U} \SaveRubikState{exmpfig5b.tex}
-\RubikRotation{R} \SaveRubikState{exmpfig5c.tex}
-\RubikRotation{F} \SaveRubikState{exmpfig5d.tex}
-%%
-\begin{figure}[hbt]
-\centering
-\noindent \showcube{exmpfig5a.tex}\hspace{-4mm}(a)
-\lift{\RubikU}\showcube{exmpfig5b.tex}\hspace{-4mm}(b)
-\lift{\RubikR}\showcube{exmpfig5c.tex}\hspace{-4mm}(c)
-\lift{\RubikF}\showcube{exmpfig5d.tex}\hspace{-4mm}(d)
-\caption{The rotations \rrU, \rrR, \rrF\ on a solved cube.}
-\end{figure}
-%%---------------------------------
-
-Note that even though the \verb!\RubikCubeSolved! command (which allocates the
- colours to the `solved' cube) is used prior to the TikZ picture environment,
- its effects are still available to the \verb!\Draw...! command inside each of the
-picture environments.
-\begin{verbatim}
--------------------
-\newcommand{\showcube}[1]{%
- \begin{tikzpicture}[scale=0.5]
- \input{#1}
- \DrawRubikCubeRU
- \end{tikzpicture}
-}
-\newcommand{\lift}[1]{\raisebox{8mm}{#1}\hspace{2mm}}
-%%
-\RubikCubeSolved \SaveRubikState{exmpfig5a.tex}
-\RubikRotation{U} \SaveRubikState{exmpfig5b.tex}
-\RubikRotation{R} \SaveRubikState{exmpfig5c.tex}
-\RubikRotation{F} \SaveRubikState{exmpfig5d.tex}
-%%
-\begin{figure}[hbt]
- \centering
- \noindent \showcube{exmpfig5a.tex}\hspace{-4mm}(a)
- \lift{\RubikU}\showcube{exmpfig5b.tex}\hspace{-4mm}(b)
- \lift{\RubikR}\showcube{exmpfig5c.tex}\hspace{-4mm}(c)
- \lift{\RubikF}\showcube{exmpfig5d.tex}\hspace{-4mm}(d)
- \ShowRubikErrors
-\caption{The rotations \rrU, \rrR, \rrF\ on a solved cube.}
-\end{figure}
-------------------
-\end{verbatim}
-
-\pagebreak
-%----------------------
-\section*{Example~6}
-
-In this example we show how commands used inside a TikZ picture environment remain
-local to that picture environment.
-
-In this case the first fig uses the \verb!\RubikCubeSolved! inside the TikZ environment.
-However, if we then perform the rotation \textRubikR\ the command \verb!RubikRotation{R}!
-results in something quite unexpected (and obviously not correct). This is because
- the effect of the \verb!\RubikCubeSolved! command is not visible outside its TikZ environment, and hence the \verb!RubikRotation{R}! command has to operate on the state of the next earliest figure
-(ie~Figure~5d), hence the strange form of the second figure below.
-
-\medskip
-
- \begin{tikzpicture}[scale=0.5]
- \RubikCubeSolved
- \DrawRubikCubeRU
- \end{tikzpicture}
-\hspace{5mm}\lift{\RubikR}\hspace{5mm}%
-\RubikRotation{R}%
- \begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
- \end{tikzpicture}
-
-\medskip
-
-Since we are not here using any `minipage' environments, we need to use the \verb!\lift{}! command to raise the \rrhR\ hieroglyph off the baseline.
-
-\begin{verbatim}
--------------------
-\begin{tikzpicture}[scale=0.5]
- \RubikCubeSolved
- \DrawRubikCubeRU
-\end{tikzpicture}
-\hspace{5mm}\lift{\RubikR}\hspace{5mm}%
-\RubikRotation{R}%
-\begin{tikzpicture}[scale=0.5]
- \DrawRubikCubeRU
-\end{tikzpicture}
--------------------
-\end{verbatim}
-
-\begin{center}
------- END ------
-\end{center}
-
-\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot2.pdf b/Master/texmf-dist/doc/latex/rubik/example-rot2.pdf
deleted file mode 100644
index 351ecf86d73..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot2.pdf
+++ /dev/null
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot2.sh b/Master/texmf-dist/doc/latex/rubik/example-rot2.sh
deleted file mode 100644
index f44d9331a8b..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot2.sh
+++ /dev/null
@@ -1 +0,0 @@
-pdflatex --shell-escape example-rot2.tex
diff --git a/Master/texmf-dist/doc/latex/rubik/example-rot2.tex b/Master/texmf-dist/doc/latex/rubik/example-rot2.tex
deleted file mode 100644
index 688717ffcab..00000000000
--- a/Master/texmf-dist/doc/latex/rubik/example-rot2.tex
+++ /dev/null
@@ -1,42 +0,0 @@
-%% example-rot2.tex
-%% January 20, 2014
-%% RWD Nickalls & A Syropoulos
-%% example file for rubikrotation package
-%% Requires TikZ and rubikcube, and rubikrotation packages
-%% uses Perl script rubikrotation.pl
-%% experiment by un-commenting different RubikRotation commands,
-%% and reviewing the .log file for details of rotations performed.
-%%-----------------------------------------------------
-%% USAGE: pdflatex --shell-escape example-rot2.tex
-%% ----------------------------------------------------
-\documentclass[a4paper]{article}
-\usepackage{tikz,rubikcube,rubikrotation}
-\pagestyle{myheadings}
-\markright{\textsc{rubikrotation} package; \hspace{2cm}file = example-rot2.tex}
-%%--------------
-%% some well known sequences (see the web page of Reid)
-\newcommand{\sixT}{*sixT,F2,R2,U2,Fp,B,D2,L2,F,B}
-\newcommand{\cubeincube}{*cubeincube,F,L,F,Up,R,U,F2,L2,Up,Lp,B,Dp,Bp,L2,U}
-\newcommand{\sixspot}{*sixspot,U,Dp,R,Lp,F,Bp,U,Dp}
-\newcommand{\errors}{*errors,U,Dp,RR,Lpp,Fq,Bp,U,Dp,cat}
-%================
-\begin{document}
-
-\RubikCubeSolved % sets up a solved cube
-%----------------
-%\RubikRotation{R,FFF} %%this will show up the command FFF as being an error
-%\RubikRotation{U,D,L,R,F,B} %% some basic rotations in sequence
-%\RubikRotation{U2,D2,L2,R2,F2,B2} %% makes an interesting pattern
-%\RubikRotation{\sixT} %% generates a T on each face
-%\RubikRotation{\cubeincube} %% generates a cube-in-cube effect
-%\RubikRotation{random,67} %% makes 67 random rotations
-\RubikRotation{x,y,\sixspot} %% shows a sixspot effect
-%\RubikRotation{\errors} %% sixspot with errors (errors will be shown if using \ShowRobotErrors)
-
-\begin{tikzpicture}
- \DrawRubikCubeFlat %% shows cube as half cube half flat
- %\DrawRubikFlat %% shows cube as a flat representation
-\end{tikzpicture}
-%%--------------
-\ShowRubikErrors %% will show error file underneath the image
-\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/rubik/examples.pdf b/Master/texmf-dist/doc/latex/rubik/examples.pdf
new file mode 100644
index 00000000000..7aae8f46b65
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/examples.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/examples.sh b/Master/texmf-dist/doc/latex/rubik/examples.sh
new file mode 100644
index 00000000000..a891b830979
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/examples.sh
@@ -0,0 +1,5 @@
+ latex --shell-escape examples.tex
+# latex --shell-escape examples.tex
+
+##echo "...checking error file"
+##grep ERROR ./rubikstateERRORS.dat
diff --git a/Master/texmf-dist/doc/latex/rubik/examples.tex b/Master/texmf-dist/doc/latex/rubik/examples.tex
new file mode 100644
index 00000000000..9f5a1512175
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/examples.tex
@@ -0,0 +1,467 @@
+%%
+%% examples.tex
+%% examples using the rubikrotation package v3.0
+%% Requires rubik packages (v3.0) and also the tikz package
+%% Part of the Rubik bundle (www.ctan.org/pkg/rubik)
+%% RWD Nickalls & A Syropoulos
+%% September 25, 2015
+%%--------NOTE-------------------------------------------
+%% USAGE: (pdf)latex --shell-escape example-rot1.tex
+%% run three times to get all labels and fig nos correct
+%%-------------------------------------------------------
+\documentclass[a4paper]{article}
+\usepackage{tikz} %% load tikz BEFORE rubikcube
+\usepackage{rubikcube,rubikrotation}
+\usepackage{url}
+%-------------
+\pagestyle{myheadings}
+\markright{\textsc{rubikrotation} package v3.0 (Sept 2015) \hspace{0.5cm}\texttt{www.ctan.org/pkg/rubik} \hspace{0.5cm}examples.tex}
+%-----------
+%% some well known sequences (see the web page of Reid)
+\newcommand{\sixTs}{*sixTs,F2,R2,U2,Fp,B,D2,L2,F,B}
+\newcommand{\CubeInCube}{*CubeInCube,F,L,F,Up,R,U,F2,L2,Up,Lp,B,Dp,Bp,L2,U}
+\newcommand{\sixspot}{[sixspot],U,Dp,R,Lp,F,Bp,U,Dp}
+\newcommand{\superflip}{U,R2,Fp,R,Dp,L,Bp,R,Up,R,Up,D,%
+Fp,U,Fp,Up,Dp,B,Lp,Fp,Bp,Dp,Lp}
+%--------------------
+%% brace and bracket
+\newcommand{\Rubikbracket}[1]{$\left(\mbox{#1}\right)$}
+\newcommand{\Rubikbrace}[1]{$\left\{\mbox{#1}\right\}$}
+%---------------
+%% increase text space to make room
+\addtolength{\oddsidemargin}{-1.5cm}
+\addtolength{\textwidth}{3cm}
+\addtolength{\textheight}{1cm}
+%%==================
+
+\begin{document}
+
+\begin{center}
+\Huge{Rubikrotation examples}\,\footnote{These examples are part of the
+\textsc{rubikrotation} package, and assume some familiarity with the Rubik bundle
+documentation \texttt{rubikcube.pdf} and \texttt{rubikrotation.pdf}.}
+\end{center}
+
+\bigskip
+
+\textsc{note}: Since the \verb!\RubikRotation! command calls the perl script
+\texttt{rubikrotation.pl} this \texttt{.tex}~file needs to be run using
+the \verb!--shell-escape! command-line switch, as follows:
+\begin{quote}
+\begin{verbatim}
+latex --shell-escape example-tex
+\end{verbatim}
+\end{quote}
+If you forget to use the command-line switch, the file will run OK, but the cubes
+will remain in the initial `solved' configuration. The \texttt{tikz} package must be
+loaded before the two \texttt{rubik..} packages.
+
+%%------------------
+\section*{Example~1}
+
+In Figure~\ref{fig:cubeincube} 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}\
+(see the website of Reid at \url{www.cflmath.edu/~reid/Rubik/patterns.html}).
+%%--------FIGURE 1 -----------
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolved
+\RubikRotation{\sixspot}
+\ShowCube{7cm}{0.7}{\DrawRubikCubeFlat}
+\caption{\label{fig:cubeincube}The so-called `sixspot' configuration (Reid).}
+\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! is a Rubik \verb!\Draw..! command
+(see \textsc{rubikrotation} documentation for details).
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+\thispagestyle{empty} %% disables pagenumbers
+...
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolved
+ \RubikRotation{\sixspot}
+ \ShowCube{7cm}{0.7}{\DrawRubikCubeFlat}
+ \caption{...}
+\end{figure}
+\end{verbatim}
+\end{quote}
+Note that running the `sixspot' sequence 3 times returns the cube to its original `solved'
+state (it is a so-called `order~3' sequence). The~command for processing it three times
+is \verb!\RubikRotation[3]{\sixspot}!.
+
+
+\pagebreak
+%%-------------------------
+\section*{Example~2}
+
+ In this example we demonstrate the use of the \verb!\ShowRubikErrors! command, 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 (in this example we have introduced a few
+ errors---wrong minipage width, typos and some animals---into the rotation sequence).
+ It is important to note that the \verb!\ShowRubikErrors! command must be
+ placed \textit{after} the TikZ picture environment (i.e.,~in this case after
+the \verb!\ShowCube! command). Note that full details of all
+ errors are also included in the .log file.
+
+%%--------FIGURE 2 -----------
+
+\RubikCubeSolved
+\RubikRotation{[sixspot],U,Dp,R,Lp,F,Bp,U,Dpppp,cat,dog}
+
+\begin{figure}[hbt]
+ \centering
+ \ShowCubeF{4.5cm}{0.7}{\DrawRubikCubeFlat}
+ \ShowRubikErrors
+\parbox{0.7\textwidth}{%
+\caption{\label{fig:cubeincubeE}The same `sixspot' sequence of rotations as shown in
+Example~1, but now with some errors (wrong minipage-width, typos \& animals\,!) in the
+rotation sequence (it 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.5cm) in the
+\verb!\ShowCubeF! command---see code below---is too narrow: it should be 7cm ($10 \times 0.7$)
+to just include the whole image. 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}
+\RubikCubeSolved
+\RubikRotation{[sixspot],U,Dp,R,Lp,F,Bp,U,Dpppp,cat,dog}
+\begin{figure}[hbt]
+ \centering
+ \ShowCubeF{4.5cm}{0.7}{\DrawRubikCubeFlat}
+ \ShowRubikErrors
+\caption{....}
+\end{figure}
+\end{verbatim}
+\end{quote}
+Even if the \verb!\ShowRubikErrors! 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 reveal any errors.
+
+
+
+\pagebreak
+%-------------------------------
+\section*{Example~3}
+
+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}
+In this example, we also save the final configuration (state) to a file
+(\texttt{exampfig4.tex}) using the command
+\verb!\SaveRubikState{exampfig4.tex}!
+so we can display the cube in the same state later (see Example~4) but
+in a different format.
+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 in both Figures~\ref{fig:randomone} and \ref{fig:randomtwo}.
+%%--------FIGURE 3 -----------
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolved
+ \RubikRotation{random,120}
+ \SaveRubikState{exampfig4.tex}
+ \ShowCube{8.4cm}{0.7}{\DrawRubikFlat}
+\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
+ \RubikCubeSolved
+ \RubikRotation{random,120}
+ \SaveRubikState{exampfig4.tex}
+ \ShowCube{8.4cm}{0.7}{\DrawRubikFlat}
+\caption{....}
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+Q: How do we determine the minipage-width (8.4cm) in the \verb!\ShowCube! command?
+
+A: The object is 12 cubie squares wide (1\,cm each). Since the specified TikZ scale factor is~$0.7$
+here, then the true width of the image is $12 \times 0.7 = 8.4$\,cm. If you change the scale then
+the size of the image will change, and a new width will be required to just fit the image.
+
+Note that in this particular case (only a single image in the `figure' environment), since
+the \verb!\ShowCube! command places the image centrally inside the 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 centered 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).
+
+
+
+\pagebreak
+
+%----------------------
+\section*{Example~4}
+
+In this example we display a cube having the same state as that shown in
+Figure~\ref{fig:randomone}. The configuration state was saved from
+Figure~\ref{fig:randomone} using the command
+\verb!\SaveRubikState{exampfig4.tex}!, and then input here
+using \verb!\input{exampfig4.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{exampfig4.tex}
+ \ShowCube{4cm}{0.8}{\DrawRubikCubeLD}
+\parbox{0.7\textwidth}{%
+\caption{\label{fig:randomtwo}This shows a Rubik cube in exactly the same
+state as the one shown in Figure~\ref{fig:randomone}} }
+\end{figure}
+%%---------------------------------
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{figure}[hbt]
+ \centering
+ \input{exampfig4.tex}
+ \Showcube{4cm}{0.8}{\DrawRubikCubeLD}
+\caption{....}
+\end{figure}
+\end{verbatim}
+\end{quote}
+
+
+\pagebreak
+%----------------------
+\section*{Example~5}
+
+Here we show a convenient way of displaying a series of small cubes showing
+a sequence of rotations (\rr{U}, \rr{R}, \rr{F}).
+
+\begin{figure}[hbt]
+\centering
+\RubikCubeSolved
+\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\Rubik{U}
+\RubikRotation{U}\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\Rubik{R}
+\RubikRotation{R}\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\Rubik{F}
+\RubikRotation{F}\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\caption{The rotations \rr{U}, \rr{R}, \rr{F}\ on a solved cube.}
+\end{figure}
+The code for the above sequence is as follows:
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolved
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \Rubik{U}
+ \RubikRotation{U}\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \Rubik{R}
+ \RubikRotation{R}\ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \Rubik{F}
+ \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}
+
+
+\pagebreak
+%----------------------
+\section*{Example~6}
+
+In this example we highlight the fact that commands used inside a TikZ picture
+environment remain local to that environment. Note that this applies with other
+environments too; for example, with both the \verb!\minipage! the \verb!\figure! environments.
+Consequently, it is generally best when drawing a sequence of cubes to reserve the TikZ
+picture environment (i.e.,~the \verb!\ShowCube! command) only for Rubik \verb!\Draw..!
+commands and TikZ commands.
+
+In this example the first cube uses the \verb!\RubikCubeSolved! \textit{inside} the TikZ environment.
+However, if we then perform the rotation \textRubik{R}\ the command \verb!RubikRotation{R}!
+results in something quite unexpected (and obviously not correct). This is because
+ the effect of the \verb!\RubikCubeSolved! command is not visible outside its TikZ environment,
+and hence the \verb!RubikRotation{R}! command has to operate on the current globally available
+colour state information; i.e.,~that following the action of the
+\textbackslash\texttt{RubikRotation\{[sixspot],....\}} command in the earlier Example~2
+(shown in Figure~2) which was executed \textit{before, and outside} the \texttt{figure} environment
+ in that example, and hence the strange form of the second cube below.
+
+
+\medskip
+
+\begin{minipage}{0.4\textwidth}
+\ShowCube{2cm}{0.5}{%
+ \RubikCubeSolved
+ \DrawRubikCubeRU
+ }
+ \hspace{4mm}\Rubik{R}\hspace{5mm}%
+ \RubikRotation{R}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{minipage}
+%---------------
+\hspace{1cm}
+\begin{minipage}{0.5\textwidth}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{minipage}{0.4\textwidth}
+ \ShowCube{2cm}{0.5}{%
+ \RubikCubeSolved
+ \DrawRubikCubeRU
+ }
+ \hspace{4mm}\Rubik{R}\hspace{5mm}%
+ \RubikRotation{R}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{minipage}
+\end{verbatim}
+\end{minipage}
+
+\bigskip
+
+If we now bring the \verb!\RubikCubeSolved! command out and place it before
+the \verb!\ShowCube! command then its `state' information becomes globally
+accessable, and can therefore be acted upon (\&~updated) by the \verb!\RubikRotation{R}!
+command, and hence is rendered (correctly for us) by the next \verb!\DrawRubikCubeRU! command.
+
+\bigskip
+
+
+\begin{minipage}{0.4\textwidth}
+ \RubikCubeSolved
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{4mm}\Rubik{R}\hspace{5mm}%
+ \RubikRotation{R}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{minipage}
+%---------------
+\hspace{1cm}
+\begin{minipage}{0.5\textwidth}
+\begin{verbatim}
+\begin{minipage}{0.4\textwidth}
+ \RubikCubeSolved
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{4mm}\Rubik{R}\hspace{5mm}%
+ \RubikRotation{R}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+\end{minipage}
+\end{verbatim}
+\end{minipage}
+
+
+
+
+\pagebreak
+%----------------------
+\section*{Example~7}
+
+\subsection*{The `superflip' configuration}
+
+Once you have mastered 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.
+
+For the impatient, the superflip sequence of 24 quarter-turn rotations (listed on
+Randelshofer's website (\url{www.randelshofer.ch/rubik/patterns/U080.01.html}) is as follows.
+This converts the solved cube on the left into the configuration shown on the right.
+
+\bigskip
+
+\begin{center}
+\Rubik{U}\Rubik{R}\Rubik{R}\Rubik{Fp}\Rubik{R}\Rubik{Dp}\Rubik{L}\Rubik{Bp}\Rubik{R}%
+\Rubik{Up}\Rubik{R}\Rubik{Up}\Rubik{D}\Rubik{Fp}\Rubik{U}\Rubik{Fp}\Rubik{Up}\Rubik{Dp}%
+\Rubik{B}\Rubik{Lp}\Rubik{Fp}\Rubik{Bp}\Rubik{Dp}\Rubik{Lp}
+\end{center}
+
+\medskip
+
+{\noindent}Surprisingly, this sequence is actually equivalent to
+\Rubikbrace{\Rubikbracket{\Rubik{M}\Rubik{Up}}4, \Rubik{yp}, \Rubik{x}}3
+
+%--------draw the images-------------
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolved%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{5mm}$\Longrightarrow$\hspace{5mm}%
+ \RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{1cm}%
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeFlat}
+\caption{Two representations of the superflip configuration.}
+\end{figure}
+%----------------------
+
+%\pagebreak
+
+{\noindent}The full code for the figure above is as follows:
+\begin{quote}
+\begin{verbatim}
+\usepackage{tikz,rubikcube,rubikrotation}
+...
+\begin{center}
+\Rubik{U}\Rubik{R}\Rubik{R}\Rubik{Fp}\Rubik{R}\Rubik{Dp}\Rubik{L}\Rubik{Bp}%
+\Rubik{R}\Rubik{Up}\Rubik{R}\Rubik{Up}\Rubik{D}\Rubik{Fp}\Rubik{U}\Rubik{Fp}%
+\Rubik{Up}\Rubik{Dp}\Rubik{B}\Rubik{Lp}\Rubik{Fp}\Rubik{Bp}\Rubik{Dp}\Rubik{Lp}
+\end{center}
+
+\medskip
+
+%% brace and bracket macros
+\newcommand{\Rubikbracket}[1]{$\left(\mbox{#1}\right)$}
+\newcommand{\Rubikbrace}[1]{$\left\{\mbox{#1}\right\}$}
+
+{\noindent}Surprisingly, this sequence is actually equivalent to
+\Rubikbrace{\Rubikbracket{\Rubik{M}\Rubik{Up}}4, \Rubik{yp}, \Rubik{x}}3
+
+\newcommand{\superflip}{U,R2,Fp,R,Dp,L,Bp,R,Up,R,Up,D,%
+Fp,U,Fp,Up,Dp,B,Lp,Fp,Bp,Dp,Lp}
+
+\begin{figure}[hbt]
+ \centering
+ \RubikCubeSolved%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{5mm}$\Longrightarrow$\hspace{5mm}%
+ \RubikRotation{\superflip}%
+ \ShowCube{2cm}{0.5}{\DrawRubikCubeRU}
+ \hspace{1cm}%
+ \ShowCube{5cm}{0.5}{\DrawRubikCubeFlat}
+\caption{...}
+\end{figure}
+\end{verbatim}
+\end{quote}
+\begin{center}
+------ END ------
+\end{center}
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/rubik/rubikcube.pdf b/Master/texmf-dist/doc/latex/rubik/rubikcube.pdf
index 5cffa577720..62d8671ee15 100644
--- a/Master/texmf-dist/doc/latex/rubik/rubikcube.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/rubikcube.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/rubikrotation.1 b/Master/texmf-dist/doc/latex/rubik/rubikrotation.1
new file mode 100644
index 00000000000..bfcec061deb
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/rubikrotation.1
@@ -0,0 +1,48 @@
+.\" copyright (c) 2015 A Syropoulos and RWD Nickalls
+.\" rubikrotation.1
+.\" place this file in: /usr/share/man/man1/
+..
+.TH rubikrotation.1
+.SH NAME
+.B rubikrotation (v3.0)
+.SH AUTHORS
+A. Syropoulos and R.W.D. Nickalls (September 25, 2015)
+
+ asyropoulos[at]<yahoo><com>
+ dick[at]<nickalls><org>
+
+.SH DESCRIPTION
+.B rubikrotation
+is a Perl script for processing Rubik cube rotations. It is part of the LaTeX rubikrotation package, and is typically CALLed by rubikrotation.sty. See the package manual for full details (type at the commandline: texdoc rubikrotation). Both the rubikrotation and rubikcube packages are part of the LaTeX Rubik `bundle'. The latest version can be downloaded from
+.PP
+CTAN: tex-archive/tex/latex/contrib/rubik/
+.PP
+rubikrotation reads Rubik configuration data and instructions from an input file, and writes the new configuration data to an output file. The input and output filenames can be specified as command-line arguments (see: command-line use).
+
+.SH COMMAND-LINE USE
+rubikrotation [-h] [-o <outfile>] -i <infile>
+
+.B -h
+displays the help info and exits.
+
+.B -i
+defines the input filename.
+Typically the file rubikstate.dat which is generated by the LaTeX RubikRotation{} command.
+
+.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 package manual (rubikrotation.pdf) and examples, and also the rubikcube package manual (rubikcube.pdf)
+
+To view rubikrotation.pdf, type: texdoc rubikrotation
+
+To view rubikrotationPL.pdf, type: texdoc rubikrotationPL
+
+To view rubikcube.pdf, type: texdoc rubikcube
+
+
+.SH BUGS
+Please report bugs to Dick Nickalls or to Apostolos Syropoulos.
+
diff --git a/Master/texmf-dist/doc/latex/rubik/rubikrotation.pdf b/Master/texmf-dist/doc/latex/rubik/rubikrotation.pdf
index 207abac2ea7..d38932f4d62 100644
--- a/Master/texmf-dist/doc/latex/rubik/rubikrotation.pdf
+++ b/Master/texmf-dist/doc/latex/rubik/rubikrotation.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.pdf b/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.pdf
new file mode 100644
index 00000000000..0dc64ac5426
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.tex b/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.tex
new file mode 100644
index 00000000000..8377aa25a07
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/rubik/rubikrotationPL.tex
@@ -0,0 +1,1333 @@
+%% rubikrotationPL.tex (v3.0)
+%% Sept 25, 2015
+%% document the perl program rubikrotation.pl
+%%********************************************
+%% use pdf only to get the landscape version
+%% remember to manually adjust long lines in the writestate sub
+%%********************************************
+
+\documentclass[a4paper]{article}
+
+\usepackage{url,ifpdf}
+
+%% need to widen the page for the code
+\addtolength{\textwidth}{4cm}
+\addtolength{\oddsidemargin}{-2cm}
+%-----------------------------
+%% use pdflatex only (to use landscape)
+\ifpdf
+ \usepackage{pdflscape} %% landscape environment
+ \usepackage[verbose]{microtype} %% pdftex nicer margin alignment
+ \usepackage{cmap} %% make the pdf searchable
+ %% use hyperref
+ \usepackage[pdfencoding=auto]{hyperref}
+ \hypersetup{%%% pdftex,
+ bookmarksopen=true,
+ bookmarksnumbered=true,
+ bookmarkstype=toc,
+ bookmarksopenlevel=2, %% (book=0, chap=1, article=2)
+ %---------------------
+ pdftitle={Documentation of rubikrotation.pl.},
+ pdfauthor={RWD Nickalls and A Syropoulos},
+ pdfsubject={Rubik, rubikrotation},
+ pdfkeywords={TeX, Rubik, Rubikrotation},
+ }
+\fi
+
+\begin{document}
+
+
+\title{\vspace{-3cm}%
+ \ifpdf\pdfbookmark[0]{Title}{Title}\else\fi%
+ %% \strut\vspace{\baselineskip}%
+ Documentation of \texttt{rubikrotation.pl}\\ version~3.0}
+\author{Nickalls RWD (\textsf{dick@nickalls.org})\\
+ and\\ Syropoulos A (\textsf{asyropoulos@yahoo.com})}
+\date{Last revised: 25 September 2015\\ \smallskip this file: \texttt{rubikrotationPL.tex}}
+\maketitle
+
+\tableofcontents
+\ifpdf\pdfbookmark[0]{Contents}{Contents}\else\fi
+
+\section{Overview}
+
+This Perl program, is part of the \LaTeX\ \textsf{rubikrotation} package.
+The two packages Rubikcube and Rubikrotation form the `Rubik bundle'
+(available from \url{http://www.ctan.org/pkg/rubik}).
+
+This program reads (as input) a formatted `data' file (typically the file \texttt{rubikstate.dat} when used with
+the rubikcube package). The data-file defines the
+current state of the cube (using the keywords up, down, left, right, front, back),
+and includes special keywords (checkstate, rotation, random) which trigger the relevant
+ subroutines to process the input data accordingly. Finally, the program writes the final state to
+a text-file (typically the file \texttt{rubikstateNEW.dat} when used with the Rubikcube package),
+ and writes any error messages to the file \texttt{rubikstateERRORS.dat}.
+
+Version 3 onwards uses the input and output filenames specified by the CALLing command-line,
+the usage being as follows:
+\begin{verbatim}
+rubikrotation -i <input file> [-o <out file>]
+\end{verbatim}
+If no output filename is specified, then the default filename \texttt{rubikOUT.txt} is used.
+When used in conjunction with the Rubikcube package, then \texttt{rubikcube.sty} calls the program and sets
+the input filename as \texttt{rubikstate.dat} and the output filename as \texttt{rubikstateNEW.dat}.
+
+%%================================
+\begin{landscape}
+
+\section{The code}
+\begin{verbatim}
+#!/usr/bin/env perl
+##
+use Carp;
+use Fatal;
+use warnings;
+##
+our $version = "3.0 (25 Sept 2015)";
+##---------------------------
+##
+## rubikrotation.pl
+## VERSION 3.0
+## Copyright 25 September, 2015,
+## RWD Nickalls (dick@nickalls.org}
+## A Syropoulos (asyropoulos@yahoo.com)
+##
+##--------------------------------
+## changes in v3.0:
+## 1) accepts command-line arguments for input (mandatory) and output (optional) filenames
+## default output filename is: rubikOUT.txt
+## 2) included the symbols [ and ] to denote a rotation-name label (ie as well as *)
+## 3) fixed some of the variable definitions (as highlighted by <use strict> pragma)
+##--------------------------------
+## changes in v2.3:
+## 1) accepts a single commandline argument (datafilename)
+## 2) uses the standard modules Carp and Fatal (give extra line info on error)
+##--------------------------------
+## changes in v2.2:
+## 1) changed licence --> LatexPP
+## 2) included random n errors in ERROR messages (lines 492--495)
+## 3) 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.
+##--------------------------------------------------
+\end{verbatim}
+
+
+
+\subsection{Main}
+
+\begin{verbatim}
+\begin{verbatim}
+## 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 (output by TeXfile),
+## and calls subs to write the TeX_OUT_FILE,
+## and finally closes all files.
+## Each line of the input file consists of a comma separated list of arguments.
+## The first argument in each line of the file rubikstate.dat is the rubikkeyword.
+## Program is documented in the rubikrotation.pdf (see section ``Overview'')
+
+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
+
+print "This is rubikrotation version $version\n";
+#================================
+ 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 ("...PERL process..................................");
+ gprint ("...program = rubikrotation.pl v$version");
+
+## setup global error parameters, so we can write all the errors to a file as an array
+my %error = (); # setup an array for error messages (was %)
+my $erroralert = ""; # error flag
+my $errornumber = 0; #set number of errors to zero
+
+ gprint ("...reading the current rubik state (from File: $source_file)");
+
+my $dataline = "";
+my $rubikkeyword = "";
+my $rotationcommand = "";
+my @data;
+
+ LINE: while (<IN_FILE>){
+ next LINE if /^#/; #skip comments
+ next LINE if /^%/; #skip comments
+ next LINE if /^$/; #skip blank lines
+ $dataline = $_; # grab the whole line as a string
+ chomp $dataline; # remove the line-ending characters
+ #$n++; # count the number of lines
+ @data=split (/,/, $dataline); # create an array called data
+ ## we have 10 fields (0--9)
+ ## check for rubikkeyword= up,down,left,right,front,back,checkstate,rotation:
+ gprint ("...$dataline");
+ $rubikkeyword=$data[0];
+
+ if ($rubikkeyword eq 'up') {
+ $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]
+ }
+
+ if ($rubikkeyword eq 'down') {
+ $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]
+ }
+ if ($rubikkeyword eq 'left') {
+ $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]
+ }
+ if ($rubikkeyword eq 'right') {
+ $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]
+ }
+
+ if ($rubikkeyword eq 'front') {
+ $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]
+ }
+ if ($rubikkeyword eq 'back') {
+ $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]
+ }
+
+## 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();
+ };
+
+## 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 so --> random sub
+## else --> exit line and get next line.
+## finally we write the output data to a file.
+
+ if ($rubikkeyword eq 'rotation')
+ {
+ gprint ("...");
+ $rotationcommand=$dataline; ## used in output message
+ gprint ("...command=$rotationcommand");
+
+
+ ##-----random-----------------
+ ## if second argument = random,
+ ## THEN we also need to check if third argument is an integer;
+ ## if so -->random sub.
+ ## if the 3rd argument is NOT an integer then reject line & get next input line
+ if ($data[1] eq 'random')
+ {
+ if ($data[2] =~/\D/) {
+ errormessage("[$data[2]] not an integer");
+ ## we reject the whole line and look at next line in the file
+ next
+ }
+ else{
+ ## data[2] must be an integer (n), so we just do n random rotations
+ random($data[2])
+ };
+ }
+ else {
+ # the line must be an ordinary rotation sequence line, so send the sequence
+ # to the rotation sub, BUT, need to first remove the
+ # rubikkeyword `rotation' from the begining of line (array)
+ # as we need to send ONLY the sequence string to the rotation sub.
+
+ ## remove keyword rotation
+ shift (@data);
+
+ ## process @data string by the rotation sub
+ rotation(@data);
+ }
+ }
+##-------------------------------
+## place additional keywords here
+##-------------------------------
+ }; ## end of while
+
+ ## we have finished reading in all the lines from the source file,
+ ## and doing 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)
+ writestate();
+ close; ##close all files
+ exit;
+##==============end of main==========================
+\end{verbatim}
+
+
+%--------------------------
+\subsection{Errormessage}
+
+\begin{verbatim}
+sub errormessage{
+## writes the argument as a standard error message to out file
+ my $errormess = $_[0];
+ $erroralert = "YES"; ## set error alert flag (for use in out message)
+ $error[$errornumber] = "** ERROR: $errormess";
+ $errornumber++; ## increment number
+};
+\end{verbatim}
+
+
+%----------------------
+\subsection{Gprint}
+
+\begin{verbatim}
+## 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.
+sub gprint{
+ my $gmess=$_[0];
+ print "$gmess\n";
+ print (TeX_OUT_FILE "\\typeout{$gmess}\%\n");
+ };
+\end{verbatim}
+
+
+
+%------------------------
+\subsection{Checkstate}
+
+\begin{verbatim}
+sub checkstate{
+### 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 {print " cubiecolour counting ERROR \n";}
+ };
+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)");
+
+if ($cubiesum != 54) { errormessage("cubiesum not = 54")};
+if ($R >9){ errormessage("No of Red cubies > 9 (=$R)")};
+if ($O >9){ errormessage("No of Orange cubies > 9 (=$O)")};
+if ($Y >9){ errormessage("No of Yellow cubies > 9 (=$Y)")};
+if ($G >9){ errormessage("No of Green cubies > 9 (=$G)")};
+if ($B >9){ errormessage("No of Blue cubies > 9 (=$B)")};
+if ($W >9){ errormessage("No of White cubies > 9 (=$W)")};
+};
+##====================================================
+\end{verbatim}
+
+
+
+%--------------------
+\subsection{Rotation}
+
+\begin{verbatim}
+# no of arguments passed to the sub = $#_ (black book p 156)
+
+sub rotation {
+## here we process the array @data (from main) consisting of all
+## the rotation commands associated with
+## a single RubikRotation command.
+
+ my $m; #multiple associated with the char, eg D2 etc
+ my $n = ($#_ +1); ##total no of arguments passed
+ my $originalchar="";
+ my $j;
+ my $numberofchars; ## length of a string
+ my $nfrontchars;
+ my $char = "";
+
+ gprint ("...arguments passed to `rotation' sub = @_ (n= $n)");
+ foreach $char (@_) {
+ $char =~s/^\s+//, $char=~s/\s+$//; ## clean leading and trailing white space
+ ## grab a copy of the original char for use if m Mod4=0
+ $originalchar=$char;
+
+ ## if argument has a leading * or [ or ] then it is a label (not a rotation)
+ ## so jump to next one
+ if (substr ($char,0,1) =~ /[ * \[ \] ]/ ){
+ gprint ("...$char is a label OK");
+ next;
+ };
+
+ ## Need to detect any trailing integer associated with a command (eg rotation multiple, eg:U3, L2 etc)
+ ## NOTES: since we are using mod4, we are only interested in trailing digit
+ ## if trailing character is a digit, then
+ ## split char string into front chars (= $char) + trailing digit (= $m)
+ $m = 1; # initialise m
+
+ ## if terminal char is a digit (d) then let d --> m and let frontstring --> char
+ ## (Black book p 130 & 136)
+ ## if the frontstring contains any digits then it will be rejected in the filter below anyway.
+
+ if ( substr ($char,-1) =~ /(\d)/)
+ {
+ $m = $1; ## grab the trailing digit (only traps a single digit)
+ $numberofchars = 0; #initialise it
+ $numberofchars = length $originalchar;
+ $nfrontchars = $numberofchars-1;
+ ## reassign the string except the terminal digit
+ $char = substr($char,0,$nfrontchars);
+ ## use MOD 4 since we are dealing with Rubik rotations
+ $m = $m % 4;
+ ## (if MOD 4 = 0 then nothing will happen as j starts at 1)
+ ## but should generate an errormessage
+ if ( $m == 0 ){
+ gprint ("...rotation $originalchar equiv 0 (NOT IMPLEMENTED)");
+ errormessage ("[$originalchar] in RubikRotation (4 MOD 4 = 0)");
+ next;
+ };
+ };
+ ## 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)
+ ##
+ if ($char eq "R") {for($j=1;$j<=$m;$j++) { gprint ("...rotation R OK"); &rrR}}
+ elsif ($char eq "Rp") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rp OK (= rrR3)"); &rrRp}}
+ elsif ($char eq "Rw") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rw OK (= rrR + rrSr)"); &rrRw}}
+ elsif ($char eq "Rwp") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rwp OK (= rrRp + rrSrp)"); &rrRwp}}
+ elsif ($char eq "Rs") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rs OK (= rrR + rrLp)"); &rrRs}}
+ elsif ($char eq "Rsp") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rsp OK (= rrRp + rrL)"); &rrRsp}}
+ elsif ($char eq "Ra") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Ra OK (= rrR + rrL)"); &rrRa}}
+ elsif ($char eq "Rap") {for($j=1;$j<=$m;$j++) { gprint ("...rotation Rap OK (= rrRp + rrLp)"); &rrRap}}
+ ####
+ elsif ($char eq "L") {for($j=1;$j<=$m;$j++) {gprint ("...rotation L OK (= rrLp3)"); &rrL}}
+ elsif ($char eq "Lp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lp OK"); &rrLp}}
+ elsif ($char eq "Lw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lw OK (= rrLp3 + rrSrp)"); &rrLw}}
+ elsif ($char eq "Lwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lwp OK (= rrLp + rrSr)"); &rrLwp}}
+ elsif ($char eq "Ls") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ls OK (= rrL + rrRp)"); &rrLs}}
+ elsif ($char eq "Lsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lsp OK (= rrLp + rrR)"); &rrLsp}}
+ elsif ($char eq "La") {for($j=1;$j<=$m;$j++) {gprint ("...rotation La OK (= rrL + rrR)"); &rrLa}}
+ elsif ($char eq "Lap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Lap OK (= rrLp + rrRp)"); &rrLap}}
+ ####
+ elsif ($char eq "U") {for($j=1;$j<=$m;$j++) {gprint ("...rotation U OK"); &rrU}}
+ elsif ($char eq "Up") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Up OK (= rrU3)"); &rrUp}}
+ elsif ($char eq "Uw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uw OK (= rrU + rrSu)"); &rrUw}}
+ elsif ($char eq "Uwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uwp OK (= rrUp + rrSup)"); &rrUwp}}
+ elsif ($char eq "Us") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Us OK (= rrU + rrDp)"); &rrUs}}
+ elsif ($char eq "Usp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Usp OK (= rrUp + rrD)"); &rrUsp}}
+ elsif ($char eq "Ua") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ua OK (= rrU + rrD)"); &rrUa}}
+ elsif ($char eq "Uap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Uap OK (= rrUp + rrDp)"); &rrUap}}
+ ####
+ elsif ($char eq "D") {for($j=1;$j<=$m;$j++) {gprint ("...rotation D OK (= rrDp3)"); &rrD}}
+ elsif ($char eq "Dp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dp OK "); &rrDp}}
+ elsif ($char eq "Dw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dw OK (= rrDp3 + rrSup)"); &rrDw}}
+ elsif ($char eq "Dwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dwp OK (= rrDp + rrSu)"); &rrDwp}}
+ elsif ($char eq "Ds") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ds OK (= rrD + rrUp)"); &rrDs}}
+ elsif ($char eq "Dsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dsp OK (= rrDp + rrU)"); &rrDsp}}
+ elsif ($char eq "Da") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Da OK (= rrD + rrU)"); &rrDa}}
+ elsif ($char eq "Dap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Dap OK (= rrDp + rrUp)"); &rrDap}}
+ ####
+ elsif ($char eq "F") {for($j=1;$j<=$m;$j++) {gprint ("...rotation F OK"); &rrF}}
+ elsif ($char eq "Fp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fp OK (= rrF3)"); &rrFp}}
+ elsif ($char eq "Fw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fw OK (= rrF + rrSf)"); &rrFw}}
+ elsif ($char eq "Fwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fwp OK (= rrFp + rrSfp)"); &rrFwp}}
+ elsif ($char eq "Fs") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fs OK (= rrF + rrBp)"); &rrFs}}
+ elsif ($char eq "Fsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fsp OK (= rrFp + rrB)"); &rrFsp}}
+ elsif ($char eq "Fa") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fa OK (= rrF + rrB)"); &rrFa}}
+ elsif ($char eq "Fap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Fap OK (= rrFp + rrBp)"); &rrFap}}
+ ####
+ elsif ($char eq "B") {for($j=1;$j<=$m;$j++) {gprint ("...rotation B OK (= rrFp3)"); &rrB}}
+ elsif ($char eq "Bp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bp OK"); &rrBp}}
+ elsif ($char eq "Bw") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bw OK (= rrFp3 + rrSfp)"); &rrBw}}
+ elsif ($char eq "Bwp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bwp OK (= rrFp + rrSf)"); &rrBwp}}
+ elsif ($char eq "Bs") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bs OK (= rrB + rrFp)"); &rrBs}}
+ elsif ($char eq "Bsp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bsp OK (= rrBp + rrF)"); &rrBsp}}
+ elsif ($char eq "Ba") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ba OK (= rrB + rrF)"); &rrBa}}
+ elsif ($char eq "Bap") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Bap OK (= rrBp + rrFp)"); &rrBap}}
+ ####
+ elsif ($char eq "Su") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Su OK "); &rrSu}}
+ elsif ($char eq "Sup") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sup OK (= rrSu3)"); &rrSup}}
+ elsif ($char eq "Sd") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sd OK (= rrSup)"); &rrSd}}
+ elsif ($char eq "Sdp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sdp OK (= rrSu)"); &rrSdp}}
+ elsif ($char eq "Sl") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sl OK (= rrSrp)"); &rrSl}}
+ elsif ($char eq "Slp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Slp OK (= rrSr)"); &rrSlp}}
+ elsif ($char eq "Sr") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sr OK"); &rrSr}}
+ elsif ($char eq "Srp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Srp OK (= rrSr3)"); &rrSrp}}
+ elsif ($char eq "Sf") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sf OK"); &rrSf}}
+ elsif ($char eq "Sfp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sfp OK (= rrSf3)"); &rrSfp}}
+ elsif ($char eq "Sb") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sb OK (= rrSfp)"); &rrSb}}
+ elsif ($char eq "Sbp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sbp OK (= rrSf)"); &rrSbp}}
+ ## XYZ stuff
+ ## need to include lowercase x,y,x, and also u,d,l,r,f,b equivalents
+ elsif ($char eq "X" or $char eq "x" or $char eq "r")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrR + rrSr + rrLp)"); &rrR;&rrSr;&rrLp}}
+ elsif ($char eq "Xp" or $char eq "xp" or $char eq "l")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrRp + rrSrp + rrL)");&rrRp;&rrSrp;&rrL}}
+ elsif ($char eq "Y" or $char eq "y" or $char eq "u")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrU + rrSu + rrDp)"); &rrU;&rrSu;&rrDp}}
+ elsif ($char eq "Yp" or $char eq "yp" or $char eq "d")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrUp + rrSup + rrD)");&rrUp;&rrSup;&rrD}}
+ elsif ($char eq "Z" or $char eq "z" or $char eq "f")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrF + rrSf + rrBp)"); &rrF;&rrSf;&rrBp}}
+ elsif ($char eq "Zp" or $char eq "zp" or $char eq "b")
+ {for($j=1;$j<=$m;$j++) {gprint ("...rotation $char OK (= rrFp + rrSfp + rrB)");&rrFp;&rrSfp;&rrB}}
+ ## extras
+ elsif ($char eq "M") {for($j=1;$j<=$m;$j++) {gprint ("...rotation M OK (= Sl) "); &rrSl}}
+ elsif ($char eq "Mp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Mp OK (= Sr) "); &rrSr}}
+ elsif ($char eq "E") {for($j=1;$j<=$m;$j++) {gprint ("...rotation E OK (= Sd) "); &rrSd}}
+ elsif ($char eq "Ep") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Ep OK (= Su) "); &rrSu}}
+ elsif ($char eq "S") {for($j=1;$j<=$m;$j++) {gprint ("...rotation S OK (= Sf) "); &rrSf}}
+ elsif ($char eq "Sp") {for($j=1;$j<=$m;$j++) {gprint ("...rotation Sp OK (= Sb) "); &rrSb}}
+ ####
+ ## check for missing rotation
+ elsif ($char eq "") {for($j=1;$j<=$m;$j++)
+ {gprint ("...rotation ,$char, ERROR ? typo or missing rotation"),
+ errormessage("[,$char,] in RubikRotation: ? typo or missing rotation")}}
+ ####
+ ## rotation must be undefined
+ else {
+ gprint ("...rotation $originalchar NOT KNOWN");
+ errormessage("[$originalchar] in RubikRotation\{\}");
+ };
+ }; # end of foreach
+ }; # end of sub
+
+##---------------------------------------------
+## aNOTE we have defined (as rotation SUBs at the end) just 9 primary rotation transforms,
+## rrR, rrSr, rrLp
+## rrU, rrSu, rrDp
+## rrF, rrSf, rrBp
+## and since all the remaining ones are simply combinations of these 9
+## we now define all the other rotation subs in terms of these 9 primary moves.
+## do NOT use multiples here: write each rotation separately
+## -------------
+## 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)
+\end{verbatim}
+
+%----------------------
+\subsection{Random}
+
+\begin{verbatim}
+# no of arguments passed to the sub = $#_ (black book p 156)
+# parameters passed = $_[0]
+
+sub random{
+## 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
+##
+## asign 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 S ones too.
+
+my @rrlist= ("U", "Up", "Su", "Sup",
+ "D", "Dp", "Sd", "Sdp",
+ "L", "Lp", "Sl", "Slp",
+ "R", "Rp", "Sr", "Srp",
+ "F", "Fp", "Sf", "Sfp",
+ "B", "Bp", "Sb", "Sbp");
+
+my $rrlistnumber=$#rrlist;
+print " rrlistnumber = $rrlistnumber\n";
+# these are numbered 0--$rrlistnumber,
+
+## let default no of random rotations for scrambling = 50
+my $defaultn = 50;
+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 ("...WARNING: integer = 0 or not given: using default value 50");
+ errormessage ("random: n invalid (n=50 was used)")};
+
+my @rr; ## array to hold all the random rotations
+print " randomising the available rotations\n";
+
+
+## set the seed for the randomisation (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 Rubik cube using $s random rotations");
+ ## now send the array off to the rotation sub
+ rotation(@rr);
+}
+##===================subs==================================
+\end{verbatim}
+
+
+%-----------------------
+\subsection{Writestate}
+
+\begin{verbatim}
+sub writestate{
+## this just 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 prog=rubikrotation version $version\n");
+print (TeX_OUT_FILE "\\typeout{...writing new Rubik 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");
+
+## 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
+ if ($rotationcommand eq "checkstate") {}
+ else {
+ print (TeX_OUT_FILE "\\typeout{** ERROR: command=$rotationcommand}\%\n");
+ print (ERROR_OUT_FILE "** ERROR: $rotationcommand\n");
+ };
+ ## last index number or array = $#arrayname (Black book p 62)
+ my $k;
+ for ($k=0; $k<=$ne; $k=$k+1) {
+ print (TeX_OUT_FILE "\\typeout{$error[$k]}\%\n");
+ print (ERROR_OUT_FILE "$error[$k]\n");
+ };
+ };
+print " Perl output file written OK\n";
+}
+##===========================================
+\end{verbatim}
+
+%-----------------
+\subsection{rrR}
+
+
+\begin{verbatim}
+## 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 center 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 R (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---------------------
+## R 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];
+
+}
+#============================
+\end{verbatim}
+
+
+%--------------------
+\subsection{rrSr}
+
+
+\begin{verbatim}
+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];
+
+}
+##===================
+\end{verbatim}
+
+
+%--------------------
+\subsection{rrLp}
+
+
+\begin{verbatim}
+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 Lface 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];
+}
+##==================================
+\end{verbatim}
+
+
+%------------------
+\subsection{rrU}
+
+
+\begin{verbatim}
+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];
+}
+##==============================
+\end{verbatim}
+
+
+%----------------------
+\subsection{rrSu}
+
+
+\begin{verbatim}
+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];
+}
+##==============================
+\end{verbatim}
+
+
+%--------------------
+\subsection{rrDp}
+
+
+
+\begin{verbatim}
+sub rrDp{
+
+## Dpwn 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];
+}
+##==============================
+\end{verbatim}
+
+
+%%------------------
+\subsection{rrF}
+
+
+\begin{verbatim}
+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];
+}
+##==============================
+\end{verbatim}
+
+
+%-------------------
+\subsection{rrSf}
+
+
+\begin{verbatim}
+sub rrSf{
+
+## do the Fs 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];
+}
+##==============================
+\end{verbatim}
+
+
+%-------------------
+\subsection{rrBp}
+
+
+\begin{verbatim}
+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];
+}
+##=====================end===================================
+\end{verbatim}
+
+\begin{center}
+------ END ------
+\end{center}
+
+\end{landscape}
+
+\end{document}