texlive[43326] trunk: latexindent (23feb17)

commits+karl at tug.org commits+karl at tug.org
Fri Feb 24 23:07:43 CET 2017


Revision: 43326
          http://tug.org/svn/texlive?view=revision&revision=43326
Author:   karl
Date:     2017-02-24 23:07:42 +0100 (Fri, 24 Feb 2017)
Log Message:
-----------
latexindent (23feb17)

Modified Paths:
--------------
    trunk/Build/source/texk/texlive/linked_scripts/latexindent/latexindent.pl
    trunk/Master/bin/win32/latexindent.exe
    trunk/Master/texmf-dist/doc/support/latexindent/README
    trunk/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml
    trunk/Master/texmf-dist/scripts/latexindent/latexindent.pl
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/support/latexindent/appendices.tex
    trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf
    trunk/Master/texmf-dist/doc/support/latexindent/latexindent.tex
    trunk/Master/texmf-dist/doc/support/latexindent/logo.tex
    trunk/Master/texmf-dist/doc/support/latexindent/references.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-conclusions-know-limitations.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-default-user-local.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-demonstration.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-how-to-use.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-indent-config-and-settings.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-introduction.tex
    trunk/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsec-commands-and-their-options.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsec-conflicting-poly-switches.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsec-noAdditionalIndent-indentRules.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsec-partnering-poly-switches.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-commands-with-arguments.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-and-their-arguments.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-with-items.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-headings.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-ifelsefi.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-no-add-remaining-code-blocks.tex
    trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-special.tex
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BackUpFileProcedure.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BlankLines.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Braces.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/DoubleBackSlash.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileContents.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Heading.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HiddenChildren.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HorizontalWhiteSpace.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Item.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Preamble.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/RoundBrackets.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Special.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Tokens.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/TrailingComments.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
    trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Verbatim.pm

Removed Paths:
-------------
    trunk/Master/texmf-dist/doc/support/latexindent/documentation/
    trunk/Master/texmf-dist/doc/support/latexindent/indent.yaml
    trunk/Master/texmf-dist/doc/support/latexindent/success/

Modified: trunk/Build/source/texk/texlive/linked_scripts/latexindent/latexindent.pl
===================================================================
(Binary files differ)

Modified: trunk/Master/bin/win32/latexindent.exe
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/support/latexindent/README
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/README	2017-02-24 01:05:59 UTC (rev 43325)
+++ trunk/Master/texmf-dist/doc/support/latexindent/README	2017-02-24 22:07:42 UTC (rev 43326)
@@ -20,7 +20,7 @@
 
 *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+
 
-FOR COMPLETE DETAILS, PLEASE SEE documentation/manual.pdf
+FOR COMPLETE DETAILS, PLEASE SEE documentation/latexindent.pdf
 
 Note: latexindent.exe was created using 
 
@@ -34,6 +34,7 @@
     You'll need
 
         latexindent.pl
+        LatexIndent/*.pm
         defaultSettings.yaml
 
     in the same directory. Windows users might prefer to grab latexindent.exe
@@ -49,5 +50,6 @@
     - a visual check, at the very least, make sure that 
       each file has the same number of lines
     - a check using latexdiff inputfile.tex outputfile.tex
+    - git status myfile.tex
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

Added: trunk/Master/texmf-dist/doc/support/latexindent/appendices.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/appendices.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/appendices.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,192 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\appendix
+	\section{Required \texttt{Perl} modules}\label{sec:requiredmodules}
+	 If you intend to use \texttt{latexindent.pl} and \emph{not} one of the supplied standalone executable files, then you will need a few standard Perl modules -- if you can run the
+	 minimum code in \cref{lst:helloworld} (\texttt{perl helloworld.pl}) then you will be able to run \texttt{latexindent.pl}, otherwise you may
+	 need to install the missing modules.
+
+	 \begin{cmhlistings}[language=Perl]{\texttt{helloworld.pl}}{lst:helloworld}
+	#!/usr/bin/perl
+
+	use strict;
+	use warnings;
+	use FindBin;
+	use YAML::Tiny;
+	use File::Copy;
+	use File::Basename;
+	use File::HomeDir;
+	use Getopt::Long;
+    use Data::Dumper;
+
+	print "hello world";
+	exit;
+\end{cmhlistings}
+	 My default installation on Ubuntu 12.04 did \emph{not} come
+	 with all of these modules as standard, but Strawberry Perl for Windows \cite{strawberryperl}
+	 did.
+
+	 Installing the modules given in \cref{lst:helloworld} will vary depending on your
+	 operating system and \texttt{Perl} distribution. For example, Ubuntu users
+	 might visit the software center, or else run
+	 \begin{commandshell}
+sudo perl -MCPAN -e 'install "File::HomeDir"'
+ \end{commandshell}
+
+	 Linux users may be interested in exploring Perlbrew \cite{perlbrew}; possible installation and setup
+	 options follow for Ubuntu (other distributions will need slightly different commands).
+	 \begin{commandshell}
+sudo apt-get install perlbrew
+perlbrew install perl-5.20.1
+perlbrew switch perl-5.20.1
+sudo apt-get install curl
+curl -L http://cpanmin.us | perl - App::cpanminus
+cpanm YAML::Tiny
+cpanm File::HomeDir
+\end{commandshell}
+
+	 Strawberry Perl users on Windows might use
+	 \texttt{CPAN client}. All of the modules are readily available on CPAN \cite{cpan}.
+
+	 \texttt{indent.log} will contain details of the location
+	 of the Perl modules on your system.  \texttt{latexindent.exe} is a standalone
+	 executable for Windows (and therefore does not require a Perl distribution) and caches copies of the Perl modules onto your system; if you
+	 wish to see where they are cached, use the  \texttt{trace} option, e.g
+	 \begin{dosprompt}
+latexindent.exe -t myfile.tex
+ \end{dosprompt}
+
+	\section{Updating the \texttt{path} variable}\label{sec:updating-path}
+	 \texttt{latexindent.pl} has a few scripts (available at \cite{latexindent-home}) that can update the \texttt{path} variables\footnote{Thanks to \cite{jasjuang} for this feature!}. If you're
+	 on a Linux or Mac machine, then you'll want \texttt{CMakeLists.txt} from \cite{latexindent-home}.
+	\subsection{Add to path for Linux}
+		To add \texttt{latexindent.pl} to the path for Linux, follow these steps:
+		\begin{enumerate}
+			\item download  \texttt{latexindent.pl} and its associated modules, \texttt{defaultSettings.yaml},
+			      to your chosen directory from \cite{latexindent-home} ;
+			\item within your directory, create a directory called \texttt{path-helper-files} and
+			      download \texttt{CMakeLists.txt} and \lstinline!cmake_uninstall.cmake.in!
+			      from \cite{latexindent-home}/path-helper-files to this directory;
+			\item run
+			      \begin{commandshell}
+ls /usr/local/bin
+          \end{commandshell}
+			      to see what is \emph{currently} in there;
+			\item run the following commands
+			      \begin{commandshell}
+sudo apt-get install cmake
+sudo apt-get update && sudo apt-get install build-essential
+mkdir build && cd build
+cmake ../path-helper-files
+sudo make install
+\end{commandshell}
+			\item run
+			      \begin{commandshell}
+ls /usr/local/bin
+          \end{commandshell}
+			      again to check that \texttt{latexindent.pl}, its modules and \texttt{defaultSettings.yaml} have been added.
+		\end{enumerate}
+		To \emph{remove} the files, run
+		\begin{commandshell}
+sudo make uninstall}.
+    \end{commandshell}
+	\subsection{Add to path for Windows}
+		To add \texttt{latexindent.exe} to the path for Windows, follow these steps:
+		\begin{enumerate}
+			\item download  \texttt{latexindent.exe}, \texttt{defaultSettings.yaml},  \texttt{add-to-path.bat}
+			      from \cite{latexindent-home} to your chosen directory;
+			\item open a command prompt and run the following command to see what is \emph{currently} in your \lstinline!%path%! variable;
+			      \begin{dosprompt}
+echo %path%
+          \end{dosprompt}
+			\item right click on \texttt{add-to-path.bat} and \emph{Run as administrator};
+			\item log out, and log back in;
+			\item open a command prompt and run
+			      \begin{dosprompt}
+echo %path%
+          \end{dosprompt}
+			      to check that the appropriate directory has been added to your \lstinline!%path%!.
+		\end{enumerate}
+		To \emph{remove} the directory from your \lstinline!%path%!, run \texttt{remove-from-path.bat} as administrator.
+
+	\section{Differences from Version 2.2 to 3.0}\label{app:differences}
+	 There are a few (small) changes to the interface when comparing Version 2.2 to Version 3.0.
+	 Explicitly, in previous versions you might have run, for example,
+	 \begin{commandshell}
+latexindent.pl -o myfile.tex outputfile.tex
+ \end{commandshell}
+	 whereas in Version 3.0 you would run any of the following, for example,
+	 \begin{commandshell}
+latexindent.pl -o=outputfile.tex myfile.tex
+latexindent.pl -o outputfile.tex myfile.tex
+latexindent.pl myfile.tex -o outputfile.tex 
+latexindent.pl myfile.tex -o=outputfile.tex 
+latexindent.pl myfile.tex -outputfile=outputfile.tex 
+latexindent.pl myfile.tex -outputfile outputfile.tex 
+ \end{commandshell}
+	 noting that the \emph{output} file is given \emph{next to} the \texttt{-o} switch.
+
+	 The fields given in \cref{lst:obsoleteYaml} are \emph{obsolete} from Version 3.0
+	 onwards.
+	 \begin{yaml}[style=yaml-LST,numbers=none]{Obsolete YAML fields from Version 3.0}[colframe=white!25!red,colbacktitle=white!75!red,colback=white!90!red,]{lst:obsoleteYaml}
+alwaysLookforSplitBrackets
+alwaysLookforSplitBrackets
+checkunmatched
+checkunmatchedELSE
+checkunmatchedbracket
+constructIfElseFi
+\end{yaml}
+
+	 There is a slight difference when specifying indentation after headings; specifically,
+	 we now write \texttt{indentAfterThisHeading} instead of \texttt{indent}. See \cref{lst:indentAfterThisHeadingOld,lst:indentAfterThisHeadingNew}
+
+	 \begin{minipage}{.45\textwidth}
+		 \begin{yaml}[style=yaml-LST,numbers=none]{\texttt{indentAfterThisHeading} in Version 2.2}{lst:indentAfterThisHeadingOld}
+indentAfterHeadings:
+    part:
+       indent: 0
+       level: 1
+\end{yaml}
+	 \end{minipage}%
+	 \hfill
+	 \begin{minipage}{.45\textwidth}
+		 \begin{yaml}[style=yaml-LST,numbers=none]{\texttt{indentAfterThisHeading} in Version 3.0}{lst:indentAfterThisHeadingNew}
+indentAfterHeadings:
+    part:
+       indentAfterThisHeading: 0
+       level: 1
+\end{yaml}
+	 \end{minipage}%
+
+	 To specify \texttt{noAdditionalIndent} for display-math environments in Version 2.2, you would write YAML
+	 as in \cref{lst:noAdditionalIndentOld}; as of Version 3.0, you would write YAML as in \cref{lst:indentAfterThisHeadingNew1}
+	 or, if you're using \texttt{-m} switch, \cref{lst:indentAfterThisHeadingNew2}.
+
+	 \begin{minipage}{.45\textwidth}
+		 \begin{yaml}[style=yaml-LST,numbers=none]{\texttt{noAdditionalIndent} in Version 2.2}{lst:noAdditionalIndentOld}
+noAdditionalIndent:
+    \[: 0
+    \]: 0
+\end{yaml}
+	 \end{minipage}%
+	 \hfill
+	 \begin{minipage}{.45\textwidth}
+		 \begin{yaml}[style=yaml-LST,numbers=none]{\texttt{noAdditionalIndent} for \texttt{displayMath} in Version 3.0}{lst:indentAfterThisHeadingNew1}
+specialBeginEnd:
+    displayMath:
+        begin: '\\\['
+        end: '\\\]'
+        lookForThis: 0
+\end{yaml}
+
+		 \begin{yaml}[style=yaml-LST,numbers=none]{\texttt{noAdditionalIndent} for \texttt{displayMath}  in Version 3.0}{lst:indentAfterThisHeadingNew2}
+noAdditionalIndent:
+    displayMath: 1
+\end{yaml}
+	 \end{minipage}%
+
+	 \mbox{}\hfill     \begin{minipage}{.25\textwidth}
+		 \hrule
+
+		 \hfill\itshape End
+
+	 \end{minipage}

Deleted: trunk/Master/texmf-dist/doc/support/latexindent/indent.yaml
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/indent.yaml	2017-02-24 01:05:59 UTC (rev 43325)
+++ trunk/Master/texmf-dist/doc/support/latexindent/indent.yaml	2017-02-24 22:07:42 UTC (rev 43326)
@@ -1,38 +0,0 @@
-!config
-# indent rule for arara
-# author: Paulo Cereda, Chris Hughes
-# last updated: 11/9/2013
-# requires arara 3.0+
-#
-# Sample usage:
-#
-# % arara: indent
-# % arara: indent: {overwrite: yes}
-# % arara: indent: {output: myfile.tex, silent: no}
-# % arara: indent: {output: myfile.tex, silent: yes, overwrite: yes}
-# % arara: indent: {trace: true}
-# % arara: indent: {localSettings: true}
-# % arara: indent: {onlyDefault: on}
-# % arara: indent: { cruft: /home/cmhughes/Desktop }
-#
-# Directories with spaces will cause issues in the cruft call.
-# 
-# Note: output will take priority above overwrite
-identifier: indent
-name: Indent
-command: <arara> @{ isWindows( "cmd /c latexindent.exe", "latexindent.pl" ) } @{silent} @{trace} @{localSettings} @{cruft}@{ isNotEmpty( cruft, '="'.concat(parameters.cruft).concat('"') ) } @{overwrite}  @{onlyDefault} @{output} "@{file}" @{ isNotEmpty( output, '"'.concat(parameters.output).concat('"') ) }
-arguments:
-- identifier: overwrite
-  flag: <arara> @{ isTrue( parameters.overwrite, "-w" ) }
-- identifier: silent
-  flag: <arara> @{ isTrue( parameters.silent, "-s" ) }
-- identifier: trace
-  flag: <arara> @{ isTrue( parameters.trace, "-t" ) }
-- identifier: localSettings
-  flag: <arara> @{ isTrue( parameters.localSettings, "-l" ) }
-- identifier: output
-  flag: <arara> @{ isNotEmpty( parameters.output, "-o" ) }
-- identifier: onlyDefault
-  flag: <arara> @{ isTrue( parameters.onlyDefault, "-d" ) }
-- identifier: cruft
-  flag: <arara> @{ isNotEmpty( parameters.cruft, "-c" ) }

Added: trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf
===================================================================
(Binary files differ)

Index: trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf	2017-02-24 01:05:59 UTC (rev 43325)
+++ trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf	2017-02-24 22:07:42 UTC (rev 43326)

Property changes on: trunk/Master/texmf-dist/doc/support/latexindent/latexindent.pdf
___________________________________________________________________
Added: svn:mime-type
## -0,0 +1 ##
+application/octet-stream
\ No newline at end of property
Added: trunk/Master/texmf-dist/doc/support/latexindent/latexindent.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/latexindent.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/latexindent.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,467 @@
+% arara: pdflatex: {shell: yes}
+% arara: bibtex
+% arara: pdflatex: {shell: yes}
+% arara: pdflatex: {shell: yes}
+% arara: pdflatex: {shell: yes}
+% !arara: indent: {overwrite: yes, trace: yes, localSettings: yes, silent: yes}
+\documentclass[10pt]{article}
+%   This program is free software: you can redistribute it and/or modify
+%   it under the terms of the GNU General Public License as published by
+%   the Free Software Foundation, either version 3 of the License, or
+%   (at your option) any later version.
+%
+%   This program 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.
+%
+%   See <http://www.gnu.org/licenses/>.
+\usepackage[left=4.5cm,right=2.5cm,showframe=false,
+	top=2cm,bottom=1.5cm]{geometry}                      % page setup
+\usepackage{lmodern}
+\usepackage{parskip}                                 % paragraph skips
+\usepackage{booktabs}                                % beautiful tables
+\usepackage{listings}                                % nice verbatim environments
+\usepackage{titlesec}                                % customize headings
+\usepackage{titletoc}                                % customize headings
+\usepackage{multicol}
+\usepackage{changepage}                              % adjust width of page
+\usepackage{fancyhdr}                                % headers & footers
+\usepackage{wrapfig}
+\usepackage{fontawesome}
+\usepackage[sc,format=hang,font=small]{caption}      % captions
+\usepackage[backend=bibtex]{biblatex}                % bibliography
+\usepackage{tcolorbox}                                % framed environments
+\usepackage{xparse}
+\usepackage[charter]{mathdesign}                     % changes font
+\usepackage[expansion=false,kerning=true]{microtype} % better kerning
+\usepackage{enumitem}                                % custom lists
+\usepackage{longtable}
+\usepackage{array}
+% setup gitinfo2, as in the manual, details just above begin{document}
+\usepackage[mark,grumpy]{gitinfo2}
+% tcolorbox libraries
+\tcbuselibrary{breakable,skins,listings,minted,xparse}
+%\usepackage{varioref}                                % clever referencing
+%\tcbuselibrary{documentation,breakable,skins,minted}
+% tikz libraries
+\usetikzlibrary{positioning}
+\usetikzlibrary{decorations.pathmorphing}
+\usetikzlibrary{decorations,shapes}
+\usepackage{varioref}                                % clever referencing
+\usepackage{hyperref}
+\hypersetup{
+	pdfauthor={Chris Hughes},
+	pdftitle={latexindent.pl package},
+	pdfkeywords={perl;beautify;indentation},
+	bookmarksnumbered,
+	bookmarksopen,
+	linktocpage,
+	colorlinks=true,
+	linkcolor=blue,
+	citecolor=black,
+}
+\usepackage{cleveref}
+
+\addbibresource{latex-indent}
+\addbibresource{contributors}
+
+% http://tex.stackexchange.com/questions/122135/how-to-add-a-png-icon-on-the-right-side-of-a-tcolorbox-title
+\newtcolorbox{warning}{parbox=false,breakable,enhanced,arc=0mm,colback=red!5,colframe=red,leftrule=12mm,%
+	overlay={\node[anchor=north west,outer sep=2pt] at (frame.north west) {\includegraphics[width=8mm]{warning}}; }
+}
+
+\definecolor{harvestgold}{cmyk}{0.00, 0.05, 0.51, 0.07}  %EDE275
+\definecolor{cmhgold}{cmyk}{0,0.178,0.909,0.008}         %FDD017
+\makeatletter
+\tcbset{
+	addtolol/.style={list entry={\kvtcb at title},add to list={lol}{lstlisting}},
+	cmhlistings/.style={
+			%	width=\linewidth,
+			%breakable,
+			colback=blue!5!white,
+			colframe=white!25!black,colback=white,
+			top=0cm,
+			bottom=0cm,
+			left=0mm,
+			listing only,
+			center title,
+			listing engine=minted,
+			minted style=colorful,
+			minted options={obeytabs=true,showtabs=true,tabsize=4,showspaces=true},
+			addtolol,
+			boxrule=0pt,
+			toprule=1pt,bottomrule=1pt,
+			titlerule=1pt,
+			colframe=white!40!black,
+			colback=white,
+			sharp corners,
+			colbacktitle=white!75!black
+		},
+	yaml-TCB/.style={
+			listing only,
+			listing engine=listings,
+			left=0cm,
+			boxrule=0pt,
+			%leftrule=3pt,
+			sharp corners,
+			center title,
+			%colbacktitle=white!75!black,
+			colbacktitle=white!75!blue,
+			colframe=white!25!blue,
+			colback=white!90!blue,
+			toprule=2pt,
+			titlerule=2pt,
+			%bottomrule=1pt,
+		},
+	MLB-TCB/.style={
+			yaml-TCB,
+			center title,
+			colframe=cmhgold,
+			colbacktitle=harvestgold,
+			colback=white!60!cmhgold,
+			width=0.9\linewidth,
+			before=\centering,
+			%bottomrule=1pt,
+			enhanced,
+			overlay={\node[anchor=north east,outer sep=2pt,draw=cmhgold,very thick,double,fill=harvestgold,font =\small] at ([yshift=-3mm]frame.north east) {\texttt{-m}}; }
+		}
+}
+
+\newtcblisting[use counter=lstlisting]{cmhlistings}[3][]{%
+	cmhlistings,
+	center title,
+	title={\color{black}{\scshape Listing \thetcbcounter}: ~#2},label={#3},
+	listing engine=listings,
+	listing options={#1},
+}
+
+\DeclareTCBInputListing[use counter=lstlisting]{\cmhlistingsfromfile}{O{} m O{} m m}{%
+	cmhlistings,
+	listing file={#2},
+	listing options={#1},
+	title={\color{black}{\scshape Listing \thetcbcounter}: ~#4},label={#5},
+	#3,
+}
+
+% command shell
+\newtcblisting{commandshell}{colback=black,colupper=white,colframe=yellow!75!black,
+	listing only,listing options={style=tcblatex,language=sh,
+			morekeywords={latexindent,pl},
+			keywordstyle=\color{blue!35!white}\bfseries,
+		},
+	listing engine=listings,
+	left=0cm,
+	every listing line={\textcolor{red}{\small\ttfamily\fontseries{b}\selectfont cmh:$\sim$\$ }}}
+
+% dosprompt
+\newtcblisting{dosprompt}{
+	colback=black,
+	colupper=white,
+	colframe=yellow!75!black,
+	listing only,
+	listing options={
+			language=command.com,
+			morekeywords={latexindent,pl},
+			keywordstyle=\color{blue!35!white}\bfseries,
+			basicstyle=\small\color{white}\ttfamily
+		},
+	listing engine=listings,
+	left=0cm,
+	every listing line={\textcolor{white}{\small\ttfamily\fontseries{b}\selectfont C:\textbackslash Users\textbackslash cmh$>$}}}
+
+\lstset{%
+	basicstyle=\small\ttfamily,language={[LaTeX]TeX},
+	%	numbers=left,
+	numberstyle=\ttfamily%\small,
+	breaklines=true,
+	%   frame=single,framexleftmargin=8mm, xleftmargin=8mm,
+	%	prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookrightarrow}},
+	%	backgroundcolor=\color{green!5},frameround=fttt,
+	%	rulecolor=\color{blue!70!black},
+	keywordstyle=\color{blue},                    % keywords
+	commentstyle=\color{purple},    % comments
+	tabsize=3,
+	%xleftmargin=1.5em,
+}%
+\DeclareTCBListing[use counter=lstlisting]{yaml}{O{} m O{} m}{
+	yaml-TCB,
+	listing options={
+			style=tcblatex,
+			numbers=none,
+			numberstyle=\color{red},
+			#1,
+		},
+	title={\color{black}{\scshape Listing \thetcbcounter}: ~#2},label={#4},
+	#3,
+}
+
+\lstdefinestyle{yaml-LST}{
+	style=tcblatex,
+	numbers=none,
+	%numbers=left,
+	numberstyle=\color{red},
+}
+
+\lstdefinestyle{demo}{
+	numbers=none,
+	linewidth=1.25\textwidth,
+	columns=fullflexible,
+}
+
+% stars around contributors
+\pgfdeclaredecoration{stars}{initial}{
+	\state{initial}[width=15pt]
+	{
+		\pgfmathparse{round(rnd*100)}
+		\pgfsetfillcolor{yellow!\pgfmathresult!orange}
+		\pgfsetstrokecolor{yellow!\pgfmathresult!red}
+		\pgfnode{star}{center}{}{}{\pgfusepath{stroke,fill}}
+	}
+	\state{final}
+	{
+		\pgfpathmoveto{\pgfpointdecoratedpathlast}
+	}
+}
+
+\newtcolorbox{stars}{%
+	enhanced jigsaw,
+	breakable, % allow page breaks
+	left=0cm,
+	top=0cm,
+	before skip=0.2cm,
+	boxsep=0cm,
+	frame style={draw=none,fill=none}, % hide the default frame
+	colback=white,
+	overlay={
+			\draw[inner sep=0,minimum size=rnd*15pt+2pt]
+			decorate[decoration={stars,segment length=2cm}] {
+					decorate[decoration={zigzag,segment length=2cm,amplitude=0.3cm}] {
+							([xshift=-.5cm,yshift=0.1cm]frame.south west) --  ([xshift=-.5cm,yshift=0.4cm]frame.north west)
+						}};
+			\draw[inner sep=0,minimum size=rnd*15pt+2pt]
+			decorate[decoration={stars,segment length=2cm}] {
+					decorate[decoration={zigzag,segment length=2cm,amplitude=0.3cm}] {
+							([xshift=.75cm,yshift=0.1cm]frame.south east) --  ([xshift=.75cm,yshift=0.6cm]frame.north east)
+						}};
+			\node[anchor=north west,outer sep=2pt,opacity=0.25] at ([xshift=-4.25cm]frame.north west) {\resizebox{3cm}{!}{\faGithub}};
+		},
+	% paragraph skips obeyed within tcolorbox
+	parbox=false,
+}
+
+% copied from /usr/local/texlive/2013/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx
+% the only modification is the \stars and \endstars
+\defbibenvironment{specialbib}
+{\stars\list
+	{\printtext[labelnumberwidth]{%
+			\printfield{prefixnumber}%
+			\printfield{labelnumber}}}
+	{\setlength{\labelwidth}{\labelnumberwidth}%
+		\setlength{\leftmargin}{\labelwidth}%
+		\setlength{\labelsep}{\biblabelsep}%
+		\addtolength{\leftmargin}{\labelsep}%
+		\setlength{\itemsep}{\bibitemsep}%
+		\setlength{\parsep}{\bibparsep}}%
+	\renewcommand*{\makelabel}[1]{\hss##1}}
+{\endlist\endstars}
+{\item}
+
+\newtcbox{yamltitlebox}[1][]{colframe=black!50!white,boxrule=.5pt,sharp corners,#1}
+
+\newcommand{\flagbox}[1]{%
+	\par
+	\makebox[30pt][l]{%
+		\hspace{-2cm}%
+		\ttfamily\fontseries{b}\selectfont #1
+	}%
+}
+
+\NewDocumentCommand{\yamltitle}{O{} m s m}{%
+	\par
+	\makebox[30pt][l]{%
+		\hspace{-2cm}%
+		\yamltitlebox[#1]{%
+			{\ttfamily\fontseries{b}\selectfont{\color{blue!80!white}#2}}: %
+			\IfBooleanTF{#3}
+			{$\langle$\itshape #4$\rangle$}
+			{{\bfseries #4}}
+		}}
+	\par\nobreak%
+}
+
+\newcommand{\fixthis}[1]
+{%
+	\marginpar{\huge \color{red} \framebox{FIX}}%
+	\typeout{FIXTHIS: p\thepage : #1^^J}%
+}
+% custom section
+\titleformat{\section}
+{\normalfont\Large\bfseries}
+{\llap{\thesection\hskip.5cm}}
+{0pt}
+{}
+% custom subsection
+\titleformat{\subsection}
+{\normalfont\bfseries}
+{\llap{\thesubsection\hskip.5cm}}
+{0pt}
+{}
+% custom subsubsection
+\titleformat{\subsubsection}
+{\normalfont\bfseries}
+{\llap{\thesubsubsection\hskip.5cm}}
+{0pt}
+{}
+
+\titlespacing\section{0pt}{12pt plus 4pt minus 2pt}{-5pt plus 2pt minus 2pt}
+\titlespacing\subsection{0pt}{12pt plus 4pt minus 2pt}{-6pt plus 2pt minus 2pt}
+\titlespacing\subsubsection{0pt}{12pt plus 4pt minus 2pt}{-6pt plus 2pt minus 2pt}
+
+% list of listings
+\contentsuse{lstlisting}{lol}
+\titlecontents{lstlisting}[2em]
+  {\addvspace{0.25pc}}
+  {\textbf{Code \thecontentslabel} }
+  {}
+  {\titlerule*[0.5em]{$\cdot$}\contentspage}
+  []
+\AtBeginDocument{\addtocontents{lol}{\protect\begin{widepage}\protect\begin{multicols}{2}}}
+\AtEndDocument{\addtocontents{lol}{\protect\end{multicols}\protect\end{widepage}}}
+
+% cleveref settings
+\crefname{table}{Table}{Tables}
+\Crefname{table}{Table}{Tables}
+\crefname{figure}{Figure}{Figures}
+\Crefname{figure}{Figure}{Figures}
+\crefname{section}{Section}{Sections}
+\Crefname{section}{Section}{Sections}
+\crefname{listing}{Listing}{Listings}
+\Crefname{listing}{Listing}{Listings}
+
+% headers and footers
+\fancyhf{} % delete current header and footer
+\fancyhead[R]{\bfseries\thepage%
+	\tikz[remember picture,overlay] {
+		\node at (1,0){\includegraphics{logo-bw}}; }
+}
+\fancyhead[L]{\rightmark}
+\fancyheadoffset[L]{3cm}
+\pagestyle{fancy}
+
+% renew plain style
+\fancypagestyle{plain}{%
+	\fancyhf{} % clear all header and footer fields
+	\renewcommand{\headrulewidth}{0pt}
+	\renewcommand{\footrulewidth}{0pt}}
+
+% widepage environment
+\newenvironment{widepage}{\begin{adjustwidth}{-3cm}{0cm}}{\end{adjustwidth}}
+
+% symbols for the m switch
+\newcommand{\BeginStartsOnOwnLine}{\color{red}\spadesuit}
+\newcommand{\BodyStartsOnOwnLine}{\color{red}\heartsuit}
+\newcommand{\EndStartsOnOwnLine}{\color{red}\diamondsuit}
+\newcommand{\EndFinishesWithLineBreak}{\color{red}\clubsuit}
+\newcommand{\ElseStartsOnOwnLine}{\color{red}\bigstar}
+\newcommand{\ElseFinishesWithLineBreak}{\color{red}\square}
+\newcommand{\EqualsStartsOnOwnLine}{\color{red}\bullet}
+
+% table rules
+\setlength\heavyrulewidth{0.25ex}
+% gitinfo2 settings
+\renewcommand{\gitMark}{\gitBranch\,@\,\gitAbbrevHash{}\,\textbullet{}\,\gitAuthorDate\,\textbullet{}\faGithub}
+
+% setting up gitinfo2:
+%   copy the file post-xxx-sample.txt from http://mirror.ctan.org/macros/latex/contrib/gitinfo2
+%   and put it in .git/hooks/post-checkout
+% then
+%   cd .git/hooks
+%   chmod g+x post-checkout
+%   chmod +x post-checkout
+%   cp post-checkout post-commit
+%   cp post-checkout post-merge
+%   cd ../..
+%   git checkout master
+%   git checkout develop
+%   ls .git
+% and you should see gitHeadInfo.gin
+
+% http://tex.stackexchange.com/questions/233843/textasteriskcentered-invisible-with-garamondmathdesign
+% remove the definition of \textasteriskcentered for TS1 encoding
+\UndeclareTextCommand{\textasteriskcentered}{TS1}
+% reinstate a default encoding
+\DeclareTextSymbolDefault{\textasteriskcentered}{OT1}
+% suitably define the command
+\DeclareTextCommand{\textasteriskcentered}{OT1}{\raisebox{-.7ex}[1ex][0pt]{*}}
+
+\begin{document}
+\renewcommand*{\thefootnote}{\arabic{footnote}}
+\title{%
+	\begin{tcolorbox}[
+			width=5.2cm,
+			boxrule=0pt,
+			colframe=white!40!black,
+			colback=white,
+			rightrule=2pt,
+			sharp corners,
+			enhanced,
+			overlay={\node[anchor=north east,outer sep=2pt] at ([xshift=3cm,yshift=4mm]frame.north east) {\includegraphics[width=3cm]{logo}}; }]
+		\centering\ttfamily\bfseries latexindent.pl\\[1cm] Version 3.0
+	\end{tcolorbox}
+}
+\author{Chris Hughes \thanks{and contributors! See \vref{sec:contributors}. For
+		all communication, please visit \cite{latexindent-home}.}}
+\maketitle
+\begin{adjustwidth}{1cm}{1cm}
+	\small
+	\texttt{latexindent.pl} is a \texttt{Perl} script that indents \texttt{.tex} (and other)
+	files according to an indentation scheme that the user can modify to suit their
+	taste. Environments, including those with alignment delimiters (such as \texttt{tabular}),
+	and commands, including those that can split braces and brackets across lines,
+	are \emph{usually} handled correctly by the script. Options for \texttt{verbatim}-like
+	environments and commands, together with indentation after headings (such as \lstinline!chapter!, \lstinline!section!, etc)
+	are also available. The script also has the ability to modifiy line breaks, and add
+	comment symbols. All user options are customisable via the switches in the YAML interface.
+\end{adjustwidth}
+\tableofcontents
+{\small
+	\lstlistoflistings
+}
+
+\input{sec-introduction}
+\input{sec-demonstration}
+\input{sec-how-to-use}
+\input{sec-indent-config-and-settings.tex}
+\input{sec-default-user-local}
+\input{subsec-noAdditionalIndent-indentRules}
+\input{subsubsec-environments-and-their-arguments}
+\input{subsubsec-environments-with-items}
+\input{subsubsec-commands-with-arguments}
+\input{subsubsec-ifelsefi}
+\input{subsubsec-special}
+\input{subsubsec-headings}
+\input{subsubsec-no-add-remaining-code-blocks}
+\stopcontents[noAdditionalIndent]
+\input{subsec-commands-and-their-options}
+\input{sec-the-m-switch}
+\input{subsec-partnering-poly-switches}
+\input{subsec-conflicting-poly-switches}
+\input{sec-conclusions-know-limitations}
+\input{references}
+\input{appendices}
+\end{document}
+
+\subsection{The phases of \texttt{latexindent.pl}}
+	With these rules in mind, let's study a few test cases:
+
+	latexindent.pl environments-line-break-conflict.tex -s -t -m -o environments-line-break-conflict-mod1.tex -l=env-conflicts-mod1.yaml
+	latexindent.pl environments-line-break-conflict-nested.tex -s -t -m -o environments-line-break-conflict-nested-mod-2.tex -l=env-conflicts-mod2.yaml
+	latexindent.pl environments-line-break-conflict-nested.tex -s -t -m -o environments-line-break-conflict-nested-mod-3.tex -l=env-conflicts-mod3.yaml
+	environments-first-opt-args.tex, see all of the different examples in test-cases.sh
+	environments-second-opt-args.tex provides some interesting cases too
+
+	The \lstinline!\fi! command knows to insert a space, so as to give, for example, \lstinline!\fi! text, and avoid things such as \lstinline!\fitext!
+
+	from yaml
+

Added: trunk/Master/texmf-dist/doc/support/latexindent/logo.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/logo.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/logo.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,20 @@
+% arara: pdflatex
+%
+% to create the black and white logo:
+%       convert -density 1000 -colorspace GRAY logo.pdf logo-bw.pdf
+\documentclass[border=1mm]{standalone}
+
+\usepackage{tikz}
+\usetikzlibrary{matrix}
+\definecolor{harvestgold}{cmyk}{0.00, 0.05, 0.51, 0.07}  %EDE275
+\definecolor{cmhgold}{cmyk}{0,0.178,0.909,0.008}         %FDD017
+\definecolor{bakeoffblue}{cmyk}{0.24, 0.00, 0.02, 0.18}  %9fd2cd
+\definecolor{bakeoffgreen}{cmyk}{0.30, 0.00, 0.20, 0.29} %80b692
+\definecolor{burntorange}{cmyk}{0.00, 0.41, 1.00, 0.04}
+\begin{document}
+\begin{tikzpicture}[logo/.style={draw=blue,circle,fill=white}]
+	\matrix{
+		\node[logo,dash pattern=on .5pt off 1.0pt,thick,draw=purple!75!white]{};  & \node[logo,draw=burntorange]{};                         \\
+		\node[logo,fill,draw=bakeoffgreen,fill=bakeoffblue]{}; & \node[logo,double,draw=cmhgold,fill=harvestgold]{};\\};
+\end{tikzpicture}
+\end{document}

Added: trunk/Master/texmf-dist/doc/support/latexindent/references.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/references.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/references.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,4 @@
+\nocite{*}
+\section{References}
+ \printbibliography[heading=subbibnumbered,title={External links},notkeyword=contributor]
+ \printbibliography[env=specialbib,heading=subbibnumbered,title={Contributors\label{sec:contributors}},keyword=contributor]

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-conclusions-know-limitations.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-conclusions-know-limitations.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-conclusions-know-limitations.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,38 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\section{Conclusions and known limitations}\label{sec:knownlimitations}
+ There are a number of known limitations of the script, and almost certainly quite a
+ few that are \emph{unknown}!
+
+ For example, \texttt{latexindent.pl} will not indent the following code correctly,
+ because of the unmatched \lstinline![!. I'm hopeful to be able to resolve this
+ issue in a future version.
+
+ \begin{lstlisting}[,nolol=true,]
+\parbox{
+\@ifnextchar[{\@assignmentwithcutoff}{\@assignmentnocutoff}
+}
+\end{lstlisting}
+
+ The main other limitation is to do with the alignment routine of environments/commands that contain
+ delimiters which are specified in \texttt{lookForAlignDelims}.
+
+ The routine works well for `standard' blocks of code that have the same number of \lstinline!&!
+ per line, but it will not do anything for lines that do not -- such examples
+ include \texttt{tabular} environments that use \lstinline!\multicolumn! or
+ perhaps spread cell contents across multiple lines.  For each alignment block (\texttt{tabular},
+ \texttt{align}, etc) \texttt{latexindent.pl} first of all makes a record
+ of the maximum number of \lstinline!&!; if each row does not have that
+ number of \lstinline!&! then it will not try to format that row. Details
+ will be given in \texttt{indent.log} assuming that \texttt{trace} mode
+ is active.
+
+ You can run \texttt{latexindent} on \texttt{.sty}, \texttt{.cls} and any file types
+ that you specify in \lstinline[breaklines=true]!fileExtensionPreference! (see \vref{lst:fileExtensionPreference});
+ if you find a case in which the script struggles, please feel free
+ to report it at \cite{latexindent-home}, and
+ in the meantime, consider using a \texttt{noIndentBlock} (see \cpageref{lst:noIndentBlockdemo}).
+
+ I hope that this script is useful to some; if you find an example where the
+ script does not behave as you think it should, the best way to contact me is to
+ report an issue on \cite{latexindent-home}; otherwise, feel free to find me on
+ the \url{http://tex.stackexchange.com/users/6621/cmhughes}.

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-default-user-local.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-default-user-local.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-default-user-local.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,492 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\section{defaultSettings.yaml}\label{sec:defuseloc}
+ \texttt{latexindent.pl} loads its settings from \texttt{defaultSettings.yaml}. The idea is to separate the behaviour of the script
+ from the internal working -- this is very similar to the way that we separate content
+ from form when writing our documents in \LaTeX.
+
+ If you look in \texttt{defaultSettings.yaml} you'll find the switches
+ that govern the behaviour of \texttt{latexindent.pl}. If you're not sure where
+ \texttt{defaultSettings.yaml} resides on your computer, don't worry as \texttt{indent.log}
+ will tell you where to find it.
+ \texttt{defaultSettings.yaml} is commented,
+ but here is a description of what each switch is designed to do. The default
+ value is given in each case; whenever you see \emph{integer} in \emph{this}
+ section, assume that it must be greater than or equal to \texttt{0} unless
+ otherwise stated.
+
+\yamltitle{fileExtensionPreference}*{fields}
+	\texttt{latexindent.pl} can be called to
+	act on a file without
+	specifying the file extension.  For example we can call
+	\begin{commandshell}
+latexindent.pl myfile
+\end{commandshell}
+	\begin{wrapfigure}[8]{r}[0pt]{6cm}
+		\cmhlistingsfromfile[firstnumber=22,linerange={22-26},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{fileExtensionPreference}}{lst:fileExtensionPreference}
+	\end{wrapfigure}
+
+	in which case the script will look for \texttt{myfile} with the extensions
+	specified in \texttt{fileExtensionPreference} in their numeric order. If
+	no match is found, the script will exit. As with all of the fields, you should
+	change and/or add to this as necessary.
+
+	Calling \texttt{latexindent.pl myfile} with the (default) settings specified in \cref{lst:fileExtensionPreference}
+	means that the script will first look for \texttt{myfile.tex}, then \texttt{myfile.sty}, \texttt{myfile.cls},
+	and finally \texttt{myfile.bib} in order\footnote{Throughout this manual, listings with line numbers represent code
+		taken directly from \texttt{defaultSettings.yaml}.}.
+
+\yamltitle{backupExtension}*{extension name}
+
+	If you call \texttt{latexindent.pl} with the \texttt{-w} switch (to overwrite
+	\texttt{myfile.tex}) then it will create a backup file before doing
+	any indentation; the default extension is \texttt{.bak}, so, for example, \texttt{myfile.bak0}
+	would be created when calling \texttt{latexindent.pl myfile.tex}  for the first time.
+
+	By default, every time you subsequently call \texttt{latexindent.pl} with
+	the \texttt{-w} to act upon \texttt{myfile.tex}, it will create successive back up files: \texttt{myfile.bak1}, \texttt{myfile.bak2},
+	etc.
+
+\yamltitle{onlyOneBackUp}*{integer}
+	\label{page:onlyonebackup}
+	If you don't want a backup for every time that you call \texttt{latexindent.pl} (so
+	you don't want \texttt{myfile.bak1}, \texttt{myfile.bak2}, etc) and you simply
+	want \texttt{myfile.bak} (or whatever you chose \texttt{backupExtension} to be)
+	then change \texttt{onlyOneBackUp} to \texttt{1}; the default value of
+	\texttt{onlyOneBackUp} is \texttt{0}.
+
+\yamltitle{maxNumberOfBackUps}*{integer}
+	Some users may only want a finite number of backup files,
+	say at most $3$, in which case, they can change this switch.
+	The smallest value of \texttt{maxNumberOfBackUps} is $0$ which will \emph{not}
+	prevent backup files being made; in this case, the behaviour will be dictated
+	entirely by \texttt{onlyOneBackUp}. The default value of \texttt{maxNumberOfBackUps}
+	is \texttt{0}.
+
+\yamltitle{cycleThroughBackUps}*{integer}
+	Some users may wish to cycle through backup files, by deleting the
+	oldest backup file and keeping only the most recent; for example,
+	with \texttt{maxNumberOfBackUps: 4}, and \texttt{cycleThroughBackUps}
+	set to \texttt{1}  then the \texttt{copy} procedure given below
+	would be obeyed.
+
+	\begin{commandshell}
+copy myfile.bak1 to myfile.bak0
+copy myfile.bak2 to myfile.bak1
+copy myfile.bak3 to myfile.bak2
+copy myfile.bak4 to myfile.bak3
+	\end{commandshell}
+	The default value of \texttt{cycleThroughBackUps} is \texttt{0}.
+
+\yamltitle{logFilePreferences}*{fields}
+	\begin{wrapfigure}[10]{r}[0pt]{9cm}
+		\cmhlistingsfromfile[firstnumber=63,linerange={63-67},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.85\linewidth,before=\centering,yaml-TCB]{\texttt{logFilePreferences}}{lst:logFilePreferences}
+	\end{wrapfigure}
+	\texttt{latexindent.pl} writes information to \texttt{indent.log}, some
+	of which can be customised by changing \texttt{logFilePreferences}; see \cref{lst:logFilePreferences}.
+	If you load your own user settings (see \vref{sec:indentconfig}) then \texttt{latexindent.pl} will
+	detail them in \texttt{indent.log}; you can choose not to have the details logged by switching
+	\texttt{showEveryYamlRead} to \texttt{0}. Once all of your settings have
+	been loaded, you can see the amalgamated settings in the log file by switching \texttt{showAmalgamatedSettings}
+	to \texttt{1}, if you wish. The log file will end with the characters
+	given in \texttt{endLogFileWith}, and will report the \texttt{GitHub} address
+	of \texttt{latexindent.pl} to the log file if \texttt{showGitHubInfoFooter} is set to \texttt{1}.
+
+\yamltitle{verbatimEnvironments}*{fields}
+
+	\begin{wrapfigure}[14]{r}[0pt]{6cm}
+		\cmhlistingsfromfile[firstnumber=71,linerange={71-73},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{verbatimEnvironments}}{lst:verbatimEnvironments}
+
+		\vspace{.2cm}
+		\cmhlistingsfromfile[firstnumber=76,linerange={76-78},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{verbatimCommands}}{lst:verbatimCommands}
+	\end{wrapfigure}
+	A field that contains a list of environments
+	that you would like left completely alone -- no indentation will be performed
+	on environments that you have specified in this field, see \cref{lst:verbatimEnvironments}.
+
+	Note that if  you put an environment in \\ \texttt{verbatimEnvironments}
+	and in other fields such as \texttt{lookForAlignDelims} or \texttt{noAdditionalIndent}
+	then \texttt{latexindent.pl} will \emph{always} prioritize \\ \texttt{verbatimEnvironments}.
+
+\yamltitle{verbatimCommands}*{fields}
+	A field that contains a list of commands that are verbatim commands, for example
+	\lstinline|\lstinline|; any commands populated in this field are protected from line breaking
+	routines (only relevant if the \texttt{-m} is active, see \vref{sec:modifylinebreaks}).
+
+\yamltitle{noIndentBlock}*{fields}
+
+	\begin{wrapfigure}[8]{r}[0pt]{6cm}
+		\cmhlistingsfromfile[firstnumber=84,linerange={84-86},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{noIndentBlock}}{lst:noIndentBlock}
+	\end{wrapfigure}
+	If you have a block of code that you don't want \texttt{latexindent.pl} to touch (even if it is \emph{not} a verbatim-like
+	environment) then you can wrap it in an environment from \texttt{noIndentBlock};
+	you can use any name you like for this, provided you populate it as demonstrate in
+	\cref{lst:noIndentBlock}.
+
+	Of course, you don't want to have to specify these as null environments
+	in your code, so you use them with a comment symbol, \lstinline!%!, followed
+	by as many spaces (possibly none) as you like; see \cref{lst:noIndentBlockdemo} for
+	example.
+
+	\begin{cmhlistings}[style=demo,escapeinside={(*@}{@*)}]{\texttt{noIndentBlock} demonstration}{lst:noIndentBlockdemo}
+%(*@@*) \begin{noindent}
+        this code
+                won't
+     be touched
+                    by
+             latexindent.pl!
+%(*@@*)\end{noindent}
+	\end{cmhlistings}
+
+\yamltitle{removeTrailingWhitespace}*{fields}\label{yaml:removeTrailingWhitespace}
+
+	\begin{wrapfigure}[12]{r}[0pt]{6cm}
+		\cmhlistingsfromfile[firstnumber=89,linerange={89-91},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{removeTrailingWhitespace}{lst:removeTrailingWhitespace}
+
+		\vspace{.2cm}
+		\cmhlistingsfromfile[firstnumber=95,linerange={95-98},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{fileContentsEnvironments}}{lst:fileContentsEnvironments}
+	\end{wrapfigure}
+	Trailing white space can be removed both \emph{before} and \emph{after} processing
+	the document, as detailed in \cref{lst:removeTrailingWhitespace}; each of the fields
+	can take the values \texttt{0} or \texttt{1}. See \vref{lst:removeTWS-before,lst:env-mlb5-modAll,lst:env-mlb5-modAll-remove-WS}
+	for before and after results.  Thanks to \cite{vosskuhle} for providing this feature.
+
+\yamltitle{fileContentsEnvironments}*{field}
+
+	Before \texttt{latexindent.pl} determines the difference between preamble (if any) and the main document,
+	it first searches for any of the environments specified in \texttt{fileContentsEnvironments}, see
+	\cref{lst:fileContentsEnvironments}.
+	The behaviour of \texttt{latexindent.pl} on these environments is determined by their location (preamble or not), and
+	the value \texttt{indentPreamble}, discussed next.
+
+\yamltitle{indentPreamble}{0|1}
+
+	The preamble of a document can sometimes contain some trickier code
+	for \texttt{latexindent.pl} to operate upon. By default, \texttt{latexindent.pl}
+	won't try to operate on the preamble (as \texttt{indentPreamble} is set to \texttt{0},
+	by default), but if you'd like \texttt{latexindent.pl} to try then change \texttt{indentPreamble} to \texttt{1}.
+
+\yamltitle{lookForPreamble}*{fields}
+
+	\begin{wrapfigure}[8]{r}[0pt]{5cm}
+		\cmhlistingsfromfile[firstnumber=103,linerange={103-107},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{lookForPreamble}{lst:lookForPreamble}
+	\end{wrapfigure}
+	Not all files contain preamble; for example, \texttt{sty}, \texttt{cls} and \texttt{bib} files typically do \emph{not}. Referencing
+	\cref{lst:lookForPreamble}, if you set, for example, \texttt{.tex} to \texttt{0}, then regardless of the setting of the value of \texttt{indentPreamble}, preamble
+	will not be assumed when operating upon \texttt{.tex} files.
+\yamltitle{preambleCommandsBeforeEnvironments}{0|1}
+	Assuming that \texttt{latexindent.pl} is asked to operate upon the preamble of a document,
+	when this switch is set to \texttt{0} then environment code blocks will be sought first,
+	and then command code blocks. When this switch is set to \texttt{1}, commands
+	will be sought first. The example that first motivated this switch contained the code given in \cref{lst:motivatepreambleCommandsBeforeEnvironments}.
+
+	\begin{cmhlistings}{Motivating \texttt{preambleCommandsBeforeEnvironments}}{lst:motivatepreambleCommandsBeforeEnvironments}
+...
+preheadhook={\begin{mdframed}[style=myframedstyle]},
+postfoothook=\end{mdframed},
+...
+\end{cmhlistings}
+
+\yamltitle{defaultIndent}*{horizontal space}
+	This is the default indentation (\lstinline!\t! means a tab, and is the default value) used in the absence of other details
+	for the command or environment we are working with; see \texttt{indentRules} in \vref{sec:noadd-indent-rules}
+	for more details.
+
+	If you're interested in experimenting with \texttt{latexindent.pl} then you
+	can \emph{remove} all indentation by setting \texttt{defaultIndent: ""}.
+
+\yamltitle{lookForAlignDelims}*{fields}
+	\begin{wrapfigure}[12]{r}[0pt]{5cm}
+		\begin{yaml}[numbers=none]{\texttt{lookForAlignDelims} (basic)}[width=.8\linewidth,before=\centering]{lst:aligndelims:basic}
+lookForAlignDelims:
+   tabular: 1
+   tabularx: 1
+   longtable: 1
+   array: 1
+   matrix: 1
+   ...
+	\end{yaml}
+	\end{wrapfigure}
+	This contains a list of environments and/or commands that
+	are operated upon in a special way by \texttt{latexindent.pl} (see \cref{lst:aligndelims:basic}).
+	In fact, the fields in \texttt{lookForAlignDelims} can actually
+	take two different forms: the \emph{basic} version is shown in \cref{lst:aligndelims:basic}
+	and the \emph{advanced} version in \cref{lst:aligndelims:advanced}; we will discuss each in turn.
+
+	The environments specified in this field will be operated on in a special way  by \texttt{latexindent.pl}. In particular, it will try and align each column by its alignment
+	tabs. It does have some limitations (discussed further in \cref{sec:knownlimitations}),
+	but in many cases it will produce results such as those in \cref{lst:tabularbefore:basic,lst:tabularafter:basic}.
+
+	If you find that \texttt{latexindent.pl} does not perform satisfactorily on such
+	environments then you can set the relevant key to \texttt{0}, for example \texttt{tabular: 0}; alternatively, if you just want to ignore \emph{specific}
+	instances of the environment, you could wrap them in something from \texttt{noIndentBlock} (see \cref{lst:noIndentBlock}).
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tabular1.tex}{\texttt{tabular1.tex}}{lst:tabularbefore:basic}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tabular1-default.tex}{\texttt{tabular1.tex} default output}{lst:tabularafter:basic}
+	\end{minipage}%
+
+	If you wish to remove the alignment of the \lstinline!\\! within a delimiter-aligned block, then the
+	advanced form of \texttt{lookForAlignDelims} shown in \cref{lst:aligndelims:advanced} is for you.
+
+	\cmhlistingsfromfile[style=yaml-LST]{demonstrations/tabular.yaml}[yaml-TCB]{\texttt{tabular.yaml}}{lst:aligndelims:advanced}
+
+	Note that you can use a mixture of the basic and advanced form: in \cref{lst:aligndelims:advanced} \texttt{tabular} and \texttt{tabularx}
+	are advanced and \texttt{longtable} is basic. When using the advanced form, each field should receive at least 1 sub-field, and \emph{can} (but does not have to) receive up to 3 fields:
+	\begin{itemize}
+		\item \texttt{delims}: switch equivalent to simply specifying, for example, \texttt{tabular: 1} in
+		      the basic version shown in \cref{lst:aligndelims:basic} (default: 1);
+		\item \texttt{alignDoubleBackSlash}: switch to determine if \lstinline!\\! should be aligned (default: 1);
+		\item \texttt{spacesBeforeDoubleBackSlash}: optionally, specifies the number of spaces to be inserted
+		      before (non-aligned) \lstinline!\\!. In order to use this field, \texttt{alignDoubleBackSlash} needs
+		      to be set to 0 (default: 0).
+	\end{itemize}
+
+	Assuming that you have the settings in \cref{lst:aligndelims:advanced} saved in \texttt{tabular.yaml}, and the code
+	from \cref{lst:tabularbefore:basic} in \texttt{tabular1.tex} and you run
+	\begin{commandshell}
+latexindent.pl -l tabular.yaml tabular1.tex 
+\end{commandshell}
+	then you should receive the before-and-after results shown in
+	\cref{lst:tabularbefore:advanced,lst:tabularafter:advanced}; note that the ampersands have been aligned, but
+	the \lstinline!\\! have not (compare the alignment of \lstinline!\\! in \cref{lst:tabularafter:basic,lst:tabularafter:advanced}).
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tabular1.tex}{\texttt{tabular1.tex}}{lst:tabularbefore:advanced}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tabular1-advanced.tex}{\texttt{tabular1.tex} using \cref{lst:aligndelims:advanced}}{lst:tabularafter:advanced}
+	\end{minipage}%
+
+	Saving \cref{lst:aligndelims:advanced} into \texttt{tabular1.yaml} as in \cref{lst:tabular1YAML}, and running the command
+	\begin{commandshell}
+latexindent.pl -l tabular1.yaml tabular1.tex 
+\end{commandshell}
+	gives \cref{lst:tabularafter:spacing}; note the spacing before the \lstinline!\\!.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tabular1-advanced-3spaces.tex}{\texttt{tabular1.tex} using \cref{lst:tabular1YAML}}{lst:tabularafter:spacing}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.54\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/tabular1.yaml}[yaml-TCB]{\texttt{tabular1.yaml}}{lst:tabular1YAML}
+	\end{minipage}%
+
+	As of Version 3.0, the alignment routine works on mandatory and optional arguments within commands, and also within `special' code blocks
+	(see \texttt{specialBeginEnd} on \cpageref{yaml:specialBeginEnd}); for example, assuming that you have a command called \lstinline!\matrix!
+	and that it is populated within \texttt{lookForAlignDelims} (which it is, by default), and that you
+	run the command
+	\begin{commandshell}
+latexindent.pl matrix1.tex 
+    \end{commandshell}
+	then the before-and-after results
+	shown in \cref{lst:matrixbefore,lst:matrixafter} are achievable by default.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/matrix1.tex}{\texttt{matrix1.tex}}{lst:matrixbefore}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/matrix1-default.tex}{\texttt{matrix1.tex} default output}{lst:matrixafter}
+	\end{minipage}%
+
+	If you have blocks of code that you wish to align at the \&  character that
+	are \emph{not} wrapped in, for example, \lstinline!\begin{tabular}! \ldots \lstinline!\end{tabular}!, then you can use the mark up
+	illustrated in \cref{lst:alignmentmarkup}; the default output is shown in \cref{lst:alignmentmarkup-default}. Note that the \lstinline!%*! must be next to
+	each other, but that there can be any number of spaces (possibly none) between the
+	\lstinline!*! and \lstinline!\begin{tabular}!; note also that you may use any
+	environment name that you have specified in \texttt{lookForAlignDelims}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/align-block.tex}{\texttt{align-block.tex}}{lst:alignmentmarkup}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/align-block-default.tex}{\texttt{align-block.tex} default output}{lst:alignmentmarkup-default}
+	\end{minipage}%
+
+	With reference to \vref{tab:code-blocks} and the, yet undiscussed, fields of \texttt{noAdditionalIndent} and \texttt{indentRules}
+	(see \vref{sec:noadd-indent-rules}), these comment-marked blocks are considered \texttt{environments}.
+
+\yamltitle{indentAfterItems}*{fields}
+	\begin{wrapfigure}[5]{r}[0pt]{7cm}
+		\cmhlistingsfromfile[firstnumber=155,linerange={155-158},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{indentAfterItems}}{lst:indentafteritems}
+	\end{wrapfigure}
+	The environment names specified in \texttt{indentAfterItems}  tell
+	\texttt{latexindent.pl} to look for \lstinline!\item! commands; if these switches are set to \texttt{1}
+	then indentation will be performed so as indent the code after each \texttt{item}.
+	A demonstration is given in \cref{lst:itemsbefore,lst:itemsafter}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/items1.tex}{\texttt{items1.tex}}{lst:itemsbefore}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/items1-default.tex}{\texttt{items1.tex} default output}{lst:itemsafter}
+	\end{minipage}
+
+\yamltitle{itemNames}*{fields}
+	\begin{wrapfigure}[5]{r}[0pt]{5cm}
+		\cmhlistingsfromfile[firstnumber=164,linerange={164-166},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{itemNames}}{lst:itemNames}
+	\end{wrapfigure}
+	If you have your own \texttt{item} commands (perhaps you
+	prefer to use \texttt{myitem}, for example)
+	then you can put populate them in \texttt{itemNames}.
+	For example, users of the \texttt{exam} document class might like to add
+	\texttt{parts} to \texttt{indentAfterItems} and \texttt{part} to \texttt{itemNames}
+	to their user settings (see \vref{sec:indentconfig} for details of how to configure user settings,
+	and \vref{lst:mysettings} \\ in particular \label{page:examsettings}.)
+
+\yamltitle{specialBeginEnd}*{fields}\label{yaml:specialBeginEnd}
+	The fields specified in \texttt{specialBeginEnd} are, in their default state, focused on math mode begin and end statements, but
+	there is no requirement for this to be the case; \cref{lst:specialBeginEnd} shows the
+	default settings of \texttt{specialBeginEnd}.
+
+	\cmhlistingsfromfile[firstnumber=170,linerange={170-182},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{specialBeginEnd}}{lst:specialBeginEnd}
+
+	The field \texttt{displayMath} represents \lstinline!\[...\]!, \texttt{inlineMath} represents
+	\lstinline!$...$! and \texttt{displayMathTex} represents \lstinline!$$...$$!. You can, of course,
+	rename these in your own YAML files (see \vref{sec:localsettings}); indeed, you
+	might like to set up your own specil begin and end statements.
+
+	A demonstration of the before-and-after results are shown in \cref{lst:specialbefore,lst:specialafter}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1.tex}{\texttt{special1.tex} before}{lst:specialbefore}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1-default.tex}{\texttt{special1.tex} default output}{lst:specialafter}
+	\end{minipage}
+
+	For each field, \texttt{lookForThis} is set to \texttt{1} by default, which means that \texttt{latexindent.pl}
+	will look for this pattern; you can tell \texttt{latexindent.pl} not to look for the pattern, by setting
+	\texttt{lookForThis} to \texttt{0}.
+
+\yamltitle{indentAfterHeadings}*{fields}
+	\begin{wrapfigure}[17]{r}[0pt]{8cm}
+		\cmhlistingsfromfile[firstnumber=192,linerange={192-201},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{indentAfterHeadings}}{lst:indentAfterHeadings}
+	\end{wrapfigure}
+	This field enables the user to specify
+	indentation rules that take effect after heading commands such as \lstinline!\part!, \lstinline!\chapter!,
+	\lstinline!\section!, \lstinline!\subsection*!, or indeed any user-specified command written in this field.\footnote{There is a slight
+		difference in interface for this field when comparing Version 2.2 to Version 3.0; see \vref{app:differences} for details.}
+
+	The default settings do \emph{not} place indentation after a heading, but you
+	can easily switch them on by changing \\ \texttt{indentAfterThisHeading: 0} to \\ \texttt{indentAfterThisHeading: 1}.
+	The \texttt{level} field tells \texttt{latexindent.pl} the hierarchy of the heading
+	structure in your document. You might, for example, like to have both \texttt{section}
+	and \texttt{subsection} set with \texttt{level: 3} because you do not want the indentation to go too deep.
+
+	You can add any of your own custom heading commands to this field, specifying the \texttt{level}
+	as appropriate.  You can also specify your own indentation in \texttt{indentRules} (see \vref{sec:noadd-indent-rules});
+	you will find the default \texttt{indentRules} contains \lstinline!chapter: " "! which
+	tells \texttt{latexindent.pl} simply to use a space character after \texttt{\chapter} headings
+	(once \texttt{indent} is set to \texttt{1} for \texttt{chapter}).
+
+	For example, assuming that you have the code in \cref{lst:headings1yaml} saved into \texttt{headings1.yaml},
+	and that you have the text from \cref{lst:headings1} saved into \texttt{headings1.tex}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings1.yaml}[yaml-TCB]{\texttt{headings1.yaml}}{lst:headings1yaml}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings1.tex}{\texttt{headings1.tex}}{lst:headings1}
+	\end{minipage}
+
+	If you run the command
+	\begin{commandshell}
+latexindent.pl headings1.tex -l=headings1.yaml
+\end{commandshell}
+	then you should receive the output given in \cref{lst:headings1-mod1}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings1-mod1.tex}{\texttt{headings1.tex} using \cref{lst:headings1yaml}}{lst:headings1-mod1}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings1-mod2.tex}{\texttt{headings1.tex} second modification}{lst:headings1-mod2}
+	\end{minipage}
+
+	Now say that you modify the \texttt{YAML} from \cref{lst:headings1yaml} so that the \texttt{paragraph} \texttt{level} is \texttt{1}; after
+	running
+	\begin{commandshell}
+latexindent.pl headings1.tex -l=headings1.yaml
+\end{commandshell}
+	you should receive the code given in \cref{lst:headings1-mod2}; notice that
+	the \texttt{paragraph} and \texttt{subsection} are at the same indentation level.
+
+\subsection{The code blocks known \texttt{latexindent.pl}}\label{subsubsec:code-blocks}
+	As of Version 3.0, \texttt{latexindent.pl} processes documents using code blocks; each
+	of these are shown in \cref{tab:code-blocks}.
+
+	\begin{longtable}{m{.3\linewidth}@{\hspace{.25cm}}m{.4\linewidth}@{}m{.2\linewidth}}
+		\caption{Code blocks known to \texttt{latexindent.pl}}\label{tab:code-blocks}\\
+		\toprule
+		Code block                    & characters allowed in name                                                                                     & example                                                                                                                                                                                                                                     \\
+		\midrule
+		environments                  & \lstinline!a-zA-Z@\*0-9_\\!                                                                                        &
+		\begin{lstlisting}[,nolol=true,]
+\begin{myenv}
+body of myenv
+\end{myenv}
+  \end{lstlisting}
+		\\\cmidrule{2-3}
+		optionalArguments             & \emph{inherits} name from parent (e.g environment name)                                                        &
+		\begin{lstlisting}[,nolol=true,]
+[
+opt arg text
+]
+  \end{lstlisting}
+		\\\cmidrule{2-3}
+		mandatoryArguments            & \emph{inherits} name from parent (e.g environment name)                                                        &
+		\begin{lstlisting}[,nolol=true,]
+{
+mand arg text
+}
+  \end{lstlisting}
+		\\\cmidrule{2-3}
+		commands                      & \lstinline!+a-zA-Z@\*0-9_\:!                                                                                        & \lstinline!\mycommand!$\langle$\itshape{arguments}$\rangle$                                                                                                                                                                                \\\cmidrule{2-3}
+		keyEqualsValuesBracesBrackets & \lstinline!a-zA-Z@\*0-9_\/.\h\{\}:\#-!                                                                                        & \lstinline!my key/.style=!$\langle$\itshape{arguments}$\rangle$                                                                                                                                                                                \\\cmidrule{2-3}
+		namedGroupingBracesBrackets   & \lstinline!a-zA-Z@\*><!                                                                                        & \lstinline!in!$\langle$\itshape{arguments}$\rangle$                                                                                                                                                                                \\\cmidrule{2-3}
+		UnNamedGroupingBracesBrackets & \centering\emph{No name!}                                                                                      & \lstinline!{! or \lstinline![! or \lstinline!,! or \lstinline!&! or \lstinline!)! or \lstinline!(! or \lstinline!$! followed by $\langle$\itshape{arguments}$\rangle$ \\\cmidrule{2-3}
+		ifElseFi                      & \lstinline!@a-zA-Z! but must begin with either \newline \lstinline!\if! of \lstinline!\@if! &
+		\begin{lstlisting}[,nolol=true,]
+\ifnum...
+...
+\else
+...
+\fi
+  \end{lstlisting}\\\cmidrule{2-3}
+		items                         & User specified, see \vref{lst:indentafteritems,lst:itemNames}                                                  &
+		\begin{lstlisting}[,nolol=true,]
+\begin{enumerate}
+  \item ...
+\end{enumerate}
+  \end{lstlisting}\\\cmidrule{2-3}
+		specialBeginEnd               & User specified, see \vref{lst:specialBeginEnd}                                                                 &
+		\begin{lstlisting}[,nolol=true,]
+\[
+  ...
+\]
+  \end{lstlisting}\\\cmidrule{2-3}
+		afterHeading                  & User specified, see \vref{lst:indentAfterHeadings}                                                             &
+		\begin{lstlisting}[,morekeywords={chapter},nolol=true,]
+\chapter{title}
+  ...
+\section{title}
+  \end{lstlisting}\\\cmidrule{2-3}
+		filecontents                  & User specified, see \vref{lst:fileContentsEnvironments}                                                        &
+		\begin{lstlisting}[,nolol=true,]
+\begin{filecontents}
+...
+\end{filecontents}
+  \end{lstlisting}\\
+		\bottomrule
+	\end{longtable}
+
+	We will refer to these code blocks in what follows.

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-demonstration.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-demonstration.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-demonstration.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,40 @@
+\section{Demonstration: before and after}
+ Let's give a demonstration of some before and after code -- after all, you probably
+ won't want to try the script if you don't much like the results. You might also
+ like to watch the video demonstration I made on youtube \cite{cmh:videodemo}
+
+ As you look at \crefrange{lst:filecontentsbefore}{lst:pstricksafter}, remember
+ that \texttt{latexindent.pl} is just following its rules, and there is nothing
+ particular about these code snippets. All of the rules can be modified
+ so that you can personalize your indentation scheme.
+
+ In each of the samples given in \crefrange{lst:filecontentsbefore}{lst:pstricksafter}
+ the `before' case is a `worst case scenario' with no effort to make indentation. The `after'
+ result would be the same, regardless of the leading white space at the beginning of
+ each line which is stripped by \texttt{latexindent.pl} (unless a \texttt{verbatim}-like
+ environment or \texttt{noIndentBlock} is specified -- more on this in \cref{sec:defuseloc}).
+
+ \begin{widepage}
+	 \centering
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/filecontents1.tex}{\texttt{filecontents1.tex}}{lst:filecontentsbefore}
+	 \end{minipage}\hfill
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/filecontents1-default.tex}{\texttt{filecontents1.tex} default output}{lst:filecontentsafter}
+	 \end{minipage}%
+
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/tikzset.tex}{\texttt{tikzset.tex}}{lst:tikzsetbefore}
+	 \end{minipage}\hfill
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/tikzset-default.tex}{\texttt{tikzset.tex} default output}{lst:tikzsetafter}
+	 \end{minipage}%
+
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/pstricks.tex}{\texttt{pstricks.tex}}{lst:pstricksbefore}
+	 \end{minipage}\hfill
+	 \begin{minipage}{.45\linewidth}
+		 \cmhlistingsfromfile{demonstrations/pstricks-default.tex}{\texttt{pstricks.tex} default output}{lst:pstricksafter}
+	 \end{minipage}%
+ \end{widepage}
+

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-how-to-use.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-how-to-use.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-how-to-use.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,248 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\section{How to use the script}
+ \texttt{latexindent.pl} ships as part of the \TeX Live distribution for
+ Linux and Mac users; \texttt{latexindent.exe} ships as part of the \TeX Live
+ and MiK\TeX{} distributions for Windows users. These files are also available
+ from github \cite{latexindent-home} should you wish to use them without
+ a \TeX{} distribution; in this case, you may like to read \vref{sec:updating-path}
+ which details how the \texttt{path} variable can be updated.
+
+ In what follows, we will always refer to \texttt{latexindent.pl}, but depending on
+ your operating system and preference, you might substitute \texttt{latexindent.exe} or
+ simply \texttt{latexindent}.
+
+ There are two ways to use \texttt{latexindent.pl}: from the command line,
+ and using \texttt{arara}; we discuss these in \cref{sec:commandline} and
+ \cref{sec:arara} respectively. We will discuss how to change the settings and
+ behaviour of the script in \vref{sec:defuseloc}.
+
+ \texttt{latexindent.pl} ships with \texttt{latexindent.exe} for Windows
+ users, so that you can use the script with or without a Perl distribution.
+ If you plan to use \texttt{latexindent.pl} (i.e, the original Perl script) then you will
+ need a few standard Perl modules -- see \vref{sec:requiredmodules} for details.
+
+\subsection{From the command line}\label{sec:commandline}
+	\texttt{latexindent.pl} has a number of different switches/flags/options, which
+	can be combined in any way that you like, either in short or long form as detailed below.
+	\texttt{latexindent.pl}  produces a \texttt{.log} file, \texttt{indent.log}, every time it
+	is run; the name of the log file can be customised, but we will
+	refer to the log file as \texttt{indent.log} throughout this document.
+	There is a base of information that is written to \texttt{indent.log},
+	but other additional information will be written depending
+	on which of the following options are used.
+
+	\begin{commandshell}
+latexindent.pl
+      \end{commandshell}
+
+	This will output a welcome message to the terminal, including the version number
+	and available options.
+
+\flagbox{-h, --help}
+
+	\begin{commandshell}
+latexindent.pl -h
+      \end{commandshell}
+
+	As above this will output a welcome message to the terminal, including the version number
+	and available options.
+	\begin{commandshell}
+latexindent.pl myfile.tex
+      \end{commandshell}
+
+	This will operate on \texttt{myfile.tex}, but will simply output to your terminal; \texttt{myfile.tex} will	not be changed
+	by \texttt{latexindent.pl} in any way using this command.
+
+\flagbox{-w, --overwrite}
+	\begin{commandshell}
+latexindent.pl -w myfile.tex
+latexindent.pl --overwrite myfile.tex
+latexindent.pl myfile.tex --overwrite 
+      \end{commandshell}
+
+	This \emph{will} overwrite \texttt{myfile.tex}, but it will
+	make a copy of \texttt{myfile.tex} first. You can control the name of
+	the extension (default is \texttt{.bak}), and how many different backups are made --
+	more on this in \cref{sec:defuseloc}, and in particular see \texttt{backupExtension} and \texttt{onlyOneBackUp}.
+
+	Note that if \texttt{latexindent.pl} can not create the backup, then it
+	will exit without touching your original file; an error message will be given
+	asking you to check the permissions of the backup file.
+
+\flagbox{-o=output.tex,--outputfile=output.tex}
+	\begin{commandshell} 
+latexindent.pl -o=output.tex myfile.tex
+latexindent.pl myfile.tex -o=output.tex 
+latexindent.pl --outputfile=output.tex myfile.tex
+latexindent.pl --outputfile output.tex myfile.tex
+      \end{commandshell}
+
+	This will indent \texttt{myfile.tex} and output it to \texttt{output.tex},
+	overwriting it (\texttt{output.tex}) if it already exists\footnote{Users of version 2.* should
+		note the subtle change in syntax}. Note that if \texttt{latexindent.pl} is called with both
+	the \texttt{-w} and \texttt{-o} switches, then \texttt{-w} will
+	be ignored and \texttt{-o} will take priority (this seems safer than the
+	other way round).
+
+	Note that using \texttt{-o} is equivalent to using
+	\begin{commandshell}
+latexindent.pl myfile.tex > output.tex
+\end{commandshell}
+	See \vref{app:differences} for details of how the interface has changed
+	from Version 2.2 to Version 3.0 for this flag.
+\flagbox{-s, --silent}
+	\begin{commandshell}
+latexindent.pl -s myfile.tex
+latexindent.pl myfile.tex -s
+      \end{commandshell}
+
+	Silent mode: no output will be given to the terminal.
+
+\flagbox{-t, --trace}
+	\begin{commandshell}
+latexindent.pl -t myfile.tex
+latexindent.pl myfile.tex -t
+      \end{commandshell}
+
+	\label{page:traceswitch}
+	Tracing mode: verbose output will be given to \texttt{indent.log}. This
+	is useful if \texttt{latexindent.pl} has made a mistake and you're
+	trying to find out where and why. You might also be interested in learning
+	about \texttt{latexindent.pl}'s thought process -- if so, this
+	switch is for you, although it should be noted that, especially for large files, this does affect
+	performance of the script.
+
+\flagbox{-tt, --ttrace}
+	\begin{commandshell}
+latexindent.pl -tt myfile.tex
+latexindent.pl myfile.tex -tt
+      \end{commandshell}
+
+	\emph{More detailed} tracing mode: this option gives more details to \texttt{indent.log}
+	than the standard \texttt{trace} option (note that, even more so than with \texttt{-t},
+	especially for large files, performance of the script will be affected).
+
+\flagbox{-l, --local[=myyaml.yaml,other.yaml,...]}
+	\begin{commandshell}
+latexindent.pl -l myfile.tex
+latexindent.pl -l=myyaml.yaml myfile.tex
+latexindent.pl -l myyaml.yaml myfile.tex
+latexindent.pl -l first.yaml,second.yaml,third.yaml myfile.tex
+latexindent.pl -l=first.yaml,second.yaml,third.yaml myfile.tex
+latexindent.pl myfile.tex -l=first.yaml,second.yaml,third.yaml 
+      \end{commandshell}
+
+	\label{page:localswitch}
+	\texttt{latexindent.pl} will always load \texttt{defaultSettings.yaml} (rhymes with camel)
+	and if it is called with the \texttt{-l} switch and it finds \texttt{localSettings.yaml}
+	in the same directory as \texttt{myfile.tex} then these settings will be
+	added to the indentation scheme. Information will be given in \texttt{indent.log} on
+	the success or failure of loading \texttt{localSettings.yaml}.
+
+	The \texttt{-l} flag can take an \emph{optional} parameter which details the name (or names separated by commas) of a YAML file(s)
+	that resides in the same directory as \texttt{myfile.tex}; you can use this option if you would
+	like to load a settings file in the current working directory that is \emph{not} called \texttt{localSettings.yaml}.
+	In fact, you can specify \emph{relative} path names to the current directory, but \emph{not}
+	absolute paths -- for absolute paths, see \vref{sec:indentconfig}.
+	Explicit demonstrations of how to use the \texttt{-l} switch are given throughout this documentation.
+
+\flagbox{-d, --onlydefault}
+	\begin{commandshell}
+latexindent.pl -d myfile.tex
+      \end{commandshell}
+
+	Only \texttt{defaultSettings.yaml}: you might like to read \cref{sec:defuseloc} before
+	using this switch. By default, \texttt{latexindent.pl} will always search for
+	\texttt{indentconfig.yaml} or \texttt{.indentconfig.yaml}  in your home directory. If you would prefer it not to do so
+	then (instead of deleting or renaming \texttt{indentconfig.yaml}/\texttt{.indentconfig.yaml}) you can simply
+	call the script with the \texttt{-d} switch; note that this will also tell
+	the script to ignore \texttt{localSettings.yaml} even if it has been called with the
+	\texttt{-l} switch.
+
+\flagbox{-c, --cruft=<directory>}
+	\begin{commandshell}
+latexindent.pl -c=/path/to/directory/ myfile.tex
+      \end{commandshell}
+
+	If you wish to have backup files and \texttt{indent.log} written to a directory
+	other than the current working directory, then you can send these `cruft' files
+	to another directory.
+	% this switch was made as a result of http://tex.stackexchange.com/questions/142652/output-latexindent-auxiliary-files-to-a-different-directory
+
+\flagbox{-g, --logfile}
+	\begin{commandshell}
+latexindent.pl -g=other.log myfile.tex
+latexindent.pl -g other.log myfile.tex
+latexindent.pl --logfile other.log myfile.tex
+latexindent.pl myfile.tex -g other.log 
+      \end{commandshell}
+
+	By default, \texttt{latexindent.pl} reports information to \texttt{indent.log}, but if you wish to change the
+	name of this file, simply call the script with your chosen name after the \texttt{-g} switch as demonstrated above.
+
+\flagbox{-m, --modifylinebreaks}
+	\begin{commandshell}
+latexindent.pl -m myfile.tex
+latexindent.pl -modifylinebreaks myfile.tex
+      \end{commandshell}
+
+	One of the most exciting developments in Version~3.0 is the ability to modify line breaks; for full details
+	see \vref{sec:modifylinebreaks}
+
+	\texttt{latexindent.pl} can also be called on a file without the file extension, for
+	example
+	\begin{commandshell}
+latexindent.pl myfile
+    \end{commandshell}
+	and in which case, you can specify
+	the order in which extensions are searched for; see \vref{lst:fileExtensionPreference}
+	for full details.
+
+\subsection{From \texttt{arara}}\label{sec:arara}
+	Using \texttt{latexindent.pl} from the command line is fine for some folks, but
+	others may find it easier to use from \texttt{arara}. \texttt{arara} ships with
+	a rule, \texttt{indent.yaml}, but in case you do not have this rule, you can find it at \cite{paulo}.
+
+	You can use the rule in any of the ways described in \cref{lst:arara} (or combinations thereof).
+	In fact, \texttt{arara} allows yet greater flexibility -- you can use \texttt{yes/no}, \texttt{true/false}, or \texttt{on/off} to toggle the various options.
+	\begin{cmhlistings}[style=demo,escapeinside={(*@}{@*)}]{\texttt{arara} sample usage}{lst:arara}
+%(*@@*) arara: indent
+%(*@@*) arara: indent: {overwrite: yes}
+%(*@@*) arara: indent: {output: myfile.tex}
+%(*@@*) arara: indent: {silent: yes}
+%(*@@*) arara: indent: {trace: yes}
+%(*@@*) arara: indent: {localSettings: yes}
+%(*@@*) arara: indent: {onlyDefault: on}
+%(*@@*) arara: indent: { cruft: /home/cmhughes/Desktop }
+\documentclass{article}
+...
+\end{cmhlistings}
+%(*@@*) arara: indent: { modifylinebreaks: yes }
+
+	Hopefully the use of these rules is fairly self-explanatory, but for completeness
+	\cref{tab:orbsandswitches} shows the relationship between \texttt{arara} directive arguments and the
+	switches given in \cref{sec:commandline}.
+
+	\begin{table}[!ht]
+		\centering
+		\caption{\texttt{arara} directive arguments and corresponding switches}
+		\label{tab:orbsandswitches}
+		\begin{tabular}{lc}
+			\toprule
+			\texttt{arara} directive argument & switch      \\
+			\midrule
+			\texttt{overwrite}                & \texttt{-w} \\
+			\texttt{output}                   & \texttt{-o} \\
+			\texttt{silent}                   & \texttt{-s} \\
+			\texttt{trace}                    & \texttt{-t} \\
+			\texttt{localSettings}            & \texttt{-l} \\
+			\texttt{onlyDefault}              & \texttt{-d} \\
+			\texttt{cruft}                    & \texttt{-c} \\
+			\texttt{modifylinebreaks}         & \texttt{-m} \\
+			\bottomrule
+		\end{tabular}
+	\end{table}
+
+	The \texttt{cruft} directive does not work well when used with
+	directories that contain spaces.
+

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-indent-config-and-settings.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-indent-config-and-settings.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-indent-config-and-settings.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,154 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\section{User, local settings, \texttt{indentconfig.yaml} and \texttt{.indentconfig.yaml}}\label{sec:indentconfig}
+ Editing \texttt{defaultSettings.yaml} is not ideal as it may be overwritten when
+ updating your distribution--a better way to customize the settings to your liking
+ is to set up your own settings file,
+ \texttt{mysettings.yaml} (or any name you like, provided it ends with \texttt{.yaml}).
+ The only thing you have to do is tell \texttt{latexindent.pl} where to find it.
+
+ \texttt{latexindent.pl} will always check your home directory for \texttt{indentconfig.yaml}
+ and  \texttt{.indentconfig.yaml} (unless
+ it is called with the \texttt{-d} switch),
+ which is a plain text file you can create that contains the \emph{absolute}
+ paths for any settings files that you wish \texttt{latexindent.pl} to load. There is no difference
+ between \texttt{indentconfig.yaml} and \texttt{.indentconfig.yaml}, other than the
+ fact that \texttt{.indentconfig.yaml} is a `hidden' file; thank you to \cite{jacobo-diaz-hidden-config}
+ for providing this feature. In what follows, we will use \texttt{indentconfig.yaml}, but it
+ is understood that this equally represents \texttt{.indentconfig.yaml} as well. If you
+ have both files in existence,  \texttt{indentconfig.yaml} takes priority.
+
+ For Mac and Linux users, their home directory is \texttt{~/username} while
+ Windows (Vista onwards) is \lstinline!C:\Users\username!\footnote{If you're not sure
+	 where to put \texttt{indentconfig.yaml}, don't
+	 worry \texttt{latexindent.pl} will tell you in the log file exactly where to
+	 put it assuming it doesn't exist already.}
+ \Cref{lst:indentconfig} shows a sample \texttt{indentconfig.yaml} file.
+
+ \begin{yaml}{\texttt{indentconfig.yaml} (sample)}{lst:indentconfig}
+	# Paths to user settings for latexindent.pl
+	#
+	# Note that the settings will be read in the order you
+	# specify here- each successive settings file will overwrite
+	# the variables that you specify
+
+	paths:
+	- /home/cmhughes/Documents/yamlfiles/mysettings.yaml
+	- /home/cmhughes/folder/othersettings.yaml
+	- /some/other/folder/anynameyouwant.yaml
+	- C:\Users\chughes\Documents\mysettings.yaml
+	- C:\Users\chughes\Desktop\test spaces\more spaces.yaml
+\end{yaml}
+
+ Note that the \texttt{.yaml} files you specify in \texttt{indentconfig.yaml}
+ will be loaded in the order that you write them in. Each file doesn't have
+ to have every switch from \texttt{defaultSettings.yaml}; in fact, I recommend
+ that you only keep the switches that you want to \emph{change} in these
+ settings files.
+
+ To get started with your own settings file, you might like to save a copy of
+ \texttt{defaultSettings.yaml} in another directory and call it, for
+ example, \texttt{mysettings.yaml}. Once you have added the path to \texttt{indentconfig.yaml}
+ you can change the switches and add more code-block names to it
+ as you see fit -- have a look at \cref{lst:mysettings} for an example
+ that uses four tabs for the default indent, adds the \texttt{tabbing}
+ environment/command to the list of environments that contains alignment delimiters; you might also like to
+ refer to the many YAML files detailed throughout the rest of this documentation.
+
+ \begin{yaml}{\texttt{mysettings.yaml} (example)}{lst:mysettings}
+# Default value of indentation
+defaultIndent: "\t\t\t\t"
+
+# environments that have tab delimiters, add more
+# as needed
+lookForAlignDelims:
+    tabbing: 1
+\end{yaml}
+
+ You can make sure that your settings are loaded by checking \texttt{indent.log}
+ for details -- if you have specified a path that \texttt{latexindent.pl} doesn't
+ recognize then you'll get a warning, otherwise you'll get confirmation that
+ \texttt{latexindent.pl} has read your settings file \footnote{Windows users
+	 may find that they have to end \texttt{.yaml} files with a blank line}.
+
+ \begin{warning}
+	 When editing \texttt{.yaml} files it is \emph{extremely} important
+	 to remember how sensitive they are to spaces. I highly recommend copying
+	 and pasting from \texttt{defaultSettings.yaml} when you create your
+	 first \texttt{whatevernameyoulike.yaml} file.
+
+	 If \texttt{latexindent.pl} can not read your \texttt{.yaml} file it
+	 will tell you so in \texttt{indent.log}.
+ \end{warning}
+
+\subsection{\texttt{localSettings.yaml}}\label{sec:localsettings}
+	The \texttt{-l} switch tells \texttt{latexindent.pl} to look for \texttt{localSettings.yaml} in the
+	\emph{same directory} as \texttt{myfile.tex}.  If you'd prefer to name your \texttt{localSettings.yaml} file something
+	different, (say, \texttt{myyaml.yaml}) then
+	you can call \texttt{latexindent.pl} using, for example,
+	\begin{commandshell}
+latexindent.pl -l=myyaml.yaml myfile.tex
+\end{commandshell}
+
+	Any settings file(s) specified using the \texttt{-l} switch will be read \emph{after} \texttt{defaultSettings.yaml} and, assuming they exist,
+	user settings from \texttt{indentconfig.yaml}.
+
+	Your settings file can contain any switches that you'd
+	like to change; a sample is shown in \cref{lst:localSettings}, and you'll find plenty of further examples throughout this manual.
+
+	\begin{yaml}{\texttt{localSettings.yaml} (example)}{lst:localSettings}
+#  verbatim environments- environments specified
+#  in this hash table will not be changed at all!
+verbatimEnvironments:
+    cmhenvironment: 0
+\end{yaml}
+
+	You can make sure that your settings file has been loaded by checking \texttt{indent.log}
+	for details; if it can not be read then you receive a warning, otherwise you'll get confirmation that
+	\texttt{latexindent.pl} has read your settings file.
+
+\subsection{Settings load order}\label{sec:loadorder}
+	\texttt{latexindent.pl} loads the settings files in the following order:
+	\begin{enumerate}
+		\item \texttt{defaultSettings.yaml} is always loaded, and can not be renamed;
+		\item \texttt{anyUserSettings.yaml} and any other arbitrarily-named files specified in \texttt{indentconfig.yaml};
+		\item \texttt{localSettings.yaml} but only if found in the same directory as \texttt{myfile.tex} and called
+		      with \texttt{-l} switch; this file can be renamed, provided that the call to \texttt{latexindent.pl} is adjusted
+		      accordingly (see \cref{sec:localsettings}). You may specify relative  paths to other
+		      YAML files using the \texttt{-l} switch, separating multiple files using commas.
+	\end{enumerate}
+	A visual representation of this is given in \cref{fig:loadorder}.
+
+	\begin{figure}
+		\centering
+		\begin{tikzpicture}[
+				needed/.style={very thick, draw=blue,fill=blue!20,
+						text centered, minimum height=2.5em,rounded corners=1ex},
+				optional/.style={draw=black, very thick,scale=0.8,
+						text centered, minimum height=2.5em,rounded corners=1ex},
+				optionalfill/.style={fill=black!10},
+				connections/.style={draw=black!30,dotted,line width=3pt,text=red},
+			]
+			% Draw diagram elements
+			\node (latexindent) [needed,circle]  {\texttt{latexindent.pl}};
+			\node (default) [needed,above right=.5cm of latexindent]  {\texttt{defaultSettings.yaml}};
+			\node (indentconfig) [optional,right=of latexindent]  {\texttt{indentconfig.yaml}};
+			\node (any) [optional,optionalfill,above right=of indentconfig]  {\texttt{any.yaml}};
+			\node (name) [optional,optionalfill,right=of indentconfig]  {\texttt{name.yaml}};
+			\node (you) [optional,optionalfill,below right=of indentconfig]  {\texttt{you.yaml}};
+			\node (want) [optional,optionalfill,below=of indentconfig]  {\texttt{want.yaml}};
+			\node (local) [optional,below=of latexindent]  {\texttt{localSettings.yaml}};
+			% Draw arrows between elements
+			\draw[connections,solid] (latexindent) to[in=-90]node[pos=0.5,anchor=north]{1} (default.south) ;
+			\draw[connections,optional] (latexindent) -- node[pos=0.5,anchor=north]{2} (indentconfig) ;
+			\draw[connections,optional] (indentconfig) to[in=-90] (any.south) ;
+			\draw[connections,optional] (indentconfig) -- (name) ;
+			\draw[connections,optional] (indentconfig) to[out=-45,in=90] (you) ;
+			\draw[connections,optional] (indentconfig) -- (want) ;
+			\draw[connections,optional] (latexindent) -- node[pos=0.5,anchor=west]{3} (local) ;
+		\end{tikzpicture}
+		\caption{Schematic of the load order described in \cref{sec:loadorder}; solid lines represent
+			mandatory files, dotted lines represent optional files. \texttt{indentconfig.yaml} can
+			contain as many files as you like. The files will be loaded in order; if you specify
+			settings for the same field in more than one file, the most recent takes priority. }
+		\label{fig:loadorder}
+	\end{figure}

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-introduction.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-introduction.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-introduction.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,47 @@
+\section{Introduction}
+\subsection{Thanks}
+	I first created \texttt{latexindent.pl} to help me format chapter files
+	in a big project. After I blogged about it on the
+	\TeX{} stack exchange \cite{cmhblog} I received some positive feedback and
+	follow-up feature requests. A big thank you to Harish Kumar who
+	helped to develop and test the initial versions of the script.
+
+	The \texttt{YAML}-based interface of \texttt{latexindent.pl} was inspired
+	by the wonderful \texttt{arara} tool; any similarities are deliberate, and
+	I hope that it is perceived as the compliment that it is. Thank you to Paulo Cereda and the
+	team for releasing this awesome tool; I initially worried that I was going to
+	have to make a GUI for \texttt{latexindent.pl}, but the release of \texttt{arara}
+	has meant there is no need.
+
+	There have been several contributors to the project so far (and hopefully more in
+	the future!); thank you very much to the people detailed in \vref{sec:contributors}
+	for their valued contributions, and thank you to those who report bugs and request features
+	at \cite{latexindent-home}.
+
+\subsection{License}
+	\texttt{latexindent.pl} is free and open source, and it always will be.
+	Before you start using it on any important files, bear in mind that \texttt{latexindent.pl} has the option to overwrite your \texttt{.tex} files.
+	It will always make at least one backup (you can choose how many it makes, see \cpageref{page:onlyonebackup})
+	but you should still be careful when using it. The script has been tested on many
+	files, but there are some known limitations (see \cref{sec:knownlimitations}).
+	You, the user, are responsible for ensuring that you maintain backups of your files
+	before running \texttt{latexindent.pl} on them. I think it is important at this
+	stage to restate an important part of the license here:
+	\begin{quote}\itshape
+		This program 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.
+	\end{quote}
+	There is certainly no malicious intent in releasing this script, and I do hope
+	that it works as you expect it to; if it does not, please first of all
+	make sure that you have the correct settings, and then feel free to let me know at \cite{latexindent-home} with a
+	complete minimum working example as I would like to improve the code as much as possible.
+	\begin{warning}
+		Before you try the script on anything important (like your thesis), test it
+		out on the sample files in the \texttt{test-case} directory \cite{latexindent-home}.
+	\end{warning}
+
+	\emph{If you have used any version 2.* of \texttt{latexindent.pl}, there
+		are a few changes to the interface; see \vref{app:differences} and the comments
+		throughout this document for details}.

Added: trunk/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/sec-the-m-switch.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,555 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+% the -m switch
+% the -m switch
+% the -m switch
+
+\fancyhead[R]{\bfseries\thepage%
+	\tikz[remember picture,overlay] {
+		\node at (1,0){\includegraphics{logo}};
+	}}
+\section{The \texttt{-m} (\texttt{modifylinebreaks}) switch}\label{sec:modifylinebreaks}
+ All features described in this section will only be relevant if the \texttt{-m} switch
+ is used.
+
+\yamltitle{modifylinebreaks}*{fields}
+	\begin{wrapfigure}[7]{r}[0pt]{8cm}
+		\cmhlistingsfromfile[firstnumber=356,linerange={356-358},style=yaml-LST,numbers=left,]{../defaultSettings.yaml}[MLB-TCB,width=.85\linewidth,before=\centering]{\texttt{modifyLineBreaks}}{lst:modifylinebreaks}
+	\end{wrapfigure}
+	\makebox[0pt][r]{%
+		\raisebox{-\totalheight}[0pt][0pt]{%
+			\tikz\node[opacity=1] at (0,0) {\includegraphics[width=4cm]{logo}};}}%	
+	One of the most exciting features of Version 3.0 is the \texttt{-m} switch, which
+	permits \texttt{latexindent.pl} to modify line breaks, according to the
+	specifications in the \texttt{modifyLineBreaks} field. \emph{The settings
+		in this field will only be considered if the \texttt{-m} switch has been used}.
+	A snippet of the default settings of this field is shown in \cref{lst:modifylinebreaks}.
+
+	Having read the previous paragraph, it should sound reasonable that, if you call \texttt{latexindent.pl}
+	using the \texttt{-m} switch, then you give it permission to modify line breaks in your file,
+	but let's be clear:
+
+	\begin{warning}
+		If you call \texttt{latexindent.pl} with the \texttt{-m} switch, then you
+		are giving it permission to modify line breaks. By default, the only
+		thing that will happen is that multiple blank lines will be condensed into
+		one blank line; many other settings are possible, discussed next.
+	\end{warning}
+
+\yamltitle{preserveBlankLines}{0|1}
+	This field is directly related to \emph{poly-switches}, discussed below.
+	By default, it is set to \texttt{1}, which means that blank lines will
+	be protected from removal; however, regardless of this setting, multiple
+	blank lines can be condensed if \texttt{condenseMultipleBlankLinesInto} is
+	greater than \texttt{0}, discussed next.
+
+\yamltitle{condenseMultipleBlankLinesInto}*{integer $\geq 0$}
+	Assuming that this switch takes an integer value greater than \texttt{0}, \texttt{latexindent.pl} will condense multiple blank lines into
+	the number of blank lines illustrated by this switch. As an example, \cref{lst:mlb-bl} shows a sample file
+	with blank lines; upon running
+	\begin{commandshell}
+latexindent.pl myfile.tex -m  
+\end{commandshell}
+	the output is shown in \cref{lst:mlb-bl-out}; note that the multiple blank lines have been
+	condensed into one blank line, and note also that we have used the \texttt{-m} switch!
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mlb1.tex}{\texttt{mlb1.tex}}{lst:mlb-bl}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mlb1-out.tex}{\texttt{mlb1.tex} out output}{lst:mlb-bl-out}
+	\end{minipage}
+
+\subsection{Poly-switches}
+	Every other field in the \texttt{modifyLineBreaks} field uses poly-switches, and can take
+	one of four integer values\footnote{You might like to associate one of the four circles in the logo with one of the four given values}:
+	\begin{itemize}[font=\bfseries]
+		\item[$-1$] \emph{remove mode}: line breaks before or after the \emph{<part of thing>} can be removed (assuming that \texttt{preserveBlankLines} is set to \texttt{0});
+		\item[0] \emph{off mode}: line breaks will not be modified for the \emph{<part of thing>} under consideration;
+		\item[1] \emph{add mode}: a line break will be added before or after the \emph{<part of thing>} under consideration, assuming that
+		      there is not already a line break before or after the \emph{<part of thing>};
+		\item[2] \emph{comment then add mode}: a comment symbol will be added, followed by a line break before or after the \emph{<part of thing>} under consideration, assuming that
+		      there is not already a comment and line break before or after the \emph{<part of thing>}.
+	\end{itemize}
+	All poly-switches are \emph{off} by default; \texttt{latexindent.pl} searches first of all for per-name settings, and then followed by global per-thing settings.
+
+\subsection{modifyLineBreaks for environments}\label{sec:modifylinebreaks-environments}
+	We start by viewing a snippet of \texttt{defaultSettings.yaml} in \cref{lst:environments-mlb}; note that it contains \emph{global} settings (immediately
+	after the \texttt{environments} field) and that \emph{per-name} settings are also allowed -- in the case of \cref{lst:environments-mlb}, settings
+	for \texttt{equation*} have been specified. Note that all poly-switches are \emph{off} by default.
+
+	\cmhlistingsfromfile[firstnumber=359,linerange={359-368},style=yaml-LST,numbers=left,]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,MLB-TCB]{\texttt{environments}}{lst:environments-mlb}
+
+\subsubsection{Adding line breaks (poly-switches set to $1$ or $2$)}
+	Let's begin with the simple example given in \cref{lst:env-mlb1-tex}; note that we have annotated key parts of the file using $\BeginStartsOnOwnLine$,
+	$\BodyStartsOnOwnLine$, $\EndStartsOnOwnLine$ and $\EndFinishesWithLineBreak$, these will be related to fields specified in \cref{lst:environments-mlb}.
+
+	\begin{cmhlistings}[escapeinside={(*@}{@*)}]{\texttt{env-mlb1.tex}}{lst:env-mlb1-tex}
+before words(*@$\BeginStartsOnOwnLine$@*) \begin{myenv}(*@$\BodyStartsOnOwnLine$@*)body of myenv(*@$\EndStartsOnOwnLine$@*)\end{myenv}(*@$\EndFinishesWithLineBreak$@*) after words
+\end{cmhlistings}
+
+	Let's explore \texttt{BeginStartsOnOwnLine} and \texttt{BodyStartsOnOwnLine} in \cref{lst:env-mlb1,lst:env-mlb2}, and in particular,
+	let's allow each of them in turn to take a value of $1$.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb1.yaml}[MLB-TCB]{\texttt{env-mlb1.yaml}}{lst:env-mlb1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb2.yaml}[MLB-TCB]{\texttt{env-mlb2.yaml}}{lst:env-mlb2}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl -m env-mlb.tex -l env-mlb1.yaml
+latexindent.pl -m env-mlb.tex -l env-mlb2.yaml
+\end{commandshell}
+	the output is as in \cref{lst:env-mlb-mod1,lst:env-mlb-mod2} respectively.
+
+	\begin{widepage}
+		\begin{minipage}{.57\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod1.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb1}}{lst:env-mlb-mod1}
+		\end{minipage}
+		\hfill
+		\begin{minipage}{.42\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod2.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb2}}{lst:env-mlb-mod2}
+		\end{minipage}
+	\end{widepage}
+
+	There are a couple of points to note:
+	\begin{itemize}
+		\item in \cref{lst:env-mlb-mod1} a line break has been added at the point denoted by $\BeginStartsOnOwnLine$ in \cref{lst:env-mlb1-tex}; no
+		      other line breaks have been changed;
+		\item in \cref{lst:env-mlb-mod2} a line break has been added at the point denoted by $\BodyStartsOnOwnLine$ in \cref{lst:env-mlb1-tex};
+		      furthermore, note that the \emph{body} of \texttt{myenv} has received the appropriate (default) indentation.
+	\end{itemize}
+
+	Let's now change each of the \texttt{1} values in \cref{lst:env-mlb1,lst:env-mlb2} so that they are $2$ and
+	save them into \texttt{env-mlb3.yaml} and \texttt{env-mlb4.yaml} respectively (see \cref{lst:env-mlb3,lst:env-mlb4}).
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb3.yaml}[MLB-TCB]{\texttt{env-mlb3.yaml}}{lst:env-mlb3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb4.yaml}[MLB-TCB]{\texttt{env-mlb4.yaml}}{lst:env-mlb4}
+	\end{minipage}
+
+	Upon running  commands analogous to the above, we obtain \cref{lst:env-mlb-mod3,lst:env-mlb-mod4}.
+
+	\begin{widepage}
+		\begin{minipage}{.57\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod3.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb3}}{lst:env-mlb-mod3}
+		\end{minipage}
+		\hfill
+		\begin{minipage}{.42\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod4.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb4}}{lst:env-mlb-mod4}
+		\end{minipage}
+	\end{widepage}
+
+	Note that line breaks have been added as in \cref{lst:env-mlb-mod1,lst:env-mlb-mod2}, but this time a comment symbol
+	has been added before adding the line break; in both cases, trailing horizontal
+	space has been stripped before doing so.
+
+	Let's explore \texttt{EndStartsOnOwnLine} and \texttt{EndFinishesWithLineBreak} in \cref{lst:env-mlb5,lst:env-mlb6},
+	and in particular, let's allow each of them in turn to take a value of $1$.
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb5.yaml}[MLB-TCB]{\texttt{env-mlb5.yaml}}{lst:env-mlb5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb6.yaml}[MLB-TCB]{\texttt{env-mlb6.yaml}}{lst:env-mlb6}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl -m env-mlb.tex -l env-mlb5.yaml
+latexindent.pl -m env-mlb.tex -l env-mlb6.yaml
+\end{commandshell}
+	the output is as in \cref{lst:env-mlb-mod5,lst:env-mlb-mod6}.
+
+	\begin{widepage}
+		\begin{minipage}{.42\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod5.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb5}}{lst:env-mlb-mod5}
+		\end{minipage}
+		\hfill
+		\begin{minipage}{.57\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod6.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb6}}{lst:env-mlb-mod6}
+		\end{minipage}
+	\end{widepage}
+
+	There are a couple of points to note:
+	\begin{itemize}
+		\item in \cref{lst:env-mlb-mod5} a line break has been added at the point denoted by $\EndStartsOnOwnLine$ in \vref{lst:env-mlb1-tex}; no
+		      other line breaks have been changed and the \lstinline!\end{myenv}! statement has \emph{not} received indentation (as intended);
+		\item in \cref{lst:env-mlb-mod6} a line break has been added at the point denoted by $\EndFinishesWithLineBreak$ in \vref{lst:env-mlb1-tex}.
+	\end{itemize}
+
+	Let's now change each of the \texttt{1} values in \cref{lst:env-mlb5,lst:env-mlb6} so that they are $2$ and
+	save them into \texttt{env-mlb7.yaml} and \texttt{env-mlb8.yaml} respectively (see \cref{lst:env-mlb7,lst:env-mlb8}).
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb7.yaml}[MLB-TCB]{\texttt{env-mlb7.yaml}}{lst:env-mlb7}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb8.yaml}[MLB-TCB]{\texttt{env-mlb8.yaml}}{lst:env-mlb8}
+	\end{minipage}
+
+	Upon running  commands analogous to the above, we obtain \cref{lst:env-mlb-mod7,lst:env-mlb-mod8}.
+
+	\begin{widepage}
+		\begin{minipage}{.42\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod7.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb7}}{lst:env-mlb-mod7}
+		\end{minipage}
+		\hfill
+		\begin{minipage}{.57\linewidth}
+			\cmhlistingsfromfile{demonstrations/env-mlb-mod8.tex}{\texttt{env-mlb.tex} using \cref{lst:env-mlb8}}{lst:env-mlb-mod8}
+		\end{minipage}
+	\end{widepage}
+
+	Note that line breaks have been added as in \cref{lst:env-mlb-mod5,lst:env-mlb-mod6}, but this time a comment symbol
+	has been added before adding the line break; in both cases, trailing horizontal
+	space has been stripped before doing so.
+
+	If you ask \texttt{latexindent.pl} to add a line break (possibly with a comment) using a poly-switch value of $1$ (or $2$),
+	it will only do so if necessary. For example, if you process the file in \vref{lst:mlb2} using any of the YAML
+	files presented so far in this section, it will be left unchanged.
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb2.tex}{\texttt{env-mlb2.tex}}{lst:mlb2}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb3.tex}{\texttt{env-mlb3.tex}}{lst:mlb3}
+	\end{minipage}
+
+	In contrast, the output from processing the file in \cref{lst:mlb3} will vary depending
+	on the poly-switches used; in \cref{lst:env-mlb3-mod2} you'll see that the comment symbol after
+	the \lstinline!\begin{myenv}! has been moved to the next line, as \texttt{BodyStartsOnOwnLine}
+	is set to \texttt{1}. In \cref{lst:env-mlb3-mod4} you'll see that the comment has been accounted
+	for correctly because \texttt{BodyStartsOnOwnLine} has been set to \texttt{2},
+	and the comment symbol has \emph{not} been moved to its own line. You're encouraged to experiment
+	with \cref{lst:mlb3} and by setting the other poly-switches considered so far to \texttt{2} in turn.
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb3-mod2.tex}{\texttt{env-mlb3.tex} using \vref{lst:env-mlb2}}{lst:env-mlb3-mod2}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb3-mod4.tex}{\texttt{env-mlb3.tex} using \vref{lst:env-mlb4}}{lst:env-mlb3-mod4}
+	\end{minipage}
+
+	The details of the discussion in this section have concerned \emph{global} poly-switches in the \texttt{environments} field;
+	each switch can also be specified on a \emph{per-name} basis, which would take priority over the global values; with
+	reference to \vref{lst:environments-mlb}, an example is shown for the \texttt{equation*} environment.
+
+\subsubsection{Removing line breaks (poly-switches set to $-1$)}
+	Setting poly-switches to $-1$ tells \texttt{latexindent.pl} to remove line breaks of the \emph{<part of the thing>}, if necessary. We will consider the
+	example code given in \cref{lst:mlb4}, noting in particular the positions of
+	the line break highlighters, $\BeginStartsOnOwnLine$, $\BodyStartsOnOwnLine$, $\EndStartsOnOwnLine$
+	and $\EndFinishesWithLineBreak$, together with the associated YAML files in \crefrange{lst:env-mlb9}{lst:env-mlb12}.
+
+	\begin{minipage}{.45\linewidth}
+		\begin{cmhlistings}[escapeinside={(*@}{@*)}]{\texttt{env-mlb4.tex}}{lst:mlb4}
+before words(*@$\BeginStartsOnOwnLine$@*)
+\begin{myenv}(*@$\BodyStartsOnOwnLine$@*)
+body of myenv(*@$\EndStartsOnOwnLine$@*)
+\end{myenv}(*@$\EndFinishesWithLineBreak$@*)
+after words
+\end{cmhlistings}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.51\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb9.yaml}[MLB-TCB]{\texttt{env-mlb9.yaml}}{lst:env-mlb9}
+
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb10.yaml}[MLB-TCB]{\texttt{env-mlb10.yaml}}{lst:env-mlb10}
+
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb11.yaml}[MLB-TCB]{\texttt{env-mlb11.yaml}}{lst:env-mlb11}
+
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/env-mlb12.yaml}[MLB-TCB]{\texttt{env-mlb12.yaml}}{lst:env-mlb12}
+	\end{minipage}
+
+	After running the commands
+	\begin{commandshell}
+latexindent.pl -m env-mlb4.tex -l env-mlb9.yaml
+latexindent.pl -m env-mlb4.tex -l env-mlb10.yaml
+latexindent.pl -m env-mlb4.tex -l env-mlb11.yaml
+latexindent.pl -m env-mlb4.tex -l env-mlb12.yaml
+\end{commandshell}
+
+	we obtain the respective output in \crefrange{lst:env-mlb4-mod9}{lst:env-mlb4-mod12}.
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb4-mod9.tex}{\texttt{env-mlb4.tex} using \cref{lst:env-mlb9}}{lst:env-mlb4-mod9}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb4-mod10.tex}{\texttt{env-mlb4.tex} using \cref{lst:env-mlb10}}{lst:env-mlb4-mod10}
+	\end{minipage}
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb4-mod11.tex}{\texttt{env-mlb4.tex} using \cref{lst:env-mlb11}}{lst:env-mlb4-mod11}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/env-mlb4-mod12.tex}{\texttt{env-mlb4.tex} using \cref{lst:env-mlb12}}{lst:env-mlb4-mod12}
+	\end{minipage}
+
+	Notice that in
+	\begin{itemize}
+		\item \cref{lst:env-mlb4-mod9} the line break denoted by $\BeginStartsOnOwnLine$ in \cref{lst:mlb4} has been removed;
+		\item \cref{lst:env-mlb4-mod10} the line break denoted by $\BodyStartsOnOwnLine$ in \cref{lst:mlb4} has been removed;
+		\item \cref{lst:env-mlb4-mod11} the line break denoted by $\EndStartsOnOwnLine$ in \cref{lst:mlb4} has been removed;
+		\item \cref{lst:env-mlb4-mod12} the line break denoted by $\EndFinishesWithLineBreak$ in \cref{lst:mlb4} has been removed.
+	\end{itemize}
+	We examined each of these cases separately for clarity of explanation, but you can combine all of the YAML
+	settings in \crefrange{lst:env-mlb9}{lst:env-mlb12} into one file; alternatively, you could tell \texttt{latexindent.pl}
+	to load them all by using the following command, for example
+	\begin{widepage}
+		\begin{commandshell}
+latexindent.pl -m env-mlb4.tex -l env-mlb9.yaml,env-mlb10.yaml,env-mlb11.yaml,env-mlb12.yaml
+\end{commandshell}
+	\end{widepage}
+	which gives the output in \vref{lst:env-mlb1-tex}.
+
+	\paragraph{About trailing horizontal space}
+		Recall that on \cpageref{yaml:removeTrailingWhitespace} we discussed the YAML field \texttt{removeTrailingWhitespace},
+		and that it has two (binary) switches to determine if horizontal space should be removed \texttt{beforeProcessing} and \texttt{afterProcessing}.
+		The \texttt{beforeProcessing} is particularly relevant when considering the \texttt{-m} switch; let's consider the
+		file shown in \cref{lst:mlb5}, which highlights trailing spaces.
+
+		\begin{minipage}{.45\linewidth}
+			\begin{cmhlistings}[showspaces=true,escapeinside={(*@}{@*)}]{\texttt{env-mlb5.tex}}{lst:mlb5}
+before words   (*@$\BeginStartsOnOwnLine$@*) 
+\begin{myenv}           (*@$\BodyStartsOnOwnLine$@*)
+body of myenv      (*@$\EndStartsOnOwnLine$@*) 
+\end{myenv}     (*@$\EndFinishesWithLineBreak$@*)
+after words
+\end{cmhlistings}
+		\end{minipage}
+		\hfill
+		\begin{minipage}{.45\linewidth}
+			\cmhlistingsfromfile[style=yaml-LST]{demonstrations/removeTWS-before.yaml}[yaml-TCB]{\texttt{removeTWS-before.yaml}}{lst:removeTWS-before}
+		\end{minipage}
+
+		The output from the following commands
+		\begin{widepage}
+			\begin{commandshell}
+latexindent.pl -m env-mlb5.tex -l env-mlb9.yaml,env-mlb10.yaml,env-mlb11.yaml,env-mlb12.yaml
+latexindent.pl -m env-mlb5.tex -l env-mlb9.yaml,env-mlb10.yaml,env-mlb11.yaml,env-mlb12.yaml,removeTWS-before.yaml
+\end{commandshell}
+		\end{widepage}
+		is shown, respectively, in \cref{lst:env-mlb5-modAll,lst:env-mlb5-modAll-remove-WS}; note that
+		the trailing horizontal white space has been preserved (by default) in \cref{lst:env-mlb5-modAll}, while
+		in \cref{lst:env-mlb5-modAll-remove-WS}, it has been removed using the switch specified in \cref{lst:removeTWS-before}.
+
+		\begin{widepage}
+			\cmhlistingsfromfile{demonstrations/env-mlb5-modAll.tex}{\texttt{env-mlb5.tex} using \crefrange{lst:env-mlb4-mod9}{lst:env-mlb4-mod12}}{lst:env-mlb5-modAll}
+
+			\cmhlistingsfromfile{demonstrations/env-mlb5-modAll-remove-WS.tex}{\texttt{env-mlb5.tex} using \crefrange{lst:env-mlb4-mod9}{lst:env-mlb4-mod12} \emph{and} \cref{lst:removeTWS-before}}{lst:env-mlb5-modAll-remove-WS}
+		\end{widepage}
+
+
+	\paragraph{Blank lines}
+		Now let's consider the file in \cref{lst:mlb6}, which contains blank lines.
+
+		\begin{minipage}{.45\linewidth}
+			\begin{cmhlistings}[escapeinside={(*@}{@*)}]{\texttt{env-mlb6.tex}}{lst:mlb6}
+before words(*@$\BeginStartsOnOwnLine$@*)
+
+
+\begin{myenv}(*@$\BodyStartsOnOwnLine$@*)
+
+
+body of myenv(*@$\EndStartsOnOwnLine$@*)
+
+
+\end{myenv}(*@$\EndFinishesWithLineBreak$@*)
+
+after words
+\end{cmhlistings}
+		\end{minipage}%
+		\hfill
+		\begin{minipage}{.45\linewidth}
+			\cmhlistingsfromfile[style=yaml-LST]{demonstrations/UnpreserveBlankLines.yaml}[MLB-TCB]{\texttt{UnpreserveBlankLines.yaml}}{lst:UnpreserveBlankLines}
+		\end{minipage}
+
+		Upon running the following commands
+		\begin{widepage}
+			\begin{commandshell}
+latexindent.pl -m env-mlb6.tex -l env-mlb9.yaml,env-mlb10.yaml,env-mlb11.yaml,env-mlb12.yaml
+latexindent.pl -m env-mlb6.tex -l env-mlb9.yaml,env-mlb10.yaml,env-mlb11.yaml,env-mlb12.yaml,UnpreserveBlankLines.yaml
+\end{commandshell}
+		\end{widepage}
+		we receive the respective outputs in \cref{lst:env-mlb6-modAll,lst:env-mlb6-modAll-un-Preserve-Blank-Lines}. In
+		\cref{lst:env-mlb6-modAll} we see that the multiple blank lines have each been condensed into one blank line,
+		but that blank lines have \emph{not} been removed by the poly-switches -- this is because, by default, \texttt{preserveBlankLines}
+		is set to \texttt{1}. By contrast, in \cref{lst:env-mlb6-modAll-un-Preserve-Blank-Lines}, we have allowed
+		the poly-switches to remove blank lines because, in \cref{lst:UnpreserveBlankLines}, we have set \texttt{preserveBlankLines} to \texttt{0}.
+
+		\begin{widepage}
+			\begin{minipage}{.30\linewidth}
+				\cmhlistingsfromfile{demonstrations/env-mlb6-modAll.tex}{\texttt{env-mlb6.tex} using \crefrange{lst:env-mlb4-mod9}{lst:env-mlb4-mod12}}{lst:env-mlb6-modAll}
+			\end{minipage}
+			\hfill
+			\begin{minipage}{.65\linewidth}
+				\cmhlistingsfromfile{demonstrations/env-mlb6-modAll-un-Preserve-Blank-Lines.tex}{\texttt{env-mlb6.tex} using \crefrange{lst:env-mlb4-mod9}{lst:env-mlb4-mod12} \emph{and} \cref{lst:UnpreserveBlankLines}}{lst:env-mlb6-modAll-un-Preserve-Blank-Lines}
+			\end{minipage}
+		\end{widepage}
+
+\subsection{Poly-switches for other code blocks}
+	Rather than repeat the examples shown for the environment code blocks (in \vref{sec:modifylinebreaks-environments}), we choose to detail the poly-switches for
+	all other code blocks in \cref{tab:poly-switch-mapping}; note that each and every one of these poly-switches is \emph{off by default}, i.e, set to \texttt{0}. Note also that,
+	by design, line breaks involving \texttt{verbatim}, \texttt{filecontents} and `comment-marked' code blocks (\vref{lst:alignmentmarkup}) can \emph{not} be
+	modified using \texttt{latexindent.pl}.
+
+	\begin{longtable}{m{.2\textwidth}@{\hspace{.75cm}}m{.35\textwidth}@{}m{.4\textwidth}}
+		\caption{Poly-switch mappings for all code-block types}\label{tab:poly-switch-mapping}\\
+		\toprule
+		Code block & Sample & Poly-switch mapping \\
+		\midrule
+		environment &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+before words(*@$\BeginStartsOnOwnLine$@*)
+\begin{myenv}(*@$\BodyStartsOnOwnLine$@*)
+body of myenv(*@$\EndStartsOnOwnLine$@*)
+\end{myenv}(*@$\EndFinishesWithLineBreak$@*)
+after words
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$     & BeginStartsOnOwnLine     \\
+			$\BodyStartsOnOwnLine$      & BodyStartsOnOwnLine      \\
+			$\EndStartsOnOwnLine$       & EndStartsOnOwnLine       \\
+			$\EndFinishesWithLineBreak$ & EndFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		ifelsefi &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+before words(*@$\BeginStartsOnOwnLine$@*)
+\if...(*@$\BodyStartsOnOwnLine$@*)
+body of if statement(*@$\ElseStartsOnOwnLine$@*)
+\else(*@$\ElseFinishesWithLineBreak$@*)
+body of else statement(*@$\EndStartsOnOwnLine$@*)
+\fi(*@$\EndFinishesWithLineBreak$@*)
+after words
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$      & IfStartsOnOwnLine         \\
+			$\BodyStartsOnOwnLine$       & BodyStartsOnOwnLine       \\
+			$\ElseStartsOnOwnLine$       & ElseStartsOnOwnLine       \\
+			$\ElseFinishesWithLineBreak$ & ElseFinishesWithLineBreak \\
+			$\EndStartsOnOwnLine$        & FiStartsOnOwnLine         \\
+			$\EndFinishesWithLineBreak$  & FiFinishesWithLineBreak   \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		optionalArguments &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+...(*@$\BeginStartsOnOwnLine$@*)
+[(*@$\BodyStartsOnOwnLine$@*)
+body of opt arg(*@$\EndStartsOnOwnLine$@*)
+](*@$\EndFinishesWithLineBreak$@*)
+...
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$     & LSqBStartsOnOwnLine\footnote{LSqB stands for Left Square Bracket} \\
+			$\BodyStartsOnOwnLine$      & OptArgBodyStartsOnOwnLine                                         \\
+			$\EndStartsOnOwnLine$       & RSqBStartsOnOwnLine                                               \\
+			$\EndFinishesWithLineBreak$ & RSqBFinishesWithLineBreak                                         \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		mandatoryArguments &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+...(*@$\BeginStartsOnOwnLine$@*)
+{(*@$\BodyStartsOnOwnLine$@*)
+body of mand arg(*@$\EndStartsOnOwnLine$@*)
+}(*@$\EndFinishesWithLineBreak$@*)
+...
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$     & LCuBStartsOnOwnLine\footnote{LCuB stands for Left Curly Brace} \\
+			$\BodyStartsOnOwnLine$      & MandArgBodyStartsOnOwnLine                                     \\
+			$\EndStartsOnOwnLine$       & RCuBStartsOnOwnLine                                            \\
+			$\EndFinishesWithLineBreak$ & RCuBFinishesWithLineBreak                                      \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		commands &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},morekeywords={mycommand},nolol=true,]
+before words(*@$\BeginStartsOnOwnLine$@*)
+\mycommand(*@$\BodyStartsOnOwnLine$@*)
+(*@$\langle$\itshape{arguments}$\rangle$@*)
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$ & CommandStartsOnOwnLine           \\
+			$\BodyStartsOnOwnLine$  & CommandNameFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		namedGroupingBraces Brackets &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},morekeywords={myname},nolol=true,]
+before words(*@$\BeginStartsOnOwnLine$@*)
+myname(*@$\BodyStartsOnOwnLine$@*)
+(*@$\langle$\itshape{braces/brackets}$\rangle$@*)
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$ & NameStartsOnOwnLine       \\
+			$\BodyStartsOnOwnLine$  & NameFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		keyEqualsValuesBraces\newline Brackets &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},morekeywords={key},nolol=true,]
+before words(*@$\BeginStartsOnOwnLine$@*)
+key(*@$\EqualsStartsOnOwnLine$@*)=(*@$\BodyStartsOnOwnLine$@*)
+(*@$\langle$\itshape{braces/brackets}$\rangle$@*)
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$  & KeyStartsOnOwnLine          \\
+			$\EqualsStartsOnOwnLine$ & EqualsStartsOnOwnLine       \\
+			$\BodyStartsOnOwnLine$   & EqualsFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		items &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+before words(*@$\BeginStartsOnOwnLine$@*)
+\item(*@$\BodyStartsOnOwnLine$@*)
+...
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$ & ItemStartsOnOwnLine       \\
+			$\BodyStartsOnOwnLine$  & ItemFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\cmidrule{2-3}
+		specialBeginEnd &
+		\begin{lstlisting}[escapeinside={(*@}{@*)},nolol=true]
+before words(*@$\BeginStartsOnOwnLine$@*)
+\[(*@$\BodyStartsOnOwnLine$@*)
+body of special(*@$\EndStartsOnOwnLine$@*)
+\](*@$\EndFinishesWithLineBreak$@*)
+after words
+  \end{lstlisting}
+		&
+		\begin{tabular}[t]{c@{~}l@{}}
+			$\BeginStartsOnOwnLine$     & SpecialBeginStartsOnOwnLine     \\
+			$\BodyStartsOnOwnLine$      & SpecialBodyStartsOnOwnLine      \\
+			$\EndStartsOnOwnLine$       & SpecialEndStartsOnOwnLine       \\
+			$\EndFinishesWithLineBreak$ & SpecialEndFinishesWithLineBreak \\
+		\end{tabular}
+		\\
+		\bottomrule
+	\end{longtable}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsec-commands-and-their-options.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsec-commands-and-their-options.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsec-commands-and-their-options.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,139 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsection{Commands and the strings between their arguments}\label{subsec:commands-string-between}
+	The \texttt{command} code blocks will always look for optional (square bracketed) and
+	mandatory (curly braced) arguments which can contain comments, line breaks and
+	`beamer' commands \lstinline!<.*?>!  between them. There are switches that can allow them to contain
+	other strings, which we discuss next.
+
+\yamltitle{commandCodeBlocks}*{fields}
+
+	The \texttt{commandCodeBlocks} field contains a few switches detailed in \cref{lst:commandCodeBlocks}.
+
+	\cmhlistingsfromfile[firstnumber=278,linerange={278-286},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{commandCodeBlocks}}{lst:commandCodeBlocks}
+
+\yamltitle{roundParenthesesAllowed}{0|1}
+
+	The need for this field was mostly motivated by commands found in code used to generate images in \texttt{PSTricks} and \texttt{tikz}; for example,
+	let's consider the code given in \cref{lst:pstricks1}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/pstricks1.tex}{\texttt{pstricks1.tex}}{lst:pstricks1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/pstricks1-default.tex}{\texttt{pstricks1} default output}{lst:pstricks1-default}
+	\end{minipage}
+
+	Notice that the \lstinline!\defFunction! command has an optional argument, followed by a
+	mandatory argument, followed by a round-parenthesis argument, $(u,v)$.
+
+	By default, because \texttt{roundParenthesesAllowed} is set to $1$ in \cref{lst:commandCodeBlocks}, then \texttt{latexindent.pl}
+	will allow round parenthesis between optional and mandatory arguments. In the case of the code in \cref{lst:pstricks1},
+	\texttt{latexindent.pl} finds \emph{all} the arguments of \lstinline!defFunction!, both before and after \lstinline!(u,v)!.
+
+	The default output from running \texttt{latexindent.pl} on \cref{lst:pstricks1} actually leaves it unchanged (see \cref{lst:pstricks1-default});
+	note in particular, this is because of \texttt{noAdditionalIndentGlobal} as discussed on \cpageref{page:command:noAddGlobal}.
+
+	Upon using the YAML settings in \cref{lst:noRoundParentheses}, and running the command
+	\begin{commandshell}
+latexindent.pl pstricks1.tex -l noRoundParentheses.yaml
+        \end{commandshell}
+	we obtain the output given in  \cref{lst:pstricks1-nrp}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/pstricks1-nrp.tex}{\texttt{pstricks1.tex} using \cref{lst:noRoundParentheses}}{lst:pstricks1-nrp}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/noRoundParentheses.yaml}[yaml-TCB]{\texttt{noRoundParentheses.yaml}}{lst:noRoundParentheses}
+	\end{minipage}
+
+	Notice the difference between \cref{lst:pstricks1-default} and \cref{lst:pstricks1-nrp}; in particular, in \cref{lst:pstricks1-nrp}, because
+	round parentheses are \emph{not} allowed, \texttt{latexindent.pl} finds that the \lstinline!\defFunction! command finishes at the first opening
+	round parenthesis. As such, the remaining braced, mandatory, arguments are found to be \texttt{UnNamedGroupingBracesBrackets} (see \vref{tab:code-blocks})
+	which, by default, assume indentation for their body, and hence the tabbed indentation in \cref{lst:pstricks1-nrp}.
+
+	Let's explore this using the YAML given in \cref{lst:defFunction} and run the command
+	\begin{commandshell}
+latexindent.pl pstricks1.tex -l defFunction.yaml
+        \end{commandshell}
+	then the output is as in \cref{lst:pstricks1-indent-rules}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/pstricks1-indent-rules.tex}{\texttt{pstricks1.tex} using \cref{lst:defFunction}}{lst:pstricks1-indent-rules}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/defFunction.yaml}[yaml-TCB]{\texttt{defFunction.yaml}}{lst:defFunction}
+	\end{minipage}
+
+	Notice in \cref{lst:pstricks1-indent-rules} that the \emph{body} of the \lstinline!defFunction! command i.e, the subsequent lines
+	containing arguments after the command name, have received the single space of indentation specified by \cref{lst:defFunction}.
+
+\yamltitle{stringsAllowedBetweenArguments}*{fields}
+	\texttt{tikz} users may well specify code such as that given in \cref{lst:tikz-node1}; processing this code using
+	\texttt{latexindent.pl} gives the default output in \cref{lst:tikz-node1-default}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tikz-node1.tex}{\texttt{tikz-node1.tex}}{lst:tikz-node1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[columns=fixed]{demonstrations/tikz-node1-default.tex}{\texttt{tikz-node1} default output}{lst:tikz-node1-default}
+	\end{minipage}
+
+	With reference to \vref{lst:commandCodeBlocks}, we see that the strings
+	\begin{quote}
+		to, node, ++
+	\end{quote}
+	are all allowed to appear between arguments, as they are each set to $1$; importantly, you are encouraged to add further names
+	to this field as necessary. This means that when \texttt{latexindent.pl}
+	processes \cref{lst:tikz-node1}, it consumes:
+	\begin{itemize}
+		\item the optional argument \lstinline![thin]!
+		\item the round-bracketed argument \lstinline!(c)! because \texttt{roundParenthesesAllowed} is $1$ by default
+		\item the string \lstinline!to! (specified in \texttt{stringsAllowedBetweenArguments})
+		\item the optional argument \lstinline![in=110,out=-90]!
+		\item the string \lstinline!++! (specified in \texttt{stringsAllowedBetweenArguments})
+		\item the round-bracketed argument \lstinline!(0,-0.5cm)! because \texttt{roundParenthesesAllowed} is $1$ by default
+		\item the string \lstinline!node! (specified in \texttt{stringsAllowedBetweenArguments})
+		\item the optional argument \lstinline![below,align=left,scale=0.5]!
+	\end{itemize}
+
+	We can explore this further, for example using \cref{lst:draw} and running the command
+	\begin{commandshell}
+latexindent.pl tikz-node1.tex -l draw.yaml  
+\end{commandshell}
+	we receive the output given in \cref{lst:tikz-node1-draw}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/tikz-node1-draw.tex}{\texttt{tikz-node1.tex} using \cref{lst:draw}}{lst:tikz-node1-draw}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/draw.yaml}[yaml-TCB]{\texttt{draw.yaml}}{lst:draw}
+	\end{minipage}
+
+	Notice that each line after the \lstinline!\draw! command (its `body') in \cref{lst:tikz-node1-draw} has been given the
+	appropriate two-spaces worth of indentation specified in \cref{lst:draw}.
+
+	Let's compare this with the output from using the YAML settings in \cref{lst:no-to}, and running the command
+	\begin{commandshell}
+latexindent.pl tikz-node1.tex -l no-to.yaml  
+\end{commandshell}
+	given in \cref{lst:tikz-node1-no-to}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/tikz-node1-no-to.tex}{\texttt{tikz-node1.tex} using \cref{lst:no-to}}{lst:tikz-node1-no-to}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/no-to.yaml}[yaml-TCB]{\texttt{no-to.yaml}}{lst:no-to}
+	\end{minipage}
+
+	In this case, \texttt{latexindent.pl} sees that:
+	\begin{itemize}
+		\item the \lstinline!\draw! command finishes after the \lstinline!(c)! as (\texttt{stringsAllowedBetweenArguments} has \texttt{to} set to $0$)
+		\item it finds a \texttt{namedGroupingBracesBrackets} called \texttt{to} (see \vref{tab:code-blocks}) \emph{with} argument \lstinline![in=110,out=-90]!
+		\item it finds another \texttt{namedGroupingBracesBrackets} but this time called \texttt{node} with argument \lstinline![below,align=left,scale=0.5]!
+	\end{itemize}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsec-conflicting-poly-switches.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsec-conflicting-poly-switches.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsec-conflicting-poly-switches.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,137 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsection{Conflicting poly-switches: sequential code blocks}
+	It is very easy to have conflicting poly-switches; if we use the example from \vref{lst:mycommand1},
+	and consider the YAML settings given in \cref{lst:mycom-mlb4}. The output from running
+	\begin{commandshell}
+latexindent.pl -m -l=mycom-mlb4.yaml mycommand1.tex
+\end{commandshell}
+	is given in \cref{lst:mycom-mlb4}.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb4.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb4}}{lst:mycommand1-mlb4}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb4.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb4.yaml}}{lst:mycom-mlb4}
+	\end{minipage}
+
+	Studying \cref{lst:mycom-mlb4}, we see that the two poly-switches are at opposition with one another:
+	\begin{itemize}
+		\item on the one hand, \texttt{LCuBStartsOnOwnLine} should \emph{not} start on its own line (as poly-switch is set to $-1$);
+		\item on the other hand, \texttt{RCuBFinishesWithLineBreak} \emph{should} finish with a line break.
+	\end{itemize}
+	So, which should win the conflict? As demonstrated in \cref{lst:mycommand1-mlb4}, it is clear that \texttt{LCuBStartsOnOwnLine} won
+	this conflict, and the reason is that \emph{the second argument was processed after the first} -- in general, the most recently-processed
+	code block and associated poly-switch takes priority.
+
+	We can explore this further by considering the YAML settings in \cref{lst:mycom-mlb5}; upon running the command
+	\begin{commandshell}
+latexindent.pl -m -l=mycom-mlb5.yaml mycommand1.tex
+\end{commandshell}
+	we obtain the output given in \cref{lst:mycommand1-mlb5}.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb5.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb5}}{lst:mycommand1-mlb5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb5.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb5.yaml}}{lst:mycom-mlb5}
+	\end{minipage}
+
+	As previously, the most-recently-processed code block takes priority -- as before, the second (i.e, \emph{last}) argument. Exploring this
+	further, we consider the YAML settings in \cref{lst:mycom-mlb6}, which give associated output in \cref{lst:mycommand1-mlb6}.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb6.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb6}}{lst:mycommand1-mlb6}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb6.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb6.yaml}}{lst:mycom-mlb6}
+	\end{minipage}
+
+	Note that a \lstinline!%! \emph{has} been added to the trailing first \lstinline!}!; this is because:
+	\begin{itemize}
+		\item while processing the \emph{first} argument, the trailing line break has been removed (\texttt{RCuBFinishesWithLineBreak} set to $-1$);
+		\item while processing the \emph{second} argument, \texttt{latexindent.pl} finds that it does \emph{not} begin on its own line, and so
+		      because \texttt{LCuBStartsOnOwnLine} is set to $2$, it adds a comment, followed by a line break.
+	\end{itemize}
+
+\subsection{Conflicting poly-switches: nested code blocks}
+	Now let's consider an example when nested code blocks have conflicting poly-switches; we'll use the code in \cref{lst:nested-env},
+	noting that it contains nested environments.
+
+	\cmhlistingsfromfile{demonstrations/nested-env.tex}{\texttt{nested-env.tex}}{lst:nested-env}
+
+	Let's use the YAML settings given in \cref{lst:nested-env-mlb1-yaml}, which upon running the command
+	\begin{commandshell}
+latexindent.pl -m -l=nested-env-mlb1.yaml nested-env.tex
+        \end{commandshell}
+	gives the output in \cref{lst:nested-env-mlb1}.
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/nested-env-mlb1.tex}{\texttt{nested-env.tex} using \cref{lst:nested-env-mlb1}}{lst:nested-env-mlb1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/nested-env-mlb1.yaml}[MLB-TCB,width=\linewidth]{\texttt{nested-env-mlb1.yaml}}{lst:nested-env-mlb1-yaml}
+	\end{minipage}
+
+	In \cref{lst:nested-env-mlb1}, let's first of all note that both environments have received the appropriate (default) indentation; secondly,
+	note that the poly-switch \texttt{EndStartsOnOwnLine} appears to have won the conflict, as \lstinline!\end{one}! has had its leading line break removed.
+
+	To understand it, let's talk about the three basic phases of \texttt{latexindent.pl}:
+	\begin{enumerate}
+		\item Phase 1: packing, in which code blocks are replaced with unique ids, working from \emph{the inside to the outside}, and then sequentially -- for example, in
+		      \cref{lst:nested-env}, the \texttt{two} environment is found \emph{before} the \texttt{one} environment; if the -m switch is active, then during this phase:
+		      \begin{itemize}
+			      \item line breaks at the beginning of the \texttt{body} can be added (if \texttt{BodyStartsOnOwnLine} is $1$ or $2$) or removed (if \texttt{BodyStartsOnOwnLine} is $-1$);
+			      \item line breaks at the end of the body can be added (if \texttt{EndStartsOnOwnLine} is $1$ or $2$) or removed (if \texttt{EndStartsOnOwnLine} is $-1$);
+			      \item line breaks after the end statement can be added (if \texttt{EndFinishesWithLineBreak} is $1$ or $2$).
+		      \end{itemize}
+		\item Phase 2: indentation, in which white space is added to the begin, body, and end statements;
+		\item Phase 3: unpacking, in which unique ids are replaced by their \emph{indented} code blocks; if the -m switch is active, then during this phase,
+		      \begin{itemize}
+			      \item line breaks before \texttt{begin} statements can be added or removed (depending upon \texttt{BeginStartsOnOwnLine});
+			      \item line breaks after \emph{end} statements can be removed but \emph{NOT} added (see \texttt{EndFinishesWithLineBreak}).
+		      \end{itemize}
+	\end{enumerate}
+
+	With reference to \cref{lst:nested-env-mlb1}, this means that during Phase 1:
+	\begin{itemize}
+		\item the \texttt{two} environment is found first, and
+		      the line break ahead of the \lstinline!\end{two}! statement is removed because \texttt{EndStartsOnOwnLine} is set to $-1$. Importantly,
+		      because, \emph{at this stage}, \lstinline!\end{two}! \emph{does} finish with a line break, \texttt{EndFinishesWithLineBreak} causes
+		      no action.
+		\item next, the \texttt{one} environment is found; the line break ahead of \lstinline!\end{one}! is removed because \texttt{EndStartsOnOwnLine}
+		      is set to $-1$.
+	\end{itemize}
+	The indentation is done in Phase 2, and then in Phase 3, \emph{there is no option to add a line break after the \lstinline!end! statements}.
+	We can justify this by remembering that during Phase 3, the \texttt{one} environment will be found and processed first, followed
+	by the \texttt{two} environment. If the \texttt{two} environment were to add a line break after the \lstinline!\end{two}! statement, then
+	\texttt{latexindent.pl} would have no way of knowing how much indentation to add to the subsequent text (in this case, \lstinline!\end{one}!).
+
+	We can explore this further using the poly-switches in \cref{lst:nested-env-mlb2}; upon running the command
+	\begin{commandshell}
+latexindent.pl -m -l=nested-env-mlb2.yaml nested-env.tex
+        \end{commandshell}
+	we obtain the output given in \cref{lst:nested-env-mlb2-output}.
+
+	\begin{minipage}{.45\linewidth}
+		\cmhlistingsfromfile{demonstrations/nested-env-mlb2.tex}{\texttt{nested-env.tex} using \cref{lst:nested-env-mlb2}}{lst:nested-env-mlb2-output}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/nested-env-mlb2.yaml}[MLB-TCB,width=\linewidth]{\texttt{nested-env-mlb2.yaml}}{lst:nested-env-mlb2}
+	\end{minipage}
+
+	During Phase 1:
+	\begin{itemize}
+		\item the \texttt{two} environment is found first, and
+		      the line break ahead of the \lstinline!\end{two}! statement is not changed because \texttt{EndStartsOnOwnLine} is set to $1$.
+		      Importantly, because, \emph{at this stage}, \lstinline!\end{two}! \emph{does} finish with a line break, \texttt{EndFinishesWithLineBreak} causes
+		      no action.
+		\item next, the \texttt{one} environment is found; the line break ahead of \lstinline!\end{one}! is already present, and no action is needed.
+	\end{itemize}
+	The indentation is done in Phase 2, and then in Phase 3, the \texttt{one} environment is found and processed first, followed by
+	the \texttt{two} environment. \emph{At this stage}, the \texttt{two} environment finds \texttt{EndFinishesWithLineBreak} is $-1$, so it removes
+	the trailing line break; remember, at this point, \texttt{latexindent.pl} has completely finished with the \texttt{one} environment.

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsec-noAdditionalIndent-indentRules.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsec-noAdditionalIndent-indentRules.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsec-noAdditionalIndent-indentRules.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,24 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsection{\texttt{noAdditionalIndent} and \texttt{indentRules}}\label{sec:noadd-indent-rules}
+	\texttt{latexindent.pl} operates on files by looking for code blocks, as detailed in \vref{subsubsec:code-blocks};
+	for each type of code block  in \vref{tab:code-blocks} (which we will call a \emph{$\langle$thing$\rangle$} in what follows)
+	it searches YAML fields for information in the following order:
+	\begin{enumerate}
+		\item \texttt{noAdditionalIndent} for the \emph{name} of the current \emph{$\langle$thing$\rangle$};
+		\item \texttt{indentRules} for the \emph{name} of the current \emph{$\langle$thing$\rangle$};
+		\item \texttt{noAdditionalIndentGlobal} for the \emph{type} of the current \emph{$\langle$thing$\rangle$};
+		\item \texttt{indentRulesGlobal} for the \emph{type} of the current \emph{$\langle$thing$\rangle$}.
+	\end{enumerate}
+
+	Using the above list, the first piece of information to be found will be used; failing that,
+	the value of \texttt{defaultIndent} is used.
+	If information is found in multiple fields, the first one according to the list above will be used; for example,
+	if information is present in both \texttt{indentRules} and in \texttt{noAdditionalIndentGlobal}, then the information from \texttt{indentRules}
+	takes priority.
+
+	We now present details for the different type of code blocks known to \texttt{latexindent.pl}, as detailed in \vref{tab:code-blocks}; for
+	reference, there follows a list of the code blocks covered.
+
+	\startcontents[noAdditionalIndent]
+	\printcontents[noAdditionalIndent]{}{0}{}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsec-partnering-poly-switches.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsec-partnering-poly-switches.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsec-partnering-poly-switches.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,47 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsection{Partnering \texttt{BodyStartsOnOwnLine} with argument-based poly-switches}
+	Some poly-switches need to be partnered together; in particular, when line breaks involving the \emph{first} argument
+	of a code block need to be accounted for using both \texttt{BodyStartsOnOwnLine} (or its equivalent, see \vref{tab:poly-switch-mapping})
+	and \texttt{LCuBStartsOnOwnLine} for mandatory arguments, and \texttt{LSqBStartsOnOwnLine} for optional arguments.
+
+	Let's begin with the code in \cref{lst:mycommand1} and the YAML settings in \cref{lst:mycom-mlb1}; with reference
+	to \vref{tab:poly-switch-mapping}, the key \texttt{CommandNameFinishesWithLineBreak} is an alias for \texttt{BodyStartsOnOwnLine}.
+
+	\cmhlistingsfromfile{demonstrations/mycommand1.tex}{\texttt{mycommand1.tex}}{lst:mycommand1}
+
+	Upon running the command
+	\begin{commandshell}
+latexindent.pl -m -l=mycom-mlb1.yaml mycommand1.tex
+\end{commandshell}
+	we obtain \cref{lst:mycommand1-mlb1}; note that the \emph{second} mandatory argument beginning brace \lstinline!{! has had
+	its leading line break removed, but that the \emph{first} brace has not.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb1.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb1}}{lst:mycommand1-mlb1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb1.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb1.yaml}}{lst:mycom-mlb1}
+	\end{minipage}
+
+	Now let's change the YAML file so that it is as in \cref{lst:mycom-mlb2}; upon running the analogous command to that given above,
+	we obtain \cref{lst:mycommand1-mlb2}; both beginning braces \lstinline!{! have had their leading line breaks removed.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb2.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb2}}{lst:mycommand1-mlb2}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb2.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb2.yaml}}{lst:mycom-mlb2}
+	\end{minipage}
+
+	Now let's change the YAML file so that it is as in \cref{lst:mycom-mlb3}; upon running the analogous command to that given above,
+	we obtain \cref{lst:mycommand1-mlb3}.
+
+	\begin{minipage}{.4\linewidth}
+		\cmhlistingsfromfile{demonstrations/mycommand1-mlb3.tex}{\texttt{mycommand1.tex} using \cref{lst:mycom-mlb3}}{lst:mycommand1-mlb3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.55\linewidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycom-mlb3.yaml}[MLB-TCB,width=\linewidth]{\texttt{mycom-mlb3.yaml}}{lst:mycom-mlb3}
+	\end{minipage}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-commands-with-arguments.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-commands-with-arguments.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-commands-with-arguments.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,100 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{Commands with arguments}\label{subsubsec:commands-arguments}
+	Let's begin with the simple example in \cref{lst:mycommand}; when \texttt{latexindent.pl} operates
+	on this file, the default output is shown in \cref{lst:mycommand-default}. \footnote{The command code blocks
+		have quite a few subtleties, described in \vref{subsec:commands-string-between}.}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand.tex}{\texttt{mycommand.tex}}{lst:mycommand}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-default.tex}{\texttt{mycommand.tex} default output}{lst:mycommand-default}
+	\end{minipage}
+
+	As in the environment-based case (see \vref{lst:myenv-noAdd1,lst:myenv-noAdd2}) we may specify \texttt{noAdditionalIndent}
+	either in `scalar' form, or in `field' form, as shown in \cref{lst:mycommand-noAdd1,lst:mycommand-noAdd2}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd1.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd1.yaml}}{lst:mycommand-noAdd1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd2.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd2.yaml}}{lst:mycommand-noAdd2}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl mycommand.tex -l mycommand-noAdd1.yaml  
+latexindent.pl mycommand.tex -l mycommand-noAdd2.yaml  
+\end{commandshell}
+	we receive the respective output given in \cref{lst:mycommand-output-noAdd1,lst:mycommand-output-noAdd2}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd1.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd1}}{lst:mycommand-output-noAdd1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd2.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd2}}{lst:mycommand-output-noAdd2}
+	\end{minipage}
+
+	Note that in \cref{lst:mycommand-output-noAdd1} that the `body', optional argument \emph{and} mandatory argument have \emph{all} received
+	no additional indentation, while in \cref{lst:mycommand-output-noAdd2}, only the `body' has not received any additional indentation. We define
+	the `body' of a command as any lines following the command name that include its optional or mandatory arguments.
+
+	We may further customise \texttt{noAdditionalIndent} for \texttt{mycommand} as we did in \vref{lst:myenv-noAdd5,lst:myenv-noAdd6}; explicit examples
+	are given in \cref{lst:mycommand-noAdd3,lst:mycommand-noAdd4}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd3.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd3.yaml}}{lst:mycommand-noAdd3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd4.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd4.yaml}}{lst:mycommand-noAdd4}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl mycommand.tex -l mycommand-noAdd3.yaml  
+latexindent.pl mycommand.tex -l mycommand-noAdd4.yaml  
+\end{commandshell}
+	we receive the respective output given in \cref{lst:mycommand-output-noAdd3,lst:mycommand-output-noAdd4}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd3.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd3}}{lst:mycommand-output-noAdd3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd4.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd4}}{lst:mycommand-output-noAdd4}
+	\end{minipage}
+
+	Attentive readers will note that the body of \texttt{mycommand} in both \cref{lst:mycommand-output-noAdd3,lst:mycommand-output-noAdd4}
+	has received no additional indent, even though \texttt{body} is explicitly set to \texttt{0} in both \cref{lst:mycommand-noAdd3,lst:mycommand-noAdd4}.
+	This is because, by default, \texttt{noAdditionalIndentGlobal} for \texttt{commands} is set to \texttt{1} by default; this can be easily
+	fixed as in \cref{lst:mycommand-noAdd5,lst:mycommand-noAdd6}.\label{page:command:noAddGlobal}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd5.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd5.yaml}}{lst:mycommand-noAdd5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mycommand-noAdd6.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{mycommand-noAdd6.yaml}}{lst:mycommand-noAdd6}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl mycommand.tex -l mycommand-noAdd5.yaml  
+latexindent.pl mycommand.tex -l mycommand-noAdd6.yaml  
+\end{commandshell}
+	we receive the respective output given in \cref{lst:mycommand-output-noAdd5,lst:mycommand-output-noAdd6}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd5.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd5}}{lst:mycommand-output-noAdd5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/mycommand-noAdd6.tex}{\texttt{mycommand.tex} using \cref{lst:mycommand-noAdd6}}{lst:mycommand-output-noAdd6}
+	\end{minipage}
+
+	Both \texttt{indentRules} and \texttt{indentRulesGlobal} can be adjusted as they were for \emph{environment} code blocks, as in
+	\vref{lst:myenv-rules3,lst:myenv-rules4} and \vref{lst:indentRulesGlobal:environments,lst:opt-args-indent-rules-glob,lst:mand-args-indent-rules-glob}.

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-and-their-arguments.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-and-their-arguments.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-and-their-arguments.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,255 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{Environments and their arguments}\label{subsubsec:env-and-their-args}
+	There are a few different YAML switches governing the indentation of environments; let's start
+	with the code shown in \cref{lst:myenvtex}.
+
+	\cmhlistingsfromfile{demonstrations/myenvironment-simple.tex}{\texttt{myenv.tex}}{lst:myenvtex}
+
+\yamltitle{noAdditionalIndent}*{fields}
+	If we do not wish \texttt{myenv} to receive any additional indentation, we have a few choices available to us,
+	as demonstrated in \cref{lst:myenv-noAdd1,lst:myenv-noAdd2}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd1.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd1.yaml}}{lst:myenv-noAdd1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd2.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd2.yaml}}{lst:myenv-noAdd2}
+	\end{minipage}
+
+	On applying either of the following commands,
+	\begin{commandshell}
+latexindent.pl myenv.tex -l myenv-noAdd1.yaml  
+latexindent.pl myenv.tex -l myenv-noAdd2.yaml  
+\end{commandshell}
+	we obtain the output given in \cref{lst:myenv-output}; note in particular that the environment \texttt{myenv}
+	has not received any \emph{additional} indentation, but that the \texttt{outer} environment \emph{has} still
+	received indentation.
+
+	\cmhlistingsfromfile{demonstrations/myenvironment-simple-noAdd-body1.tex}{\texttt{myenv.tex output (using either \cref{lst:myenv-noAdd1} or \cref{lst:myenv-noAdd2})}}{lst:myenv-output}
+
+	Upon changing the YAML files to those shown in \cref{lst:myenv-noAdd3,lst:myenv-noAdd4}, and running either
+	\begin{commandshell}
+latexindent.pl myenv.tex -l myenv-noAdd3.yaml  
+latexindent.pl myenv.tex -l myenv-noAdd4.yaml  
+\end{commandshell}
+	we obtain the output given in \cref{lst:myenv-output-4}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd3.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd3.yaml}}{lst:myenv-noAdd3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd4.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd4.yaml}}{lst:myenv-noAdd4}
+	\end{minipage}
+
+	\cmhlistingsfromfile{demonstrations/myenvironment-simple-noAdd-body4.tex}{\texttt{myenv.tex output} (using either \cref{lst:myenv-noAdd3} or \cref{lst:myenv-noAdd4})}{lst:myenv-output-4}
+
+	Let's now allow \texttt{myenv} to have some optional and mandatory arguments, as in \cref{lst:myenv-args}.
+	\cmhlistingsfromfile{demonstrations/myenvironment-args.tex}{\texttt{myenv-args.tex}}{lst:myenv-args}
+	Upon running
+	\begin{commandshell}
+latexindent.pl -l=myenv-noAdd1.yaml myenv-args.tex  
+\end{commandshell}
+	we obtain the output shown in \cref{lst:myenv-args-noAdd1}; note that the optional argument, mandatory argument and body \emph{all}
+	have received no additional indent. This is because, when \texttt{noAdditionalIndent} is specified in `scalar' form (as in \cref{lst:myenv-noAdd1}),
+	then \emph{all} parts of the environment (body, optional and mandatory arguments) are assumed to want no additional indent.
+	\cmhlistingsfromfile{demonstrations/myenvironment-args-noAdd-body1.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-noAdd1}}{lst:myenv-args-noAdd1}
+
+	We may customise \texttt{noAdditionalIndent} for optional and mandatory arguments of the \texttt{myenv} environment, as shown in, for example, \cref{lst:myenv-noAdd5,lst:myenv-noAdd6}.
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd5.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd5.yaml}}{lst:myenv-noAdd5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-noAdd6.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-noAdd6.yaml}}{lst:myenv-noAdd6}
+	\end{minipage}
+
+	Upon running
+	\begin{commandshell}
+latexindent.pl myenv.tex -l myenv-noAdd5.yaml  
+latexindent.pl myenv.tex -l myenv-noAdd6.yaml  
+\end{commandshell}
+	we obtain the respective outputs given in \cref{lst:myenv-args-noAdd5,lst:myenv-args-noAdd6}. Note that in \cref{lst:myenv-args-noAdd5}
+	the text for the \emph{optional} argument has not received any additional indentation, and that in \cref{lst:myenv-args-noAdd6} the
+	\emph{mandatory} argument has not received any additional indentation; in both cases, the \emph{body} has not received any additional indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-noAdd5.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-noAdd5}}{lst:myenv-args-noAdd5}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-noAdd6.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-noAdd6}}{lst:myenv-args-noAdd6}
+	\end{minipage}
+
+\yamltitle{indentRules}*{fields}
+	We may also specify indentation rules for environment code blocks using the \texttt{indentRules} field; see, for example,
+	\cref{lst:myenv-rules1,lst:myenv-rules2}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-rules1.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-rules1.yaml}}{lst:myenv-rules1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-rules2.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-rules2.yaml}}{lst:myenv-rules2}
+	\end{minipage}
+
+	On applying either of the following commands,
+	\begin{commandshell}
+latexindent.pl myenv.tex -l myenv-rules1.yaml  
+latexindent.pl myenv.tex -l myenv-rules2.yaml  
+\end{commandshell}
+	we obtain the output given in \cref{lst:myenv-rules-output}; note in particular that the environment \texttt{myenv}
+	has received one tab (from the \texttt{outer} environment) plus three spaces from \cref{lst:myenv-rules1} or \ref{lst:myenv-rules2}.
+
+	\cmhlistingsfromfile{demonstrations/myenv-rules1.tex}{\texttt{myenv.tex output (using either \cref{lst:myenv-rules1} or \cref{lst:myenv-rules2})}}{lst:myenv-rules-output}
+
+	If you specify a field in \texttt{indentRules} using anything other than horizontal space, it will be ignored.
+
+	Returning to the example in \cref{lst:myenv-args} that contains optional and mandatory arguments. Upon using \cref{lst:myenv-rules1} as in
+	\begin{commandshell}
+latexindent.pl myenv-args.tex -l=myenv-rules1.yaml  
+\end{commandshell}
+	we obtain the output in \cref{lst:myenv-args-rules1}; note that the body, optional argument and mandatory argument have \emph{all}
+	received the same customised indentation.
+	\cmhlistingsfromfile{demonstrations/myenvironment-args-rules1.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-rules1}}{lst:myenv-args-rules1}
+
+	You can specify different indentation rules for the different features using, for example, \cref{lst:myenv-rules3,lst:myenv-rules4}
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-rules3.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-rules3.yaml}}{lst:myenv-rules3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/myenv-rules4.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{myenv-rules4.yaml}}{lst:myenv-rules4}
+	\end{minipage}
+
+	After running
+	\begin{commandshell}
+latexindent.pl myenv-args.tex -l myenv-rules3.yaml  
+latexindent.pl myenv-args.tex -l myenv-rules4.yaml  
+\end{commandshell}
+	then we obtain the respective outputs given in \cref{lst:myenv-args-rules3,lst:myenv-args-rules4}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules3.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-rules3}}{lst:myenv-args-rules3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules4.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-rules4}}{lst:myenv-args-rules4}
+	\end{minipage}
+
+	Note that in \cref{lst:myenv-args-rules3}, the optional argument has only received a single space of indentation, while the mandatory argument
+	has received the default (tab) indentation; the environment body has received three spaces of indentation.
+
+	In \cref{lst:myenv-args-rules4}, the optional argument has received the default (tab) indentation, the mandatory argument has received two tabs
+	of indentation, and the body has received three spaces of indentation.
+
+\yamltitle{noAdditionalIndentGlobal}*{fields}
+	\begin{wrapfigure}[6]{r}[0pt]{7cm}
+		\cmhlistingsfromfile[firstnumber=247,linerange={247-248},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{env-noAdditionalGlobal.yaml}}{lst:noAdditionalIndentGlobal:environments}
+	\end{wrapfigure}
+	Assuming that your environment name is not found within neither \texttt{noAdditionalIndent} nor \texttt{indentRules}, the next
+	place that \texttt{latexindent.pl} will look is \texttt{noAdditionalIndentGlobal}, and in particular \emph{for the environments} key
+	(see \cref{lst:noAdditionalIndentGlobal:environments}). Let's say that you change
+	the value of \texttt{environments} to \texttt{1} in \cref{lst:noAdditionalIndentGlobal:environments}, and that you run
+
+	\begin{widepage}
+		\begin{commandshell}
+latexindent.pl myenv-args.tex -l env-noAdditionalGlobal.yaml
+latexindent.pl myenv-args.tex -l myenv-rules1.yaml,env-noAdditionalGlobal.yaml
+\end{commandshell}
+	\end{widepage}
+
+	The respective output from these two commands are in \cref{lst:myenv-args-no-add-global1,lst:myenv-args-no-add-global2}; in \cref{lst:myenv-args-no-add-global1} notice that \emph{both}
+	environments receive no additional indentation but that the arguments of \texttt{myenv} still \emph{do} receive indentation. In \cref{lst:myenv-args-no-add-global2}
+	notice that the \emph{outer} environment does not receive additional indentation, but because of the settings from \texttt{myenv-rules1.yaml} (in \vref{lst:myenv-rules1}), the \texttt{myenv}
+	environment still \emph{does} receive indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules1-noAddGlobal1.tex}{\texttt{myenv-args.tex} using \cref{lst:noAdditionalIndentGlobal:environments}}{lst:myenv-args-no-add-global1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules1-noAddGlobal2.tex}{\texttt{myenv-args.tex} using \cref{lst:noAdditionalIndentGlobal:environments,lst:myenv-rules1}}{lst:myenv-args-no-add-global2}
+	\end{minipage}
+
+	In fact, \texttt{noAdditionalIndentGlobal} also contains keys that control the indentation of optional and mandatory
+	arguments; on referencing \cref{lst:opt-args-no-add-glob,lst:mand-args-no-add-glob}
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/opt-args-no-add-glob.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{opt-args-no-add-glob.yaml}}{lst:opt-args-no-add-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mand-args-no-add-glob.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{mand-args-no-add-glob.yaml}}{lst:mand-args-no-add-glob}
+	\end{minipage}
+
+	we may run the commands
+	\begin{commandshell}
+latexindent.pl  myenv-args.tex -local opt-args-no-add-glob.yaml
+latexindent.pl  myenv-args.tex -local mand-args-no-add-glob.yaml
+\end{commandshell}
+	which produces the respective outputs given in \cref{lst:myenv-args-no-add-opt,lst:myenv-args-no-add-mand}. Notice that in \cref{lst:myenv-args-no-add-opt}
+	the \emph{optional} argument has not received any additional indentation, and in \cref{lst:myenv-args-no-add-mand} the \emph{mandatory} argument
+	has not received any additional indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules1-noAddGlobal3.tex}{\texttt{myenv-args.tex} using \cref{lst:opt-args-no-add-glob}}{lst:myenv-args-no-add-opt}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-rules1-noAddGlobal4.tex}{\texttt{myenv-args.tex} using \cref{lst:mand-args-no-add-glob}}{lst:myenv-args-no-add-mand}
+	\end{minipage}
+
+\yamltitle{indentRulesGlobal}*{fields}
+	\begin{wrapfigure}[4]{r}[0pt]{7cm}
+		\cmhlistingsfromfile[firstnumber=263,linerange={263-264},style=yaml-LST]{../defaultSettings.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{env-indentRulesGlobal.yaml}}{lst:indentRulesGlobal:environments}
+	\end{wrapfigure}
+	The final check that \texttt{latexindent.pl} will make is to look for \texttt{indentRulesGlobal} as detailed in \cref{lst:indentRulesGlobal:environments}; if you change the \texttt{environments}
+	field to anything involving horizontal space, say \lstinline!" "!, and then run the following commands
+
+	\begin{commandshell}
+latexindent.pl  myenv-args.tex -l env-indentRules.yaml
+latexindent.pl  myenv-args.tex -l myenv-rules1.yaml,env-indentRules.yaml
+\end{commandshell}
+	then the respective output is shown in \cref{lst:myenv-args-indent-rules-global1,lst:myenv-args-indent-rules-global2}. Note that
+	in \cref{lst:myenv-args-indent-rules-global1}, both the environment blocks have received a single-space indentation, whereas in
+	\cref{lst:myenv-args-indent-rules-global2} the \texttt{outer} environment has received single-space indentation (specified by \texttt{indentRulesGlobal}),
+	but \texttt{myenv} has received \lstinline!"   "!, as specified by the particular \texttt{indentRules} for \texttt{myenv} \vref{lst:myenv-rules1}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-global-rules1.tex}{\texttt{myenv-args.tex} using \cref{lst:indentRulesGlobal:environments}}{lst:myenv-args-indent-rules-global1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-global-rules2.tex}{\texttt{myenv-args.tex} using \cref{lst:myenv-rules1,lst:indentRulesGlobal:environments}}{lst:myenv-args-indent-rules-global2}
+	\end{minipage}
+
+	You can specify \texttt{indentRulesGlobal} for both optional and mandatory arguments, as detailed in \cref{lst:opt-args-indent-rules-glob,lst:mand-args-indent-rules-glob}
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/opt-args-indent-rules-glob.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{opt-args-indent-rules-glob.yaml}}{lst:opt-args-indent-rules-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/mand-args-indent-rules-glob.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{mand-args-indent-rules-glob.yaml}}{lst:mand-args-indent-rules-glob}
+	\end{minipage}
+
+	Upon running the following commands
+	\begin{commandshell}
+latexindent.pl  myenv-args.tex -local opt-args-indent-rules-glob.yaml
+latexindent.pl  myenv-args.tex -local mand-args-indent-rules-glob.yaml
+\end{commandshell}
+	we obtain the respective outputs in \cref{lst:myenv-args-indent-rules-global3,lst:myenv-args-indent-rules-global4}. Note that the \emph{optional}
+	argument in \cref{lst:myenv-args-indent-rules-global3} has received two tabs worth of indentation, while the \emph{mandatory} argument has
+	done so in \cref{lst:myenv-args-indent-rules-global4}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-global-rules3.tex}{\texttt{myenv-args.tex} using \cref{lst:opt-args-indent-rules-glob}}{lst:myenv-args-indent-rules-global3}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/myenvironment-args-global-rules4.tex}{\texttt{myenv-args.tex} using \cref{lst:mand-args-indent-rules-glob}}{lst:myenv-args-indent-rules-global4}
+	\end{minipage}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-with-items.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-with-items.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-environments-with-items.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,59 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{Environments with items}
+	With reference to \vref{lst:indentafteritems,lst:itemNames}, some commands
+	may contain \texttt{item} commands; for the purposes of this discussion,
+	we will use the code from \vref{lst:itemsbefore}.
+
+	Assuming that you've populated \texttt{itemNames} with the name of your
+	\texttt{item}, you can put the item name into \texttt{noAdditionalIndent}
+	as in \cref{lst:item-noAdd1}, although a more efficient approach may be
+	to change the relevant field in \texttt{itemNames} to \texttt{0}. Similarly,
+	you can customise the indentation that your \texttt{item} receives using
+	\texttt{indentRules}, as in \cref{lst:item-rules1}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/item-noAdd1.yaml}[yaml-TCB]{\texttt{item-noAdd1.yaml}}{lst:item-noAdd1}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/item-rules1.yaml}[yaml-TCB]{\texttt{item-rules1.yaml}}{lst:item-rules1}
+	\end{minipage}
+
+	Upon running the following commands
+	\begin{commandshell}
+latexindent.pl items1.tex -local item-noAdd1.yaml  
+latexindent.pl items1.tex -local item-rules1.yaml  
+\end{commandshell}
+	the respective outputs are given in \cref{lst:items1-noAdd1,lst:items1-rules1}; note that in \cref{lst:items1-noAdd1}
+	that the text after each \texttt{item} has not received any additional indentation, and in \cref{lst:items1-rules1},
+	the text after each \texttt{item} has received a single space of indentation, specified by \cref{lst:item-rules1}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/items1-noAdd1.tex}{\texttt{items1.tex} using \cref{lst:item-noAdd1}}{lst:items1-noAdd1}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/items1-rules1.tex}{\texttt{items1.tex} using \cref{lst:item-rules1}}{lst:items1-rules1}
+	\end{minipage}
+
+	Alternatively, you might like to populate \texttt{noAdditionalIndentGlobal} or \texttt{indentRulesGlobal} using the \texttt{items}
+	key, as demonstrated in \cref{lst:items-noAdditionalGlobal,lst:items-indentRulesGlobal}. Note that there is a need to
+	`reset/remove' the \texttt{item} field from \texttt{indentRules} in both cases (see the hierarchy description given on \cpageref{sec:noadd-indent-rules})
+	as the \texttt{item} command is a member of \texttt{indentRules} by default.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/items-noAdditionalGlobal.yaml}[yaml-TCB]{\texttt{items-noAdditionalGlobal.yaml}}{lst:items-noAdditionalGlobal}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/items-indentRulesGlobal.yaml}[yaml-TCB]{\texttt{items-indentRulesGlobal.yaml}}{lst:items-indentRulesGlobal}
+	\end{minipage}
+
+	Upon running the following commands,
+	\begin{commandshell}
+latexindent.pl items1.tex -local items-noAdditionalGlobal.yaml
+latexindent.pl items1.tex -local items-indentRulesGlobal.yaml
+\end{commandshell}
+	the respective outputs from \cref{lst:items1-noAdd1,lst:items1-rules1} are obtained; note, however, that
+	\emph{all} such \texttt{item} commands without their own individual \texttt{noAdditionalIndent} or \texttt{indentRules}
+	settings would behave as in these listings.

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-headings.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-headings.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-headings.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,93 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{\texttt{afterHeading} code blocks}\label{subsubsec-headings-no-add-indent-rules}
+	Let's use the example \cref{lst:headings2} for demonstration throughout this \namecref{subsubsec-headings-no-add-indent-rules}.
+	As discussed on \cpageref{lst:headings1}, by default \texttt{latexindent.pl} will not add indentation after headings.
+
+	\cmhlistingsfromfile{demonstrations/headings2.tex}{\texttt{headings2.tex}}{lst:headings2}
+
+	On using the YAML file in \cref{lst:headings3yaml} by running the command
+	\begin{commandshell}
+latexindent.pl headings2.tex -l headings3.yaml      
+    \end{commandshell}
+	we obtain the output in \cref{lst:headings2-mod3}. Note that the argument of \texttt{paragraph} has received (default) indentation,
+	and that the body after the heading statement has received (default) indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod3.tex}{\texttt{headings2.tex} using \cref{lst:headings3yaml}}{lst:headings2-mod3}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings3.yaml}[yaml-TCB]{\texttt{headings3.yaml}}{lst:headings3yaml}
+	\end{minipage}
+
+	If we specify \texttt{noAdditionalIndent} as in \cref{lst:headings4yaml} and run the command
+	\begin{commandshell}
+latexindent.pl headings2.tex -l headings4.yaml      
+    \end{commandshell}
+	then we receive the output in \cref{lst:headings2-mod4}. Note that the arguments \emph{and} the body after the heading
+	of \texttt{paragraph} has received no additional indentation, because we have specified \texttt{noAdditionalIndent} in scalar form.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod4.tex}{\texttt{headings2.tex} using \cref{lst:headings4yaml}}{lst:headings2-mod4}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings4.yaml}[yaml-TCB]{\texttt{headings4.yaml}}{lst:headings4yaml}
+	\end{minipage}
+
+	Similarly, if we specify \texttt{indentRules} as in \cref{lst:headings5yaml} and run analogous commands to those above,
+	we receive the output in \cref{lst:headings2-mod5}; note that the \emph{body}, \emph{mandatory argument} and content
+	\emph{after the heading} of \texttt{paragraph} have \emph{all} received three tabs worth of indentation.
+
+	\begin{minipage}{.55\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod5.tex}{\texttt{headings2.tex} using \cref{lst:headings5yaml}}{lst:headings2-mod5}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.42\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings5.yaml}[yaml-TCB]{\texttt{headings5.yaml}}{lst:headings5yaml}
+	\end{minipage}
+
+	We may, instead, specify \texttt{noAdditionalIndent} in `field' form, as in \cref{lst:headings6yaml} which gives the output in \cref{lst:headings2-mod6}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod6.tex}{\texttt{headings2.tex} using \cref{lst:headings6yaml}}{lst:headings2-mod6}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings6.yaml}[yaml-TCB]{\texttt{headings6.yaml}}{lst:headings6yaml}
+	\end{minipage}
+
+	Analogously, we may specify \texttt{indentRules} as in \cref{lst:headings7yaml} which gives the output in \cref{lst:headings2-mod7};
+	note that mandatory argument text has only received a single space of indentation, while the body after the heading has
+	received three tabs worth of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod7.tex}{\texttt{headings2.tex} using \cref{lst:headings7yaml}}{lst:headings2-mod7}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings7.yaml}[yaml-TCB]{\texttt{headings7.yaml}}{lst:headings7yaml}
+	\end{minipage}
+
+	Finally, let's consider \texttt{noAdditionalIndentGlobal} and \texttt{indentRulesGlobal} shown in \cref{lst:headings8yaml,lst:headings9yaml}
+	respectively, with respective output in \cref{lst:headings2-mod8,lst:headings2-mod9}. Note that in \cref{lst:headings8yaml} the
+	\emph{mandatory argument} of \texttt{paragraph} has received a (default) tab's worth of indentation, while the body after the
+	heading has received \emph{no additional indentation}. Similarly, in \cref{lst:headings2-mod9}, the \emph{argument} has received both a
+	(default) tab plus two spaces of indentation (from the global rule specified in \cref{lst:headings9yaml}), and the remaining body
+	after \texttt{paragraph} has received just two spaces of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod8.tex}{\texttt{headings2.tex} using \cref{lst:headings8yaml}}{lst:headings2-mod8}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings8.yaml}[yaml-TCB]{\texttt{headings8.yaml}}{lst:headings8yaml}
+	\end{minipage}
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/headings2-mod9.tex}{\texttt{headings2.tex} using \cref{lst:headings9yaml}}{lst:headings2-mod9}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/headings9.yaml}[yaml-TCB]{\texttt{headings9.yaml}}{lst:headings9yaml}
+	\end{minipage}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-ifelsefi.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-ifelsefi.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-ifelsefi.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,70 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{ifelsefi code blocks}
+	Let's use the simple example shown in \cref{lst:ifelsefi1}; when
+	\texttt{latexindent.pl} operates on this file, the output as in \cref{lst:ifelsefi1-default};
+	note that the body of each of the \lstinline!\if! statements have been indented,
+	and that the \lstinline!\else! statement has been accounted for correctly.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1.tex}{\texttt{ifelsefi1.tex}}{lst:ifelsefi1}
+	\end{minipage}%
+	\hfill
+	\begin{minipage}{.54\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1-default.tex}{\texttt{ifelsefi1.tex} default output}{lst:ifelsefi1-default}
+	\end{minipage}
+
+	It is recommended to specify \texttt{noAdditionalIndent} and \texttt{indentRules} in the `scalar' form only
+	for these type of code blocks, although the `field' form would work, assuming that \texttt{body} was specified.
+	Examples are shown in \cref{lst:ifnum-noAdd,lst:ifnum-indent-rules}.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/ifnum-noAdd.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{ifnum-noAdd.yaml}}{lst:ifnum-noAdd}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/ifnum-indent-rules.yaml}[width=.8\linewidth,before=\centering,yaml-TCB]{\texttt{ifnum-indent-rules.yaml}}{lst:ifnum-indent-rules}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl ifelsefi1.tex -local ifnum-noAdd.yaml  
+latexindent.pl ifelsefi1.tex -l ifnum-indent-rules.yaml  
+\end{commandshell}
+	we receive the respective output given in \cref{lst:ifelsefi1-output-noAdd,lst:ifelsefi1-output-indent-rules}; note that
+	in \cref{lst:ifelsefi1-output-noAdd}, the \texttt{ifnum} code block has \emph{not} received any additional indentation,
+	while in \cref{lst:ifelsefi1-output-indent-rules}, the \texttt{ifnum} code block has received one tab and two spaces of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1-noAdd.tex}{\texttt{ifelsefi1.tex} using \cref{lst:ifnum-noAdd}}{lst:ifelsefi1-output-noAdd}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.5\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1-indent-rules.tex}{\texttt{ifelsefi1.tex} using \cref{lst:ifnum-indent-rules}}{lst:ifelsefi1-output-indent-rules}
+	\end{minipage}
+
+	We may specify \texttt{noAdditionalIndentGlobal} and \texttt{indentRulesGlobal} as in \cref{lst:ifelsefi-noAdd-glob,lst:ifelsefi-indent-rules-global}.
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/ifelsefi-noAdd-glob.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{ifelsefi-noAdd-glob.yaml}}{lst:ifelsefi-noAdd-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/ifelsefi-indent-rules-global.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{ifelsefi-indent-rules-global.yaml}}{lst:ifelsefi-indent-rules-global}
+	\end{minipage}
+
+	Upon running the following commands
+	\begin{commandshell}
+latexindent.pl ifelsefi1.tex -local ifelsefi-noAdd-glob.yaml  
+latexindent.pl ifelsefi1.tex -l ifelsefi-indent-rules-global.yaml  
+\end{commandshell}
+	we receive the outputs in \cref{lst:ifelsefi1-output-noAdd-glob,lst:ifelsefi1-output-indent-rules-global}; notice that  in
+	\cref{lst:ifelsefi1-output-noAdd-glob} neither of the \texttt{ifelsefi} code blocks have received indentation, while in
+	\cref{lst:ifelsefi1-output-indent-rules-global} both code blocks have received a single space of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1-noAdd-glob.tex}{\texttt{ifelsefi1.tex} using \cref{lst:ifelsefi-noAdd-glob}}{lst:ifelsefi1-output-noAdd-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/ifelsefi1-indent-rules-global.tex}{\texttt{ifelsefi1.tex} using \cref{lst:ifelsefi-indent-rules-global}}{lst:ifelsefi1-output-indent-rules-global}
+	\end{minipage}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-no-add-remaining-code-blocks.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-no-add-remaining-code-blocks.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-no-add-remaining-code-blocks.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,109 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{The remaining code blocks}
+	Referencing the different types of code blocks in \vref{tab:code-blocks}, we have a few
+	code blocks yet to cover; these are very similar to the \texttt{commands} code block type
+	covered comprehensively in \vref{subsubsec:commands-arguments}, but a small discussion
+	defining these remaining code blocks is necessary.
+
+	\paragraph{\texttt{keyEqualsValuesBracesBrackets}}
+		\texttt{latexindent.pl} defines this type of code block by the following criteria:
+		\begin{itemize}
+			\item it must immediately follow either \lstinline!{! OR \lstinline![! OR \lstinline!,! with comments
+			      and blank lines allowed;
+			\item then it has a name made up of the characters detailed in \vref{tab:code-blocks};
+			\item then an $=$ symbol;
+			\item then at least one set of curly braces or square brackets (comments and line breaks allowed throughout).
+		\end{itemize}
+
+		An example is shown in \cref{lst:pgfkeysbefore}, with the default output given in \cref{lst:pgfkeys1:default}.
+
+		\begin{minipage}{.45\textwidth}
+			\cmhlistingsfromfile{demonstrations/pgfkeys1.tex}{\texttt{pgfkeys1.tex}}{lst:pgfkeysbefore}
+		\end{minipage}%
+		\hfill
+		\begin{minipage}{.5\textwidth}
+			\cmhlistingsfromfile{demonstrations/pgfkeys1-default.tex}{\texttt{pgfkeys1.tex} default output}{lst:pgfkeys1:default}
+		\end{minipage}%
+
+		In \cref{lst:pgfkeys1:default}, note that the maximum indentation is three tabs, and these come from:
+		\begin{itemize}
+			\item the \lstinline!\pgfkeys! command's mandatory argument;
+			\item the \lstinline!start coordinate/.initial! key's mandatory argument;
+			\item the \lstinline!start coordinate/.initial! key's body, which is defined as any lines following the name of the
+			      key that include its arguments.  This is the part controlled by the \emph{body} field for \texttt{noAdditionalIndent}
+			      and friends from \cpageref{sec:noadd-indent-rules}.
+		\end{itemize}
+	\paragraph{\texttt{namedGroupingBracesBrackets}}
+		This type of code block is mostly motivated by tikz-based code; we define this code block as follows:
+		\begin{itemize}
+			\item it must immediately follow either \emph{horizontal space} OR \emph{one or more line breaks} OR \lstinline!{! OR \lstinline![!
+			      OR \lstinline!$!;
+			\item the name may contain the characters detailed in \vref{tab:code-blocks};
+			\item then at least one set of curly braces or square brackets (comments and line breaks allowed throughout).
+		\end{itemize}
+		A simple example is given in \cref{lst:child1}, with default output in \cref{lst:child1:default}.
+
+		\begin{minipage}{.45\textwidth}
+			\cmhlistingsfromfile{demonstrations/child1.tex}{\texttt{child1.tex}}{lst:child1}
+		\end{minipage}%
+		\hfill
+		\begin{minipage}{.5\textwidth}
+			\cmhlistingsfromfile{demonstrations/child1-default.tex}{\texttt{child1.tex} default output}{lst:child1:default}
+		\end{minipage}%
+
+		In particular, \texttt{latexindent.pl} considers \texttt{child}, \texttt{parent} and \texttt{node} all to be \texttt{namedGroupingBracesBrackets}\footnote{
+			You may like to verify this by using the \texttt{-tt} option and checking \texttt{indent.log}! }.
+		Referencing \cref{lst:child1:default},
+		note that the maximum indentation is two tabs, and these come from:
+		\begin{itemize}
+			\item the \lstinline!child!'s mandatory argument;
+			\item the \lstinline!child!'s body, which is defined as any lines following the name of the \texttt{namedGroupingBracesBrackets}
+			      that include its arguments. This is the part controlled by the \emph{body} field for \texttt{noAdditionalIndent}
+			      and friends from \cpageref{sec:noadd-indent-rules}.
+		\end{itemize}
+
+	\paragraph{\texttt{UnNamedGroupingBracesBrackets}} occur in a variety of situations; specifically, we define
+		this type of code block as satisfying the following criteria:
+		\begin{itemize}
+			\item it must immediately follow either \lstinline!{! OR \lstinline![! OR \lstinline!,! OR \lstinline!&! OR \lstinline!)! OR \lstinline!(!
+			      OR \lstinline!$!;
+			\item then at least one set of curly braces or square brackets (comments and line breaks allowed throughout).
+		\end{itemize}
+
+		An example is shown in \cref{lst:psforeach1} with default output give in \cref{lst:psforeach:default}.
+
+		\begin{minipage}{.45\textwidth}
+			\cmhlistingsfromfile{demonstrations/psforeach1.tex}{\texttt{psforeach1.tex}}{lst:psforeach1}
+		\end{minipage}%
+		\hfill
+		\begin{minipage}{.5\textwidth}
+			\cmhlistingsfromfile{demonstrations/psforeach1-default.tex}{\texttt{psforeach1.tex} default output}{lst:psforeach:default}
+		\end{minipage}%
+
+		Referencing \cref{lst:psforeach:default}, there are \emph{three} sets of unnamed braces. Note also that the maximum value
+		of indentation is three tabs, and these come from:
+		\begin{itemize}
+			\item the \lstinline!\psforeach! command's mandatory argument;
+			\item the \emph{first} un-named braces mandatory argument;
+			\item the \emph{first} un-named braces \emph{body}, which we define as any lines following the first opening \lstinline!{! or \lstinline![!
+			      that defined the code block.  This is the part controlled by the \emph{body} field for \texttt{noAdditionalIndent}
+			      and friends from \cpageref{sec:noadd-indent-rules}.
+		\end{itemize}
+		Users wishing to customise the mandatory and/or optional arguments on a \emph{per-name} basis for the \texttt{UnNamedGroupingBracesBrackets}
+		should use \texttt{always-un-named}.
+
+	\paragraph{\texttt{filecontents}} code blocks behave just as \texttt{environments}, except that neither arguments nor items are sought.
+
+\subsubsection{Summary}
+	Having considered all of the different types of code blocks, the functions of the fields given in
+	\cref{lst:noAdditionalIndentGlobal,lst:indentRulesGlobal} should now make sense.
+
+	\begin{widepage}
+		\begin{minipage}{.47\linewidth}
+			\cmhlistingsfromfile[firstnumber=247,linerange={247-259},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[before=\centering,yaml-TCB]{\texttt{noAdditionalIndentGlobal}}{lst:noAdditionalIndentGlobal}
+		\end{minipage}%
+		\hfill
+		\begin{minipage}{.47\linewidth}
+			\cmhlistingsfromfile[firstnumber=263,linerange={263-275},style=yaml-LST,numbers=left]{../defaultSettings.yaml}[before=\centering,yaml-TCB]{\texttt{indentRulesGlobal}}{lst:indentRulesGlobal}
+		\end{minipage}%
+	\end{widepage}

Added: trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-special.tex
===================================================================
--- trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-special.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/support/latexindent/subsubsec-special.tex	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,60 @@
+% arara: pdflatex: {shell: yes, files: [latexindent]}
+\subsubsection{\texttt{specialBeginEnd} code blocks}
+	Let's use the example from \vref{lst:specialbefore} which has default output shown in
+	\vref{lst:specialafter}.
+
+	It is recommended to specify \texttt{noAdditionalIndent} and \texttt{indentRules} in the `scalar' form
+	for these type of code blocks, although the `field' form would work, assuming that \texttt{body} was specified.
+	Examples are shown in \cref{lst:displayMath-noAdd,lst:displayMath-indent-rules}.
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/displayMath-noAdd.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{displayMath-noAdd.yaml}}{lst:displayMath-noAdd}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/displayMath-indent-rules.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{displayMath-indent-rules.yaml}}{lst:displayMath-indent-rules}
+	\end{minipage}
+
+	After running the following commands,
+	\begin{commandshell}
+latexindent.pl special1.tex -local displayMath-noAdd.yaml  
+latexindent.pl special1.tex -l displayMath-indent-rules.yaml  
+\end{commandshell}
+	we receive the respective output given in \cref{lst:special1-output-noAdd,lst:special1-output-indent-rules}; note that
+	in \cref{lst:special1-output-noAdd}, the \texttt{displayMath} code block has \emph{not} received any additional indentation,
+	while in \cref{lst:special1-output-indent-rules}, the \texttt{displayMath} code block has received three tabs worth of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1-noAdd.tex}{\texttt{special1.tex} using \cref{lst:displayMath-noAdd}}{lst:special1-output-noAdd}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1-indent-rules.tex}{\texttt{special1.tex} using \cref{lst:displayMath-indent-rules}}{lst:special1-output-indent-rules}
+	\end{minipage}
+
+	We may specify \texttt{noAdditionalIndentGlobal} and \texttt{indentRulesGlobal} as in \cref{lst:special-noAdd-glob,lst:special-indent-rules-global}.
+
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/special-noAdd-glob.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{special-noAdd-glob.yaml}}{lst:special-noAdd-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.49\textwidth}
+		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/special-indent-rules-global.yaml}[width=.9\linewidth,before=\centering,yaml-TCB]{\texttt{special-indent-rules-global.yaml}}{lst:special-indent-rules-global}
+	\end{minipage}
+
+	Upon running the following commands
+	\begin{commandshell}
+latexindent.pl special1.tex -local special-noAdd-glob.yaml  
+latexindent.pl special1.tex -l special-indent-rules-global.yaml  
+\end{commandshell}
+	we receive the outputs in \cref{lst:special1-output-noAdd-glob,lst:special1-output-indent-rules-global}; notice that  in
+	\cref{lst:special1-output-noAdd-glob} neither of the \texttt{special} code blocks have received indentation, while in
+	\cref{lst:special1-output-indent-rules-global} both code blocks have received a single space of indentation.
+
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1-noAdd-glob.tex}{\texttt{special1.tex} using \cref{lst:special-noAdd-glob}}{lst:special1-output-noAdd-glob}
+	\end{minipage}
+	\hfill
+	\begin{minipage}{.45\textwidth}
+		\cmhlistingsfromfile{demonstrations/special1-indent-rules-global.tex}{\texttt{special1.tex} using \cref{lst:special-indent-rules-global}}{lst:special1-output-indent-rules-global}
+	\end{minipage}

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/AlignmentAtAmpersand.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,255 @@
+package LatexIndent::AlignmentAtAmpersand;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Tokens qw/%tokens/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/align_at_ampersand find_aligned_block/;
+our $alignmentBlockCounter;
+
+sub find_aligned_block{
+    my $self = shift;
+
+    return unless (${$self}{body} =~ m/(?!<\\)%\*\h*\\begin\{/s);
+
+    # aligned block
+	#      %* \begin{tabular}
+	#         1 & 2 & 3 & 4 \\
+	#         5 &   & 6 &   \\
+	#        %* \end{tabular}
+    $self->logger('looking for ALIGNED blocks marked by comments','heading')if($is_t_switch_active);
+    $self->logger(Dumper(\%{$masterSettings{lookForAlignDelims}})) if($is_t_switch_active);
+    while( my ($alignmentBlock,$yesno)= each %{$masterSettings{lookForAlignDelims}}){
+        if(ref $yesno eq "HASH"){
+              $yesno = (defined ${$yesno}{delims} ) ? ${$yesno}{delims} : 1;
+            }
+        if($yesno){
+            $self->logger("looking for $alignmentBlock:$yesno environments");
+
+            my $noIndentRegExp = qr/
+                            (
+                                (?!<\\)
+                                %
+                                \*
+                                \h*                     # possible horizontal spaces
+                                \\begin\{
+                                        $alignmentBlock  # environment name captured into $2
+                                       \}               # %* \begin{alignmentBlock} statement
+                            )
+                            (
+                                .*?
+                            )
+                            \R
+                            \h*
+                            (
+                                (?!<\\)
+                                %\*                     # %
+                                \h*                     # possible horizontal spaces
+                                \\end\{$alignmentBlock\} # \end{alignmentBlock}
+                            )                           # %* \end{<something>} statement
+                            #\R
+                        /sx;
+
+            while( ${$self}{body} =~ m/$noIndentRegExp/sx){
+
+              ${$self}{body} =~ s/
+                                    $noIndentRegExp
+                                /
+                                    # create a new Environment object
+                                    my $alignmentBlock = LatexIndent::AlignmentAtAmpersand->new( begin=>$1,
+                                                                          body=>$2,
+                                                                          end=>$3,
+                                                                          name=>$alignmentBlock,
+                                                                          modifyLineBreaksYamlName=>"environments",
+                                                                          linebreaksAtEnd=>{
+                                                                            begin=>1,
+                                                                            body=>1,
+                                                                            end=>0,
+                                                                          },
+                                                                          );
+            
+                                    # the settings and storage of most objects has a lot in common
+                                    $self->get_settings_and_store_new_object($alignmentBlock);
+                                    ${@{${$self}{children}}[-1]}{replacementText};
+                              /xseg;
+            } 
+      } else {
+            $self->logger("*not* looking for $alignmentBlock as $alignmentBlock:$yesno");
+      }
+    }
+    return;
+}
+
+sub modify_line_breaks_settings{
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+#    $self->remove_leading_space;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $alignmentBlockCounter++;
+    ${$self}{id} = "$tokens{alignmentBlock}$alignmentBlockCounter";
+    return;
+}
+
+sub align_at_ampersand{
+    my $self = shift;
+    return if(${$self}{bodyLineBreaks}==0);
+
+    # calculate the maximum number of ampersands in a row in the body
+    my $maximumNumberOfAmpersands = 0;
+    foreach(split("\n",${$self}{body})){
+        my $numberOfAmpersands = () = $_ =~ /(?<!\\)&/g;
+        $maximumNumberOfAmpersands = $numberOfAmpersands if($numberOfAmpersands>$maximumNumberOfAmpersands);
+    }
+
+    # create an array of zeros
+    my @columnSizes = (0) x ($maximumNumberOfAmpersands+1); 
+
+    # array for the new body
+    my @formattedBody;
+
+    # now loop back through the body, and store the maximum column size
+    foreach(split("\n",${$self}{body})){
+        # remove \\ and anything following it
+        my $endPiece;
+        if($_ =~ m/(\\\\.*)/){
+            $_ =~ s/(\\\\.*)//;
+            $endPiece = $1;
+        }
+
+        my $numberOfAmpersands = () = $_ =~ /(?<!\\)&/g;
+        if($numberOfAmpersands == $maximumNumberOfAmpersands){
+            # remove any trailing comments
+            my $trailingComments;
+            if($_ =~ m/$trailingCommentRegExp/ ){
+                $_ =~ s/($trailingCommentRegExp)//;
+                $trailingComments = $1; 
+            }
+
+            # if the line finishes with an &, then add an empty space,
+            # otherwise the column count is off
+            $_ .= ($_ =~ m/(?<!\\)&$/ ? " ":q());
+
+            # loop through the columns
+            my $columnCount = 0;
+            my $strippedRow = '';
+            foreach my $column (split(/(?<!\\)&/,$_)){
+                # remove leading space
+                $column =~ s/^\h*//;
+
+                # remove trailing space
+                $column =~ s/\h*$//; 
+
+                # if a column has finished with a \ then we need to add a trailing space, 
+                # otherwise the \ can be put next to &. See test-cases/texexchange/112343-gonzalo for example
+                $column .= ($column =~ m/\\$/ ? " ": q());
+
+                # store the column size
+                $columnSizes[$columnCount] = length($column) if(length($column)>$columnSizes[$columnCount]);
+
+                # put the row back together, using " " if the column is empty
+                $strippedRow .= ($columnCount>0 ? "&" : q() ).(length($column)>0 ? $column: " ");
+
+                # move on to the next column
+                $columnCount++;
+            }
+
+            # store the information
+            push(@formattedBody,{
+                                row=>$strippedRow,
+                                format=>1,
+                                endPiece=>($endPiece ? $endPiece :q() ),
+                                trailingComment=>($trailingComments ? $trailingComments :q() )});
+        } else {
+            # otherwise simply store the row
+            push(@formattedBody,{
+                                row=>$_.($endPiece ? $endPiece : q() ),
+                                format=>0});
+        }
+    }
+
+    # output some of the info so far to the log file
+    $self->logger("Column sizes of horizontally stripped formatted block (${$self}{name}): @columnSizes") if $is_t_switch_active;
+
+    # README: printf( formatting, expression)
+    #
+    #   formatting has the form %-50s & %-20s & %-19s
+    #   (the numbers have been made up for example)
+    #       the - symbols mean that each column should be left-aligned
+    #       the numbers represent how wide each column is
+    #       the s represents string
+    #       the & needs to be inserted
+
+    # join up the maximum string lengths using "s %-"
+    my $fmtstring = join("s & %-", at columnSizes);
+
+    # add %- to the beginning and an s to the end
+    $fmtstring = "%-".$fmtstring."s ";
+
+    # log file info
+    $self->logger("Formatting string is: $fmtstring",'heading') if $is_t_switch_active;
+
+    # finally, reformat the body
+    foreach(@formattedBody){
+        if(${$_}{format} and ${$_}{row} !~ m/^\h*$/){
+            # format the row, and put the trailing \\ and trailing comments back into the row
+            ${$_}{row} = sprintf($fmtstring,split(/(?<!\\)&/,${$_}{row})).(${$_}{endPiece} ? ${$_}{endPiece} :q() ).(${$_}{trailingComment}? ${$_}{trailingComment} : q() );
+
+            # possibly remove space ahead of \\
+            ${$_}{row} =~ s/\h*\\\\/\\\\/ if(!${$self}{alignDoubleBackSlash});
+
+            # possibly insert spaces infront of \\
+            if(defined ${$self}{spacesBeforeDoubleBackSlash} and ${$self}{spacesBeforeDoubleBackSlash}>=0 and !${$self}{alignDoubleBackSlash}){
+                my $horizontalSpaceToInsert = " "x (${$self}{spacesBeforeDoubleBackSlash});
+                ${$_}{row} =~ s/\h*\\\\/$horizontalSpaceToInsert\\\\/;
+            }
+        }
+
+        # if we have an empty row, it's possible that it originally had an end piece (e.g \\) and/or trailing comments
+        if(${$_}{row} =~ m/^\h*$/){
+            ${$_}{row} .= (${$_}{endPiece} ? ${$_}{endPiece} :q() ).(${$_}{trailingComment}? ${$_}{trailingComment} : q() );
+        }
+    }
+
+    # to the log file
+    if($is_tt_switch_active){    
+        $self->logger(${$_}{row},'ttrace') for @formattedBody;
+    }
+
+    # delete the original body
+    ${$self}{body} = q();
+
+    # update the body
+    ${$self}{body} .= ${$_}{row}."\n" for @formattedBody;
+
+    # if the \end{} statement didn't originally have a line break before it, we need to remove the final 
+    # line break added by the above
+    ${$self}{body} =~ s/\h*\R$//s if !${$self}{linebreaksAtEnd}{body};
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Arguments.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,380 @@
+package LatexIndent::Arguments;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/get_arguments_regexp find_opt_mand_arguments get_numbered_arg_regexp construct_arguments_regexp $optAndMandRegExp/;
+our $ArgumentCounter;
+our $optAndMandRegExp; 
+our $optAndMandRegExpWithLineBreaks; 
+
+sub construct_arguments_regexp{
+    my $self = shift;
+
+    $optAndMandRegExp = $self->get_arguments_regexp;
+
+    $optAndMandRegExpWithLineBreaks = $self->get_arguments_regexp(mode=>"lineBreaksAtEnd");
+}
+
+sub indent{
+    my $self = shift;
+    $self->logger("Arguments object doesn't receive any direct indentation, but its children will...",'heading') if $is_t_switch_active;
+    return;
+}
+
+sub find_opt_mand_arguments{
+    my $self = shift;
+
+    $self->logger("Searching ${$self}{name} for optional and mandatory arguments",'heading') if $is_t_switch_active;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    # the command object allows () 
+    my $objectDependentOptAndMandRegExp = (defined ${$self}{optAndMandArgsRegExp} ? ${$self}{optAndMandArgsRegExp} : $optAndMandRegExpWithLineBreaks);
+
+    if(${$self}{body} =~ m/^$objectDependentOptAndMandRegExp\h*($trailingCommentRegExp)?/){
+        $self->logger("Optional/Mandatory arguments found in ${$self}{name}: $1",'heading') if $is_t_switch_active;
+
+        # create a new Arguments object
+        # The arguments object is a little different to most
+        # other objects, as it is created purely for its children,
+        # so some of the properties common to other objects, such 
+        # as environment, ifelsefi, etc do not exist for Arguments;
+        # they will, however, exist for its children: OptionalArgument, MandatoryArgument
+        my $arguments = LatexIndent::Arguments->new(begin=>"",
+                                                name=>${$self}{name}.":arguments",
+                                                parent=>${$self}{name},
+                                                body=>$1,
+                                                linebreaksAtEnd=>{
+                                                  end=>$2?1:0,
+                                                },
+                                                end=>"",
+                                                regexp=>$objectDependentOptAndMandRegExp,
+                                                endImmediatelyFollowedByComment=>$2?0:($3?1:0),
+                                              );
+
+        # give unique id
+        $arguments->create_unique_id;
+
+        # determine which comes first, optional or mandatory
+        if(${$arguments}{body} =~ m/.*?((?<!\\)\{|\[)/s){
+
+            if($1 eq "\["){
+                $self->logger("Searching for optional arguments, and then mandatory (optional found first)") if $is_t_switch_active;
+                # look for optional arguments
+                $arguments->find_optional_arguments;
+
+                # look for mandatory arguments
+                $arguments->find_mandatory_arguments;
+            } else {
+                $self->logger("Searching for mandatory arguments, and then optional (mandatory found first)") if $is_t_switch_active;
+                # look for mandatory arguments
+                $arguments->find_mandatory_arguments;
+
+                # look for optional arguments
+                $arguments->find_optional_arguments;
+            }
+
+        } else {
+                $self->logger("Searching for round brackets ONLY") if $is_t_switch_active;
+                # look for round brackets
+                $arguments->find_round_brackets;
+        }
+
+        # examine *first* child
+        #   situation: parent BodyStartsOnOwnLine >= 1, but first child has BeginStartsOnOwnLine == 0 || BeginStartsOnOwnLine == undef
+        #   problem: the *body* of parent actually starts after the arguments
+        #   solution: remove the linebreak at the end of the begin statement of the parent
+        if(defined ${$self}{BodyStartsOnOwnLine} and ${$self}{BodyStartsOnOwnLine}>=1){
+            if( !(defined ${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine} and ${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine}>=1) 
+                    and ${$self}{body} !~ m/^$blankLineToken/){
+                my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine";
+                my $BeginStringLogFile = ${${${$arguments}{children}}[0]}{aliases}{BeginStartsOnOwnLine}||"BeginStartsOnOwnLine";
+                $self->logger("$BodyStringLogFile = 1 (in ${$self}{name}), but first argument should not begin on its own line (see $BeginStringLogFile)") if $is_t_switch_active;
+                $self->logger("Removing line breaks at the end of ${$self}{begin}") if $is_t_switch_active;
+                ${$self}{begin} =~ s/\R*$//s;
+                ${$self}{linebreaksAtEnd}{begin} = 0;
+            }
+        }
+
+        # situation: preserveBlankLines is active, so the body may well begin with a blank line token
+        #            which means that ${$self}{linebreaksAtEnd}{begin} *should be* 1
+        if(${${${$arguments}{children}}[0]}{body} =~ m/^($blankLineToken)/){
+            $self->logger("Updating {linebreaksAtEnd}{begin} for ${$self}{name} as $blankLineToken or blank line found at beginning of argument child") if $is_t_switch_active;
+            ${$self}{linebreaksAtEnd}{begin} = 1 
+          }
+
+        # examine *first* child
+        #   situation: parent BodyStartsOnOwnLine == -1, but first child has BeginStartsOnOwnLine == 1
+        #   problem: the *body* of parent actually starts after the arguments
+        #   solution: add a linebreak at the end of the begin statement of the parent so that
+        #              the child settings are obeyed.
+        #              BodyStartsOnOwnLine == 0 will actually be controlled by the last arguments' 
+        #              settings of EndFinishesWithLineBreak
+        if( ${$self}{linebreaksAtEnd}{begin} == 0
+           and ((defined ${$self}{BodyStartsOnOwnLine} and ${$self}{BodyStartsOnOwnLine}==-1) 
+                    or !(defined ${$self}{BodyStartsOnOwnLine})) 
+              ){
+            if(defined ${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine} and ${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine}>=1){
+                my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine";
+                my $BeginStringLogFile = ${${${$arguments}{children}}[0]}{aliases}{BeginStartsOnOwnLine}||"BeginStartsOnOwnLine";
+                my $BodyValue = (defined ${$self}{BodyStartsOnOwnLine}) ? ${$self}{BodyStartsOnOwnLine} : "0";
+                $self->logger("$BodyStringLogFile = $BodyValue (in ${$self}{name}), but first argument *should* begin on its own line (see $BeginStringLogFile)") if $is_t_switch_active;
+
+                # possibly add a comment at the end of the begin statement
+                my $trailingCommentToken = q();
+                if(${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine}==1){
+                    $self->logger("Adding line breaks at the end of ${$self}{begin} (first argument, see $BeginStringLogFile == ${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine})") if $is_t_switch_active;
+                } elsif(${${${$arguments}{children}}[0]}{BeginStartsOnOwnLine}==2){
+                    $self->logger("Adding a % at the end of begin, ${$self}{begin} followed by a linebreak ($BeginStringLogFile == 2)") if $is_t_switch_active;
+                    $trailingCommentToken = "%".$self->add_comment_symbol;
+                    $self->logger("Removing trailing space on ${$self}{begin}") if $is_t_switch_active;
+                    ${$self}{begin} =~ s/\h*$//s;
+                }
+
+                # modification
+                ${$self}{begin} .= "$trailingCommentToken\n";
+                ${$self}{linebreaksAtEnd}{begin} = 1;
+            }
+        }
+
+        # the replacement text can be just the ID, but the ID might have a line break at the end of it
+        ${$arguments}{replacementText} = ${$arguments}{id};
+
+        # children need to receive ancestor information, see test-cases/commands/commands-triple-nested.tex
+        foreach (@{${$arguments}{children}}){
+            $self->logger("Updating argument children of ${$self}{name} to include ${$self}{id} in ancestors") if $is_t_switch_active;
+            push(@{${$_}{ancestors}},{ancestorID=>${$self}{id},ancestorIndentation=>${$self}{indentation},type=>"natural"});
+        }
+
+        # the argument object only needs a trailing line break if the *last* child
+        # did not add one at the end, and if BodyStartsOnOwnLine >= 1
+        if( (defined ${${${$arguments}{children}}[-1]}{EndFinishesWithLineBreak} and ${${${$arguments}{children}}[-1]}{EndFinishesWithLineBreak}<1)
+            and (defined ${$self}{BodyStartsOnOwnLine} and ${$self}{BodyStartsOnOwnLine}>=1) ){
+            $self->logger("Updating replacementtext to include a linebreak for arguments in ${$self}{name}") if $is_t_switch_active;
+            ${$arguments}{replacementText} .= "\n" if(${$arguments}{linebreaksAtEnd}{end});
+        }
+
+        # store children in special hash
+        push(@{${$self}{children}},$arguments);
+
+        # remove the environment block, and replace with unique ID
+        ${$self}{body} =~ s/${$arguments}{regexp}/${$arguments}{replacementText}/;
+
+        # delete the regexp, as there's no need for it
+        delete ${${${$self}{children}}[-1]}{regexp};
+
+        $self->logger(Dumper(\%{$arguments}),'ttrace') if($is_tt_switch_active);
+        $self->logger("replaced with ID: ${$arguments}{id}") if $is_t_switch_active;
+    } else {
+        $self->logger("... no arguments found") if $is_t_switch_active;
+    }
+
+}
+
+
+sub create_unique_id{
+    my $self = shift;
+
+    $ArgumentCounter++;
+    ${$self}{id} = "$tokens{arguments}$ArgumentCounter$tokens{endOfToken}";
+    return;
+}
+
+sub get_numbered_arg_regexp{
+
+    # for example #1 #2, etc
+    my $numberedArgRegExp = qr/(?:#\d\h*;?,?\/?)+/;
+    return $numberedArgRegExp;
+}
+
+sub get_arguments_regexp{
+
+    my $self = shift;
+    my %input = @_;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    # some calls to this routine need to account for the linebreaks at the end, some do not
+    my $lineBreaksAtEnd = (defined ${input}{mode} and ${input}{mode} eq 'lineBreaksAtEnd')?'\R*':q();
+
+    # for example #1 #2, etc
+    my $numberedArgRegExp = $self->get_numbered_arg_regexp;
+
+    # beamer special
+    my $beamerRegExp = qr/\<.*?\>/;
+
+    # commands are allowed strings between arguments, e.g node, decoration, etc, specified in stringsAllowedBetweenArguments
+    my $stringsBetweenArguments = q();
+
+    if(defined ${input}{stringBetweenArguments} and ${input}{stringBetweenArguments}==1){
+        # grab the strings allowed between arguments
+        my %stringsAllowedBetweenArguments = %{${$masterSettings{commandCodeBlocks}}{stringsAllowedBetweenArguments}};
+
+        while( my ($allowedStringName,$allowedStringValue)= each %stringsAllowedBetweenArguments){
+            # change + and - to escaped characters
+            $allowedStringName =~ s/\+/\\+/g;
+            $allowedStringName =~ s/\-/\\-/g;
+
+            # form the regexp
+            $stringsBetweenArguments .= ($stringsBetweenArguments eq '' ? q() : "|").$allowedStringName if $allowedStringValue; 
+        }
+
+        # report to log file
+        $self->logger("Strings allowed between arguments $stringsBetweenArguments (see stringsAllowedBetweenArguments)",'heading') if $is_t_switch_active;
+     }
+
+    if(defined ${input}{roundBrackets} and ${input}{roundBrackets}==1){
+            # arguments regexp
+            return qr/
+                                  (                          # capture into $1
+                                     (?:                  
+                                        (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|_|\^|$stringsBetweenArguments)* 
+                                        (?:
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \[
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\[|(?<!\\)\{) 
+                                                         ).
+                                                     )*?     # not including [, but \[ ok
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \]          # [optional arguments]
+                                             )
+                                             |               # OR
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \{
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\{|(?<!\\)\[) 
+                                                         ).
+                                                     )*?     # not including {, but \{ ok
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \}          # {mandatory arguments}
+                                             )
+                                             |               # OR
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \(\$
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\$) 
+                                                         ).
+                                                     )*?     # not including $
+                                                 \$
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \)          # {mandatory arguments}
+                                             )
+                                             |               # OR
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \(
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\() 
+                                                         ).
+                                                     )*?     # not including {, but \{ ok
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \)          # {mandatory arguments}
+                                             )
+                                        )
+                                     )
+                                     +                       # at least one of the above
+                                     # NOT followed by
+                                     (?!
+                                       (?:
+                                           (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|$stringsBetweenArguments)*  # 0 or more h-space, blanklines, trailing comments
+                                           (?:
+                                             (?:(?<!\\)\[)
+                                             |
+                                             (?:(?<!\\)\{)
+                                             |
+                                             (?:(?<!\\)\()
+                                           )
+                                       )
+                                     )
+                                     \h*
+                                     ($lineBreaksAtEnd)
+                                  )                  
+                                  /sx;
+        } else {
+            return qr/
+                                  (                          # capture into $1
+                                     (?:                  
+                                        (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp|_|\^|$stringsBetweenArguments)* 
+                                        (?:
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \[
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\[|(?<!\\)\{) 
+                                                         ).
+                                                     )*?     # not including [, but \[ ok
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \]          # [optional arguments]
+                                             )
+                                             |               # OR
+                                             (?:
+                                                 \h*         # 0 or more spaces
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \{
+                                                     (?:
+                                                         (?!
+                                                             (?:(?<!\\)\{|(?<!\\)\[) 
+                                                         ).
+                                                     )*?     # not including {, but \{ ok
+                                                 (?<!\\)     # not immediately pre-ceeded by \
+                                                 \}          # {mandatory arguments}
+                                             )
+                                        )
+                                     )
+                                     +                       # at least one of the above
+                                     # NOT followed by
+                                     (?!
+                                       (?:
+                                           (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp|$beamerRegExp)*  # 0 or more h-space, blanklines, trailing comments
+                                           (?:
+                                             (?:(?<!\\)\[)
+                                             |
+                                             (?:(?<!\\)\{)
+                                           )
+                                       )
+                                     )
+                                     \h*
+                                     ($lineBreaksAtEnd)
+                                  )                  
+                                  /sx;
+        }
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BackUpFileProcedure.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BackUpFileProcedure.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BackUpFileProcedure.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,135 @@
+package LatexIndent::BackUpFileProcedure;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/%switches/;
+use File::Basename;             # to get the filename and directory path
+use File::Copy;                 # to copy the original file to backup (if overwrite option set)
+use Exporter qw/import/;
+our @EXPORT_OK = qw/create_back_up_file/;
+
+# copy main file to a back up in the case of the overwrite switch being active
+
+sub create_back_up_file{
+    my $self = shift;
+
+    return unless($switches{overwrite});
+
+    # if we want to over write the current file create a backup first
+    $self->logger("Backup procedure (-w flag active):",'heading');
+
+    my $fileName = ${$self}{fileName};
+
+    # grab the file extension preferences
+    my %fileExtensionPreference= %{$masterSettings{fileExtensionPreference}};
+
+    # sort the file extensions by preference 
+    my @fileExtensions = sort { $fileExtensionPreference{$a} <=> $fileExtensionPreference{$b} } keys(%fileExtensionPreference);
+
+    # backup file name is the base name
+    my $backupFile = basename(${$self}{fileName}, at fileExtensions);
+    
+    # add the user's backup directory to the backup path
+    $backupFile = "${$self}{cruftDirectory}/$backupFile";
+
+    # local variables, determined from the YAML settings
+    my $onlyOneBackUp = $masterSettings{onlyOneBackUp};
+    my $maxNumberOfBackUps = $masterSettings{maxNumberOfBackUps};
+    my $cycleThroughBackUps= $masterSettings{cycleThroughBackUps};
+    my $backupExtension= $masterSettings{backupExtension};
+    
+    # if both ($onlyOneBackUp and $maxNumberOfBackUps) then we have
+    # a conflict- er on the side of caution and turn off onlyOneBackUp
+    if($onlyOneBackUp and $maxNumberOfBackUps>1) {
+        $self->logger("WARNING: onlyOneBackUp=$onlyOneBackUp and maxNumberOfBackUps: $maxNumberOfBackUps");
+        $self->logger("setting onlyOneBackUp=0 which will allow you to reach $maxNumberOfBackUps back ups");
+        $onlyOneBackUp = 0;
+    }
+    
+    # if the user has specified that $maxNumberOfBackUps = 1 then
+    # they only want one backup
+    if($maxNumberOfBackUps==1) {
+        $onlyOneBackUp=1 ;
+        $self->logger("FYI: you set maxNumberOfBackUps=1, so I'm setting onlyOneBackUp: 1 ");
+    } elsif($maxNumberOfBackUps<=0 and !$onlyOneBackUp) {
+        $onlyOneBackUp=0 ;
+        $maxNumberOfBackUps=-1;
+    }
+    
+    # if onlyOneBackUp is set, then the backup file will
+    # be overwritten each time
+    if($onlyOneBackUp) {
+        $backupFile .= $backupExtension;
+        $self->logger("copying $fileName to $backupFile");
+        $self->logger("$backupFile was overwritten (see onlyOneBackUp)") if (-e $backupFile);
+    } else {
+        # start with a backup file .bak0 (or whatever $backupExtension is present)
+        my $backupCounter = 0;
+        $backupFile .= $backupExtension.$backupCounter;
+    
+        # if it exists, then keep going: .bak0, .bak1, ...
+        while (-e $backupFile or $maxNumberOfBackUps>1) {
+            if($backupCounter==$maxNumberOfBackUps) {
+                $self->logger("maxNumberOfBackUps reached ($maxNumberOfBackUps, see maxNumberOfBackUps)");
+    
+                # some users may wish to cycle through back up files, e.g:
+                #    copy myfile.bak1 to myfile.bak0
+                #    copy myfile.bak2 to myfile.bak1
+                #    copy myfile.bak3 to myfile.bak2
+                #
+                #    current back up is stored in myfile.bak4
+                if($cycleThroughBackUps) {
+                    $self->logger("cycleThroughBackUps detected (see cycleThroughBackUps) ");
+                    for(my $i=1;$i<=$maxNumberOfBackUps;$i++) {
+                        # remove number from backUpFile
+                        my $oldBackupFile = $backupFile;
+                        $oldBackupFile =~ s/$backupExtension.*/$backupExtension/;
+                        my $newBackupFile = $oldBackupFile;
+    
+                        # add numbers back on
+                        $oldBackupFile .= $i;
+                        $newBackupFile .= $i-1;
+    
+                        # check that the oldBackupFile exists
+                        if(-e $oldBackupFile){
+                        $self->logger(" copying $oldBackupFile to $newBackupFile ");
+                            copy($oldBackupFile,$newBackupFile) or die "Could not write to backup file $backupFile. Please check permissions. Exiting.";
+                        }
+                    }
+                }
+    
+                # rest maxNumberOfBackUps
+                $maxNumberOfBackUps=1 ;
+                last; # break out of the loop
+            } elsif(!(-e $backupFile)) {
+                $maxNumberOfBackUps=1;
+                last; # break out of the loop
+            }
+            $self->logger(" $backupFile already exists, incrementing by 1... (see maxNumberOfBackUps and onlyOneBackUp)");
+            $backupCounter++;
+            $backupFile =~ s/$backupExtension.*/$backupExtension$backupCounter/;
+        }
+        $self->logger("copying $fileName to $backupFile");
+    }
+    
+    # output these lines to the log file
+    $self->logger("Backup file: ",$backupFile,"");
+    $self->logger("Overwriting file: ",$fileName,"");
+    copy($fileName,$backupFile) or die "Could not write to backup file $backupFile. Please check permissions. Exiting.";
+}
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BlankLines.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BlankLines.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/BlankLines.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,108 @@
+package LatexIndent::BlankLines;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/protect_blank_lines unprotect_blank_lines condense_blank_lines/;
+
+sub protect_blank_lines{
+    return unless $is_m_switch_active;
+    my $self = shift;
+
+    unless(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}){
+        $self->logger("Blank lines will not be protected (preserveBlankLines=0)",'heading') if $is_t_switch_active;
+        return
+    }
+
+    $self->logger("Protecting blank lines (see preserveBlankLines)",'heading') if $is_t_switch_active;
+    ${$self}{body} =~ s/^(\h*)?\R/$tokens{blanklines}\n/mg;
+    return;
+}
+
+sub condense_blank_lines{
+    return unless $is_m_switch_active;
+
+    return unless ${$masterSettings{modifyLineBreaks}}{condenseMultipleBlankLinesInto}>0;
+
+    my $self = shift;
+
+    # if preserveBlankLines is set to 0, then the blank-line-token will not be present
+    # in the document -- we change that here
+    if(${$masterSettings{modifyLineBreaks}}{preserveBlankLines}==0){
+        # turn the switch on
+        ${$masterSettings{modifyLineBreaks}}{preserveBlankLines}=1;
+
+        # log file information
+        $self->logger("Updating body to inclued blank line token, this requires preserveBlankLines = 1",'ttrace') if($is_tt_switch_active);
+        $self->logger("(any blanklines that could have been removed, would have done so by this point)",'ttrace') if($is_tt_switch_active);
+
+        # make the call
+        $self->protect_blank_lines ;
+        $self->logger("body now looks like:\n${$self}{body}",'ttrace') if($is_tt_switch_active);
+     }
+
+    # grab the value from the settings
+    my $condenseMultipleBlankLinesInto = ${$masterSettings{modifyLineBreaks}}{condenseMultipleBlankLinesInto};
+
+    # grab the blank-line-token
+    my $blankLineToken = $tokens{blanklines};
+
+    # condense!
+    $self->logger("Condensing multiple blank lines into $condenseMultipleBlankLinesInto (see condenseMultipleBlankLinesInto)",'heading') if $is_t_switch_active;
+    my $replacementToken = $blankLineToken;
+    for (my $i=1; $i<$condenseMultipleBlankLinesInto; $i++ ){
+        $replacementToken .= "\n$blankLineToken";
+    }
+
+    $self->logger("blank line replacement token: $replacementToken",'ttrace') if($is_tt_switch_active);
+    ${$self}{body} =~ s/($blankLineToken\h*\R*\h*){1,}$blankLineToken/$replacementToken/mgs;
+    $self->logger("body now looks like:\n${$self}{body}",'ttrace') if($is_tt_switch_active);
+    return;
+}
+
+sub unprotect_blank_lines{
+    return unless $is_m_switch_active;
+
+    return unless ${$masterSettings{modifyLineBreaks}}{preserveBlankLines};
+    my $self = shift;
+
+    $self->logger("Unprotecting blank lines (see preserveBlankLines)",'heading') if $is_t_switch_active;
+    my $blankLineToken = $tokens{blanklines};
+
+    # loop through the body, looking for the blank line token
+    while(${$self}{body} =~ m/$blankLineToken/m){
+        # when the blank line token occupies the whole line
+        if(${$self}{body} =~ m/^\h*$blankLineToken$/m){
+            $self->logger("Replacing purely blank lines",'heading') if $is_tt_switch_active;
+            ${$self}{body} =~ s/^\h*$blankLineToken$//mg;
+            $self->logger("body now looks like:\n${$self}{body}",'ttrace') if($is_tt_switch_active);
+        }
+        # otherwise the blank line has been deleted, so we compensate with an extra
+        if(${$self}{body} =~ m/(^\h*)?$blankLineToken/m){
+            $self->logger("Replacing blank line token that doesn't take up whole line",'heading') if $is_tt_switch_active;
+            ${$self}{body} =~ s/(^\h*)?$blankLineToken/$1?"\n".$1:"\n"/me;
+            $self->logger("body now looks like:\n${$self}{body}",'ttrace') if($is_tt_switch_active);
+        }
+    }
+    $self->logger("Finished unprotecting lines (see preserveBlankLines)",'heading') if $is_t_switch_active;
+    $self->logger("body now looks like ${$self}{body}",'ttrace') if($is_tt_switch_active);
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Braces.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Braces.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Braces.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,188 @@
+package LatexIndent::Braces;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Command qw/$commandRegExp $commandRegExpTrailingComment $optAndMandAndRoundBracketsRegExpLineBreaks/;
+use LatexIndent::KeyEqualsValuesBraces qw/$key_equals_values_bracesRegExp $key_equals_values_bracesRegExpTrailingComment/;
+use LatexIndent::NamedGroupingBracesBrackets qw/$grouping_braces_regexp $grouping_braces_regexpTrailingComment/;
+use LatexIndent::UnNamedGroupingBracesBrackets qw/$un_named_grouping_braces_RegExp $un_named_grouping_braces_RegExp_trailing_comment/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_commands_or_key_equals_values_braces/;
+our $commandCounter;
+
+sub find_commands_or_key_equals_values_braces{
+
+    my $self = shift;
+
+    $self->logger("Searching for commands with optional and/or mandatory arguments AND key = {value}",'heading') if $is_t_switch_active ;
+
+    # match either a \\command or key={value}
+    while( ${$self}{body} =~ m/$commandRegExpTrailingComment/
+                            or  
+           ${$self}{body} =~ m/$key_equals_values_bracesRegExpTrailingComment/
+                            or
+           ${$self}{body} =~ m/$grouping_braces_regexpTrailingComment/
+                            or
+           ${$self}{body} =~ m/$un_named_grouping_braces_RegExp_trailing_comment/
+         ){
+      if(${$self}{body} =~ m/$commandRegExpTrailingComment/){ 
+
+        # global substitution
+        ${$self}{body} =~ s/
+                            $commandRegExpTrailingComment
+                          /
+                            # log file output
+                            $self->logger("command found: $2",'heading') if $is_t_switch_active ;
+
+                            # create a new command object
+                            my $command = LatexIndent::Command->new(begin=>$1.$2.($3?$3:q()).($4?$4:q()),
+                                                                    name=>$2,
+                                                                    body=>$5.($8?$8:($10?$10:q())),    # $8 is linebreak, $10 is trailing comment
+                                                                    end=>q(),
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$4?1:0,
+                                                                      end=>$8?1:0,            # $8 is linebreak before comment check, $10 is after
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"commands",
+                                                                    endImmediatelyFollowedByComment=>$8?0:($10?1:0),
+                                                                    aliases=>{
+                                                                      # begin statements
+                                                                      BeginStartsOnOwnLine=>"CommandStartsOnOwnLine",
+                                                                      # body statements
+                                                                      BodyStartsOnOwnLine=>"CommandNameFinishesWithLineBreak",
+                                                                    },
+                                                                    optAndMandArgsRegExp=>$optAndMandAndRoundBracketsRegExpLineBreaks,
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($command);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($8?($10?$10:q()):q());
+                         /xseg;
+
+      } elsif (${$self}{body} =~ m/$key_equals_values_bracesRegExpTrailingComment/){
+
+        # global substitution
+        ${$self}{body} =~ s/
+                              $key_equals_values_bracesRegExpTrailingComment
+                           /
+                           # log file output
+                           $self->logger("key_equals_values_braces found: $3",'heading') if $is_t_switch_active ;
+
+                           # create a new key_equals_values_braces object
+                           my $key_equals_values_braces = LatexIndent::KeyEqualsValuesBraces->new(
+                                                                   begin=>($2?$2:q()).$3.$4.($5?$5:q()),
+                                                                   name=>$3,
+                                                                   body=>$6.($9?$9:($10?$10:q()).($11?$11:q())),     # $9 is linebreak before comment check, $11 is trailing comment
+                                                                   end=>q(),
+                                                                   linebreaksAtEnd=>{
+                                                                     begin=>$5?1:0,
+                                                                     end=>$9?1:0,                # $9 is linebreak before comment check
+                                                                   },
+                                                                   modifyLineBreaksYamlName=>"keyEqualsValuesBracesBrackets",
+                                                                   beginningbit=>$1,
+                                                                   endImmediatelyFollowedByComment=>$9?0:($11?1:0),
+                                                                   aliases=>{
+                                                                     # begin statements
+                                                                     BeginStartsOnOwnLine=>"KeyStartsOnOwnLine",
+                                                                     # body statements
+                                                                     BodyStartsOnOwnLine=>"EqualsFinishesWithLineBreak",
+                                                                   },
+                                                                   additionalAssignments=>["EqualsStartsOnOwnLine"],
+                                                                 );
+                    
+                           # the settings and storage of most objects has a lot in common
+                           $self->get_settings_and_store_new_object($key_equals_values_braces);
+                           ${@{${$self}{children}}[-1]}{replacementText}.($9?($11?$11:q()):q());
+                           /xseg;
+                    
+      } elsif (${$self}{body} =~ m/$grouping_braces_regexpTrailingComment/){
+
+        # global substitution
+        ${$self}{body} =~ s/
+                            $grouping_braces_regexpTrailingComment
+                            /
+                            # log file output
+                            $self->logger("named grouping braces found: $2",'heading') if $is_t_switch_active ;
+
+                            # create a new key_equals_values_braces object
+                            my $grouping_braces = LatexIndent::NamedGroupingBracesBrackets->new(
+                                                                    begin=>$2.($3?$3:q()).($4?$4:q()),
+                                                                    name=>$2,
+                                                                    body=>$5.($8?$8:($9?$9:q())),    
+                                                                    end=>q(),
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$4?1:0,
+                                                                      end=>$8?1:0,
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"namedGroupingBracesBrackets",
+                                                                    beginningbit=>$1,
+                                                                    endImmediatelyFollowedByComment=>$8?0:($9?1:0),
+                                                                    aliases=>{
+                                                                      # begin statements
+                                                                      BeginStartsOnOwnLine=>"NameStartsOnOwnLine",
+                                                                      # body statements
+                                                                      BodyStartsOnOwnLine=>"NameFinishesWithLineBreak",
+                                                                    },
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($grouping_braces);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($8?($9?$9:q()):q());
+                           /xseg;
+
+    } elsif (${$self}{body} =~ m/$un_named_grouping_braces_RegExp_trailing_comment/) {
+        # global substitution
+        ${$self}{body} =~ s/
+                            $un_named_grouping_braces_RegExp_trailing_comment
+                          /
+                            # log file output
+                            $self->logger("UNnamed grouping braces found: (no name, by definition!)",'heading') if $is_t_switch_active ;
+
+                            # create a new Un-named-grouping-braces-brackets object
+                            my $un_named_grouping_braces = LatexIndent::UnNamedGroupingBracesBrackets->new(
+                                                                    begin=>q(),
+                                                                    name=>"always-un-named",
+                                                                    body=>$3.($6?$6:($8?$8:q())),    
+                                                                    end=>q(),
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$2?1:0,
+                                                                      end=>$6?1:0,
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"UnNamedGroupingBracesBrackets",
+                                                                    beginningbit=>$1.($2?$2:q()),
+                                                                    endImmediatelyFollowedByComment=>$6?0:($8?1:0),
+                                                                    # begin statements
+                                                                    BeginStartsOnOwnLine=>0,
+                                                                    # body statements
+                                                                    BodyStartsOnOwnLine=>0,
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($un_named_grouping_braces);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($6?($8?$8:q()):q());
+                         /xseg;
+
+    }
+  }
+    return;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,178 @@
+package LatexIndent::Command;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/construct_command_regexp $commandRegExp $commandRegExpTrailingComment $optAndMandAndRoundBracketsRegExpLineBreaks/;
+our $commandCounter;
+our $commandRegExp;
+our $commandRegExpTrailingComment; 
+our $optAndMandAndRoundBracketsRegExp; 
+our $optAndMandAndRoundBracketsRegExpLineBreaks; 
+
+# store the regular expresssion for matching and replacing 
+sub construct_command_regexp{
+    my $self = shift;
+
+    $optAndMandAndRoundBracketsRegExp = $self->get_arguments_regexp(
+                                                                    roundBrackets=>${$masterSettings{commandCodeBlocks}}{roundParenthesesAllowed},
+                                                                    stringBetweenArguments=>1);
+
+    $optAndMandAndRoundBracketsRegExpLineBreaks = $self->get_arguments_regexp(
+                                                                    roundBrackets=>${$masterSettings{commandCodeBlocks}}{roundParenthesesAllowed},
+                                                                    mode=>"lineBreaksAtEnd",
+                                                                    stringBetweenArguments=>1);
+
+    # construct the command regexp
+    $commandRegExp = qr/
+              (\\|@)   
+              (
+               [+a-zA-Z@\*0-9_\:]+? # lowercase|uppercase letters, @, *, numbers
+              )                
+              (\h*)
+              (\R*)?
+              ($optAndMandAndRoundBracketsRegExp)
+              (\R)?
+            /sx;
+
+    # command regexp with trailing comment
+    $commandRegExpTrailingComment = qr/$commandRegExp(\h*)((?:$trailingCommentRegExp\h*)*)/;
+
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # check for adding/removing linebreaks before =
+    $self->check_linebreaks_before_equals;
+
+    # search for arguments
+    $self->find_opt_mand_arguments;
+
+    # situation: ${${$self}{linebreaksAtEnd}}{end} == 1, and the argument container object
+    # still contains a linebreak at the end; in this case, we need to remove the linebreak from 
+    # the container object
+    if(${${$self}{linebreaksAtEnd}}{end} == 1 
+      and ${${${$self}{children}}[0]}{body} =~ m/\R$/s
+      and !${$self}{endImmediatelyFollowedByComment}){
+        $self->logger("Removing linebreak from argument container of ${$self}{name}") if $is_t_switch_active;
+        ${${${$self}{children}}[0]}{body} =~ s/\R$//s;
+        ${${${${$self}{children}}[0]}{linebreaksAtEnd}}{body} = 0;
+    }
+
+    # situation: ${${$self}{linebreaksAtEnd}}{end} == 1 and the last argument specifies
+    # EndFinishesWithLineBreaks = 0 (see test-cases/commands/just-one-command-mod10.tex)
+    if(${${$self}{linebreaksAtEnd}}{end} == 1 
+        and defined ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} 
+        and ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} == -1
+        ){
+          $self->logger("Switching linebreaksAtEnd{end} to be 0 in command ${$self}{name} as last argument specifies EndFinishesWithLineBreak == 0") if $is_t_switch_active;
+          ${${$self}{linebreaksAtEnd}}{end} = 0;
+          ${$self}{EndFinishesWithLineBreak} = -1;
+        }
+    
+    # if the last argument finishes with a linebreak, it won't get interpreted at 
+    # the right time (see test-cases/commands/commands-one-line-nested-simple-mod1.tex for example)
+    # so this little bit fixes it
+    if(${${${${${$self}{children}}[0]}{children}[-1]}{linebreaksAtEnd}}{end} and ${${$self}{linebreaksAtEnd}}{end} == 0 
+        and defined ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} 
+        and ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} >= 1 
+        and !${$self}{endImmediatelyFollowedByComment}){
+
+        # update the Command object
+        $self->logger("Adjusting linebreaksAtEnd in command ${$self}{name}") if $is_t_switch_active;
+        ${${$self}{linebreaksAtEnd}}{end} = ${${${${${$self}{children}}[0]}{children}[-1]}{linebreaksAtEnd}}{end};
+        ${$self}{replacementText} .= "\n";
+
+        # update the argument object
+        $self->logger("Adjusting argument object in command, ${$self}{name}") if $is_t_switch_active;
+        ${${${${$self}{children}}[0]}{linebreaksAtEnd}}{body} = 0;
+        ${${${$self}{children}}[0]}{body} =~ s/\R$//s;
+
+        # update the last mandatory/optional argument
+        $self->logger("Adjusting last argument in command, ${$self}{name}") if $is_t_switch_active;
+        ${${${${${$self}{children}}[0]}{children}[-1]}{linebreaksAtEnd}}{end} = 0;
+        ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} = -1;
+        ${${${${$self}{children}}[0]}{children}[-1]}{replacementText} =~ s/\R$//s;
+
+        # output to log file
+        $self->logger(Dumper(${${${$self}{children}}[0]}{children}[-1])) if $is_t_switch_active;
+    }
+
+    # situation: ${${$self}{linebreaksAtEnd}}{end} == 1 and the last argument has added 
+    # a line break, which can result in a bogus blank line (see test-cases/commands/just-one-command.tex with mand-args-mod1.yaml)
+    if(${${$self}{linebreaksAtEnd}}{end} == 1 
+        and defined ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} 
+        and ${${${${$self}{children}}[0]}{children}[-1]}{EndFinishesWithLineBreak} >= 1 
+        and ${${${${$self}{children}}[0]}{children}[-1]}{replacementText}=~m/\R$/s
+        and !${$self}{endImmediatelyFollowedByComment}){
+    
+        # last argument adjustment
+        $self->logger("Adjusting last argument in command, ${$self}{name} to avoid double line break") if $is_t_switch_active;
+        ${${${${$self}{children}}[0]}{children}[-1]}{replacementText}=~s/\R$//s;
+        ${${${${${$self}{children}}[0]}{children}[-1]}{linebreaksAtEnd}}{end} = 0;
+
+        # argument object adjustment
+        $self->logger("Adjusting argument object in command, ${$self}{name} to avoid double line break") if $is_t_switch_active;
+        ${${${${$self}{children}}[0]}{linebreaksAtEnd}}{body} = 0;
+        ${${${$self}{children}}[0]}{body}=~s/\R$//s;
+    } 
+
+    # the arguments body might finish with horizontal space, in which case, we need to transfer this 
+    # to the parent object replacement text.
+    #
+    # see ../test-cases/texexchange/5461.tex which was the first example to demonstrate the need for this
+    if(!${${${$self}{children}}[0]}{endImmediatelyFollowedByComment} and ${${${$self}{children}}[0]}{body} =~ m/\h*$/ and ${$self}{replacementText} !~ m/\R$/){
+        $self->logger("${$self}{name}: trailling horizontal space found in arguments -- removing it from arguments, adding to replacement text") if $is_t_switch_active;
+        ${${${$self}{children}}[0]}{body} =~ s/(\h*)$//s; 
+        ${$self}{replacementText} .= "$1";
+    }
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for special begin/end
+    $self->find_special;
+
+}
+
+sub check_linebreaks_before_equals{
+    # empty routine, which allows the above routine to function (this routine kicks in for KeyEqualsValuesBraces)
+    return;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $commandCounter++;
+    ${$self}{id} = "$tokens{command}$commandCounter";
+    return;
+}
+
+sub align_at_ampersand{
+    # need an empty routine here for commands; see
+    # test-cases/matrix1.tex for example
+    return;
+}
+
+1;


Property changes on: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Command.pm
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Document.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,335 @@
+package LatexIndent::Document;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use Data::Dumper;
+
+# gain access to subroutines in the following modules
+use LatexIndent::Switches qw/storeSwitches %switches $is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::LogFile qw/logger output_logfile processSwitches/;
+use LatexIndent::GetYamlSettings qw/readSettings modify_line_breaks_settings get_indentation_settings_for_this_object get_every_or_custom_value get_indentation_information get_object_attribute_for_indentation_settings alignment_at_ampersand_settings/;
+use LatexIndent::FileExtension qw/file_extension_check/;
+use LatexIndent::BackUpFileProcedure qw/create_back_up_file/;
+use LatexIndent::BlankLines qw/protect_blank_lines unprotect_blank_lines condense_blank_lines/;
+use LatexIndent::ModifyLineBreaks qw/modify_line_breaks_body modify_line_breaks_end remove_line_breaks_begin adjust_line_breaks_end_parent/;
+use LatexIndent::TrailingComments qw/remove_trailing_comments put_trailing_comments_back_in add_comment_symbol construct_trailing_comment_regexp/;
+use LatexIndent::HorizontalWhiteSpace qw/remove_trailing_whitespace remove_leading_space/;
+use LatexIndent::Indent qw/indent wrap_up_statement determine_total_indentation indent_begin indent_body indent_end_statement final_indentation_check  get_surrounding_indentation indent_children_recursively check_for_blank_lines_at_beginning put_blank_lines_back_in_at_beginning add_surrounding_indentation_to_begin_statement/;
+use LatexIndent::Tokens qw/token_check %tokens/;
+use LatexIndent::HiddenChildren qw/find_surrounding_indentation_for_children update_family_tree get_family_tree check_for_hidden_children/;
+use LatexIndent::AlignmentAtAmpersand qw/align_at_ampersand find_aligned_block/;
+use LatexIndent::DoubleBackSlash qw/dodge_double_backslash un_dodge_double_backslash/;
+
+# code blocks
+use LatexIndent::Verbatim qw/put_verbatim_back_in find_verbatim_environments find_noindent_block find_verbatim_commands  put_verbatim_commands_back_in/;
+use LatexIndent::Environment qw/find_environments/;
+use LatexIndent::IfElseFi qw/find_ifelsefi/;
+use LatexIndent::Arguments qw/get_arguments_regexp find_opt_mand_arguments get_numbered_arg_regexp construct_arguments_regexp/;
+use LatexIndent::OptionalArgument qw/find_optional_arguments/;
+use LatexIndent::MandatoryArgument qw/find_mandatory_arguments get_mand_arg_reg_exp/;
+use LatexIndent::RoundBrackets qw/find_round_brackets/;
+use LatexIndent::Item qw/find_items construct_list_of_items/;
+use LatexIndent::Braces qw/find_commands_or_key_equals_values_braces/;
+use LatexIndent::Command qw/construct_command_regexp/;
+use LatexIndent::KeyEqualsValuesBraces qw/construct_key_equals_values_regexp/;
+use LatexIndent::NamedGroupingBracesBrackets qw/construct_grouping_braces_brackets_regexp/;
+use LatexIndent::UnNamedGroupingBracesBrackets qw/construct_unnamed_grouping_braces_brackets_regexp/;
+use LatexIndent::Special qw/find_special construct_special_begin/;
+use LatexIndent::Heading qw/find_heading construct_headings_levels/;
+use LatexIndent::FileContents qw/find_file_contents_environments_and_preamble/;
+use LatexIndent::Preamble;
+
+sub new{
+    # Create new objects, with optional key/value pairs
+    # passed as initializers.
+    #
+    # See Programming Perl, pg 319
+    my $invocant = shift;
+    my $class = ref($invocant) || $invocant;
+    my $self = {@_};
+    bless ($self,$class);
+    return $self;
+}
+
+sub latexindent{
+    my $self = shift;
+    $self->storeSwitches;
+    $self->processSwitches;
+    $self->readSettings;
+    $self->file_extension_check;
+    $self->operate_on_file;
+}
+
+sub operate_on_file{
+    my $self = shift;
+
+    $self->create_back_up_file;
+    $self->token_check;
+    $self->construct_regular_expressions;
+    $self->find_noindent_block;
+    $self->find_verbatim_commands;
+    $self->find_aligned_block;
+    $self->remove_trailing_comments;
+    $self->find_verbatim_environments;
+    $self->protect_blank_lines;
+    $self->remove_trailing_whitespace(when=>"before");
+    $self->find_file_contents_environments_and_preamble;
+    $self->dodge_double_backslash;
+    $self->remove_leading_space;
+    $self->process_body_of_text;
+    $self->remove_trailing_whitespace(when=>"after");
+    $self->condense_blank_lines;
+    $self->unprotect_blank_lines;
+    $self->un_dodge_double_backslash;
+    $self->put_verbatim_back_in;
+    $self->put_trailing_comments_back_in;
+    $self->put_verbatim_commands_back_in;
+    $self->output_indented_text;
+    $self->output_logfile;
+    return
+}
+
+sub construct_regular_expressions{
+    my $self = shift;
+    $self->construct_trailing_comment_regexp;
+    $self->construct_list_of_items;
+    $self->construct_special_begin;
+    $self->construct_headings_levels;
+    $self->construct_arguments_regexp;
+    $self->construct_command_regexp;
+    $self->construct_key_equals_values_regexp;
+    $self->construct_grouping_braces_brackets_regexp;
+    $self->construct_unnamed_grouping_braces_brackets_regexp;
+
+}
+
+sub output_indented_text{
+    my $self = shift;
+
+    # output to screen, unless silent mode
+    print ${$self}{body} unless $switches{silentMode};
+
+    $self->logger("Output routine",'heading');
+
+    # if -overwrite is active then output to original fileName
+    if($switches{overwrite}) {
+        $self->logger("Overwriting file ${$self}{fileName}");
+        open(OUTPUTFILE,">",${$self}{fileName});
+        print OUTPUTFILE ${$self}{body};
+        close(OUTPUTFILE);
+    } elsif($switches{outputToFile}) {
+        $self->logger("Outputting to file $switches{outputToFile}");
+        open(OUTPUTFILE,">",$switches{outputToFile});
+        print OUTPUTFILE ${$self}{body};
+        close(OUTPUTFILE);
+    } else {
+        $self->logger("Not outputting to file; see -w and -o switches for more options.");
+    }
+    return;
+}
+
+sub process_body_of_text{
+    my $self = shift;
+
+    # find objects recursively
+    $self->logger('Phase 1: searching for objects','heading');
+    $self->find_objects;
+
+    # find all hidden child
+    $self->logger('Phase 2: finding surrounding indentation','heading');
+    $self->find_surrounding_indentation_for_children;
+
+    # indentation recursively
+    $self->logger('Phase 3: indenting objects','heading');
+    $self->indent_children_recursively;
+
+    # final indentation check
+    $self->logger('Phase 4: final indentation check','heading');
+    $self->final_indentation_check;
+
+    return;
+}
+
+sub find_objects{
+    my $self = shift;
+
+    # search for environments
+    $self->logger('looking for ENVIRONMENTS');
+    $self->find_environments;
+
+    # search for ifElseFi blocks
+    $self->logger('looking for IFELSEFI');
+    $self->find_ifelsefi;
+
+    # search for headings (part, chapter, section, setc)
+    $self->logger('looking for HEADINGS (chapter, section, part, etc)');
+    $self->find_heading;
+    
+    # search for commands with arguments
+    $self->logger('looking for COMMANDS and key = {value}');
+    $self->find_commands_or_key_equals_values_braces;
+
+    # search for special begin/end
+    $self->logger('looking for SPECIAL begin/end');
+    $self->find_special;
+
+    # if there are no children, return
+    if(${$self}{children}){
+        $self->logger("Objects have been found.",'heading');
+    } else {
+        $self->logger("No objects found.");
+        return;
+    }
+
+    # logfile information
+    $self->logger(Dumper(\%{$self}),'ttrace') if($is_tt_switch_active);
+    $self->logger("Operating on: ${$self}{name}",'heading');
+    $self->logger("Number of children:",'heading');
+    $self->logger(scalar (@{${$self}{children}}));
+
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+    $self->logger("There are no tasks particular to ${$self}{name}") if $is_t_switch_active;
+}
+
+sub get_settings_and_store_new_object{
+    my $self = shift;
+
+    # grab the object to be operated upon
+    my ($latexIndentObject) = @_;
+
+    # there are a number of tasks common to each object
+    $latexIndentObject->tasks_common_to_each_object(%{$self});
+      
+    # tasks particular to each object
+    $latexIndentObject->tasks_particular_to_each_object;
+
+    # store children in special hash
+    push(@{${$self}{children}},$latexIndentObject);
+
+}
+
+sub tasks_common_to_each_object{
+    my $self = shift;
+
+    # grab the parent information
+    my %parent = @_;
+
+    # update/create the ancestor information
+    if($parent{ancestors}){
+      $self->logger("Ancestors *have* been found for ${$self}{name}") if($is_t_switch_active);
+      push(@{${$self}{ancestors}},@{$parent{ancestors}});
+    } else {
+      $self->logger("No ancestors found for ${$self}{name}") if($is_t_switch_active);
+      if(defined $parent{id} and $parent{id} ne ''){
+        $self->logger("Creating ancestors with $parent{id} as the first one") if($is_t_switch_active);
+        push(@{${$self}{ancestors}},{ancestorID=>$parent{id},ancestorIndentation=>\$parent{indentation},type=>"natural",name=>${$self}{name}});
+      }
+    }
+
+    # natural ancestors
+    ${$self}{naturalAncestors} = q();
+    if(${$self}{ancestors}){
+      ${$self}{naturalAncestors} .= "---".${$_}{ancestorID}."\n" for @{${$self}{ancestors}};
+    }
+
+    # in what follows, $self can be an environment, ifElseFi, etc
+
+    # count linebreaks in body
+    my $bodyLineBreaks = 0;
+    $bodyLineBreaks++ while(${$self}{body} =~ m/\R/sxg);
+    ${$self}{bodyLineBreaks} = $bodyLineBreaks;
+
+    # get settings for this object
+    $self->get_indentation_settings_for_this_object;
+
+    # give unique id
+    $self->create_unique_id;
+
+    # add trailing text to the id to stop, e.g LATEX-INDENT-ENVIRONMENT1 matching LATEX-INDENT-ENVIRONMENT10
+    ${$self}{id} .= $tokens{endOfToken};
+
+    # the replacement text can be just the ID, but the ID might have a line break at the end of it
+    $self->get_replacement_text;
+
+    # the above regexp, when used below, will remove the trailing linebreak in ${$self}{linebreaksAtEnd}{end}
+    # so we compensate for it here
+    $self->adjust_replacement_text_line_breaks_at_end;
+
+    # modify line breaks on body and end statements
+    $self->modify_line_breaks_body;
+
+    # modify line breaks end statements
+    $self->modify_line_breaks_end;
+
+    # check the body for current children
+    $self->check_for_hidden_children;
+
+    return;
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text can be just the ID, but the ID might have a line break at the end of it
+    ${$self}{replacementText} = ${$self}{id};
+    return;
+}
+
+sub adjust_replacement_text_line_breaks_at_end{
+    my $self = shift;
+
+    # the above regexp, when used below, will remove the trailing linebreak in ${$self}{linebreaksAtEnd}{end}
+    # so we compensate for it here
+    $self->logger("Putting linebreak after replacementText for ${$self}{name}") if($is_t_switch_active);
+    if(defined ${$self}{horizontalTrailingSpace}){
+        ${$self}{replacementText} .= ${$self}{horizontalTrailingSpace} unless(!${$self}{endImmediatelyFollowedByComment} and defined ${$self}{EndFinishesWithLineBreak} and ${$self}{EndFinishesWithLineBreak}==2);
+    }
+    ${$self}{replacementText} .= "\n" if(${$self}{linebreaksAtEnd}{end});
+
+}
+
+sub count_body_line_breaks{
+    my $self = shift;
+
+    my $oldBodyLineBreaks = (defined ${$self}{bodyLineBreaks})? ${$self}{bodyLineBreaks} : 0;
+
+    # count linebreaks in body
+    my $bodyLineBreaks = 0;
+    $bodyLineBreaks++ while(${$self}{body} =~ m/\R/sxg);
+    ${$self}{bodyLineBreaks} = $bodyLineBreaks;
+    $self->logger("bodyLineBreaks ${$self}{bodyLineBreaks}")  if((${$self}{bodyLineBreaks} != $oldBodyLineBreaks) and  $is_t_switch_active);
+}
+
+sub wrap_up_tasks{
+    my $self = shift;
+
+    # most recent child object
+    my $child = @{${$self}{children}}[-1];
+
+    # check if the last object was the last thing in the body, and if it has adjusted linebreaks
+    $self->adjust_line_breaks_end_parent;
+
+    $self->logger(Dumper(\%{$child})) if($is_tt_switch_active);
+    $self->logger("replaced with ID: ${$child}{id}") if $is_t_switch_active;
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/DoubleBackSlash.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/DoubleBackSlash.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/DoubleBackSlash.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,45 @@
+package LatexIndent::DoubleBackSlash;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::Tokens qw/%tokens/;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/dodge_double_backslash un_dodge_double_backslash/;
+
+# some code can contain, e.g
+#       cycle list={blue,mark=none\\},
+# see test-cases/texexchange/29293-christian-feuersanger.tex
+#
+# This is problematic, as the argument regexp won't count the right } because it has a 
+# backslash immediately infront of it!
+sub dodge_double_backslash{
+    my $self = shift;
+
+    ${$self}{body} =~ s/(?:\\\\(\{|\}|\]))/$tokens{doubleBackSlash}$1/sg;
+    return;
+}
+
+# this routine replaces the token with the \\\\
+sub un_dodge_double_backslash{
+    my $self = shift;
+
+    ${$self}{body} =~ s/$tokens{doubleBackSlash}/\\\\/sg;
+    return;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,128 @@
+package LatexIndent::Environment;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_environments/;
+our $environmentCounter;
+
+# store the regular expresssion for matching and replacing the \begin{}...\end{} statements
+our $environmentRegExp = qr/
+            (
+                \\begin\{
+                        (
+                         [a-zA-Z@\*0-9_\\]+ # lowercase|uppercase letters, @, *, numbers
+                        )                 # environment name captured into $2
+                       \}                 # \begin{<something>} statement
+                       \h*                # horizontal space
+                       (\R*)?             # possible line breaks (into $3)
+            )                             # begin statement captured into $1
+            (
+                (?:                       # cluster-only (), don't capture 
+                    (?!                   # don't include \begin in the body
+                        (?:\\begin)       # cluster-only (), don't capture
+                    ).                    # any character, but not \\begin
+                )*?                       # non-greedy
+                        (\R*)?            # possible line breaks (into $5)
+            )                             # environment body captured into $4
+            (
+                \\end\{\2\}               # \end{<something>} statement
+            )                             # captured into $6
+            (\h*)?                        # possibly followed by horizontal space
+            (\R)?                         # possibly followed by a line break 
+            /sx;
+
+sub find_environments{
+    my $self = shift;
+
+
+    while( ${$self}{body} =~ m/$environmentRegExp\h*($trailingCommentRegExp)?/){
+
+      # global substitution
+      ${$self}{body} =~ s/
+                $environmentRegExp(\h*)($trailingCommentRegExp)?
+             /
+                # log file output
+                $self->logger("environment found: $2",'heading') if $is_t_switch_active;
+
+                # create a new Environment object
+                my $env = LatexIndent::Environment->new(begin=>$1,
+                                                        name=>$2,
+                                                        body=>$4,
+                                                        end=>$6,
+                                                        linebreaksAtEnd=>{
+                                                          begin=>$3?1:0,
+                                                          body=>$5?1:0,
+                                                          end=>$8?1:0,
+                                                        },
+                                                        modifyLineBreaksYamlName=>"environments",
+                                                        endImmediatelyFollowedByComment=>$8?0:($10?1:0),
+                                                        horizontalTrailingSpace=>$7?$7:q(),
+                                                      );
+
+                # the settings and storage of most objects has a lot in common
+                $self->get_settings_and_store_new_object($env);
+                ${@{${$self}{children}}[-1]}{replacementText}.($9?$9:q()).($10?$10:q());
+                /xseg;
+    $self->adjust_line_breaks_end_parent;
+    } 
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # if the environment is empty, we may need to update linebreaksAtEnd{body}
+    if(${$self}{body} =~ m/^\h*$/s and ${${$self}{linebreaksAtEnd}}{begin}){
+          $self->logger("empty environment body (${$self}{name}), updating linebreaksAtEnd{body} to be 1") if($is_t_switch_active);
+          ${${$self}{linebreaksAtEnd}}{body} = 1;
+    }
+
+    # search for items as the first order of business
+    $self->find_items;
+
+    # search for headings (important to do this before looking for commands!)
+    $self->find_heading;
+
+    # search for commands, keys, named grouping braces
+    $self->find_commands_or_key_equals_values_braces;
+
+    # search for arguments
+    $self->find_opt_mand_arguments;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for special begin/end
+    $self->find_special;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $environmentCounter++;
+    ${$self}{id} = "$tokens{environment}$environmentCounter";
+    return;
+}
+
+
+1;


Property changes on: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Environment.pm
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileContents.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileContents.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileContents.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,230 @@
+package LatexIndent::FileContents;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/find_file_contents_environments_and_preamble/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our $fileContentsCounter;
+
+sub find_file_contents_environments_and_preamble{
+    my $self = shift;
+
+    # store the file contents blocks in an array which, depending on the value 
+    # of indentPreamble, will be put into the verbatim hash, or otherwise 
+    # stored as children to be operated upon
+    my @fileContentsStorageArray; 
+
+    # fileContents environments
+    $self->logger('looking for FILE CONTENTS environments (see fileContentsEnvironments)','heading');
+    $self->logger(Dumper(\%{$masterSettings{fileContentsEnvironments}})) if($is_t_switch_active);
+    while( my ($fileContentsEnv,$yesno)= each %{$masterSettings{fileContentsEnvironments}}){
+        if($yesno){
+            $self->logger("looking for $fileContentsEnv:$yesno environments");
+
+            # the trailing * needs some care
+            if($fileContentsEnv =~ m/\*$/){
+                $fileContentsEnv =~ s/\*$//;
+                $fileContentsEnv .= '\*';
+            }
+
+            my $fileContentsRegExp = qr/
+                            (
+                            \\begin\{
+                                    $fileContentsEnv       
+                                   \}                     
+                            )
+                            (
+                                .*?
+                            )                            
+                            (
+                                \\end\{$fileContentsEnv\}  
+                                \h*
+                            )                    
+                            (\R)?  
+                        /sx;
+
+            while( ${$self}{body} =~ m/$fileContentsRegExp/sx){
+
+              # create a new Environment object
+              my $fileContentsBlock = LatexIndent::FileContents->new( begin=>$1,
+                                                    body=>$2,
+                                                    end=>$3,
+                                                    name=>$fileContentsEnv,
+                                                    linebreaksAtEnd=>{
+                                                      begin=>0,
+                                                      body=>0,
+                                                      end=>$4?1:0,
+                                                    },
+                                                    modifyLineBreaksYamlName=>"filecontents",
+                                                    );
+              # give unique id
+              $fileContentsBlock->create_unique_id;
+
+              # the replacement text can be just the ID, but the ID might have a line break at the end of it
+              $fileContentsBlock->get_replacement_text;
+
+              # count body line breaks
+              $fileContentsBlock->count_body_line_breaks;
+
+              # the above regexp, when used below, will remove the trailing linebreak in ${$self}{linebreaksAtEnd}{end}
+              # so we compensate for it here
+              $fileContentsBlock->adjust_replacement_text_line_breaks_at_end;
+
+              # store the fileContentsBlock, and determine location afterwards
+              push(@fileContentsStorageArray,$fileContentsBlock);
+
+              # log file output
+              $self->logger("FILECONTENTS environment found: $fileContentsEnv");
+
+              # remove the environment block, and replace with unique ID
+              ${$self}{body} =~ s/$fileContentsRegExp/${$fileContentsBlock}{replacementText}/sx;
+
+              $self->logger("replaced with ID: ${$fileContentsBlock}{id}");
+            } 
+      } else {
+            $self->logger("*not* looking for $fileContentsEnv as $fileContentsEnv:$yesno");
+      }
+    }
+
+    # determine if body of document contains \begin{document} -- if it does, then assume
+    # that the body has a preamble
+    my $preambleRegExp = qr/
+                        (.*?)
+                        (\R*)?            # linebreaks at end of body into $2
+                        \\begin\{document\}
+                /sx;
+    my $preamble = q();
+
+    my $needToStorePreamble = 0;
+
+    # try and find the preamble
+    if( ${$self}{body} =~ m/$preambleRegExp/sx and ${$masterSettings{lookForPreamble}}{${$self}{fileExtension}}){
+
+        $self->logger("\\begin{document} found in body (after searching for filecontents)-- assuming that a preamble exists");
+
+        # create a preamble object
+        $preamble = LatexIndent::Preamble->new( begin=>q(),
+                                              body=>$1,
+                                              end=>q(),
+                                              name=>"preamble",
+                                              linebreaksAtEnd=>{
+                                                begin=>0,
+                                                body=>$2?1:0,
+                                                end=>0,
+                                              },
+                                              afterbit=>($2?$2:q())."\\begin{document}",
+                                              modifyLineBreaksYamlName=>"preamble",
+                                              );
+
+        # give unique id
+        $preamble->create_unique_id;
+
+        # get the replacement_text
+        $preamble->get_replacement_text;
+
+        # log file output
+        $self->logger("preamble found: $preamble");
+
+        # remove the environment block, and replace with unique ID
+        ${$self}{body} =~ s/$preambleRegExp/${$preamble}{replacementText}/sx;
+
+        $self->logger("replaced with ID: ${$preamble}{replacementText}");
+        # indentPreamble set to 1
+        if($masterSettings{indentPreamble}){
+            $self->logger("storing ${$preamble}{id} for indentation (see indentPreamble)");
+            $needToStorePreamble = 1;
+        } else {
+            # indentPreamble set to 0
+            $self->logger("NOT storing ${$preamble}{id} for indentation -- will store as VERBATIM object (see indentPreamble)");
+            $preamble->unprotect_blank_lines;
+            ${$self}{verbatim}{${$preamble}{id}} = $preamble;
+        }
+    }
+
+    # loop through the fileContents array, check if it's in the preamble
+    foreach(@fileContentsStorageArray){
+              my $indentThisChild = 0;
+              # verbatim children go in special hash
+              if($preamble ne '' and ${$preamble}{body} =~ m/${$_}{id}/){
+                $self->logger("filecontents (${$_}{id}) is within preamble");
+                # indentPreamble set to 1
+                if($masterSettings{indentPreamble}){
+                    $self->logger("storing ${$_}{id} for indentation (indentPreamble is 1)");
+                    $indentThisChild = 1;
+                } else {
+                    # indentPreamble set to 0
+                    $self->logger("Storing ${$_}{id} as a VERBATIM object (indentPreamble is 0)");
+                    ${$self}{verbatim}{${$_}{id}}=$_;
+                }
+              } else {
+                    $self->logger("storing ${$_}{id} for indentation (${$_}{name} found outside of preamble)");
+                    $indentThisChild = 1;
+              }
+              # store the child, if necessary
+              if($indentThisChild){
+                    $_->remove_leading_space;
+                    $_->get_indentation_settings_for_this_object;
+                    $_->tasks_particular_to_each_object;
+                    push(@{${$self}{children}},$_);
+              }
+    }
+
+    if($needToStorePreamble){
+        $preamble->dodge_double_backslash;
+        $preamble->remove_leading_space;
+        $preamble->find_commands_or_key_equals_values_braces if($masterSettings{preambleCommandsBeforeEnvironments});
+        $preamble->tasks_particular_to_each_object;
+        push(@{${$self}{children}},$preamble);
+    }
+    return;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $fileContentsCounter++;
+    ${$self}{id} = "$tokens{filecontents}$fileContentsCounter$tokens{endOfToken}";
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # search for environments
+    $self->find_environments;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for headings (part, chapter, section, setc)
+    $self->find_heading;
+    
+    # search for commands with arguments
+    $self->find_commands_or_key_equals_values_braces;
+
+    # search for special begin/end
+    $self->find_special;
+
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/FileExtension.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,99 @@
+package LatexIndent::FileExtension;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use File::Basename; # to get the filename and directory path
+use Exporter qw/import/;
+our @EXPORT_OK = qw/file_extension_check/;
+
+sub file_extension_check{
+    my $self = shift;
+
+    # grab the filename
+    my $fileName = ${$self}{fileName};
+
+    # grab the file extension preferences
+    my %fileExtensionPreference= %{$masterSettings{fileExtensionPreference}};
+
+    # sort the file extensions by preference 
+    my @fileExtensions = sort { $fileExtensionPreference{$a} <=> $fileExtensionPreference{$b} } keys(%fileExtensionPreference);
+    
+    # get the base file name, allowing for different extensions (possibly no extension)
+    my ($dir, $name, $ext) = fileparse($fileName, @fileExtensions);
+
+    # check to make sure given file type is supported
+    if( -e $fileName  and !$ext ){
+        my $message = "The file $fileName exists , but the extension does not correspond to any given in fileExtensionPreference; consinder updating fileExtensionPreference.";
+        $self->logger($message,'heading');
+        $self->output_logfile;
+        die($message);
+    }
+
+    # if no extension, search according to fileExtensionPreference
+    if (!$ext) {
+        $self->logger("File extension work:",'heading');
+        $self->logger("latexindent called to act upon $fileName with an, as yet, unrecognised file extension;");
+        $self->logger("searching for file with an extension in the following order (see fileExtensionPreference):");
+        $self->logger(join("\n", at fileExtensions));
+
+        my $fileFound = 0;
+        # loop through the known file extensions (see @fileExtensions)
+        foreach (@fileExtensions ){
+            if ( -e $fileName.$_ ) {
+               $self->logger("$fileName$_ found!");
+               $fileName .= $_;
+               $self->logger("Updated fileName to $fileName");
+               ${$self}{fileName} = $fileName ;
+               $fileFound = 1;
+               $ext = $_;
+               last;
+            }
+        }
+        unless($fileFound){
+          $self->logger("I couldn't find a match for $fileName in fileExtensionPreference (see defaultSettings.yaml)");
+          foreach (@fileExtensions ){
+            $self->logger("I searched for $fileName$_");
+          }
+          $self->logger("but couldn't find any of them.");
+          $self->logger("Consider updating fileExtensionPreference. Error: Exiting, no indendation done.");
+          $self->output_logfile;
+          die "I couldn't find a match for $fileName in fileExtensionPreference.\nExiting, no indendation done."; 
+        }
+      } else {
+        # if the file has a recognised extension, check that the file exists
+        unless( -e $fileName ){
+          my $message = "Error: I couldn't find $fileName, are you sure it exists?. No indentation done. Exiting.";
+          $self->logger($message);
+          $self->output_logfile;
+          die $message;
+        }
+      }
+
+    # store the file extension
+    ${$self}{fileExtension} = $ext;
+
+    # read the file into the Document body
+    my @lines;
+    open(MAINFILE, $fileName) or die "Could not open input file, $fileName";
+    push(@lines,$_) while(<MAINFILE>);
+    close(MAINFILE);
+
+    # the all-important step: update the body
+    ${$self}{body} = join("", at lines);
+}
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/GetYamlSettings.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,471 @@
+package LatexIndent::GetYamlSettings;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use strict;
+use warnings;
+use LatexIndent::Switches qw/%switches $is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use YAML::Tiny;                # interpret defaultSettings.yaml and other potential settings files
+use File::Basename;            # to get the filename and directory path
+use File::HomeDir;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/readSettings modify_line_breaks_settings get_indentation_settings_for_this_object get_every_or_custom_value get_indentation_information get_object_attribute_for_indentation_settings alignment_at_ampersand_settings %masterSettings/;
+
+# Read in defaultSettings.YAML file
+our $defaultSettings;
+
+# master yaml settings is a hash, global to this module
+our %masterSettings;
+
+# previously found settings is a hash, global to this module
+our %previouslyFoundSettings;
+
+sub readSettings{
+  my $self = shift;
+  
+  $defaultSettings = YAML::Tiny->new;
+  $defaultSettings = YAML::Tiny->read( "$FindBin::RealBin/defaultSettings.yaml" );
+  $self->logger("YAML settings read",'heading');
+  $self->logger("Reading defaultSettings.yaml from $FindBin::RealBin/defaultSettings.yaml");
+  
+  # if latexindent.exe is invoked from TeXLive, then defaultSettings.yaml won't be in 
+  # the same directory as it; we need to navigate to it
+  if(!$defaultSettings) {
+    $defaultSettings = YAML::Tiny->read( "$FindBin::RealBin/../../texmf-dist/scripts/latexindent/defaultSettings.yaml");
+    $self->logger("Reading defaultSettings.yaml (2nd attempt, TeXLive, Windows) from $FindBin::RealBin/../../texmf-dist/scripts/latexindent/defaultSettings.yaml");
+  }
+
+  # need to exit if we can't get defaultSettings.yaml
+  die "Could not open defaultSettings.yaml" if(!$defaultSettings);
+   
+  # master yaml settings is a hash, global to this module
+  our %masterSettings = %{$defaultSettings->[0]};
+
+  # scalar to read user settings
+  my $userSettings;
+
+  # array to store the paths to user settings
+  my @absPaths;
+  
+  # we'll need the home directory a lot in what follows
+  my $homeDir = File::HomeDir->my_home; 
+  
+  # get information about user settings- first check if indentconfig.yaml exists
+  my $indentconfig = "$homeDir/indentconfig.yaml";
+
+  # if indentconfig.yaml doesn't exist, check for the hidden file, .indentconfig.yaml
+  $indentconfig = "$homeDir/.indentconfig.yaml" if(! -e $indentconfig);
+
+  # messages for indentconfig.yaml and/or .indentconfig.yaml
+  if ( -e $indentconfig and !$switches{onlyDefault}) {
+        $self->logger("Reading path information from $indentconfig");
+        # if both indentconfig.yaml and .indentconfig.yaml exist
+        if ( -e File::HomeDir->my_home . "/indentconfig.yaml" and  -e File::HomeDir->my_home . "/.indentconfig.yaml") {
+              $self->logger("$homeDir/.indentconfig.yaml has been found, but $indentconfig takes priority");
+        } elsif ( -e File::HomeDir->my_home . "/indentconfig.yaml" ) {
+              $self->logger("(Alternatively $homeDir/.indentconfig.yaml can be used)");
+        } elsif ( -e File::HomeDir->my_home . "/.indentconfig.yaml" ) {
+              $self->logger("(Alternatively $homeDir/indentconfig.yaml can be used)");
+        }
+
+        # read the absolute paths from indentconfig.yaml
+        $userSettings = YAML::Tiny->read( "$indentconfig" );
+
+        # output the contents of indentconfig to the log file
+        $self->logger(Dump \%{$userSettings->[0]});
+
+        # update the absolute paths
+        @absPaths = @{$userSettings->[0]->{paths}};
+  } else {
+     if($switches{onlyDefault}) {
+        $self->logger("Only default settings requested, not reading USER settings from $indentconfig");
+        $self->logger("Ignoring $switches{readLocalSettings} (you used the -d switch)") if($switches{readLocalSettings});
+        $switches{readLocalSettings}=0;
+     } else {
+       # give the user instructions on where to put indentconfig.yaml or .indentconfig.yaml
+       $self->logger("Home directory is $homeDir (didn't find either indentconfig.yaml or .indentconfig.yaml)");
+       $self->logger("To specify user settings you would put indentconfig.yaml here: $homeDir/indentconfig.yaml");
+       $self->logger("Alternatively, you can use the hidden file .indentconfig.yaml as: $homeDir/.indentconfig.yaml");
+     }
+  }
+
+  # get information about LOCAL settings, assuming that $readLocalSettings exists
+  my $directoryName = dirname (${$self}{fileName});
+  
+  # local settings can be separated by ,
+  # e.g  
+  #     -l = myyaml1.yaml,myyaml2.yaml
+  # and in which case, we need to read them all
+  my @localSettings;
+  if($switches{readLocalSettings} =~ m/,/){
+        $self->logger("Multiple localSettings found, separated by commas:",'heading');
+        @localSettings = split(/,/,$switches{readLocalSettings});
+  } else {
+    push(@localSettings,$switches{readLocalSettings}) if($switches{readLocalSettings});
+  }
+
+  # add local settings to the paths, if appropriate
+  foreach (@localSettings) {
+    if ( (-e "$directoryName/$_") and !(-z "$directoryName/$_")) {
+        $self->logger("Adding $directoryName/$_ to YAML read paths");
+        push(@absPaths,"$directoryName/$_");
+    } elsif ( !(-e "$directoryName/$_") ) {
+          $self->logger("WARNING yaml file not found: $directoryName/$_ not found");
+          $self->logger("Proceeding without it.");
+    }
+  }
+
+  # read in the settings from each file
+  foreach my $settings (@absPaths) {
+    # check that the settings file exists and that it isn't empty
+    if (-e $settings and !(-z $settings)) {
+        $self->logger("Reading USER settings from $settings");
+        $userSettings = YAML::Tiny->read( "$settings" );
+  
+        # if we can read userSettings
+        if($userSettings) {
+              # update the MASTER setttings to include updates from the userSettings
+              while(my($firstLevelKey, $firstLevelValue) = each %{$userSettings->[0]}) {
+                      # the update approach is slightly different for hashes vs scalars/arrays
+                      if (ref($firstLevelValue) eq "HASH") {
+                          while(my ($secondLevelKey,$secondLevelValue) = each %{$userSettings->[0]{$firstLevelKey}}) {
+                            if (ref $secondLevelValue eq "HASH"){
+                                # if masterSettings already contains a *scalar* value in secondLevelKey
+                                # then we need to delete it (test-cases/headings-first.tex with indentRules1.yaml first demonstrated this)
+                                if(ref $masterSettings{$firstLevelKey}{$secondLevelKey} ne "HASH"){
+                                    $self->logger("masterSettings{$firstLevelKey}{$secondLevelKey} currently contains a *scalar* value, but it needs to be updated with a hash (see $settings); deleting the scalar") if($is_t_switch_active);
+                                    delete $masterSettings{$firstLevelKey}{$secondLevelKey} ;
+                                }
+                                while(my ($thirdLevelKey,$thirdLevelValue) = each %{$secondLevelValue}) {
+                                    if (ref $thirdLevelValue eq "HASH"){
+                                        # similarly for third level
+                                        if (ref $masterSettings{$firstLevelKey}{$secondLevelKey}{$thirdLevelKey} ne "HASH"){
+                                            $self->logger("masterSettings{$firstLevelKey}{$secondLevelKey}{$thirdLevelKey} currently contains a *scalar* value, but it needs to be updated with a hash (see $settings); deleting the scalar") if($is_t_switch_active);
+                                            delete $masterSettings{$firstLevelKey}{$secondLevelKey}{$thirdLevelKey} ;
+                                        }
+                                        while(my ($fourthLevelKey,$fourthLevelValue) = each %{$thirdLevelValue}) {
+                                            $masterSettings{$firstLevelKey}{$secondLevelKey}{$thirdLevelKey}{$fourthLevelKey} = $fourthLevelValue;
+                                        }
+                                    } else {
+                                        $masterSettings{$firstLevelKey}{$secondLevelKey}{$thirdLevelKey} = $thirdLevelValue;
+                                    }
+                                }
+                            } else {
+                                $masterSettings{$firstLevelKey}{$secondLevelKey} = $secondLevelValue;
+                            }
+                          }
+                      } else {
+                            $masterSettings{$firstLevelKey} = $firstLevelValue;
+                      }
+              }
+
+              # output settings to $logfile
+              if($masterSettings{logFilePreferences}{showEveryYamlRead}){
+                  $self->logger(Dump \%{$userSettings->[0]});
+              } else {
+                  $self->logger("Not showing settings in the log file (see showEveryYamlRead and showAmalgamatedSettings).");
+              }
+         } else {
+               # otherwise print a warning that we can not read userSettings.yaml
+               $self->logger("WARNING $settings contains invalid yaml format- not reading from it");
+         }
+    } else {
+        # otherwise keep going, but put a warning in the log file
+        $self->logger("WARNING: $homeDir/indentconfig.yaml");
+        if (-z $settings) {
+            $self->logger("specifies $settings but this file is EMPTY -- not reading from it");
+        } else {
+            $self->logger("specifies $settings but this file does not exist - unable to read settings from this file");
+        }
+    }
+  }
+
+  # some users may wish to see showAmalgamatedSettings
+  # which details the overall state of the settings modified
+  # from the default in various user files
+  if($masterSettings{logFilePreferences}{showAmalgamatedSettings}){
+      $self->logger("Amalgamated/overall settings to be used:",'heading');
+      $self->logger(Dump \%masterSettings);
+  }
+
+  return;
+}
+
+sub get_indentation_settings_for_this_object{
+    my $self = shift;
+
+    # create a name for previously found settings
+    my $storageName = ${$self}{name}.${$self}{modifyLineBreaksYamlName};
+
+    # check for storage of repeated objects
+    if ($previouslyFoundSettings{$storageName}){
+        $self->logger("Using stored settings for $storageName") if($is_t_switch_active);
+    } else {
+        my $name = ${$self}{name};
+        $self->logger("Storing settings for $storageName") if($is_t_switch_active);
+
+        # check for noAdditionalIndent and indentRules
+        # otherwise use defaultIndent
+        my $indentation = $self->get_indentation_information;
+
+        # check for alignment at ampersand settings
+        $self->alignment_at_ampersand_settings;
+
+        # check for line break settings
+        $self->modify_line_breaks_settings;
+
+        # store the settings
+        %{${previouslyFoundSettings}{$storageName}} = (
+                        indentation=>$indentation,
+                        BeginStartsOnOwnLine=>${$self}{BeginStartsOnOwnLine},
+                        BodyStartsOnOwnLine=>${$self}{BodyStartsOnOwnLine},
+                        EndStartsOnOwnLine=>${$self}{EndStartsOnOwnLine},
+                        EndFinishesWithLineBreak=>${$self}{EndFinishesWithLineBreak},
+                      );
+
+        # don't forget alignment settings!
+        ${${previouslyFoundSettings}{$storageName}}{lookForAlignDelims} = ${$self}{lookForAlignDelims} if(defined ${$self}{lookForAlignDelims});
+        ${${previouslyFoundSettings}{$storageName}}{alignDoubleBackSlash} = ${$self}{alignDoubleBackSlash} if(defined ${$self}{alignDoubleBackSlash});
+        ${${previouslyFoundSettings}{$storageName}}{spacesBeforeDoubleBackSlash} = ${$self}{spacesBeforeDoubleBackSlash} if(defined ${$self}{spacesBeforeDoubleBackSlash});
+
+        # some objects, e.g ifElseFi, can have extra assignments, e.g ElseStartsOnOwnLine
+        # these need to be stored as well!
+        foreach (@{${$self}{additionalAssignments}}){
+            ${${previouslyFoundSettings}{$storageName}}{$_} = ${$self}{$_};
+        }
+
+    }
+
+    # append indentation settings to the current object
+    while( my ($key,$value)= each %{${previouslyFoundSettings}{$storageName}}){
+            ${$self}{$key} = $value;
+    }
+
+    return;
+}
+
+sub alignment_at_ampersand_settings{
+    my $self = shift;
+
+    # if the YamlName is, for example, optionalArguments, mandatoryArguments, heading, then we'll be looking for information about the *parent*
+    my $name = (defined ${$self}{nameForIndentationSettings}) ? ${$self}{nameForIndentationSettings} : ${$self}{name};
+
+    # check, for example,
+    #   lookForAlignDelims:
+    #      tabular: 1
+    # or
+    #
+    #   lookForAlignDelims:
+    #      tabular: 
+    #         delims: 1
+    #         alignDoubleBackSlash: 1
+    #         spacesBeforeDoubleBackSlash: 2
+    return unless ${$masterSettings{lookForAlignDelims}}{$name}; 
+
+    ## check, for example,
+    ##   lookForAlignDelims:
+    ##      tabular:
+    ##         body: 1
+    #return unless $self->get_object_attribute_for_indentation_settings;
+    
+    if(ref ${$masterSettings{lookForAlignDelims}}{$name} eq "HASH"){
+      ${$self}{lookForAlignDelims} = (defined ${${$masterSettings{lookForAlignDelims}}{$name}}{delims} ) ? ${${$masterSettings{lookForAlignDelims}}{$name}}{delims} : 1;
+      ${$self}{alignDoubleBackSlash} = (defined ${${$masterSettings{lookForAlignDelims}}{$name}}{alignDoubleBackSlash} ) ? ${${$masterSettings{lookForAlignDelims}}{$name}}{alignDoubleBackSlash} : 1;
+      ${$self}{spacesBeforeDoubleBackSlash} = (defined ${${$masterSettings{lookForAlignDelims}}{$name}}{spacesBeforeDoubleBackSlash} ) ? ${${$masterSettings{lookForAlignDelims}}{$name}}{spacesBeforeDoubleBackSlash} : -1;
+    } else {
+      ${$self}{lookForAlignDelims} = 1;
+      ${$self}{alignDoubleBackSlash} = 1;
+      ${$self}{spacesBeforeDoubleBackSlash} = -1;
+    }
+    return;
+}
+
+sub modify_line_breaks_settings{
+    # return with undefined values unless the -m switch is active
+    return unless $is_m_switch_active;
+
+    my $self = shift;
+
+    # details to the log file
+    $self->logger("-m modifylinebreaks switch active, looking for settings for ${$self}{name} ",'heading') if $is_t_switch_active;
+
+    # some objects, e.g ifElseFi, can have extra assignments, e.g ElseStartsOnOwnLine
+    my @toBeAssignedTo = ${$self}{additionalAssignments} ? @{${$self}{additionalAssignments}} : ();
+
+    # the following will *definitley* be in the array, so let's add them
+    push(@toBeAssignedTo,("BeginStartsOnOwnLine","BodyStartsOnOwnLine","EndStartsOnOwnLine","EndFinishesWithLineBreak"));
+
+    # we can effeciently loop through the following
+    foreach (@toBeAssignedTo){
+                    $self->get_every_or_custom_value(
+                                    toBeAssignedTo=>$_,
+                                    toBeAssignedToAlias=> ${$self}{aliases}{$_} ?  ${$self}{aliases}{$_} : $_,
+                                  );
+      }
+    return;
+}
+
+sub get_every_or_custom_value{
+  my $self = shift;
+  my %input = @_;
+
+  my $toBeAssignedTo = $input{toBeAssignedTo};
+  my $toBeAssignedToAlias = $input{toBeAssignedToAlias};
+
+  # alias
+  if(${$self}{aliases}{$toBeAssignedTo}){
+        $self->logger("aliased $toBeAssignedTo using ${$self}{aliases}{$toBeAssignedTo}") if($is_t_switch_active);
+  }
+
+  # name of the object in the modifyLineBreaks yaml (e.g environments, ifElseFi, etc)
+  my $YamlName = ${$self}{modifyLineBreaksYamlName};
+
+  # if the YamlName is either optionalArguments or mandatoryArguments, then we'll be looking for information about the *parent*
+  my $name = ($YamlName =~ m/Arguments/) ? ${$self}{parent} : ${$self}{name};
+
+  # these variables just ease the notation what follows
+  my $everyValue = ${${$masterSettings{modifyLineBreaks}}{$YamlName}}{$toBeAssignedToAlias};
+  my $customValue = ${${${$masterSettings{modifyLineBreaks}}{$YamlName}}{$name}}{$toBeAssignedToAlias};
+
+  # check for the *custom* value
+  if (defined $customValue){
+      $self->logger("$name: $toBeAssignedToAlias=$customValue, (*custom* value) adjusting $toBeAssignedTo") if($is_t_switch_active);
+      ${$self}{$toBeAssignedTo} = $customValue !=0 ? $customValue : undef;
+   } else {
+      # check for the *every* value
+      if (defined $everyValue and $everyValue != 0){
+          $self->logger("$name: $toBeAssignedToAlias=$everyValue, (*every* value) adjusting $toBeAssignedTo") if($is_t_switch_active);
+          ${$self}{$toBeAssignedTo} = $everyValue;
+      }
+   }
+  return;
+}
+
+sub get_indentation_information{
+    my $self = shift;
+
+    #**************************************
+    # SEARCHING ORDER:
+    #   noAdditionalIndent *per-name* basis
+    #   indentRules *per-name* basis
+    #   noAdditionalIndentGlobal
+    #   indentRulesGlobal
+    #**************************************
+
+    # noAdditionalIndent can be a scalar or a hash, e.g
+    #
+    #   noAdditionalIndent:
+    #       myexample: 1
+    #
+    # OR
+    #
+    #   noAdditionalIndent:
+    #       myexample: 
+    #           body: 1
+    #           optionalArguments: 1
+    #           mandatoryArguments: 1
+    # 
+    # specifying as a scalar with no field (e.g myexample: 1)
+    # will be interpreted as noAdditionalIndent for *every*
+    # field, so the body, optional arguments and mandatory arguments
+    # will *all* receive noAdditionalIndent 
+    #
+    # indentRules can also be a scalar or a hash, e.g
+    #   indentRules:
+    #       myexample: "\t"
+    #
+    # OR
+    #
+    #   indentRules:
+    #       myexample:
+    #           body: "  "
+    #           optionalArguments: "\t \t"
+    #           mandatoryArguments: ""
+    #
+    # specifying as a scalar with no field will
+    # mean that *every* field will receive the same treatment
+
+    # if the YamlName is, for example, optionalArguments, mandatoryArguments, heading, then we'll be looking for information about the *parent*
+    my $name = (defined ${$self}{nameForIndentationSettings}) ? ${$self}{nameForIndentationSettings} : ${$self}{name};
+
+    # if the YamlName is not optionalArguments, mandatoryArguments, heading (possibly others) then assume we're looking for 'body'
+    my $YamlName = $self->get_object_attribute_for_indentation_settings;
+
+    my $indentationInformation;
+    foreach my $indentationAbout ("noAdditionalIndent","indentRules"){
+        # check that the 'thing' is defined
+        if(defined ${$masterSettings{$indentationAbout}}{$name}){
+            if(ref ${$masterSettings{$indentationAbout}}{$name} eq "HASH"){
+                $self->logger("$indentationAbout indentation specified with multiple fields for $name, searching for $name: $YamlName (see $indentationAbout)") if $is_t_switch_active ;
+                $indentationInformation = ${${$masterSettings{$indentationAbout}}{$name}}{$YamlName};
+            } else {
+                $indentationInformation = ${$masterSettings{$indentationAbout}}{$name};
+                $self->logger("$indentationAbout indentation specified for $name (for *all* fields, body, optionalArguments, mandatoryArguments, afterHeading), using '$indentationInformation' (see $indentationAbout)") if $is_t_switch_active ;
+            }
+            # return, after performing an integrity check
+            if(defined $indentationInformation){
+                if($indentationAbout eq "noAdditionalIndent" and $indentationInformation == 1){
+                        $self->logger("Found! Using '' (see $indentationAbout)") if $is_t_switch_active;
+                        return q();
+                } elsif($indentationAbout eq "indentRules" and $indentationInformation=~m/^\h*$/){
+                        $self->logger("Found! Using '$indentationInformation' (see $indentationAbout)") if $is_t_switch_active;
+                        return $indentationInformation ;
+                }
+            }
+        }
+    }
+
+    # gather information
+    $YamlName = ${$self}{modifyLineBreaksYamlName};
+
+    foreach my $indentationAbout ("noAdditionalIndent","indentRules"){
+        # global assignments in noAdditionalIndentGlobal and/or indentRulesGlobal
+        my $globalInformation = $indentationAbout."Global";
+        next if(!(defined ${$masterSettings{$globalInformation}}{$YamlName})); 
+        if( ($globalInformation eq "noAdditionalIndentGlobal") and ${$masterSettings{$globalInformation}}{$YamlName}==1){
+            $self->logger("$globalInformation specified for $YamlName (see $globalInformation)") if $is_t_switch_active;
+            return q();
+        } elsif($globalInformation eq "indentRulesGlobal") {
+            if(${$masterSettings{$globalInformation}}{$YamlName}=~m/^\h*$/){
+                $self->logger("$globalInformation specified for $YamlName (see $globalInformation)") if $is_t_switch_active;
+                return ${$masterSettings{$globalInformation}}{$YamlName};
+            } else {
+                $self->logger("$globalInformation specified (${$masterSettings{$globalInformation}}{$YamlName}) for $YamlName, but it needs to only contain horizontal space -- I'm ignoring this one") if $is_t_switch_active;
+          }
+        }
+    }
+
+    # return defaultIndent, by default
+    $self->logger("Using defaultIndent for $name") if $is_t_switch_active;
+    return $masterSettings{defaultIndent};
+}
+
+sub get_object_attribute_for_indentation_settings{
+    # when looking for noAdditionalIndent or indentRules, we may need to determine
+    # which thing we're looking for, e.g
+    #
+    #   chapter:
+    #       body: 0
+    #       optionalArguments: 1
+    #       mandatoryArguments: 1
+    #       afterHeading: 0
+    #
+    # this method returns 'body' by default, but the other objects (optionalArgument, mandatoryArgument, afterHeading)
+    # return their appropriate identifier.
+    return "body";
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Heading.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Heading.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Heading.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,240 @@
+package LatexIndent::Heading;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_heading construct_headings_levels/;
+our $headingCounter;
+our @headingsRegexpArray;
+our $allHeadingsRegexp = q();
+
+sub construct_headings_levels{
+    my $self = shift;
+
+    # grab the heading levels
+    my %headingsLevels = %{$masterSettings{indentAfterHeadings}};
+
+    # delete the values that have indentAfterThisHeading set to 0
+    while( my ($headingName,$headingInfo)= each %headingsLevels){
+        if(!${$headingsLevels{$headingName}}{indentAfterThisHeading}){
+            $self->logger("Not indenting after $headingName (see indentAfterThisHeading)",'heading') if $is_t_switch_active;
+            delete $headingsLevels{$headingName};
+        } else {
+            # *all heading* regexp, remembering put starred headings at the front of the regexp
+            if($headingName =~ m/\*/){
+                 $self->logger("Putting $headingName at the beginning of the allHeadings regexp, as it contains a *");
+                 $allHeadingsRegexp = $headingName.($allHeadingsRegexp eq '' ?q():"|$allHeadingsRegexp");
+            } else {
+                 $self->logger("Putting $headingName at the END of the allHeadings regexp, as it contains a *");
+                 $allHeadingsRegexp .= ($allHeadingsRegexp eq '' ?q():"|").$headingName ;
+            }
+        }
+    }
+
+    # check for a * in the name
+    $allHeadingsRegexp =~ s/\*/\\\*/g;
+
+    # sort the file extensions by preference 
+    my @sortedByLevels = sort { ${$headingsLevels{$a}}{level} <=> $headingsLevels{$b}{level} } keys(%headingsLevels);
+
+    # it could be that @sortedByLevels is empty;
+    return if !@sortedByLevels;
+
+    $self->logger("All headings regexp: $allHeadingsRegexp",'heading'); 
+    $self->logger("Now to construct headings regexp for each level:",'heading'); 
+
+    # loop through the levels, and create a regexp for each (min and max values are the first and last values respectively from sortedByLevels)
+    for(my $i = ${$headingsLevels{$sortedByLevels[0]}}{level}; $i <= ${$headingsLevels{$sortedByLevels[-1]}}{level}; $i++ ){
+        # level regexp
+        my @tmp = grep { ${$headingsLevels{$_}}{level} == $i } keys %headingsLevels;
+        if(@tmp){
+            my $headingsAtThisLevel = q();
+            foreach(@tmp){
+               # put starred headings at the front of the regexp
+               if($_ =~ m/\*/){
+                    $self->logger("Putting $_ at the beginning of this regexp, as it contains a *");
+                    $headingsAtThisLevel = $_.($headingsAtThisLevel eq '' ?q():"|$headingsAtThisLevel");
+               } else {
+                    $self->logger("Putting $_ at the END of this regexp, as it contains a *");
+                    $headingsAtThisLevel .= ($headingsAtThisLevel eq '' ?q():"|").$_ ;
+               }
+            }
+
+            # make the stars escaped correctly
+            $headingsAtThisLevel =~ s/\*/\\\*/g;
+            push(@headingsRegexpArray,$headingsAtThisLevel);
+            $self->logger("Heading level regexp for level $i will contain: $headingsAtThisLevel");
+        }
+    }
+  }
+
+sub find_heading{
+
+    # if there are no headings regexps, there's no point going any further
+    return if!@headingsRegexpArray;
+
+    my $self = shift;
+
+    # otherwise loop through the headings regexp
+    $self->logger("Searching for special begin/end (see specialBeginEnd)");
+
+    # loop through each headings match; note that we need to 
+    # do it in *reverse* so as to ensure that the lower level headings get matched first of all
+    foreach(reverse(@headingsRegexpArray)){
+        
+        # the regexp
+        my $headingRegExp = qr/
+                              (
+                                  \\($_)        # name stored into $2
+                              )                 # beginning bit into $1
+                              (
+                                  .*?                 
+                              )                 # body into $3      
+                              (\R*)?            # linebreaks at end of body into $4
+                              ((?:\\(?:$allHeadingsRegexp))|$)  # up to another heading, or else the end of the file
+                           /sx;
+        
+        while(${$self}{body} =~ m/$headingRegExp/){
+
+            # log file output
+            $self->logger("heading found: $2",'heading');
+
+            ${$self}{body} =~ s/
+                                $headingRegExp
+                               /
+                                # create a new heading object
+                                my $headingObject = LatexIndent::Heading->new(begin=>q(),
+                                                                        body=>$1.$3,
+                                                                        end=>q(),
+                                                                        afterbit=>($4?$4:q()).($5?$5:q()),
+                                                                        name=>$2.":heading",
+                                                                        parent=>$2,
+                                                                        nameForIndentationSettings=>$2,
+                                                                        linebreaksAtEnd=>{
+                                                                          begin=>0,
+                                                                          body=>0,
+                                                                          end=>0,
+                                                                        },
+                                                                        modifyLineBreaksYamlName=>"afterHeading",
+                                                                        endImmediatelyFollowedByComment=>0,
+                                                                      );
+
+                                # the settings and storage of most objects has a lot in common
+                                $self->get_settings_and_store_new_object($headingObject);
+                                ${@{${$self}{children}}[-1]}{replacementText};
+                              /xse;
+        }
+     }
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text for a heading (chapter, section, etc) needs to put the trailing part back in
+    $self->logger("Custom replacement text routine for heading ${$self}{name}");
+    ${$self}{replacementText} = ${$self}{id}.${$self}{afterbit};
+    delete ${$self}{afterbit};
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $headingCounter++;
+
+    ${$self}{id} = "$tokens{heading}$headingCounter";
+    return;
+}
+
+sub adjust_replacement_text_line_breaks_at_end{
+    return;
+}
+
+sub get_object_attribute_for_indentation_settings{
+    # when looking for noAdditionalIndent or indentRules, we may need to determine
+    # which thing we're looking for, e.g
+    #
+    #   chapter:
+    #       body: 0
+    #       optionalArguments: 1
+    #       mandatoryArguments: 1
+    #       afterHeading: 0
+    #
+    # this method returns 'body' by default, but the other objects (optionalArgument, mandatoryArgument, afterHeading)
+    # return their appropriate identifier.
+    my $self = shift;
+    
+    return ${$self}{modifyLineBreaksYamlName};
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # search for commands, keys, named grouping braces
+    $self->find_commands_or_key_equals_values_braces;
+
+    # we need to transfer the details from the modifyLineBreaks of the command
+    # child object to the heading object.
+    #
+    # for example, if we have
+    #
+    #   \chapter{some heading here}
+    #
+    # and we want to modify the linebreak before the \chapter command using, for example,
+    #
+    # commands:
+    #     CommandStartsOnOwnLine: 1
+    #
+    # then we need to transfer this information to the heading object
+    if($is_m_switch_active){
+        $self->logger("Searching for linebreak preferences immediately infront of ${$self}{parent}",'heading');
+        foreach(@{${$self}{children}}){
+            if(${$_}{name} eq ${$self}{parent}){
+                $self->logger("Named child found: ${$_}{name}");
+                if(defined ${$_}{BeginStartsOnOwnLine}){
+                    $self->logger("Transferring information from ${$_}{id} (${$_}{name}) to ${$self}{id} (${$self}{name}) for BeginStartsOnOwnLine");
+                    ${$self}{BeginStartsOnOwnLine} = ${$_}{BeginStartsOnOwnLine};
+                } else {
+                    $self->logger("No information found in ${$_}{name} for BeginStartsOnOwnLine");
+                }
+                last;
+            }
+        }
+    }
+
+    # search for special begin/end
+    $self->find_special;
+
+    return;
+}
+
+sub add_surrounding_indentation_to_begin_statement{
+    # almost all of the objects add surrounding indentation to the 'begin' statements, 
+    # but some (e.g HEADING) have their own method
+    my $self = shift;
+    
+    $self->logger("Adding surrounding indentation after (empty, by design!) begin statement of ${$self}{name} (${$self}{id})");
+    ${$self}{begin} .= ${$self}{surroundingIndentation};  # add indentation
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HiddenChildren.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HiddenChildren.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HiddenChildren.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,190 @@
+package LatexIndent::HiddenChildren;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::Tokens qw/%tokens/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/find_surrounding_indentation_for_children update_family_tree get_family_tree check_for_hidden_children %familyTree/;
+
+# hiddenChildren can be stored in a global array, it doesn't matter what level they're at
+our %familyTree;
+our %allChildren;
+
+
+#----------------------------------------------------------
+#   Discussion surrounding hidden children
+#
+#   Consider the following latex code
+#
+#   \begin{one}
+#       body of one 
+#       body of one 
+#       body of one 
+#       \begin{two}
+#          body of two
+#          body of two
+#          body of two
+#          body of two
+#       \end{two}
+#   \end{one}
+#
+#   From the visual perspective, we might say that <one> and <two> are *nested* children;
+#   from the persepective of latexindent.pl, however, they actually have *the same level*.
+#
+#   Graphically, you might represent it as follows
+#
+#                     *
+#                   /  \
+#                  /    \
+#                 /      \ 
+#                O        O
+#
+#   where * represents the 'root' document object, and each 'O' is an environment object; the
+#   first one, on the left, represents <two> and the second one, on the right, represents <one>. 
+#   (Remember that the environment regexp does not allow \begin within its body.)
+#
+#   When processing the document, <one> will be processed *before* <two>. Furthermore, because
+#   <one> and <two> are at the same level, they are not *natural* ancestors of each other; as such, 
+#   we say that <two> is a *hidden* child, and that its 'adopted' ancestor is <one>. 
+#
+#   We need to go to a lot of effort to make sure that <two> knows about its ancestors and its 
+#   surrounding indentation (<one> in this case). The subroutines in this file do that effort.
+#----------------------------------------------------------
+
+sub find_surrounding_indentation_for_children{
+    my $self = shift;
+
+    # output to logfile
+    $self->logger("FamilyTree before update:",'heading') if $is_t_switch_active;
+    $self->logger(Dumper(\%familyTree)) if($is_t_switch_active);
+
+    # update the family tree with ancestors
+    $self->update_family_tree;
+
+    # output information to the logfile
+    $self->logger("FamilyTree after update:",'heading') if $is_t_switch_active;
+    $self->logger(Dumper(\%familyTree)) if($is_t_switch_active);
+
+    while( my ($idToSearch,$ancestorToSearch) = each %familyTree){
+          $self->logger("Hidden child ID: ,$idToSearch, here are its ancestors:",'heading') if $is_t_switch_active;
+          foreach(@{${$ancestorToSearch}{ancestors}}){
+              $self->logger("ID: ${$_}{ancestorID}") if($is_t_switch_active);
+              my $tmpIndentation = ref(${$_}{ancestorIndentation}) eq 'SCALAR'?${${$_}{ancestorIndentation}}:${$_}{ancestorIndentation};
+              $tmpIndentation = $tmpIndentation ? $tmpIndentation : q(); 
+              $self->logger("indentation: '$tmpIndentation'") if($is_t_switch_active);
+              }
+          }
+
+    return;
+}
+
+sub update_family_tree{
+    my $self = shift;
+
+    # loop through the hash
+    $self->logger("Updating FamilyTree...",'heading') if $is_t_switch_active;
+    while( my ($idToSearch,$ancestorToSearch)= each %familyTree){
+          foreach(@{${$ancestorToSearch}{ancestors}}){
+              my $ancestorID = ${$_}{ancestorID};
+              $self->logger("current ID: $idToSearch, ancestor: $ancestorID") if($is_t_switch_active);
+              if($familyTree{$ancestorID}){
+                  $self->logger("$ancestorID is a key within familyTree, grabbing its ancestors") if($is_t_switch_active);
+                  my $naturalAncestors = q();
+                  foreach(@{${$familyTree{$idToSearch}}{ancestors}}){
+                      $naturalAncestors .= "---".${$_}{ancestorID} if(${$_}{type} eq "natural");
+                  }
+                  foreach(@{${$familyTree{$ancestorID}}{ancestors}}){
+                      $self->logger("ancestor of *hidden* child: ${$_}{ancestorID}") if($is_t_switch_active);
+                      my $newAncestorId = ${$_}{ancestorID};
+                      my $type;
+                      if($naturalAncestors =~ m/$ancestorID/){
+                            $type = "natural";
+                      } else {
+                            $type = "adopted";
+                      }
+                      my $matched = grep { $_->{ancestorID} eq $newAncestorId } @{${$familyTree{$idToSearch}}{ancestors}};
+                      push(@{${$familyTree{$idToSearch}}{ancestors}},{ancestorID=>${$_}{ancestorID},ancestorIndentation=>${$_}{ancestorIndentation},type=>$type}) unless($matched);
+                  }
+              } else {
+                    my $naturalAncestors = q();
+                    foreach(@{${$familyTree{$idToSearch}}{ancestors}}){
+                        $naturalAncestors .= "---".${$_}{ancestorID} if(${$_}{type} eq "natural");
+                    }
+                    $self->logger("natural ancestors of $ancestorID: $naturalAncestors") if($is_t_switch_active);
+                    foreach(@{${$allChildren{$ancestorID}}{ancestors}}){
+                        my $newAncestorId = ${$_}{ancestorID};
+                        my $type;
+                        if($naturalAncestors =~ m/$newAncestorId/){
+                            $type = "natural";
+                        } else {
+                            $type = "adopted";
+                        }
+                        my $matched = grep { $_->{ancestorID} eq $newAncestorId } @{${$familyTree{$idToSearch}}{ancestors}};
+                        unless($matched){
+                            $self->logger("ancestor of UNHIDDEN child: ${$_}{ancestorID}") if($is_t_switch_active);
+                            push(@{${$familyTree{$idToSearch}}{ancestors}},{ancestorID=>${$_}{ancestorID},ancestorIndentation=>${$_}{ancestorIndentation},type=>$type});
+                        }
+                    }
+              } 
+          }
+    }
+
+}
+
+sub check_for_hidden_children{
+
+    my $self = shift;
+
+    # if there are no hidden children, then exit
+    return if ${$self}{body} !~ m/$tokens{beginOfToken}/;
+
+    # grab the matches
+    my @matched = (${$self}{body} =~ /((?:$tokens{ifelsefiSpecial})?$tokens{beginOfToken}.[-a-z0-9]+?$tokens{endOfToken})/ig);
+
+    # log file
+    $self->logger("Hidden children check") if $is_t_switch_active;
+    $self->logger(join("|", at matched)) if $is_t_switch_active;
+
+    my $naturalAncestors = ${$self}{naturalAncestors}; 
+
+    # loop through the hidden children
+    foreach my $match (@matched){
+        # update the family tree with ancestors of self
+        if(${$self}{ancestors}){
+            foreach(@{${$self}{ancestors}}){
+                my $newAncestorId = ${$_}{ancestorID};
+                unless (grep { $_->{ancestorID} eq $newAncestorId } @{${$familyTree{$match}}{ancestors}}){
+                    my $type = ($naturalAncestors =~ m/${$_}{ancestorID}/ ) ? "natural" : "adopted";
+                    $self->logger("Adding ${$_}{ancestorID} to the $type family tree of $match") if($is_t_switch_active);
+                    push(@{$familyTree{$match}{ancestors}},{ancestorID=>${$_}{ancestorID},ancestorIndentation=>${$_}{ancestorIndentation},type=>$type});
+                }
+            }
+        }
+
+        # update the family tree with self
+        unless (grep { $_->{ancestorID} eq ${$self}{id}} @{${$familyTree{$match}}{ancestors}}){
+                    my $type = ($naturalAncestors =~ m/${$self}{id}/ ) ? "natural" : "adopted";
+                    $self->logger("Adding ${$self}{id} to the $type family tree of hiddenChild $match") if($is_t_switch_active);
+                    push(@{$familyTree{$match}{ancestors}},{ancestorID=>${$self}{id},ancestorIndentation=>${$self}{indentation},type=>$type});
+        }
+    }
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HorizontalWhiteSpace.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HorizontalWhiteSpace.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/HorizontalWhiteSpace.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,62 @@
+package LatexIndent::HorizontalWhiteSpace;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/remove_trailing_whitespace remove_leading_space/;
+
+sub remove_trailing_whitespace{
+    my $self = shift;
+    my %input = @_;
+
+    # this method can be called before the indendation, and after, depending upon the input
+    if($input{when} eq "before"){
+        return unless(${$masterSettings{removeTrailingWhitespace}}{beforeProcessing});
+        $self->logger("Removing trailing white space *before* the document is processed (see removeTrailingWhitespace: beforeProcessing)",'heading') if $is_t_switch_active;
+    } elsif($input{when} eq "after"){
+        return unless(${$masterSettings{removeTrailingWhitespace}}{afterProcessing});
+        $self->logger("Removing trailing white space *after* the document is processed (see removeTrailingWhitespace: afterProcessing)",'heading') if $is_t_switch_active;
+    } else {
+        return;
+    }
+
+    ${$self}{body} =~ s/
+                       \h+  # followed by possible horizontal space
+                       $    # up to the end of a line
+                       //xsmg;
+
+    $self->logger("Processed body, *$input{when}* indentation (${$self}{name}):") if($is_t_switch_active);
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+
+}
+
+sub remove_leading_space{
+    my $self = shift;
+    $self->logger("Removing leading space from ${$self}{name} (verbatim/noindentblock already accounted for)",'heading') if $is_t_switch_active;
+    ${$self}{body} =~ s/
+                        (   
+                            ^           # beginning of the line
+                            \h*         # with 0 or more horizontal spaces
+                        )?              # possibly
+                        //mxg;
+    return;
+}
+
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,276 @@
+package LatexIndent::IfElseFi;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_ifelsefi/;
+our %previouslyFoundSettings;
+our $ifElseFiCounter;
+
+# store the regular expresssion for matching and replacing the \if...\else...\fi statements
+# note: we search for \else separately in an attempt to keep this regexp a little more managable
+our $ifElseFiRegExp = qr/
+                (
+                    \\
+                        (@?if[a-zA-Z@]*?)
+                    \h*
+                    (\R*)
+                )                           # begin statement, e.g \ifnum, \ifodd
+                (
+                    \\(?!if)|\R|\h|\#|!-!   # up until a \\, linebreak # or !-!, which is 
+                )                           # part of the tokens used for latexindent
+                (
+                    (?: 
+                        (?!\\if).
+                    )*?                     # body, which can't include another \if
+                )
+                (\R*)                       # linebreaks after body
+                (
+                    \\fi(?![a-zA-Z])                    # \fi statement 
+                )
+                (\h*)                       # 0 or more horizontal spaces
+                (\R)?                       # linebreaks after \fi
+/sx;
+
+
+sub indent{
+    my $self = shift;
+
+    # determine the surrounding and current indentation
+    $self->determine_total_indentation;
+
+    # line break checks after \if statement, can get messy if we 
+    # have, for example
+    #       \ifnum
+    #               something
+    # which might be changed into
+    #       \ifnumsomething
+    # which is undeserible
+    if (defined ${$self}{BodyStartsOnOwnLine}
+        and ${$self}{BodyStartsOnOwnLine}==-1 
+        and ${$self}{body} !~ m/^(\h|\\|(?:!-!))/s
+    ){
+        ${$self}{begin} .= " ";
+    }
+
+    # indent the body
+    $self->indent_body;
+
+    # calculate and grab the surrounding indentation for the \else statement adjustment
+    $self->get_surrounding_indentation;
+    my $surroundingIndentation = ${$self}{surroundingIndentation}?${$self}{surroundingIndentation}:q();
+
+    if(${$self}{elsePresent} and ${$self}{linebreaksAtEnd}{ifbody}){
+            $self->logger("Adding surrounding indentation to \\else statement ('$surroundingIndentation')")if $is_t_switch_active;
+            ${$self}{body} =~ s/\h*\\else/$surroundingIndentation\\else/; 
+            $self->logger("Body (${$self}{name}) after \\else adjustment:\n${$self}{body}") if $is_t_switch_active;
+    }
+
+    # indent the end statement
+    $self->indent_end_statement;
+
+    # wrap-up statement
+    $self->wrap_up_statement;
+
+    # line break checks *after* \end{statement}
+    if (defined ${$self}{EndFinishesWithLineBreak}
+        and ${$self}{EndFinishesWithLineBreak}==-1 
+        ) {
+        # add a single horizontal space after the child id, otherwise we can end up 
+        # with things like
+        #       before: 
+        #               \fi
+        #                   text
+        #       after:
+        #               \fitext
+        $self->logger("Adding a single space after \\fi statement (otherwise \\fi can be comined with next line of text in an unwanted way)",'heading') if $is_t_switch_active;
+        ${$self}{end} =${$self}{end}." ";
+    }
+
+    return $self;
+}
+
+sub find_ifelsefi{
+    my $self = shift;
+
+    while( ${$self}{body} =~ m/$ifElseFiRegExp\h*($trailingCommentRegExp)?/){
+
+      ${$self}{body} =~ s/
+                $ifElseFiRegExp(\h*)($trailingCommentRegExp)?
+                    /
+                        # log file output
+                        $self->logger("IfElseFi found: $2",'heading')if $is_t_switch_active;
+           
+                        # create a new IfElseFi object
+                        my $ifElseFi = LatexIndent::IfElseFi->new(begin=>$1.(($4 eq "\n" and !$3)?"\n":q()),
+                                                                name=>$2,
+                                                                # if $4 is a line break, don't count it twice (it will already be in 'begin')
+                                                                body=>($4 eq "\n") ? $5.$6 : $4.$5.$6,
+                                                                end=>$7,
+                                                                linebreaksAtEnd=>{
+                                                                  begin=>(($4 eq "\n")||$3)?1:0,
+                                                                  body=>$6?1:0,
+                                                                  end=>$9?1:0,
+                                                                },
+                                                                aliases=>{
+                                                                  # begin statements
+                                                                  BeginStartsOnOwnLine=>"IfStartsOnOwnLine",
+                                                                  # end statements
+                                                                  EndStartsOnOwnLine=>"FiStartsOnOwnLine",
+                                                                  # after end statements
+                                                                  EndFinishesWithLineBreak=>"FiFinishesWithLineBreak",
+                                                                },
+                                                                elsePresent=>0,
+                                                                modifyLineBreaksYamlName=>"ifElseFi",
+                                                                additionalAssignments=>["ElseStartsOnOwnLine","ElseFinishesWithLineBreak"],
+                                                                endImmediatelyFollowedByComment=>$9?0:($11?1:0),
+                                                                horizontalTrailingSpace=>$8?$8:q(),
+                                                              );
+                        # the settings and storage of most objects has a lot in common
+                        $self->get_settings_and_store_new_object($ifElseFi);
+                        ${@{${$self}{children}}[-1]}{replacementText}.($10?$10:q()).($11?$11:q());
+                        /xse;
+
+    } 
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # check for existence of \else statement, and associated line break information
+    $self->check_for_else_statement;
+
+    # search for headings (important to do this before looking for commands!)
+    $self->find_heading;
+
+    # search for commands, keys, named grouping braces
+    $self->find_commands_or_key_equals_values_braces;
+
+    # search for arguments
+    $self->find_opt_mand_arguments;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for special begin/end
+    $self->find_special;
+
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $ifElseFiCounter++;
+
+    ${$self}{id} = "$tokens{ifelsefi}$ifElseFiCounter";
+    return;
+}
+
+sub check_for_else_statement{
+    my $self = shift;
+    $self->logger("Looking for \\else statement (${$self}{name})",'heading') if $is_t_switch_active;
+    if(${$self}{body} =~ m/
+                            (\R*)   # possible line breaks before \else statement
+                            \\else  
+                            \h*     # possible horizontal space
+                            (\R*)   # possible line breaks after \else statement
+                            /x){
+      $self->logger("found \\else statement, storing line break information:") if($is_t_switch_active);
+
+      # linebreaks *before* \else statement
+      ${$self}{linebreaksAtEnd}{ifbody} = $1?1:0;
+      $self->logger("linebreaksAtEnd of ifbody: ${$self}{linebreaksAtEnd}{ifbody}") if($is_t_switch_active);
+
+      # linebreaks *after* \else statement
+      ${$self}{linebreaksAtEnd}{else} = $2?1:0;
+      $self->logger("linebreaksAtEnd of else: ${$self}{linebreaksAtEnd}{else}") if($is_t_switch_active);
+      ${$self}{elsePresent}=1;
+
+      # check that \else isn't the first thing in body
+      if(${$self}{body} =~ m/^\\else/s and ${$self}{linebreaksAtEnd}{begin}){
+        ${$self}{linebreaksAtEnd}{ifbody} = 1;
+        $self->logger("\\else *begins* the ifbody, linebreaksAtEnd of ifbody: ${$self}{linebreaksAtEnd}{ifbody}") if($is_t_switch_active);
+      }
+
+      # check if -m switch is active
+      return unless $is_m_switch_active;
+
+      # possibly modify line break *before* \else statement
+      if(defined ${$self}{ElseStartsOnOwnLine}){
+          if(${$self}{ElseStartsOnOwnLine}>=1 and !${$self}{linebreaksAtEnd}{ifbody}){
+              # by default, assume that no trailing comment token is needed
+              my $trailingCommentToken = q();
+              if(${$self}{ElseStartsOnOwnLine}==2){
+                $self->logger("Adding a % immediately before else statement of ${$self}{name} (ElseStartsOnOwnLine==2)") if $is_t_switch_active;
+                $trailingCommentToken = "%".$self->add_comment_symbol;
+              }
+
+              # add a line break after ifbody, if appropriate
+              $self->logger("Adding a linebreak before the \\else statement (see ElseStartsOnOwnLine)");
+              ${$self}{body} =~ s/\\else/$trailingCommentToken\n\\else/s;
+              ${$self}{linebreaksAtEnd}{ifbody} = 1;
+          } elsif (${$self}{ElseStartsOnOwnLine}==-1 and ${$self}{linebreaksAtEnd}{ifbody}){
+              # remove line break *after* ifbody, if appropriate
+              $self->logger("Removing linebreak before \\else statement (see ElseStartsOnOwnLine)");
+              ${$self}{body} =~ s/\R*(\h*)\\else/$1\\else/sx;
+              ${$self}{linebreaksAtEnd}{ifbody} = 0;
+          }
+      }
+
+      # possibly modify line break *before* \else statement
+      if(defined ${$self}{ElseFinishesWithLineBreak}){
+          if(${$self}{ElseFinishesWithLineBreak}>=1 and !${$self}{linebreaksAtEnd}{else}){
+              # by default, assume that no trailing comment token is needed
+              my $trailingCommentToken = q();
+              if(${$self}{ElseFinishesWithLineBreak}==2){
+                return if(${$self}{body} =~ m/\\else\h*$trailingCommentRegExp/s);
+                $self->logger("Adding a % immediately after else statement of ${$self}{name} (ElseFinishesWithLineBreak==2)") if $is_t_switch_active;
+                $trailingCommentToken = "%".$self->add_comment_symbol;
+              }
+
+              # add a line break after else, if appropriate
+              $self->logger("Adding a linebreak after the \\else statement (see ElseFinishesWithLineBreak)")if $is_t_switch_active;
+              ${$self}{body} =~ s/\\else\h*/\\else$trailingCommentToken\n/s;
+              ${$self}{linebreaksAtEnd}{else} = 1;
+          } elsif (${$self}{ElseFinishesWithLineBreak}==-1 and ${$self}{linebreaksAtEnd}{else}){
+              # remove line break *after* else, if appropriate, 
+              # note the space so that, for example,
+              #     \else
+              #             some text
+              # becomes
+              #     \else some text
+              # and not
+              #     \elsesome text
+              $self->logger("Removing linebreak after \\else statement (see ElseFinishesWithLineBreak)")if $is_t_switch_active;
+              ${$self}{body} =~ s/\\else\h*\R*/\\else /sx;
+              ${$self}{linebreaksAtEnd}{else} = 0;
+          }
+      }
+
+      return;
+    } else {
+      $self->logger("\\else statement not found") if($is_t_switch_active);
+    }
+}
+
+1;


Property changes on: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/IfElseFi.pm
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Indent.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,371 @@
+package LatexIndent::Indent;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+use LatexIndent::HiddenChildren qw/%familyTree/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/indent wrap_up_statement determine_total_indentation indent_begin indent_body indent_end_statement final_indentation_check push_family_tree_to_indent get_surrounding_indentation indent_children_recursively check_for_blank_lines_at_beginning put_blank_lines_back_in_at_beginning add_surrounding_indentation_to_begin_statement/;
+our %familyTree;
+
+sub indent{
+    my $self = shift;
+
+    # determine the surrounding and current indentation
+    $self->determine_total_indentation;
+
+    # indent the begin statement
+    $self->indent_begin;
+
+    # indent the body
+    $self->indent_body;
+
+    # indent the end statement
+    $self->indent_end_statement;
+
+    # output the completed object to the log file
+    $self->logger("Complete indented object (${$self}{name}) after indentation:\n${$self}{begin}${$self}{body}${$self}{end}") if $is_t_switch_active;
+
+    # wrap-up statement
+    $self->wrap_up_statement;
+    return $self;
+}
+
+sub wrap_up_statement{
+    my $self = shift;
+    $self->logger("Finished indenting ${$self}{name}",'heading') if $is_t_switch_active;
+    return $self;
+  }
+
+sub determine_total_indentation{
+    my $self = shift;
+
+    # calculate and grab the surrounding indentation
+    $self->get_surrounding_indentation;
+
+    # logfile information
+    my $surroundingIndentation = ${$self}{surroundingIndentation};
+    $self->logger("indenting object ${$self}{name}") if($is_t_switch_active);
+    (my $during = $surroundingIndentation) =~ s/\t/TAB/g;
+    $self->logger("indentation *surrounding* object: '$during'") if($is_t_switch_active);
+    ($during = ${$self}{indentation}) =~ s/\t/TAB/g;
+    $self->logger("indentation *of* object: '$during'") if($is_t_switch_active);
+    ($during = $surroundingIndentation.${$self}{indentation}) =~ s/\t/TAB/g;
+    $self->logger("*total* indentation to be added: '$during'") if($is_t_switch_active);
+
+    # form the total indentation of the object
+    ${$self}{indentation} = $surroundingIndentation.${$self}{indentation};
+
+}
+
+sub get_surrounding_indentation{
+    my $self = shift;
+
+    my $surroundingIndentation = q();
+
+    if($familyTree{${$self}{id}}){
+        $self->logger("Adopted ancestors found!") if($is_t_switch_active);
+        foreach(@{${$familyTree{${$self}{id}}}{ancestors}}){
+            if(${$_}{type} eq "adopted"){
+                my $newAncestorId = ${$_}{ancestorID};
+                $self->logger("ancestor ID: $newAncestorId, adding indentation of $newAncestorId to surroundingIndentation of ${$self}{id}") if($is_t_switch_active);
+                $surroundingIndentation .= ref(${$_}{ancestorIndentation}) eq 'SCALAR'
+                                                    ?
+                                            (${${$_}{ancestorIndentation}}?${${$_}{ancestorIndentation}}:q())
+                                                    :
+                                            (${$_}{ancestorIndentation}?${$_}{ancestorIndentation}:q());
+            }
+        }
+    }
+    ${$self}{surroundingIndentation} = $surroundingIndentation;
+
+}
+
+sub indent_begin{
+    # for most objects, the begin statement is just one line, but there are exceptions, e.g KeyEqualsValuesBraces
+    return;
+}
+
+sub indent_body{
+    my $self = shift;
+
+    # grab the indentation of the object
+    my $indentation = ${$self}{indentation};
+
+    # output to the logfile
+    $self->logger("Body (${$self}{name}) before indentation:\n${$self}{body}") if $is_t_switch_active;
+
+    # last minute check for modified bodyLineBreaks
+    $self->count_body_line_breaks if $is_m_switch_active;
+
+    # some objects need to check for blank line tokens at the beginning
+    $self->check_for_blank_lines_at_beginning if $is_m_switch_active; 
+
+    # some objects can format their body to align at the & character
+    $self->align_at_ampersand if ${$self}{lookForAlignDelims};
+
+    # body indendation
+    if(${$self}{linebreaksAtEnd}{begin}==1){
+        if(${$self}{body} =~ m/^\h*$/s){
+            $self->logger("Body of ${$self}{name} is empty, not applying indentation") if $is_t_switch_active;
+        } else {
+            # put any existing horizontal space after the current indentation
+            $self->logger("Entire body of ${$self}{name} receives indendentation") if $is_t_switch_active;
+            ${$self}{body} =~ s/^(\h*)/$indentation$1/mg;  # add indentation
+        }
+    } elsif(${$self}{linebreaksAtEnd}{begin}==0 and ${$self}{bodyLineBreaks}>0) {
+        if(${$self}{body} =~ m/
+                            (.*?)      # content of first line
+                            \R         # first line break
+                            (.*$)      # rest of body
+                            /sx){
+            my $bodyFirstLine = $1;
+            my $remainingBody = $2;
+            $self->logger("first line of body: $bodyFirstLine",'heading') if $is_t_switch_active;
+            $self->logger("remaining body (before indentation):\n'$remainingBody'") if($is_t_switch_active);
+    
+            # add the indentation to all the body except first line
+            $remainingBody =~ s/^/$indentation/mg unless($remainingBody eq '');  # add indentation
+            $self->logger("remaining body (after indentation):\n$remainingBody'") if($is_t_switch_active);
+    
+            # put the body back together
+            ${$self}{body} = $bodyFirstLine."\n".$remainingBody; 
+        }
+    }
+
+    # if the routine check_for_blank_lines_at_beginning has been called, then the following routine
+    # puts blank line tokens back in 
+    $self->put_blank_lines_back_in_at_beginning if $is_m_switch_active; 
+
+    # the final linebreak can be modified by a child object; see test-cases/commands/figureValign-mod5.tex, for example
+    if($is_m_switch_active and defined ${$self}{linebreaksAtEnd}{body} and ${$self}{linebreaksAtEnd}{body}==1 and ${$self}{body} !~ m/\R$/){
+        $self->logger("Updating body for ${$self}{name} to contain a linebreak at the end (linebreaksAtEnd is 1, but there isn't currently a linebreak)") if($is_t_switch_active);
+        ${$self}{body} .= "\n";
+    }
+
+    # output to the logfile
+    $self->logger("Body (${$self}{name}) after indentation:\n${$self}{body}") if $is_t_switch_active;
+    return $self;
+}
+
+sub check_for_blank_lines_at_beginning{
+    # some objects need this routine
+    return;
+}
+
+sub put_blank_lines_back_in_at_beginning{
+    # some objects need this routine
+    return;
+}
+
+sub indent_end_statement{
+    my $self = shift;
+    my $surroundingIndentation = (${$self}{surroundingIndentation} and $familyTree{${$self}{id}})
+                                            ?
+                                 (ref(${$self}{surroundingIndentation}) eq 'SCALAR'?${${$self}{surroundingIndentation}}:${$self}{surroundingIndentation})
+                                            :q();
+
+    # end{statement} indentation, e.g \end{environment}, \fi, }, etc
+    if(${$self}{linebreaksAtEnd}{body}){
+        ${$self}{end} =~ s/^\h*/$surroundingIndentation/mg;  # add indentation
+        $self->logger("Adding surrounding indentation to ${$self}{end} (${$self}{name}: '$surroundingIndentation')") if($is_t_switch_active);
+     }
+    return $self;
+}
+
+sub final_indentation_check{
+    # problem:
+    #       if a tab is appended to spaces, it will look different 
+    #       from spaces appended to tabs (see test-cases/items/spaces-and-tabs.tex)
+    # solution:
+    #       move all of the tabs to the beginning of ${$self}{indentation}
+    # notes;
+    #       this came to light when studying test-cases/items/items1.tex
+
+    my $self = shift;
+
+    my $indentation;
+    my $numberOfTABS; 
+    my $after;
+    ${$self}{body} =~ s/
+                        ^((\h*|\t*)((\h+)(\t+))+)
+                        /   
+                        # fix the indentation
+                        $indentation = $1;
+
+                        # count the number of tabs
+                        $numberOfTABS = () = $indentation=~ \/\t\/g;
+                        $self->logger("Number of tabs: $numberOfTABS") if($is_t_switch_active);
+
+                        # log the after
+                        ($after = $indentation) =~ s|\t||g;
+                        $after = "TAB"x$numberOfTABS.$after;
+                        $self->logger("Indentation after: '$after'") if($is_t_switch_active);
+                        ($indentation = $after) =~s|TAB|\t|g;
+                        $indentation;
+                       /xsmeg;
+
+}
+
+sub indent_children_recursively{
+    my $self = shift;
+
+    unless(defined ${$self}{children}) {
+        $self->logger("No child objects (${$self}{name})") if $is_t_switch_active;
+        return;
+    }
+
+    $self->logger('Pre-processed body:','heading') if $is_t_switch_active;
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+
+    # send the children through this indentation routine recursively
+    if(defined ${$self}{children}){
+        foreach my $child (@{${$self}{children}}){
+            $self->logger("Indenting child objects on ${$child}{name}") if $is_t_switch_active;
+            $child->indent_children_recursively;
+        }
+    } 
+
+    $self->logger("Replacing ids with begin, body, and end statements:",'heading') if $is_t_switch_active;
+
+    # loop through document children hash
+    while( scalar (@{${$self}{children}}) > 0 ){
+          my $index = 0;
+          # we work through the array *in order*
+          foreach my $child (@{${$self}{children}}){
+            $self->logger("Searching ${$self}{name} for ${$child}{id}...",'heading') if $is_t_switch_active;
+            if(${$self}{body} =~ m/${$child}{id}/s){
+                # we only care if id is first non-white space character 
+                # and if followed by line break 
+                # if m switch is active 
+                my $IDFirstNonWhiteSpaceCharacter = 0;
+                my $IDFollowedImmediatelyByLineBreak = 0;
+
+                # update the above two, if necessary
+                if ($is_m_switch_active){
+                    $IDFirstNonWhiteSpaceCharacter = (${$self}{body} =~ m/^${$child}{id}/m 
+                                                            or 
+                                                         ${$self}{body} =~ m/^\h\h*${$child}{id}/m
+                                                        ) ?1:0;
+                    $IDFollowedImmediatelyByLineBreak = (${$self}{body} =~ m/${$child}{id}\h*\R*/m) ?1:0;
+               }
+
+                # log file info
+                $self->logger("${$child}{id} found!") if($is_t_switch_active);
+                $self->logger("Indenting  ${$child}{name} (id: ${$child}{id})",'heading') if $is_t_switch_active;
+                $self->logger("looking up indentation scheme for ${$child}{name}") if($is_t_switch_active);
+
+                # line break checks *after* <end statement>
+                if (defined ${$child}{EndFinishesWithLineBreak}
+                    and ${$child}{EndFinishesWithLineBreak}==-1 
+                    and $IDFollowedImmediatelyByLineBreak) {
+                    # remove line break *after* <end statement>, if appropriate
+                    my $EndStringLogFile = ${$child}{aliases}{EndFinishesWithLineBreak}||"EndFinishesWithLineBreak";
+                    $self->logger("Removing linebreak after ${$child}{end} (see $EndStringLogFile)") if $is_t_switch_active;
+                    ${$self}{body} =~ s/${$child}{id}(\h*)?(\R|\h)*/${$child}{id}$1/s;
+                    ${$child}{linebreaksAtEnd}{end} = 0;
+                }
+
+                # perform indentation
+                $child->indent;
+
+                # surrounding indentation is now up to date
+                my $surroundingIndentation = (${$child}{surroundingIndentation} and ${$child}{hiddenChildYesNo})
+                                                        ?
+                                             (ref(${$child}{surroundingIndentation}) eq 'SCALAR'?${${$child}{surroundingIndentation}}:${$child}{surroundingIndentation})
+                                                        :q();
+
+                # line break checks before <begin statement>
+                if(defined ${$child}{BeginStartsOnOwnLine}){
+                    my $BeginStringLogFile = ${$child}{aliases}{BeginStartsOnOwnLine}||"BeginStartsOnOwnLine";
+                    if(${$child}{BeginStartsOnOwnLine}>=1 and !$IDFirstNonWhiteSpaceCharacter){
+                        # by default, assume that no trailing comment token is needed
+                        my $trailingCommentToken = q();
+                        if(${$child}{BeginStartsOnOwnLine}==2){
+                            $self->logger("Removing space immediately before ${$child}{id}, in preparation for adding % ($BeginStringLogFile == 2)") if $is_t_switch_active;
+                            ${$self}{body} =~ s/\h*${$child}{id}/${$child}{id}/s;
+                            $self->logger("Adding a % at the end of the line that ${$child}{begin} is on, then a linebreak ($BeginStringLogFile == 2)") if $is_t_switch_active;
+                            $trailingCommentToken = "%".$self->add_comment_symbol;
+                        } else {
+                            $self->logger("Adding a linebreak at the beginning of ${$child}{begin} (see $BeginStringLogFile)") if $is_t_switch_active;
+                        }
+
+                        # the trailing comment/linebreak magic
+                        ${$child}{begin} = "$trailingCommentToken\n".${$child}{begin};
+                        $child->add_surrounding_indentation_to_begin_statement;
+
+                        # remove surrounding indentation ahead of %
+                        ${$child}{begin} =~ s/^(\h*)%/%/ if(${$child}{BeginStartsOnOwnLine}==2);
+                    } elsif (${$child}{BeginStartsOnOwnLine}==-1 and $IDFirstNonWhiteSpaceCharacter){
+                        # important to check we don't move the begin statement next to a blank-line-token
+                        my $blankLineToken = $tokens{blanklines};
+                        if(${$self}{body} !~ m/$blankLineToken\R*\h*${$child}{id}/s){
+                            $self->logger("Removing linebreak before ${$child}{begin} (see $BeginStringLogFile in ${$child}{modifyLineBreaksYamlName} YAML)") if $is_t_switch_active;
+                            ${$self}{body} =~ s/(\h*)(?:\R*|\h*)+${$child}{id}/$1${$child}{id}/s;
+                        } else {
+                            $self->logger("Not removing linebreak ahead of ${$child}{begin}, as blank-line-token present (see preserveBlankLines)") if $is_t_switch_active;
+                        }
+                    }
+                }
+
+                $self->logger(Dumper(\%{$child}),'ttrace') if($is_tt_switch_active);
+
+                # replace ids with body
+                ${$self}{body} =~ s/${$child}{id}/${$child}{begin}${$child}{body}${$child}{end}/;
+
+                # log file info
+                $self->logger("Body (${$self}{name}) now looks like:",'heading') if $is_t_switch_active;
+                $self->logger(${$self}{body}) if($is_t_switch_active);
+
+                # remove element from array: http://stackoverflow.com/questions/174292/what-is-the-best-way-to-delete-a-value-from-an-array-in-perl
+                splice(@{${$self}{children}}, $index, 1);
+
+                # output to the log file
+                $self->logger("deleted child key ${$child}{name} (parent is: ${$self}{name})") if $is_t_switch_active;
+
+                # restart the loop, as the size of the array has changed
+                last;
+              } else {
+                $self->logger("${$child}{id} not found") if($is_t_switch_active);
+              }
+
+              # increment the loop counter
+              $index++;
+            }
+    }
+
+    # logfile info
+    $self->logger("${$self}{name} has this many children:",'heading') if $is_t_switch_active;
+    $self->logger(scalar @{${$self}{children}}) if $is_t_switch_active;
+    $self->logger("Post-processed body (${$self}{name}):") if($is_t_switch_active);
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+
+}
+
+sub add_surrounding_indentation_to_begin_statement{
+    # almost all of the objects add surrounding indentation to the 'begin' statements, 
+    # but some (e.g HEADING) have their own method
+    my $self = shift;
+
+    my $surroundingIndentation = ${$self}{surroundingIndentation};
+    ${$self}{begin} =~ s/^(\h*)?/$surroundingIndentation/mg;  # add indentation
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Item.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Item.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Item.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,149 @@
+package LatexIndent::Item;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_items construct_list_of_items/;
+our $itemCounter;
+our $listOfItems = q();
+our $itemRegExp; 
+
+sub construct_list_of_items{
+    my $self = shift;
+
+    # put together a list of the items
+    while( my ($item,$lookForThisItem)= each %{$masterSettings{itemNames}}){
+        $listOfItems .= ($listOfItems eq "")?"$item":"|$item" if($lookForThisItem);
+    }
+
+    # detail items in the log
+    $self->logger("List of items: $listOfItems (see itemNames)",'heading');
+
+    $itemRegExp = qr/
+                          (
+                              \\($listOfItems)
+                              \h*
+                              (\R*)?
+                          )
+                          (
+                              (?:                 # cluster-only (), don't capture 
+                                  (?!             
+                                      (?:\\(?:$listOfItems)) # cluster-only (), don't capture
+                                  ).              # any character, but not \\$item
+                              )*                 
+                          )                       
+                          (\R)?
+                       /sx;
+    
+
+    return;
+}
+
+sub find_items{
+    # no point carrying on if the list of items is empty
+    return if($listOfItems eq "");
+
+    my $self = shift;
+
+    return unless ${$masterSettings{indentAfterItems}}{${$self}{name}};
+
+    # otherwise loop through the item names
+    $self->logger("Searching for items (see itemNames) in ${$self}{name} (see indentAfterItems)") if $is_t_switch_active;
+    $self->logger(Dumper(\%{$masterSettings{itemNames}})) if $is_t_switch_active;
+
+    while(${$self}{body} =~ m/$itemRegExp\h*($trailingCommentRegExp)?/){
+
+        # log file output
+        $self->logger("Item found: $2",'heading') if $is_t_switch_active;
+
+        ${$self}{body} =~ s/
+                            $itemRegExp(\h*)($trailingCommentRegExp)?
+                           /
+                            # create a new Item object
+                            my $itemObject = LatexIndent::Item->new(begin=>$1,
+                                                                    body=>$4,
+                                                                    end=>q(),
+                                                                    name=>$2,
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$3?1:0,
+                                                                      body=>$5?1:0,
+                                                                    },
+                                                                    aliases=>{
+                                                                      # begin statements
+                                                                      BeginStartsOnOwnLine=>"ItemStartsOnOwnLine",
+                                                                      # body statements
+                                                                      BodyStartsOnOwnLine=>"ItemFinishesWithLineBreak",
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"items",
+                                                                    endImmediatelyFollowedByComment=>$5?0:($7?1:0),
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($itemObject);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($6?$6:q()).($7?$7:q());
+                           /xseg;
+    }
+}
+
+
+sub create_unique_id{
+    my $self = shift;
+
+    $itemCounter++;
+
+    ${$self}{id} = "$tokens{item}$itemCounter";
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # the item body could hoover up line breaks; we do an additional check
+    ${${$self}{linebreaksAtEnd}}{body}=1 if(${$self}{body} =~ m/\R+$/s );
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for headings (part, chapter, section, setc)
+    $self->find_heading;
+    
+    # search for commands with arguments
+    $self->find_commands_or_key_equals_values_braces;
+
+    # search for special begin/end
+    $self->find_special;
+
+}
+
+sub remove_line_breaks_begin{
+    # the \item command can need a trailing white space if the line breaks have been removed after it and
+    # there is no white space
+    my $self = shift;
+    my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine";
+    $self->logger("Removing linebreak at the end of begin (see $BodyStringLogFile)");
+    ${$self}{begin} =~ s/\R*$//sx;
+    ${$self}{begin} .= " " unless(${$self}{begin} =~ m/\h$/s or ${$self}{body} =~ m/^\h/s or ${$self}{body} =~ m/^\R/s );
+    ${$self}{linebreaksAtEnd}{begin} = 0;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,122 @@
+package LatexIndent::KeyEqualsValuesBraces;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_m_switch_active/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Command"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/construct_key_equals_values_regexp $key_equals_values_bracesRegExp $key_equals_values_bracesRegExpTrailingComment/;
+our $key_equals_values_braces_Counter;
+our $key_equals_values_bracesRegExp; 
+our $key_equals_values_bracesRegExpTrailingComment; 
+
+sub construct_key_equals_values_regexp{
+    my $self = shift;
+
+    # grab the arguments regexp
+    my $optAndMandRegExp = $self->get_arguments_regexp;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    # store the regular expresssion for matching and replacing 
+    $key_equals_values_bracesRegExp = qr/
+                  (
+                    (?:
+                       (?:(?<!\\)\{)
+                           |
+                           ,
+                           |
+                       (?:(?<!\\)\[)
+                     )
+                     (?:\h|\R|$blankLineToken|$trailingCommentRegExp)*
+                  )                                                     # $1 pre-key bit: could be { OR , OR [                                 
+                  (\\)?                                                 # $2 possible backslash
+                  (
+                   [a-zA-Z@\*0-9_\/.\h\{\}:\#-]+?                               # lowercase|uppercase letters, @, *, numbers, forward slash, dots
+                  )                                                     # $3 name
+                  (
+                    (?:\h|\R|$blankLineToken|$trailingCommentRegExp)*
+                    =\h*
+                    (?:\d*\:?)
+                  )                                                     # $4 = symbol
+                  (\R*)?                                                # $5 linebreak after =
+                  ($optAndMandRegExp)                                   # $6 opt|mand arguments
+                  (\R)?                                                 # $9 linebreak at end
+                /sx;
+
+    $key_equals_values_bracesRegExpTrailingComment = qr/$key_equals_values_bracesRegExp(\h*)((?:$trailingCommentRegExp\h*)*)?/;
+}
+
+sub indent_begin{
+    my $self = shift;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    if(${$self}{begin} =~ /\R=/s or ${$self}{begin} =~ /$blankLineToken\h*=/s ){
+        $self->logger("= found on own line in ${$self}{name}, adding indentation") if $is_t_switch_active;
+        ${$self}{begin} =~ s/=/${$self}{indentation}=/s;
+    }
+}
+
+sub check_linebreaks_before_equals{
+    # check if -m switch is active
+    return unless $is_m_switch_active;
+    
+    my $self = shift;
+
+    # linebreaks *infront* of = symbol
+    if(${$self}{begin} =~ /\R\h*=/s){
+          if(defined ${$self}{EqualsStartsOnOwnLine} and ${$self}{EqualsStartsOnOwnLine}==-1){
+            $self->logger("Removing linebreak before = symbol in ${$self}{name} (see EqualsStartsOnOwnLine)") if $is_t_switch_active;
+            ${$self}{begin} =~ s/(\R|\h)*=/=/s;
+          }
+    } else {
+      if(defined ${$self}{EqualsStartsOnOwnLine} and ${$self}{EqualsStartsOnOwnLine}==1){
+            $self->logger("Adding a linebreak before = symbol for ${$self}{name} (see EqualsStartsOnOwnLine)") if $is_t_switch_active;
+            ${$self}{begin} =~ s/=/\n=/s;
+      } elsif(defined ${$self}{EqualsStartsOnOwnLine} and ${$self}{EqualsStartsOnOwnLine}==2){
+            $self->logger("Adding a % linebreak immediately before = symbol for ${$self}{name} (see EqualsStartsOnOwnLine)") if $is_t_switch_active;
+            ${$self}{begin} =~ s/\h*=/%\n=/s;
+      }
+    }
+    return;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $key_equals_values_braces_Counter++;
+    ${$self}{id} = "$tokens{key_equals_values_braces}$key_equals_values_braces_Counter";
+    return;
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text for a key = {value} needes to accomodate the leading [ OR { OR % OR , OR any combination thereof
+    $self->logger("Custom replacement text routine for ${$self}{name}") if $is_t_switch_active;
+    ${$self}{replacementText} = ${$self}{beginningbit}.${$self}{id};
+    delete ${$self}{beginningbit};
+}
+
+1;


Property changes on: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/KeyEqualsValuesBraces.pm
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/LogFile.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,166 @@
+package LatexIndent::LogFile;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/%switches/;
+use FindBin; 
+use File::Basename; # to get the filename and directory path
+use Exporter qw/import/;
+our @EXPORT_OK = qw/logger output_logfile processSwitches/;
+our @logFileNotes;
+
+# log file methods
+# log file methods
+# log file methods
+#   reference: http://stackoverflow.com/questions/6736998/help-calling-a-sub-routine-from-a-perl-module-and-printing-to-logfile
+
+sub logger{
+    shift;
+    my $line = shift;
+    my $infoLevel = shift;
+    push(@logFileNotes,{line=>$line,level=>$infoLevel?$infoLevel:'default'});
+    return
+}
+
+sub processSwitches{
+    my $self = shift;
+
+    # details of the script to log file
+    $self->logger("$FindBin::Script version 3.0, a script to indent .tex files",'heading');
+    $self->logger("$FindBin::Script lives here: $FindBin::RealBin/");
+
+    # time the script is used
+    my $time = localtime();
+    $self->logger("$time");
+
+    if(scalar(@ARGV) < 1 or $switches{showhelp}) {
+    print <<ENDQUOTE
+latexindent.pl version 3.0
+usage: latexindent.pl [options] [file][.tex|.sty|.cls|.bib|...]
+      -h, --help
+          help (see the documentation for detailed instructions and examples)
+      -o, --outputfile
+          output to another file; sample usage:
+                latexindent.pl -o outputfile.tex myfile.tex 
+                latexindent.pl -o=outputfile.tex myfile.tex 
+      -w, --overwrite
+          overwrite the current file; a backup will be made, but still be careful
+      -s, --silent
+          silent mode: no output will be given to the terminal
+      -t, --trace
+          tracing mode: verbose information given to the log file
+      -l, --local[=myyaml.yaml]
+          use localSettings.yaml (assuming it exists in the directory of your file);
+          alternatively, use myyaml.yaml, if it exists; sample usage:
+                latexindent.pl -l some.yaml myfile.tex 
+                latexindent.pl -l=another.yaml myfile.tex 
+                latexindent.pl -l=some.yaml,another.yaml myfile.tex 
+      -d, --onlydefault
+          ONLY use defaultSettings.yaml, ignore ALL (yaml) user files
+      -g, --logfile
+          used to specify the name of logfile (default is indent.log)
+      -c, --cruft=<cruft directory> 
+          used to specify the location of backup files and indent.log
+      -m, --modifylinebreaks
+          modify linebreaks before, during, and at the end of code blocks; 
+          trailing comments can also be added using this feature
+ENDQUOTE
+    ;
+    exit(2);
+}
+
+    # log the switches from the user
+    $self->logger('Processing switches','heading');
+
+    # check on the trace mode switch (should be turned on if ttrace mode active)
+    $switches{trace} = $switches{ttrace} ?  1 : $switches{trace};
+
+    # output details of switches
+    $self->logger('-t|--trace: Trace mode active (you have used either -t or --trace)') if($switches{trace} and !$switches{ttrace});
+    $self->logger('-tt|--ttrace: TTrace mode active (you have used either -tt or --ttrace)') if($switches{tracingModeVeryDetailed});
+    $self->logger('-s|--silent: Silent mode active (you have used either -s or --silent)') if($switches{silentMode});
+    $self->logger('-d|--onlydefault: Only defaultSettings.yaml will be used (you have used either -d or --onlydefault)') if($switches{onlyDefault});
+    $self->logger("-w|--overwrite: Overwrite mode active, will make a back up of ${$self}{fileName} first") if($switches{overwrite});
+    $self->logger("-l|--localSettings: Read localSettings YAML file") if($switches{readLocalSettings});
+    $self->logger("-o|--outputfile: output to file") if($switches{outputToFile});
+    $self->logger("-m|--modifylinebreaks: modify line breaks") if($switches{modifyLineBreaks});
+    $self->logger("-g|--logfile: logfile name") if($switches{logFileName});
+    $self->logger("-c|--cruft: cruft directory") if($switches{cruftDirectory});
+
+    # check if overwrite and outputfile are active similtaneously
+    if($switches{overwrite} and $switches{outputToFile}){
+        $self->logger("Options check",'heading');
+        $self->logger("You have called latexindent.pl with both -o and -w");
+        $self->logger("-o (output to file) will take priority, and -w (over write) will be ignored");
+        $switches{overwrite}=0;
+    }
+
+    # cruft directory
+    ${$self}{cruftDirectory} = $switches{cruftDirectory}||(dirname ${$self}{fileName});
+    die "Could not find directory ${$self}{cruftDirectory}\nExiting, no indentation done." if(!(-d ${$self}{cruftDirectory}));
+    my $logfileName = $switches{logFileName}||"indent.log";
+    $self->logger("Directory for backup files and $logfileName: ${$self}{cruftDirectory}",'heading');
+
+    # output location of modules
+    if($FindBin::Script eq 'latexindent.pl' or ($FindBin::Script eq 'latexindent.exe' and $switches{trace} )) {
+        my @listOfModules = ('FindBin', 'YAML::Tiny', 'File::Copy', 'File::Basename', 'Getopt::Long','File::HomeDir');
+        $self->logger("Perl modules are being loaded from the following directories:",'heading');
+        foreach my $moduleName (@listOfModules) {
+                (my $file = $moduleName) =~ s|::|/|g;
+                require $file . '.pm';
+                $self->logger($INC{$file .'.pm'});
+              }
+        $self->logger("Latex Indent perl modules are being loaded from, for example:",'heading');
+                (my $file = 'LatexIndent::Document') =~ s|::|/|g;
+                require $file . '.pm';
+                $self->logger($INC{$file .'.pm'});
+    }
+    return;
+}
+
+sub output_logfile{
+  my $self = shift;
+  my $logfile;
+  my $logfileName = $switches{logFileName}||"indent.log";
+
+  open($logfile,">","${$self}{cruftDirectory}/$logfileName") or die "Can't open $logfileName";
+
+  # put the final line in the logfile
+  $self->logger("${$masterSettings{logFilePreferences}}{endLogFileWith}",'heading');
+
+  # github info line
+  $self->logger("Please direct all communication/issues to: ",'heading') if ${$masterSettings{logFilePreferences}}{showGitHubInfoFooter};
+  $self->logger("https://github.com/cmhughes/latexindent.pl") if ${$masterSettings{logFilePreferences}}{showGitHubInfoFooter};
+
+  # output the logfile
+  foreach my $line (@logFileNotes){
+        if(${$line}{level} eq 'heading'){
+            print $logfile ${$line}{line},"\n";
+          } elsif(${$line}{level} eq 'default') {
+            # add tabs to the beginning of lines 
+            # for default logfile lines
+            ${$line}{line} =~ s/^/\t/mg;
+            print $logfile ${$line}{line},"\n";
+          } 
+  }
+
+  close($logfile);
+}
+
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/MandatoryArgument.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,130 @@
+package LatexIndent::MandatoryArgument;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_mandatory_arguments get_mand_arg_reg_exp/;
+our $mandatoryArgumentCounter;
+
+sub find_mandatory_arguments{
+    my $self = shift;
+
+    my $mandArgRegExp = $self->get_mand_arg_reg_exp;
+
+    # pick out the mandatory arguments
+    while(${$self}{body} =~ m/$mandArgRegExp\h*($trailingCommentRegExp)*(.*)/s){
+        # log file output
+        $self->logger("Mandatory argument found, body in ${$self}{name}",'heading') if $is_t_switch_active;
+        $self->logger("(last argument)") if($9 eq '' and $is_t_switch_active);
+
+        ${$self}{body} =~ s/
+                            $mandArgRegExp(\h*)($trailingCommentRegExp)*(.*)
+                           /
+                            # create a new Mandatory Argument object
+                            my $mandatoryArg = LatexIndent::MandatoryArgument->new(begin=>$1,
+                                                                    name=>${$self}{name}.":mandatoryArgument",
+                                                                    nameForIndentationSettings=>${$self}{parent},
+                                                                    parent=>${$self}{parent},
+                                                                    body=>$3.($4?$4:q()),
+                                                                    end=>$5,
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$2?1:0,
+                                                                      body=>$4?1:0,
+                                                                      end=>$7?1:0,
+                                                                    },
+                                                                    aliases=>{
+                                                                      # begin statements
+                                                                      BeginStartsOnOwnLine=>"LCuBStartsOnOwnLine",
+                                                                      # body statements
+                                                                      BodyStartsOnOwnLine=>"MandArgBodyStartsOnOwnLine",
+                                                                      # end statements
+                                                                      EndStartsOnOwnLine=>"RCuBStartsOnOwnLine",
+                                                                      # after end statements
+                                                                      EndFinishesWithLineBreak=>"RCuBFinishesWithLineBreak",
+                                                                    },
+                                                                    horizontalTrailingSpace=>$6?$6:q(),
+                                                                    modifyLineBreaksYamlName=>"mandatoryArguments",
+                                                                    # the last argument (determined by $10 eq '') needs information from the argument container object
+                                                                    endImmediatelyFollowedByComment=>($10 eq '')?${$self}{endImmediatelyFollowedByComment}:($9?1:0),
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($mandatoryArg);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($8?$8:q()).($9?$9:q()).($10?$10:q());
+                            /xseg;
+    $self->wrap_up_tasks;
+        }
+  }
+
+sub create_unique_id{
+    my $self = shift;
+
+    $mandatoryArgumentCounter++;
+    ${$self}{id} = "$tokens{mandatoryArgument}$mandatoryArgumentCounter";
+    return;
+}
+
+sub get_mand_arg_reg_exp{
+
+    my $mandArgRegExp = qr/      
+                                   (?<!\\)     # not immediately pre-ceeded by \
+                                   (
+                                    \{
+                                       \h*
+                                       (\R*)   # linebreaks after { into $2
+                                   )           # { captured into $1
+                                   (
+                                       (?:
+                                           (?!
+                                               (?:(?<!\\)\{) 
+                                           ).
+                                       )*?     # not including {, but \{ ok
+                                   )            # body into $3
+                                   (\R*)       # linebreaks after body into $4
+                                   (?<!\\)     # not immediately pre-ceeded by \
+                                   (
+                                    \}         # {mandatory arguments}
+                                   )           # } into $5
+                                   (\h*)
+                                   (\R)?       # linebreaks after } into $6
+                               /sx;
+
+    return $mandArgRegExp;
+}
+
+sub get_object_attribute_for_indentation_settings{
+    my $self = shift;
+    
+    return ${$self}{modifyLineBreaksYamlName};
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for special begin/end
+    $self->find_special;
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/ModifyLineBreaks.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,174 @@
+package LatexIndent::ModifyLineBreaks;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use Data::Dumper;
+use Exporter qw/import/;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+our @EXPORT_OK = qw/modify_line_breaks_body modify_line_breaks_end adjust_line_breaks_end_parent remove_line_breaks_begin/;
+our @allObjects;
+
+sub modify_line_breaks_body{
+    my $self = shift;
+
+    # add a line break after \begin{statement} if appropriate
+    if(defined ${$self}{BodyStartsOnOwnLine}){
+      my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine";
+      if(${$self}{BodyStartsOnOwnLine}>=1 and !${$self}{linebreaksAtEnd}{begin}){
+          if(${$self}{BodyStartsOnOwnLine}==1){
+            # modify the begin statement
+            $self->logger("Adding a linebreak at the end of begin, ${$self}{begin} (see $BodyStringLogFile)") if $is_t_switch_active;
+            ${$self}{begin} .= "\n";       
+            ${$self}{linebreaksAtEnd}{begin} = 1;
+            $self->logger("Removing leading space from body of ${$self}{name} (see $BodyStringLogFile)") if $is_t_switch_active;
+            ${$self}{body} =~ s/^\h*//;       
+          } elsif(${$self}{BodyStartsOnOwnLine}==2){
+            # by default, assume that no trailing comment token is needed
+            my $trailingCommentToken = q();
+            if(${$self}{body} !~ m/^\h*$trailingCommentRegExp/s){
+                # modify the begin statement
+                $self->logger("Adding a % at the end of begin, ${$self}{begin}, followed by a linebreak ($BodyStringLogFile == 2)") if $is_t_switch_active;
+                $trailingCommentToken = "%".$self->add_comment_symbol;
+                ${$self}{begin} =~ s/\h*$//;       
+                ${$self}{begin} .= "$trailingCommentToken\n";       
+                ${$self}{linebreaksAtEnd}{begin} = 1;
+                $self->logger("Removing leading space from body of ${$self}{name} (see $BodyStringLogFile)") if $is_t_switch_active;
+                ${$self}{body} =~ s/^\h*//;       
+            } else {
+                $self->logger("Even though $BodyStringLogFile == 2, ${$self}{begin} already finishes with a %, so not adding another.") if $is_t_switch_active;
+            }
+          } 
+       } elsif (${$self}{BodyStartsOnOwnLine}==-1 and ${$self}{linebreaksAtEnd}{begin}){
+          # remove line break *after* begin, if appropriate
+          $self->remove_line_breaks_begin;
+       }
+    }
+  }
+
+sub remove_line_breaks_begin{
+    my $self = shift;
+    my $BodyStringLogFile = ${$self}{aliases}{BodyStartsOnOwnLine}||"BodyStartsOnOwnLine";
+    $self->logger("Removing linebreak at the end of begin (see $BodyStringLogFile)") if $is_t_switch_active;
+    ${$self}{begin} =~ s/\R*$//sx;
+    ${$self}{linebreaksAtEnd}{begin} = 0;
+}
+
+sub modify_line_breaks_end{
+    my $self = shift;
+
+    # possibly modify line break *before* \end{statement}
+    if(defined ${$self}{EndStartsOnOwnLine}){
+          my $EndStringLogFile = ${$self}{aliases}{EndStartsOnOwnLine}||"EndStartsOnOwnLine";
+          if(${$self}{EndStartsOnOwnLine}>=1 and !${$self}{linebreaksAtEnd}{body}){
+              # add a line break after body, if appropriate
+              $self->logger("Adding a linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active;
+
+              # by default, assume that no trailing comment token is needed
+              my $trailingCommentToken = q();
+              if(${$self}{EndStartsOnOwnLine}==2){
+                $self->logger("Adding a % immediately after body of ${$self}{name} ($EndStringLogFile==2)") if $is_t_switch_active;
+                $trailingCommentToken = "%".$self->add_comment_symbol;
+                ${$self}{body} =~ s/\h*$//s;
+              }
+              
+              # modified end statement
+              if(${$self}{body} =~ m/^\h*$/s and ${$self}{BodyStartsOnOwnLine} >=1 ){
+                ${$self}{linebreaksAtEnd}{body} = 0;
+              } else {
+                ${$self}{body} .= "$trailingCommentToken\n";
+                ${$self}{linebreaksAtEnd}{body} = 1;
+              }
+          } elsif (${$self}{EndStartsOnOwnLine}==-1 and ${$self}{linebreaksAtEnd}{body}){
+              # remove line break *after* body, if appropriate
+
+              # check to see that body does *not* finish with blank-line-token, 
+              # if so, then don't remove that final line break
+              if(${$self}{body} !~ m/$tokens{blanklines}$/s){
+                $self->logger("Removing linebreak at the end of body (see $EndStringLogFile)") if $is_t_switch_active;
+                ${$self}{body} =~ s/\R*$//sx;
+                ${$self}{linebreaksAtEnd}{body} = 0;
+              } else {
+                $self->logger("Blank line token found at end of body (${$self}{name}), see preserveBlankLines, not removing line break before ${$self}{end}") if $is_t_switch_active;
+              }
+          }
+    }
+
+    # possibly modify line break *after* \end{statement}
+    if(defined ${$self}{EndFinishesWithLineBreak}
+       and ${$self}{EndFinishesWithLineBreak}>=1 
+       and !${$self}{linebreaksAtEnd}{end}){
+              my $EndStringLogFile = ${$self}{aliases}{EndFinishesWithLineBreak}||"EndFinishesWithLineBreak";
+              if(${$self}{EndFinishesWithLineBreak}==1){
+                $self->logger("Adding a linebreak at the end of ${$self}{end} (see $EndStringLogFile)") if $is_t_switch_active;
+                ${$self}{linebreaksAtEnd}{end} = 1;
+
+                # modified end statement
+                ${$self}{replacementText} .= "\n";
+              } elsif(${$self}{EndFinishesWithLineBreak}==2){
+                if(${$self}{endImmediatelyFollowedByComment}){
+                  # no need to add a % if one already exists
+                  $self->logger("Even though $EndStringLogFile == 2, ${$self}{end} is immediately followed by a %, so not adding another; not adding line break.") if $is_t_switch_active;
+                } else {
+                  # otherwise, create a trailing comment, and tack it on 
+                  $self->logger("Adding a % immediately after, ${$self}{end} ($EndStringLogFile==2)") if $is_t_switch_active;
+                  my $trailingCommentToken = "%".$self->add_comment_symbol;
+                  ${$self}{end} =~ s/\h*$//s;
+                  ${$self}{replacementText} .= "$trailingCommentToken\n";
+                  ${$self}{linebreaksAtEnd}{end} = 1;
+                }
+              }
+    }
+
+}
+
+sub adjust_line_breaks_end_parent{
+    # when a parent object contains a child object, the line break
+    # at the end of the parent object can become messy
+    return unless $is_m_switch_active;
+
+    my $self = shift;
+
+    # most recent child object
+    my $child = @{${$self}{children}}[-1];
+
+    # adjust parent linebreaks information
+    if(${$child}{linebreaksAtEnd}{end} and ${$self}{body} =~ m/${$child}{replacementText}\h*\R*$/s and !${$self}{linebreaksAtEnd}{body}){
+        $self->logger("ID: ${$child}{id}") if($is_t_switch_active);
+        $self->logger("${$child}{begin}...${$child}{end} is found at the END of body of parent, ${$self}{name}, avoiding a double line break:") if($is_t_switch_active);
+        $self->logger("adjusting ${$self}{name} linebreaksAtEnd{body} to be 1") if($is_t_switch_active);
+        ${$self}{linebreaksAtEnd}{body}=1;
+      }
+
+    # the modify line switch can adjust line breaks, so we need another check, 
+    # see for example, test-cases/environments/environments-remove-line-breaks-trailing-comments.tex
+    if(defined ${$child}{linebreaksAtEnd}{body} 
+        and !${$child}{linebreaksAtEnd}{body} 
+        and ${$child}{body} =~ m/\R(?:$trailingCommentRegExp\h*)?$/s ){
+        # log file information
+        $self->logger("Undisclosed line break at the end of body of ${$child}{name}: '${$child}{end}'") if($is_t_switch_active);
+        $self->logger("Adding a linebreak at the end of body for ${$child}{id}") if($is_t_switch_active);
+        
+        # make the adjustments
+        ${$child}{body} .= "\n";
+        ${$child}{linebreaksAtEnd}{body}=1;
+    }
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,71 @@
+package LatexIndent::NamedGroupingBracesBrackets;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Command"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/construct_grouping_braces_brackets_regexp $grouping_braces_regexp $grouping_braces_regexpTrailingComment/;
+our $groupingBracesCounter;
+our $grouping_braces_regexp; 
+our $grouping_braces_regexpTrailingComment; 
+
+sub construct_grouping_braces_brackets_regexp{
+    my $self = shift;
+
+    # grab the arguments regexp
+    my $optAndMandRegExp = $self->get_arguments_regexp;
+
+    # store the regular expresssion for matching and replacing 
+    $grouping_braces_regexp = qr/
+                  (
+                     \h|\R|\{|\[|\$|\)
+                  )
+                  (
+                   [0-9a-zA-Z@\*><]+?  # lowercase|uppercase letters, @, *, numbers, forward slash, dots
+                  )                    # $2 name
+                  (\h*)                # $3 h-space
+                  (\R*)                # $4 linebreaks
+                  ($optAndMandRegExp)  # $5 mand|opt arguments (at least one)
+                  (\R)?                # $8 linebreak 
+                /sx;
+
+    # something {value} grouping braces with trailing comment
+    $grouping_braces_regexpTrailingComment = qr/$grouping_braces_regexp\h*((?:$trailingCommentRegExp\h*)*)?/;
+
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $groupingBracesCounter++;
+    ${$self}{id} = "$tokens{groupingBraces}$groupingBracesCounter";
+    return;
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text for a key = {value} needes to accomodate the leading [ OR { OR % OR , OR any combination thereof
+    $self->logger("Custom replacement text routine for ${$self}{name}") if $is_t_switch_active;
+    ${$self}{replacementText} = ${$self}{beginningbit}.${$self}{id};
+    delete ${$self}{beginningbit};
+}
+
+1;


Property changes on: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/NamedGroupingBracesBrackets.pm
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/OptionalArgument.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,115 @@
+package LatexIndent::OptionalArgument;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_optional_arguments/;
+our $optionalArgumentCounter;
+our $optArgRegExp = qr/      
+                               (?<!\\)     # not immediately pre-ceeded by \
+                               (
+                                \[
+                                   \h*
+                                   (\R*)
+                               )
+                               (.*?)
+                               (\R*)
+                               (?<!\\)     # not immediately pre-ceeded by \
+                               (
+                                \]          # [optional arguments]
+                               )
+                               (\h*)
+                               (\R)?
+                           /sx;
+
+sub find_optional_arguments{
+    my $self = shift;
+
+    # pick out the optional arguments
+    while(${$self}{body} =~ m/$optArgRegExp\h*($trailingCommentRegExp)*(.*)/s){
+        # log file output
+        $self->logger("Optional argument found, body in ${$self}{name}",'heading') if $is_t_switch_active;
+        $self->logger("(last argument)") if($9 eq '' and $is_t_switch_active);
+
+        ${$self}{body} =~ s/
+                            $optArgRegExp(\h*)($trailingCommentRegExp)*(.*)
+                           /
+                            # create a new Optional Argument object
+                            my $optionalArg = LatexIndent::OptionalArgument->new(begin=>$1,
+                                                                    name=>${$self}{name}.":optionalArgument",
+                                                                    nameForIndentationSettings=>${$self}{parent},
+                                                                    parent=>${$self}{parent},
+                                                                    body=>$3.($4?$4:q()),
+                                                                    end=>$5,
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$2?1:0,
+                                                                      body=>$4?1:0,
+                                                                      end=>$7?1:0,
+                                                                    },
+                                                                    aliases=>{
+                                                                      # begin statements
+                                                                      BeginStartsOnOwnLine=>"LSqBStartsOnOwnLine",
+                                                                      # body statements
+                                                                      BodyStartsOnOwnLine=>"OptArgBodyStartsOnOwnLine",
+                                                                      # end statements
+                                                                      EndStartsOnOwnLine=>"RSqBStartsOnOwnLine",
+                                                                      # after end statements
+                                                                      EndFinishesWithLineBreak=>"RSqBFinishesWithLineBreak",
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"optionalArguments",
+                                                                    # the last argument (determined by $10 eq '') needs information from the argument container object
+                                                                    endImmediatelyFollowedByComment=>($10 eq '')?${$self}{endImmediatelyFollowedByComment}:($9?1:0),
+                                                                    horizontalTrailingSpace=>$6?$6:q(),
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($optionalArg);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($8?$8:q()).($9?$9:q()).($10?$10:q());
+                            /xseg;
+        }
+  }
+
+sub get_object_attribute_for_indentation_settings{
+    my $self = shift;
+    
+    return ${$self}{modifyLineBreaksYamlName};
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $optionalArgumentCounter++;
+    ${$self}{id} = "$tokens{optionalArgument}$optionalArgumentCounter";
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for special begin/end
+    $self->find_special;
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Preamble.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Preamble.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Preamble.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,64 @@
+package LatexIndent::Preamble;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our $preambleCounter;
+
+sub create_unique_id{
+    my $self = shift;
+
+    $preambleCounter++;
+    ${$self}{id} = "$tokens{preamble}$preambleCounter$tokens{endOfToken}";
+    return;
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text for preamble needs to put the \\begin{document} back in
+    $self->logger("Custom replacement text routine for preamble ${$self}{name}");
+    ${$self}{replacementText} = ${$self}{id}.${$self}{afterbit};
+    delete ${$self}{afterbit};
+}
+
+sub indent{
+    # preamble doesn't receive any additional indentation
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    my $self = shift;
+
+    # search for environments
+    $self->find_environments;
+
+    # search for ifElseFi blocks
+    $self->find_ifelsefi;
+
+    # search for commands with arguments
+    $self->find_commands_or_key_equals_values_braces if(!$masterSettings{preambleCommandsBeforeEnvironments});
+
+    # search for special begin/end
+    $self->find_special;
+
+
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/RoundBrackets.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/RoundBrackets.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/RoundBrackets.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,100 @@
+package LatexIndent::RoundBrackets;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_round_brackets/;
+our $roundBracketCounter;
+our $roundBracketRegExp = qr/      
+                           (?<!\\)
+                           (
+                               \(
+                              \h*
+                              (\R*)
+                           )
+                            (.*?)
+                            (\R*)
+                            (?<!\\)     # not immediately pre-ceeded by \
+                            (
+                             \)          # [optional arguments]
+                            )
+                            (\h*)
+                            (\R)?
+                           /sx;
+
+sub indent{
+    return;
+}
+
+sub find_round_brackets{
+    my $self = shift;
+
+    # pick out the optional arguments
+    while(${$self}{body} =~ m/$roundBracketRegExp\h*($trailingCommentRegExp)*(.*)/s){
+        # log file output
+
+        ${$self}{body} =~ s/
+                            $roundBracketRegExp(\h*)($trailingCommentRegExp)*(.*)
+                           /
+                            # create a new Optional Argument object
+                            my $roundBracket = LatexIndent::RoundBrackets->new(begin=>$1,
+                                                                    name=>${$self}{name}.":roundBracket",
+                                                                    nameForIndentationSettings=>${$self}{parent},
+                                                                    parent=>${$self}{parent},
+                                                                    body=>$3.($4?$4:q()),
+                                                                    end=>$5,
+                                                                    linebreaksAtEnd=>{
+                                                                      begin=>$2?1:0,
+                                                                      body=>$4?1:0,
+                                                                      end=>$7?1:0,
+                                                                    },
+                                                                    modifyLineBreaksYamlName=>"roundBracket",
+                                                                    # the last argument (determined by $10 eq '') needs information from the argument container object
+                                                                    endImmediatelyFollowedByComment=>($10 eq '')?${$self}{endImmediatelyFollowedByComment}:($9?1:0),
+                                                                    horizontalTrailingSpace=>$6?$6:q(),
+                                                                  );
+
+                            # the settings and storage of most objects has a lot in common
+                            $self->get_settings_and_store_new_object($roundBracket);
+                            ${@{${$self}{children}}[-1]}{replacementText}.($8?$8:q()).($9?$9:q()).($10?$10:q());
+                            /xseg;
+        }
+  }
+
+sub get_object_attribute_for_indentation_settings{
+    my $self = shift;
+    
+    return ${$self}{modifyLineBreaksYamlName};
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $roundBracketCounter++;
+    ${$self}{id} = "$tokens{roundBracket}$roundBracketCounter";
+    return;
+}
+
+sub tasks_particular_to_each_object{
+    return;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Special.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Special.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Special.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,184 @@
+package LatexIndent::Special;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/find_special construct_special_begin/;
+our $specialCounter;
+our $specialBegins = q();
+our $specialAllMatchesRegExp = q();
+our %individualSpecialRegExps;
+
+sub construct_special_begin{
+    my $self = shift;
+
+    # put together a list of the begin terms in special
+    while( my ($specialName,$BeginEnd)= each %{$masterSettings{specialBeginEnd}}){
+      # only append the regexps if lookForThis is 1
+      $specialBegins .= ($specialBegins eq ""?q():"|").${$BeginEnd}{begin} if(${$BeginEnd}{lookForThis});
+    }
+
+    # put together a list of the begin terms in special
+    while( my ($specialName,$BeginEnd)= each %{$masterSettings{specialBeginEnd}}){
+
+      # only append the regexps if lookForThis is 1
+      if(${$BeginEnd}{lookForThis}){
+        # the beginning parts
+        $specialBegins .= ($specialBegins eq ""?q():"|").${$BeginEnd}{begin};
+
+        # the overall regexp
+        $specialAllMatchesRegExp .= ($specialAllMatchesRegExp eq ""?q():"|")
+                                    .qr/
+                                    ${$BeginEnd}{begin}
+                                    (?:                        # cluster-only (), don't capture 
+                                        (?!             
+                                            (?:$specialBegins) # cluster-only (), don't capture
+                                        ).                     # any character, but not anything in $specialBegins
+                                    )*?                 
+                                    ${$BeginEnd}{end}
+                             /sx;
+
+        # store the individual special regexp
+        $individualSpecialRegExps{$specialName} = qr/
+                                  (
+                                      ${$BeginEnd}{begin}
+                                      \h*
+                                      (\R*)?
+                                  )
+                                  (
+                                      (?:                        # cluster-only (), don't capture 
+                                          (?!             
+                                              (?:$specialBegins) # cluster-only (), don't capture
+                                          ).                     # any character, but not anything in $specialBegins
+                                      )*?                 
+                                     (\R*)?
+                                  )                       
+                                  (
+                                    ${$BeginEnd}{end}
+                                  )
+                                  (\h*)
+                                  (\R)?
+                               /sx
+
+        } else {
+            $self->logger("The special regexps won't include anything from $specialName (see lookForThis)",'heading') if $is_t_switch_active ;
+        }
+    }
+
+    # move $$ to the beginning
+    if($specialBegins =~ m/\|\\\$\\\$/){
+      $specialBegins =~ s/\|(\\\$\\\$)//;
+      $specialBegins = $1."|".$specialBegins; 
+    }
+
+    # info to the log file
+    $self->logger("The special beginnings regexp is: $specialBegins (see specialBeginEnd)",'heading') if $is_t_switch_active;
+
+    # overall special regexp
+    $self->logger("The overall special regexp is: $specialAllMatchesRegExp(see specialBeginEnd)",'heading') if $is_t_switch_active;
+
+  }
+
+sub find_special{
+    my $self = shift;
+
+    # no point carrying on if the list of specials is empty
+    return if($specialBegins eq "");
+
+    # otherwise loop through the special begin/end
+    $self->logger("Searching for special begin/end (see specialBeginEnd)") if $is_t_switch_active ;
+    $self->logger(Dumper(\%{$masterSettings{specialBeginEnd}})) if $is_tt_switch_active;
+
+    # keep looping as long as there is a special match of some kind
+    while(${$self}{body} =~ m/$specialAllMatchesRegExp/sx){
+
+        # loop through each special match
+        while( my ($specialName,$BeginEnd)= each %{$masterSettings{specialBeginEnd}}){
+
+            # log file
+            if(${$BeginEnd}{lookForThis}){
+                $self->logger("Looking for $specialName",'heading') if $is_t_switch_active ;
+            } else {
+                $self->logger("Not looking for $specialName (see lookForThis)",'heading') if $is_t_switch_active ;
+                next;
+            }
+
+            # the regexp
+            my $specialRegExp = $individualSpecialRegExps{$specialName};
+            
+            while(${$self}{body} =~ m/$specialRegExp(\h*)($trailingCommentRegExp)?/){
+
+                # global substitution
+                ${$self}{body} =~ s/
+                                    $specialRegExp(\h*)($trailingCommentRegExp)?
+                                   /
+                                    # log file output
+                                    $self->logger("special found: $specialName",'heading') if $is_t_switch_active;
+
+                                    # create a new special object
+                                    my $specialObject = LatexIndent::Special->new(begin=>$1,
+                                                                            body=>$3,
+                                                                            end=>$5,
+                                                                            name=>$specialName,
+                                                                            linebreaksAtEnd=>{
+                                                                              begin=>$2?1:0,
+                                                                              body=>$4?1:0,
+                                                                              end=>$7?1:0,
+                                                                            },
+                                                                            aliases=>{
+                                                                              # begin statements
+                                                                              BeginStartsOnOwnLine=>"SpecialBeginStartsOnOwnLine",
+                                                                              # body statements
+                                                                              BodyStartsOnOwnLine=>"SpecialBodyStartsOnOwnLine",
+                                                                              # end statements
+                                                                              EndStartsOnOwnLine=>"SpecialEndStartsOnOwnLine",
+                                                                              # after end statements
+                                                                              EndFinishesWithLineBreak=>"SpecialEndFinishesWithLineBreak",
+                                                                            },
+                                                                            modifyLineBreaksYamlName=>"specialBeginEnd",
+                                                                            endImmediatelyFollowedByComment=>$7?0:($9?1:0),
+                                                                            horizontalTrailingSpace=>$6?$6:q(),
+                                                                          );
+
+                                    # the settings and storage of most objects has a lot in common
+                                    $self->get_settings_and_store_new_object($specialObject);
+                                    ${@{${$self}{children}}[-1]}{replacementText}.($8?$8:q()).($9?$9:q());
+                                    /xseg;
+
+    $self->wrap_up_tasks;
+            }
+         }
+     }
+}
+
+
+sub create_unique_id{
+    my $self = shift;
+
+    $specialCounter++;
+
+    ${$self}{id} = "$tokens{special}$specialCounter";
+    return;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Switches.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,37 @@
+package LatexIndent::Switches;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/%switches storeSwitches $is_m_switch_active $is_t_switch_active $is_tt_switch_active/;
+our %switches;
+our $is_m_switch_active;
+our $is_t_switch_active;
+our $is_tt_switch_active;
+
+sub storeSwitches{
+    my $self = shift;
+
+    # copy document switches into hash local to this module
+	%switches = %{${$self}{switches}};
+    $is_m_switch_active = defined $switches{modifyLineBreaks}?$switches{modifyLineBreaks}: 0;
+    $is_t_switch_active = defined $switches{trace}?$switches{trace}: 0;
+    $is_tt_switch_active = defined $switches{ttrace}?$switches{ttrace}: 0;
+    $is_t_switch_active = $is_tt_switch_active ? $is_tt_switch_active : $is_t_switch_active;
+    delete ${$self}{switches};
+  }
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Tokens.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Tokens.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Tokens.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,68 @@
+package LatexIndent::Tokens;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use Exporter qw/import/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+our @EXPORT_OK = qw/token_check %tokens/;
+
+# each of the tokens begins the same way -- this is exploited during the hidden Children routine
+my $beginningToken = "LTXIN-TK-";
+my $ifelsefiSpecial = "!-!";
+
+# the %tokens hash is passed around many modules
+our %tokens = (
+                environment=>$beginningToken."ENVIRONMENT",
+                ifelsefiSpecial=>$ifelsefiSpecial,
+                ifelsefi=>$ifelsefiSpecial.$beginningToken."IFELSEFI", 
+                item=>$beginningToken."ITEMS",
+                trailingComment=>"latexindenttrailingcomment", 
+                blanklines=>$beginningToken."blank-line",
+                arguments=>$beginningToken."ARGUMENTS",
+                optionalArgument=>$beginningToken."OPTIONAL-ARGUMENT",
+                mandatoryArgument=>$beginningToken."MANDATORY-ARGUMENT",
+                roundBracket=>$beginningToken."ROUND-BRACKET",
+                verbatim=>$beginningToken."VERBATIM",
+                command=>$beginningToken."COMMAND",
+                key_equals_values_braces=>$beginningToken."KEY-VALUE-BRACES",
+                groupingBraces=>$beginningToken."GROUPING-BRACES",
+                unNamedgroupingBraces=>$beginningToken."UN-NAMED-GROUPING-BRACES",
+                special=>$beginningToken."SPECIAL",
+                heading=>$beginningToken."HEADING",
+                filecontents=>$beginningToken."FILECONTENTS",
+                preamble=>$beginningToken."preamble",
+                beginOfToken=>$beginningToken,
+                doubleBackSlash=>$beginningToken."DOUBLEBACKSLASH",
+                alignmentBlock=>$beginningToken."ALIGNMENTBLOCK",
+                endOfToken=>"-END",
+              );
+
+sub token_check{
+    my $self = shift;
+
+    $self->logger("Token check",'heading') if $is_t_switch_active;
+    # we use tokens for trailing comments, environments, commands, etc, so check that they're not in the body
+    foreach( keys %tokens){
+        while(${$self}{body} =~ m/$tokens{$_}/si){
+            $self->logger("Found $tokens{$_} within body, updating replacement token to $tokens{$_}-LIN") if($is_t_switch_active);
+            $tokens{$_} .= "-LIN";
+        }
+    }
+}
+
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/TrailingComments.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/TrailingComments.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/TrailingComments.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,112 @@
+package LatexIndent::TrailingComments;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/remove_trailing_comments put_trailing_comments_back_in $trailingCommentRegExp add_comment_symbol construct_trailing_comment_regexp/;
+our @trailingComments;
+our $commentCounter = 0;
+our $trailingCommentRegExp;
+
+sub construct_trailing_comment_regexp{
+    $trailingCommentRegExp = qr/(?<!\\)%$tokens{trailingComment}\d+$tokens{endOfToken}/;
+}
+
+sub add_comment_symbol{
+    # add a trailing comment token after, for example, a square brace [
+    # or a curly brace { when, for example, BeginStartsOnOwnLine == 2
+    my $self = shift;
+
+    # increment the comment counter
+    $commentCounter++;
+
+    # store the comment -- without this, it won't get processed correctly at the end
+    push(@trailingComments,{id=>$tokens{trailingComment}.$commentCounter.$tokens{endOfToken},value=>q()});
+
+    # log file info
+    $self->logger("Updating trailing comment array",'heading')if $is_t_switch_active;
+    $self->logger(Dumper(\@trailingComments),'ttrace') if($is_tt_switch_active);
+
+    # the returned value
+    return $tokens{trailingComment}.$commentCounter.$tokens{endOfToken};
+}
+
+sub remove_trailing_comments{
+    my $self = shift;
+    $self->logger("Storing trailing comments",'heading')if $is_t_switch_active;
+
+    # perform the substitution
+    ${$self}{body} =~ s/
+                            (?<!\\)  # not preceeded by a \
+                            %        # % 
+                            (
+                                \h*? # followed by possible horizontal space
+                                .*?  # and anything else
+                            )
+                            $        # up to the end of a line
+                        /   
+                            # increment comment counter and store comment
+                            $commentCounter++;
+                            push(@trailingComments,{id=>$tokens{trailingComment}.$commentCounter.$tokens{endOfToken},value=>$1});
+
+                            # replace comment with dummy text
+                            "%".$tokens{trailingComment}.$commentCounter.$tokens{endOfToken};
+                       /xsmeg;
+    if(@trailingComments){
+        $self->logger("Trailing comments stored in:") if($is_t_switch_active);
+        $self->logger(Dumper(\@trailingComments)) if($is_t_switch_active);
+    } else {
+        $self->logger("No trailing comments found") if($is_t_switch_active);
+    }
+    return;
+}
+
+sub put_trailing_comments_back_in{
+    my $self = shift;
+    return unless( @trailingComments > 0 );
+
+    $self->logger("Returning trailing comments to body",'heading')if $is_t_switch_active;
+
+    # loop through trailing comments in reverse so that, for example, 
+    # latexindenttrailingcomment1 doesn't match the first 
+    # part of latexindenttrailingcomment18, which would result in an 8 left over (bad)
+    while( my $comment = pop @trailingComments){
+      my $trailingcommentID = ${$comment}{id};
+      my $trailingcommentValue = ${$comment}{value};
+      if(${$self}{body} =~ m/%$trailingcommentID
+                              (
+                                  (?!          # not immediately preceeded by 
+                                      (?<!\\)  # \
+                                      %        # %
+                                  ).*?
+                              )                # captured into $1
+                              (\h*)?$                
+                          /mx and $1 ne ''){
+          $self->logger("Comment not at end of line $trailingcommentID, moving it to end of line")if $is_t_switch_active;
+          ${$self}{body} =~ s/%$trailingcommentID(.*)$/$1%$trailingcommentValue/m;
+      } else {
+          ${$self}{body} =~ s/%$trailingcommentID/%$trailingcommentValue/;
+      }
+      $self->logger("replace %$trailingcommentID with %$trailingcommentValue") if($is_t_switch_active);
+    }
+    return;
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/UnNamedGroupingBracesBrackets.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,135 @@
+package LatexIndent::UnNamedGroupingBracesBrackets;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::TrailingComments qw/$trailingCommentRegExp/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Exporter qw/import/;
+our @ISA = "LatexIndent::Command"; # class inheritance, Programming Perl, pg 321
+our @EXPORT_OK = qw/construct_unnamed_grouping_braces_brackets_regexp $un_named_grouping_braces_RegExp $un_named_grouping_braces_RegExp_trailing_comment/;
+our $unNamedGroupingBracesCounter;
+our $un_named_grouping_braces_RegExp;
+our $un_named_grouping_braces_RegExp_trailing_comment; 
+
+sub construct_unnamed_grouping_braces_brackets_regexp{
+    my $self = shift;
+
+    # grab the arguments regexp
+    my $optAndMandRegExp = $self->get_arguments_regexp;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    # for example #1 #2, etc
+    my $numberedArgRegExp = $self->get_numbered_arg_regexp;
+
+    # store the regular expresssion for matching and replacing 
+    $un_named_grouping_braces_RegExp = qr/
+                  # NOT
+                  (?!
+                      (?:
+                        (?:(?<!\\)\]) 
+                        |
+                        (?:(?<!\\)\}) 
+                      )
+                      (?:\h|\R|$blankLineToken|$trailingCommentRegExp|$numberedArgRegExp)*  # 0 or more h-space, blanklines, trailing comments
+                  )
+                  # END of NOT
+                  (
+                     (?:
+                        \{|\[|,|&|\)|\(|\$ # starting with { OR [ OR , OR & OR ) OR ( OR $
+                     )
+                     \h*
+                  )                     # $1 into beginning bit
+                  (\R*)                 # $2 linebreaksAtEnd of begin
+                  ($optAndMandRegExp)   # $3 mand|opt arguments (at least one) stored into body
+                  (\R)?                 # $6 linebreak 
+                /sx;
+
+    $un_named_grouping_braces_RegExp_trailing_comment = qr/$un_named_grouping_braces_RegExp(\h*)((?:$trailingCommentRegExp\h*)*)?/; 
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $unNamedGroupingBracesCounter++;
+    ${$self}{id} = "$tokens{unNamedgroupingBraces}$unNamedGroupingBracesCounter";
+    return;
+}
+
+sub get_replacement_text{
+    my $self = shift;
+
+    # the replacement text for a key = {value} needes to accomodate the leading [ OR { OR % OR , OR any combination thereof
+    $self->logger("Custom replacement text routine for ${$self}{name}") if $is_t_switch_active;
+
+    # the un-named object is a little special, as it doesn't have a name; as such, if there are blank lines before
+    # the braces/brackets, we have to insert them
+    #
+    # also, the argument reg-exp can pick up a leading comment (with line break), which needs to be put
+    # into the replacement text (see documentation/demonstrations/pstricks.tex and test-cases/unnamed-braces/unnamed.tex for example)
+    ${$self}{body} =~ s/(.*?)(\{|\[)/$2/s;
+    ${$self}{replacementText} = ${$self}{beginningbit}.($1 ne ''?$1:q()).${$self}{id};
+
+    # but now turn off the switch for linebreaksAtEnd{begin}, otherwise the first brace gets too much indentation
+    # (see, for example, test-cases/namedGroupingBracesBrackets/special-characters-minimal.tex)
+    ${${$self}{linebreaksAtEnd}}{begin} = 0;
+    $self->logger("Beginning bit is: ${$self}{beginningbit}") if($is_t_switch_active);
+    delete ${$self}{beginningbit};
+}
+
+sub check_for_blank_lines_at_beginning{
+    # some examples can have blank line tokens at the beginning of the body, 
+    # which can confuse the routine below 
+    # See, for example, 
+    #       test-cases/namedGroupingBracesBrackets/special-characters-minimal-blank-lines-m-switch.tex
+    #   compared to
+    #       test-cases/namedGroupingBracesBrackets/special-characters-minimal-blank-lines-default.tex
+    my $self = shift;
+
+    # blank line token
+    my $blankLineToken = $tokens{blanklines};
+
+    # if the body begins with 2 or more blank line tokens
+    if(${$self}{body} =~ m/^((?:$blankLineToken\R){2,})/s){
+
+        # remove them
+        ${$self}{body} =~ s/^((?:$blankLineToken\R)+)//s;
+
+        # store
+        my $blank_line_tokens_at_beginning_of_body = $1;
+
+        # and count them, for use after the indentation routine
+        ${$self}{blankLinesAtBeginning} = () = $blank_line_tokens_at_beginning_of_body =~ /$blankLineToken\R/sg
+    }
+    return;
+}
+
+sub put_blank_lines_back_in_at_beginning{
+    my $self = shift;
+
+    # some bodies have blank lines at the beginning
+    if(${$self}{blankLinesAtBeginning}){
+        for(my $i=0; $i<${$self}{blankLinesAtBeginning}; $i++){
+            ${$self}{body} = $tokens{blanklines}.${$self}{body};
+        }
+    }
+    return
+}
+
+1;

Added: trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Verbatim.pm
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Verbatim.pm	                        (rev 0)
+++ trunk/Master/texmf-dist/scripts/latexindent/LatexIndent/Verbatim.pm	2017-02-24 22:07:42 UTC (rev 43326)
@@ -0,0 +1,296 @@
+package LatexIndent::Verbatim;
+#	This program is free software: you can redistribute it and/or modify
+#	it under the terms of the GNU General Public License as published by
+#	the Free Software Foundation, either version 3 of the License, or
+#	(at your option) any later version.
+#
+#	This program 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.
+#
+#	See http://www.gnu.org/licenses/.
+#
+#	Chris Hughes, 2017
+#
+#	For all communication, please visit: https://github.com/cmhughes/latexindent.pl
+use strict;
+use warnings;
+use LatexIndent::Tokens qw/%tokens/;
+use LatexIndent::GetYamlSettings qw/%masterSettings/;
+use LatexIndent::Switches qw/$is_t_switch_active $is_tt_switch_active/;
+use Data::Dumper;
+use Exporter qw/import/;
+our @EXPORT_OK = qw/put_verbatim_back_in find_verbatim_environments find_noindent_block find_verbatim_commands put_verbatim_commands_back_in/;
+our @ISA = "LatexIndent::Document"; # class inheritance, Programming Perl, pg 321
+our $verbatimCounter;
+
+sub find_noindent_block{
+    my $self = shift;
+
+    # noindent block
+    $self->logger('looking for NOINDENTBLOCk environments (see noIndentBlock)','heading') if $is_t_switch_active;
+    $self->logger(Dumper(\%{$masterSettings{noIndentBlock}})) if($is_t_switch_active);
+    while( my ($noIndentBlock,$yesno)= each %{$masterSettings{noIndentBlock}}){
+        if($yesno){
+            $self->logger("looking for $noIndentBlock:$yesno environments") if $is_t_switch_active;
+
+            my $noIndentRegExp = qr/
+                            (
+                                (?!<\\)
+                                %
+                                \h*                     # possible horizontal spaces
+                                \\begin\{
+                                        $noIndentBlock  # environment name captured into $2
+                                       \}               # %* \begin{noindentblock} statement
+                            )
+                            (
+                                .*?
+                            )                           # non-greedy match (body)
+                            (
+                                (?!<\\)
+                                %                       # %
+                                \h*                     # possible horizontal spaces
+                                \\end\{$noIndentBlock\} # \end{noindentblock}
+                            )                           # %* \end{<something>} statement
+                        /sx;
+
+            while( ${$self}{body} =~ m/$noIndentRegExp/sx){
+
+              # create a new Environment object
+              my $noIndentBlock = LatexIndent::Verbatim->new( begin=>$1,
+                                                    body=>$2,
+                                                    end=>$3,
+                                                    name=>$noIndentBlock,
+                                                    );
+            
+              # give unique id
+              $noIndentBlock->create_unique_id;
+
+              # verbatim children go in special hash
+              ${$self}{verbatim}{${$noIndentBlock}{id}}=$noIndentBlock;
+
+              # log file output
+              $self->logger("NOINDENTBLOCK environment found: $noIndentBlock") if $is_t_switch_active;
+
+              # remove the environment block, and replace with unique ID
+              ${$self}{body} =~ s/$noIndentRegExp/${$noIndentBlock}{id}/sx;
+
+              $self->logger("replaced with ID: ${$noIndentBlock}{id}") if $is_t_switch_active;
+            } 
+      } else {
+            $self->logger("*not* looking for $noIndentBlock as $noIndentBlock:$yesno") if $is_t_switch_active;
+      }
+    }
+    return;
+}
+
+sub find_verbatim_environments{
+    my $self = shift;
+
+    # verbatim environments
+    $self->logger('looking for VERBATIM environments (see verbatimEnvironments)','heading') if $is_t_switch_active;
+    $self->logger(Dumper(\%{$masterSettings{verbatimEnvironments}})) if($is_t_switch_active);
+    while( my ($verbEnv,$yesno)= each %{$masterSettings{verbatimEnvironments}}){
+        if($yesno){
+            $self->logger("looking for $verbEnv:$yesno environments") if $is_t_switch_active;
+
+            my $verbatimRegExp = qr/
+                            (
+                            \\begin\{
+                                    $verbEnv     # environment name captured into $1
+                                   \}            # \begin{<something>} statement
+                            )
+                            (
+                                .*?
+                            )                    # any character, but not \\begin
+                            (
+                                \\end\{$verbEnv\}# \end{<something>} statement
+                            )                    
+                        /sx;
+
+            while( ${$self}{body} =~ m/$verbatimRegExp/sx){
+
+              # create a new Environment object
+              my $verbatimBlock = LatexIndent::Verbatim->new( begin=>$1,
+                                                    body=>$2,
+                                                    end=>$3,
+                                                    name=>$verbEnv,
+                                                    );
+              # give unique id
+              $verbatimBlock->create_unique_id;
+
+              # verbatim children go in special hash
+              ${$self}{verbatim}{${$verbatimBlock}{id}}=$verbatimBlock;
+
+              # log file output
+              $self->logger("VERBATIM environment found: $verbEnv") if $is_t_switch_active;
+
+              # remove the environment block, and replace with unique ID
+              ${$self}{body} =~ s/$verbatimRegExp/${$verbatimBlock}{id}/sx;
+
+              $self->logger("replaced with ID: ${$verbatimBlock}{id}") if $is_t_switch_active;
+            } 
+      } else {
+            $self->logger("*not* looking for $verbEnv as $verbEnv:$yesno") if $is_t_switch_active;
+      }
+    }
+    return;
+}
+
+sub find_verbatim_commands{
+    my $self = shift;
+
+    # verbatim commands need to be treated separately to verbatim environments;
+    # note that, for example, we could quite reasonably have \lstinline!%!, which 
+    # would need to be found *before* trailing comments have been removed. Similarly, 
+    # verbatim commands need to be put back in *after* trailing comments have been put 
+    # back in
+    $self->logger('looking for VERBATIM commands (see verbatimCommands)','heading');
+    $self->logger(Dumper(\%{$masterSettings{verbatimCommands}})) if($is_tt_switch_active);
+    while( my ($verbCommand,$yesno)= each %{$masterSettings{verbatimCommands}}){
+        if($yesno){
+            $self->logger("looking for $verbCommand:$yesno Commands") if $is_t_switch_active;
+
+            my $verbatimCommandRegExp = qr/
+                            (
+                                \\$verbCommand     
+                                \h*                                             
+                            )                                                   # name of command into $1
+                            (
+                                \[
+                                    (?:
+                                        (?!
+                                            (?:(?<!\\)\[) 
+                                        ).
+                                    )*?     # not including [, but \[ ok
+                                (?<!\\)     # not immediately pre-ceeded by \
+                                \]          # [optional arguments]
+                                \h*
+                            )?                                                  # opt arg into $2
+                            (
+                              .
+                            )                                                   # delimiter into $3
+                            (
+                              .*?
+                            )                                                   # body into $4
+                            \3
+                        /mx;
+
+            while( ${$self}{body} =~ m/$verbatimCommandRegExp/){
+
+              # create a new Environment object
+              my $verbatimCommand = LatexIndent::Verbatim->new( begin=>$1.($2?$2:q()).$3,
+                                                    body=>$4,
+                                                    end=>$3,
+                                                    name=>$verbCommand,
+                                                    optArg=>$2?$2:q(),
+                                                    );
+              # give unique id
+              $verbatimCommand->create_unique_id;
+
+              # output, if desired
+              $self->logger(Dumper($verbatimCommand),'ttrace') if($is_tt_switch_active);
+
+              # verbatim children go in special hash
+              ${$self}{verbatimCommands}{${$verbatimCommand}{id}}=$verbatimCommand;
+
+              # log file output
+              $self->logger("VERBATIM command found: $verbCommand") if $is_t_switch_active;
+
+              # remove the environment block, and replace with unique ID
+              ${$self}{body} =~ s/$verbatimCommandRegExp/${$verbatimCommand}{id}/sx;
+
+              $self->logger("replaced with ID: ${$verbatimCommand}{id}") if $is_t_switch_active;
+            } 
+      } else {
+            $self->logger("*not* looking for $verbCommand as $verbCommand:$yesno") if $is_t_switch_active;
+      }
+    }
+    return;
+
+}
+
+sub  put_verbatim_back_in {
+    my $self = shift;
+
+    # if there are no verbatim children, return
+    return unless(${$self}{verbatim});
+
+    # search for environments/commands
+    $self->logger('Putting verbatim back in, here is the pre-processed body:','heading') if $is_t_switch_active;
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+
+    # loop through document children hash
+    while( (scalar keys %{${$self}{verbatim}})>0 ){
+          while( my ($key,$child)= each %{${$self}{verbatim}}){
+            if(${$self}{body} =~ m/${$child}{id}/mx){
+
+                # replace ids with body
+                ${$self}{body} =~ s/${$child}{id}/${$child}{begin}${$child}{body}${$child}{end}/;
+
+                # log file info
+                $self->logger('Body now looks like:','heading') if $is_tt_switch_active;
+                $self->logger(${$self}{body},'ttrace') if($is_tt_switch_active);
+
+                # delete the hash so it won't be operated upon again
+                delete ${$self}{verbatim}{${$child}{id}};
+                $self->logger("deleted key") if $is_t_switch_active;
+              }
+            }
+    }
+
+    # logfile info
+    $self->logger("Number of children:",'heading') if $is_t_switch_active;
+    $self->logger(scalar keys %{${$self}{verbatim}}) if $is_t_switch_active;
+    $self->logger('Post-processed body:','heading') if $is_t_switch_active;
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+    return;
+}
+
+sub  put_verbatim_commands_back_in {
+    my $self = shift;
+
+    # if there are no verbatim children, return
+    return unless(${$self}{verbatimCommands});
+
+    # search for environments/commands
+    $self->logger('Putting verbatim commands back in, here is the pre-processed body:','heading') if $is_t_switch_active;
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+
+    # loop through document children hash
+    while( (scalar keys %{${$self}{verbatimCommands}})>0 ){
+          while( my ($key,$child)= each %{${$self}{verbatimCommands}}){
+            if(${$self}{body} =~ m/${$child}{id}/mx){
+
+                # replace ids with body
+                ${$self}{body} =~ s/${$child}{id}/${$child}{begin}${$child}{body}${$child}{end}/;
+
+                # log file info
+                $self->logger('Body now looks like:','heading') if $is_tt_switch_active;
+                $self->logger(${$self}{body},'ttrace') if($is_tt_switch_active);
+
+                # delete the hash so it won't be operated upon again
+                delete ${$self}{verbatimCommands}{${$child}{id}};
+                $self->logger("deleted key") if $is_t_switch_active;
+              }
+            }
+    }
+
+    # logfile info
+    $self->logger("Number of children:",'heading');
+    $self->logger(scalar keys %{${$self}{verbatimCommands}});
+    $self->logger('Post-processed body:','heading') if $is_t_switch_active;
+    $self->logger(${$self}{body}) if($is_t_switch_active);
+    return;
+}
+
+sub create_unique_id{
+    my $self = shift;
+
+    $verbatimCounter++;
+    ${$self}{id} = "$tokens{verbatim}$verbatimCounter$tokens{endOfToken}";
+    return;
+}
+
+1;

Modified: trunk/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml
===================================================================
--- trunk/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml	2017-02-24 01:05:59 UTC (rev 43325)
+++ trunk/Master/texmf-dist/scripts/latexindent/defaultSettings.yaml	2017-02-24 22:07:42 UTC (rev 43326)
@@ -1,5 +1,5 @@
 # 
-# defaultSettings.yaml for latexindent.pl,
+# defaultSettings.yaml for latexindent.pl, version 3.0
 #                      a script that aims to
 #                      beautify .tex, .sty, .cls files
 #
@@ -13,8 +13,17 @@
 #
 # Please read the manual first to understand what each switch does :)
 
-# Default value of indentation
-defaultIndent: "\t"
+# latexindent can be called without a file extension, 
+# e.g, simply
+#       latexindent myfile
+# in which case the choice of file extension is chosen
+# according to the choices made in fileExtensionPreference
+# Other file extensions can be added.
+fileExtensionPreference:
+    .tex: 1
+    .sty: 2
+    .cls: 3
+    .bib: 4
 
 # default file extension of backup file (if original is overwritten with -w switch)
 # for example, if your .tex file is called
@@ -50,19 +59,62 @@
 # the back up will be written to myfile.bak4
 cycleThroughBackUps: 0
 
+# preferences for information displayed in the log file
+logFilePreferences:
+    showEveryYamlRead: 1
+    showAmalgamatedSettings: 0
+    endLogFileWith: '--------------' 
+    showGitHubInfoFooter: 1
+
+#  verbatim environments- environments specified 
+#  in this hash table will not be changed at all!
+verbatimEnvironments:
+    verbatim: 1
+    lstlisting: 1
+
+#  verbatim commands such as \verb! body !, \lstinline$something else$
+verbatimCommands:
+    verb: 1
+    lstinline: 1
+
+#  no indent blocks (not necessarily verbatim 
+#  environments) which are marked as %\begin{noindent}
+#  or anything else that the user puts in this hash
+#  table
+noIndentBlock:
+    noindent: 1
+    cmhtest: 1
+
+# remove trailing whitespace from all lines 
+removeTrailingWhitespace:
+    beforeProcessing: 0
+    afterProcessing: 1
+
+# \begin{document} and \end{document} are treated differently
+# by latexindent within filecontents environments
+fileContentsEnvironments:
+    filecontents: 1
+    filecontents*: 1
+
 # indent preamble
 indentPreamble: 0
 
-# always look for split { }, which means that the user doesn't
-# have to complete checkunmatched, checkunmatchedELSE
-alwaysLookforSplitBraces: 1
+# assume no preamble in cls, sty, by default
+lookForPreamble:
+    .tex: 1
+    .sty: 0
+    .cls: 0
+    .bib: 0
 
-# always look for split [ ], which means that the user doesn't
-# have to complete checkunmatchedbracket
-alwaysLookforSplitBrackets: 1
+# some preambles can contain \begin and \end statements
+# that are not in their 'standard environment block', for example,
+# consider the following key = values:
+#    preheadhook={\begin{mdframed}[style=myframedstyle]},
+#    postfoothook=\end{mdframed},
+preambleCommandsBeforeEnvironments: 0
 
-# remove trailing whitespace from all lines 
-removeTrailingWhitespace: 0
+# Default value of indentation
+defaultIndent: "\t"
 
 # environments that have tab delimiters, add more 
 # as needed
@@ -91,49 +143,44 @@
    dcases: 1
    listabla: 1
 
-# if you have indent rules for particular environments
-# or commands, put them in here; for example, you might just want 
-# to use a space " " or maybe a double tab "\t\t"
-indentRules:
-   myenvironment: "\t\t"
-   anotherenvironment: "\t\t\t\t"
-   chapter: " "
-   section: " "
-   item: "      "
+# if you want the script to look for \item commands 
+# and format it, as follows (for example),
+#       \begin{itemize}
+#           \item content here
+#                 next line is indented
+#                 next line is indented
+#           \item another item
+#       \end{itemize}
+# then populate indentAfterItems. See also itemNames
+indentAfterItems:
+    itemize: 1
+    enumerate: 1
+    list: 1
 
-#  verbatim environments- environments specified 
-#  in this hash table will not be changed at all!
-verbatimEnvironments:
-    verbatim: 1
-    lstlisting: 1
+# if you want to use other names for your items (such as, for example, part)
+# then populate them here- note that you can trick latexindent.pl
+# into indenting all kinds of commands (within environments specified in 
+# indentAfterItems) using this technique.
+itemNames:
+    item: 1
+    myitem: 1
 
-#  no indent blocks (not necessarily verbatim 
-#  environments) which are marked as %\begin{noindent}
-#  or anything else that the user puts in this hash
-#  table
-noIndentBlock:
-    noindent: 1
-    cmhtest: 1
+# specialBeginEnd is mainly mathmode focus, although
+# there's no restrictions
+specialBeginEnd:
+    displayMath:
+        begin: '\\\['
+        end: '\\\]'
+        lookForThis: 1
+    inlineMath:
+        begin: '(?<!\$)(?<!\\)\$(?!\$)'
+        end: '(?<!\\)\$(?!\$)'
+        lookForThis: 1
+    displayMathTeX:
+        begin: '\$\$'
+        end: '\$\$'
+        lookForThis: 1
 
-# if you don't want to have additional indentation 
-# in an environment put it in this hash table; note that
-# environments in this hash table will inherit 
-# the *current* level of indentation they just won't
-# get any *additional*.
-noAdditionalIndent:
-    myexample: 1
-    mydefinition: 1
-    problem: 1
-    exercises: 1
-    mysolution: 1
-    foreach: 0
-    widepage: 1
-    comment: 1
-    \[: 0
-    \]: 0
-    document: 1
-    frame: 0
-
 # if you want to add indentation after
 # a heading, such as \part, \chapter, etc
 # then populate it in here - you can add 
@@ -144,139 +191,220 @@
 # or add your own title command
 indentAfterHeadings:
     part:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 1
     chapter: 
-       indent: 0
+       indentAfterThisHeading: 0
        level: 2
     section:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 3
     subsection:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 4
     subsection*:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 4
     subsubsection:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 5
     paragraph:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 6
     subparagraph:
-       indent: 0
+       indentAfterThisHeading: 0
        level: 7
 
-# if you want the script to look for \item commands 
-# and format it, as follows (for example),
-#       \begin{itemize}
-#           \item content here
-#                 next line is indented
-#                 next line is indented
-#           \item another item
-#       \end{itemize}
-# then populate indentAfterItems. See also itemNames
-indentAfterItems:
-    itemize: 1
-    enumerate: 1
-    list: 1
+# if you don't want to have additional indentation 
+# in an environment put it in this hash table; note that
+# environments in this hash table will inherit 
+# the *current* level of indentation they just won't
+# get any *additional*.
+noAdditionalIndent:
+    myexample: 1
+    mydefinition: 1
+    problem: 1
+    exercises: 1
+    mysolution: 1
+    foreach: 0
+    widepage: 1
+    comment: 1
+    document: 1
+    frame: 0
 
-# if you want to use other names for your items (such as, for example, part)
-# then populate them here- note that you can trick latexindent.pl
-# into indenting all kinds of commands (within environments specified in 
-# indentAfterItems) using this technique.
-itemNames:
-    item: 1
-    myitem: 1
+# if you have indent rules for particular environments
+# or commands, put them in here; for example, you might just want 
+# to use a space " " or maybe a double tab "\t\t"
+indentRules:
+   myenvironment: "\t\t"
+   anotherenvironment: "\t\t\t\t"
+   chapter: " "
+   section: " "
+   item: "      "
+   myitem: "        "
 
-# if you want to indent if, else, fi constructs such as, for example,
-#
-#       \ifnum#1=2
-#               something
-#       \else
-#               something else
-#       \fi
-#
-# then populate them in constructIfElseFi
-constructIfElseFi:
-    ifnum: 1
-    ifdim: 1
-    ifodd: 1
-    ifvmode: 1
-    ifhmode: 1
-    ifmmode: 1
-    ifinner: 1
-    if: 1
-    ifcat: 1
-    ifx: 1
-    ifvoid: 1
-    ifeof: 1
-    iftrue: 1
-    ifcase: 1
+# set noAdditionalIndent globally for codeblocks
+noAdditionalIndentGlobal:
+    environments: 0
+    commands: 1
+    optionalArguments: 0
+    mandatoryArguments: 0
+    ifElseFi: 0
+    items: 0
+    keyEqualsValuesBracesBrackets: 0
+    namedGroupingBracesBrackets: 0
+    UnNamedGroupingBracesBrackets: 0
+    specialBeginEnd: 0
+    afterHeading: 0
+    filecontents: 0
 
-# latexindent can be called without a file extension, 
-# e.g, simply
-#       latexindent myfile
-# in which case the choice of file extension is chosen
-# according to the choices made in fileExtensionPreference
-# Other file extensions can be added.
-fileExtensionPreference:
-    .tex: 1
-    .sty: 2
-    .cls: 3
-    .bib: 4
+# set indentRules globally for codeblocks; these need 
+# to be horizontal spaces, if they are to be used
+indentRulesGlobal:
+    environments: 0
+    commands: 0
+    optionalArguments: 0
+    mandatoryArguments: 0
+    ifElseFi: 0
+    items: 0
+    keyEqualsValuesBracesBrackets: 0
+    namedGroupingBracesBrackets: 0
+    UnNamedGroupingBracesBrackets: 0
+    specialBeginEnd: 0
+    afterHeading: 0
+    filecontents: 0
 
-# preferences for information displayed in the log file
-logFilePreferences:
-    showEveryYamlRead: 1
-    showAlmagamatedSettings: 0
-    endLogFileWith: '--------------' 
-    traceModeIncreaseIndent: '>>'
-    traceModeAddCurrentIndent: '||'
-    traceModeDecreaseIndent: '<<'
-    traceModeBetweenLines: "\n"
+# command code block details
+commandCodeBlocks:
+    roundParenthesesAllowed: 1
+    stringsAllowedBetweenArguments:
+        node: 1
+        at: 1
+        to: 1
+        decoration: 1
+        ++: 1
+        --: 1
 
-# \begin{document} and \end{document} are treated differently
-# by latexindent within filecontents environments
-fileContentsEnvironments:
-    filecontents: 1
-    filecontents*: 1
-
-    
-# *** NOTE ***
-# If you have specified alwaysLookforSplitBraces: 1
-# and alwaysLookforSplitBrackets: 1 then you don't need
-# to worry about completing
+# modifyLineBreaks will only be searched if the -m 
+# switch is active
+#    BeginStartsOnOwnLine: 1
+#       if a begin statement is not already on its own line,
+#       then, with -m active, it will be moved to its own line.
 #
-#       checkunmatched
-#       checkunmatchedELSE
-#       checkunmatchedbracket
+#       when set to 1, e.g 
+#               some text some text \begin{myenvironment}
+#           will be changed to
+#               some text some text 
+#               \begin{myenvironment}
+#       when set to -1, e.g 
+#               some text some text 
+#               \begin{myenvironment}
+#           will be changed to
+#               some text some text \begin{myenvironment}
+#       when set to 0, the switch is ignored
 #
-# in other words, you don't really need to edit anything 
-# below this line- it used to be necessary for older 
-# versions of the script, but not anymore :)
-#***      ***
-
-# commands that might split {} across lines
-# such as \parbox, \marginpar, etc
-checkunmatched:
-    parbox: 1
-    vbox: 1
-
-# very similar to %checkunmatched except these 
-# commands might have an else construct
-checkunmatchedELSE:
-    pgfkeysifdefined: 1
-    DTLforeach: 1
-    ifthenelse: 1
-
-# commands that might split []  across lines
-# such as \pgfplotstablecreatecol, etc
-checkunmatchedbracket:
-    pgfplotstablecreatecol: 1
-    pgfplotstablesave: 1
-    pgfplotstabletypeset: 1
-    mycommand: 1
-    psSolid: 1
-
+#    BodyStartsOnOwnLine: 1
+#       if body does not already start on its own line, then with 
+#       -m active, it will be moved to its own line.
+#
+#       when set to 1, e.g 
+#               \begin{myenv}body text body text
+#           will be changed to
+#               \begin{myenv}
+#                   body text body text
+#       when set to -1, e.g 
+#               \begin{myenv}
+#                   body text body text
+#           will be changed to
+#               \begin{myenv}body text body text
+#       when set to 0, the switch is ignored
+#
+#    EndStartsOnOwnLine: 1
+#       if an end statement is not already on its own line,
+#       then, with -m active, it will be moved to its own line.
+#
+#       when set to 1, e.g 
+#               some text some text \end{myenvironment}
+#           will be changed to
+#               some text some text 
+#               \end{myenvironment}
+#       when set to -1, e.g 
+#               some text some text 
+#               \end{myenvironment}
+#           will be changed to
+#               some text some text \end{myenvironment}
+#       when set to 0, the switch is ignored
+#
+#    EndFinishesWithLineBreak: 1
+#       this switch adjusts line breaks immmediately 
+#       after an end statement (with -m active)
+#       
+#       when set to 1, e.g 
+#               \end{myenvironment}some text some text 
+#           will be changed to
+#                   \end{myenvironment}
+#                   some text some text 
+#       when set to -1, e.g 
+#               \end{myenvironment}
+#               some text some text 
+#           will be changed to
+#                   \end{myenvironment}some text some text 
+#       when set to 0, the switch is ignored
+#
+# Naturally, you can specify settings for individual environments,
+# commands, headings, etc, populate as you wish.
+modifyLineBreaks:
+    preserveBlankLines: 1
+    condenseMultipleBlankLinesInto: 1
+    environments:
+        BeginStartsOnOwnLine: 0
+        BodyStartsOnOwnLine: 0
+        EndStartsOnOwnLine: 0
+        EndFinishesWithLineBreak: 0
+        equation*:
+            BeginStartsOnOwnLine: 0
+            BodyStartsOnOwnLine: 0
+            EndStartsOnOwnLine: 0
+            EndFinishesWithLineBreak: 0
+    ifElseFi:
+        IfStartsOnOwnLine: 0
+        BodyStartsOnOwnLine: 0
+        ElseStartsOnOwnLine: 0
+        ElseFinishesWithLineBreak: 0
+        FiStartsOnOwnLine: 0
+        FiFinishesWithLineBreak: 0
+        ifnum:
+            IfStartsOnOwnLine: 0
+            BodyStartsOnOwnLine: 0
+            ElseStartsOnOwnLine: 0
+            ElseFinishesWithLineBreak: 0
+            FiStartsOnOwnLine: 0
+            FiFinishesWithLineBreak: 0
+    commands:
+        CommandStartsOnOwnLine: 0
+        CommandNameFinishesWithLineBreak: 0
+    optionalArguments:
+        LSqBStartsOnOwnLine: 0
+        OptArgBodyStartsOnOwnLine: 0
+        RSqBStartsOnOwnLine: 0
+        RSqBFinishesWithLineBreak: 0
+    mandatoryArguments:
+        LCuBStartsOnOwnLine: 0
+        MandArgBodyStartsOnOwnLine: 0
+        RCuBStartsOnOwnLine: 0
+        RCuBFinishesWithLineBreak: 0
+    keyEqualsValuesBracesBrackets:
+        KeyStartsOnOwnLine: 0
+        EqualsStartsOnOwnLine: 0
+        EqualsFinishesWithLineBreak: 0
+    items:
+        ItemStartsOnOwnLine: 0
+        ItemFinishesWithLineBreak: 0
+    namedGroupingBracesBrackets:
+        NameStartsOnOwnLine: 0
+        NameFinishesWithLineBreak: 0
+    specialBeginEnd:
+        SpecialBeginStartsOnOwnLine: 0
+        SpecialBodyStartsOnOwnLine: 0
+        SpecialEndStartsOnOwnLine: 0
+        SpecialEndFinishesWithLineBreak: 0

Modified: trunk/Master/texmf-dist/scripts/latexindent/latexindent.pl
===================================================================
(Binary files differ)

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2017-02-24 01:05:59 UTC (rev 43325)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2017-02-24 22:07:42 UTC (rev 43326)
@@ -1236,6 +1236,7 @@
  'ktv-texdata'          => '&PREHOOK_ktv_texdata',
  'latex-git-log'        => '&PREHOOK_latex_git_log',
  'latexdiff'            => '&PREHOOK_latexdiff',
+ 'latexindent'          => '&PREHOOK_latexindent',
  'lilyglyphs'           => '&PREHOOK_lilyglyphs',
  'lollipop'             => '&PREHOOK_flatten1',
  'mathspic'             => '&PREHOOK_mathspic',
@@ -2727,7 +2728,7 @@
  'epspdf'               => '(epspdf(|\.help|boot|tk)|\.rb|makegray\.pro)$',
  'latex2nemeth'         => '\.jar$',
  'latex-make'           => '\.py$',
- 'latexindent'          => 'Settings\.yaml$',
+ 'latexindent'          => 'LatexIndent|\.yaml$',
  'lilyglyphs'           => 'lilyglyphs_common.py',
  'lua-alt-getopt'       => '\.lua$',
  'lua2dox'              => '\.(lua|def)$',
@@ -5200,6 +5201,11 @@
   &SYSTEM ("$MV latexdiff-vc latexdiff-vc.pl");    
 }
 
+sub PREHOOK_latexindent {
+  print "PREHOOK_$package - mv documentation/* doc\n";
+  &SYSTEM ("$MV documentation/* .");
+}
+
 sub PREHOOK_lilyglyphs {
   print "PREHOOK_$package - mv */*.py scripts for specialscripts, rm ~\n";
   &SYSTEM ("$MV scripts/* .");



More information about the tex-live-commits mailing list