% arara: pdflatex: { files: [latexindent]}
\subsection{oneSentencePerLine: modifying line breaks for sentences}\label{sec:onesentenceperline}

	You can instruct \texttt{latexindent.pl} to format \announce{2018-01-13}{one sentence per
	line} your file so that it puts one sentence per line. Thank you to \cite{mlep} for
	helping to shape and test this feature. The behaviour of this part of the script is
	controlled by the switches detailed in \cref{lst:oneSentencePerLine}, all of which we
	discuss next. \index{modifying linebreaks! by using one sentence per line}
	\index{sentences!oneSentencePerLine} \index{sentences!one sentence per line}
	\index{regular expressions!lowercase alph a-z} \index{regular expressions!uppercase alph
	A-Z}%

	\cmhlistingsfromfile[style=oneSentencePerLine]{../defaultSettings.yaml}[MLB-TCB,width=.85\linewidth,before=\centering]{\texttt{oneSentencePerLine}}{lst:oneSentencePerLine}

\yamltitle{manipulateSentences}{0|1}
	This is a binary switch that details if \texttt{latexindent.pl} should perform the
	sentence manipulation routine; it is \emph{off} (set to \texttt{0}) by default, and you
	will need to turn it on (by setting it to \texttt{1}) if you want the script to modify
	line breaks surrounding and within sentences.

\yamltitle{removeSentenceLineBreaks}{0|1}
	When operating upon sentences \texttt{latexindent.pl} will, by default, remove internal
	line breaks as \texttt{removeSentenceLineBreaks} is set to \texttt{1}. Setting this
	switch to \texttt{0} instructs \texttt{latexindent.pl} not to do so.
	\index{sentences!removing sentence line breaks}

	For example, consider \texttt{multiple-sentences.tex} shown in
	\cref{lst:multiple-sentences}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences.tex}{\texttt{multiple-sentences.tex}}{lst:multiple-sentences}

	If we use the YAML files in
	\cref{lst:manipulate-sentences-yaml,lst:keep-sen-line-breaks-yaml}, and run the commands
	\index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{widepage}
		\begin{commandshell}
latexindent.pl multiple-sentences -m -l=manipulate-sentences.yaml
latexindent.pl multiple-sentences -m -l=keep-sen-line-breaks.yaml
\end{commandshell}
	\end{widepage}
	then we obtain the respective output given in
	\cref{lst:multiple-sentences-mod1,lst:multiple-sentences-mod2}.

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences-mod1.tex}{\texttt{multiple-sentences.tex} using \cref{lst:manipulate-sentences-yaml}}{lst:multiple-sentences-mod1}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/manipulate-sentences.yaml}[MLB-TCB]{\texttt{manipulate-sentences.yaml}}{lst:manipulate-sentences-yaml}
	\end{cmhtcbraster}

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences-mod2.tex}{\texttt{multiple-sentences.tex} using \cref{lst:keep-sen-line-breaks-yaml}}{lst:multiple-sentences-mod2}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/keep-sen-line-breaks.yaml}[MLB-TCB]{\texttt{keep-sen-line-breaks.yaml}}{lst:keep-sen-line-breaks-yaml}
	\end{cmhtcbraster}

	Notice, in particular, that the `internal' sentence line breaks in
	\cref{lst:multiple-sentences} have been removed in \cref{lst:multiple-sentences-mod1},
	but have not been removed in \cref{lst:multiple-sentences-mod2}.

	The remainder of the settings displayed in \vref{lst:oneSentencePerLine} instruct
	\texttt{latexindent.pl} on how to define a sentence. From the perspective of
	\texttt{latexindent.pl} a sentence must: \index{sentences!follow} \index{sentences!begin
	with} \index{sentences!end with}
	\begin{itemize}
		\item \emph{follow} a certain character or set of characters (see
		      \cref{lst:sentencesFollow}); by default, this is either \lstinline!\par!, a
		      blank line, a full stop/period (.), exclamation mark (!), question mark (?) right brace
		      (\}) or a comment on the previous line;
		\item \emph{begin} with a character type (see \cref{lst:sentencesBeginWith}); by
		      default, this is only capital letters;
		\item \emph{end} with a character (see \cref{lst:sentencesEndWith}); by
		      default, these are full stop/period (.), exclamation mark (!) and question mark (?).
	\end{itemize}
	In each case, you can specify the \texttt{other} field to include any pattern that you
	would like; you can specify anything in this field using the language of regular
	expressions.
	\index{regular expressions!lowercase alph a-z}
	\index{regular expressions!uppercase alph A-Z}

	\begin{cmhtcbraster}[raster columns=3,
			raster left skip=-3.5cm,
			raster right skip=-2cm,
			raster column skip=.06\linewidth]
		\cmhlistingsfromfile[style=sentencesFollow]{../defaultSettings.yaml}[MLB-TCB,width=.9\linewidth,before=\centering]{\texttt{sentencesFollow}}{lst:sentencesFollow}
		\cmhlistingsfromfile[style=sentencesBeginWith]{../defaultSettings.yaml}[MLB-TCB,width=.9\linewidth,before=\centering]{\texttt{sentencesBeginWith}}{lst:sentencesBeginWith}
		\cmhlistingsfromfile[style=sentencesEndWith]{../defaultSettings.yaml}[MLB-TCB,width=.9\linewidth,before=\centering]{\texttt{sentencesEndWith}}{lst:sentencesEndWith}
	\end{cmhtcbraster}

\subsubsection{sentencesFollow}
	Let's explore a few of the switches in \texttt{sentencesFollow}; let's start with
	\vref{lst:multiple-sentences}, and use the YAML settings given in
	\cref{lst:sentences-follow1-yaml}. Using the command \index{sentences!follow}
	\index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences -m -l=sentences-follow1.yaml
\end{commandshell}
	we obtain the output given in \cref{lst:multiple-sentences-mod3}.

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences-mod3.tex}{\texttt{multiple-sentences.tex} using \cref{lst:sentences-follow1-yaml}}{lst:multiple-sentences-mod3}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentences-follow1.yaml}[MLB-TCB]{\texttt{sentences-follow1.yaml}}{lst:sentences-follow1-yaml}
	\end{cmhtcbraster}

	Notice that, because \texttt{blankLine} is set to \texttt{0}, \texttt{latexindent.pl}
	will not seek sentences following a blank line, and so the fourth sentence has not been
	accounted for.

	We can explore the \texttt{other} field in \cref{lst:sentencesFollow} with the
	\texttt{.tex} file detailed in \cref{lst:multiple-sentences1}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences1.tex}{\texttt{multiple-sentences1.tex}}{lst:multiple-sentences1}

	Upon running the following commands \index{switches!-l demonstration} \index{switches!-m
	demonstration}
	\begin{widepage}
		\begin{commandshell}
latexindent.pl multiple-sentences1 -m -l=manipulate-sentences.yaml
latexindent.pl multiple-sentences1 -m -l=manipulate-sentences.yaml,sentences-follow2.yaml
\end{commandshell}
	\end{widepage}
	then we obtain the respective output given in
	\cref{lst:multiple-sentences1-mod1,lst:multiple-sentences1-mod2}.
	\cmhlistingsfromfile{demonstrations/multiple-sentences1-mod1.tex}{\texttt{multiple-sentences1.tex} using \vref{lst:manipulate-sentences-yaml}}{lst:multiple-sentences1-mod1}

	\begin{cmhtcbraster}[
			raster force size=false,
			raster column 1/.style={add to width=1cm},
		]
		\cmhlistingsfromfile{demonstrations/multiple-sentences1-mod2.tex}{\texttt{multiple-sentences1.tex} using \cref{lst:sentences-follow2-yaml}}{lst:multiple-sentences1-mod2}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentences-follow2.yaml}[MLB-TCB,width=.45\textwidth]{\texttt{sentences-follow2.yaml}}{lst:sentences-follow2-yaml}
	\end{cmhtcbraster}

	Notice that in \cref{lst:multiple-sentences1-mod1} the first sentence after the
	\texttt{)} has not been accounted for, but that following the inclusion of
	\cref{lst:sentences-follow2-yaml}, the output given in
	\cref{lst:multiple-sentences1-mod2} demonstrates that the sentence \emph{has} been
	accounted for correctly.

\subsubsection{sentencesBeginWith}
	By default, \texttt{latexindent.pl} will only assume that sentences begin with the upper
	case letters \texttt{A-Z}; you can instruct the script to define sentences to begin with
	lower case letters (see \cref{lst:sentencesBeginWith}), and we can use the \texttt{other}
	field to define sentences to begin with other characters. \index{sentences!begin with}

	\cmhlistingsfromfile{demonstrations/multiple-sentences2.tex}{\texttt{multiple-sentences2.tex}}{lst:multiple-sentences2}

	Upon running the following commands \index{switches!-l demonstration} \index{switches!-m
	demonstration}
	\begin{widepage}
		\begin{commandshell}
latexindent.pl multiple-sentences2 -m -l=manipulate-sentences.yaml
latexindent.pl multiple-sentences2 -m -l=manipulate-sentences.yaml,sentences-begin1.yaml
\end{commandshell}
	\end{widepage}
	then we obtain the respective output given in
	\cref{lst:multiple-sentences2-mod1,lst:multiple-sentences2-mod2}.
	\cmhlistingsfromfile{demonstrations/multiple-sentences2-mod1.tex}{\texttt{multiple-sentences2.tex} using \vref{lst:manipulate-sentences-yaml}}{lst:multiple-sentences2-mod1}
	\index{regular expressions!numeric 0-9}

	\begin{cmhtcbraster}[
			raster force size=false,
			raster column 1/.style={add to width=1cm},
		]
		\cmhlistingsfromfile{demonstrations/multiple-sentences2-mod2.tex}{\texttt{multiple-sentences2.tex} using \cref{lst:sentences-begin1-yaml}}{lst:multiple-sentences2-mod2}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentences-begin1.yaml}[MLB-TCB,width=.45\textwidth]{\texttt{sentences-begin1.yaml}}{lst:sentences-begin1-yaml}
	\end{cmhtcbraster}
	Notice that in \cref{lst:multiple-sentences2-mod1}, the first sentence has been accounted
	for but that the subsequent sentences have not. In \cref{lst:multiple-sentences2-mod2},
	all of the sentences have been accounted for, because the \texttt{other} field in
	\cref{lst:sentences-begin1-yaml} has defined sentences to begin with either
	\lstinline!$! or any numeric digit, \texttt{0} to
	\texttt{9}.

\subsubsection{sentencesEndWith}
	Let's return to \vref{lst:multiple-sentences}; we have already seen the default way in
	which \texttt{latexindent.pl} will operate on the sentences in this file in
	\vref{lst:multiple-sentences-mod1}. We can populate the \texttt{other} field with any
	character that we wish; for example, using the YAML specified in
	\cref{lst:sentences-end1-yaml} and the command \index{sentences!end with}
	\index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences -m -l=sentences-end1.yaml
latexindent.pl multiple-sentences -m -l=sentences-end2.yaml
\end{commandshell}
	then we obtain the output in \cref{lst:multiple-sentences-mod4}. \index{regular
	expressions!lowercase alph a-z}

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences-mod4.tex}{\texttt{multiple-sentences.tex} using \cref{lst:sentences-end1-yaml}}{lst:multiple-sentences-mod4}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentences-end1.yaml}[MLB-TCB]{\texttt{sentences-end1.yaml}}{lst:sentences-end1-yaml}
	\end{cmhtcbraster}

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences-mod5.tex}{\texttt{multiple-sentences.tex} using \cref{lst:sentences-end2-yaml}}{lst:multiple-sentences-mod5}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentences-end2.yaml}[MLB-TCB]{\texttt{sentences-end2.yaml}}{lst:sentences-end2-yaml}
	\end{cmhtcbraster}

	There is a subtle difference between the output in
	\cref{lst:multiple-sentences-mod4,lst:multiple-sentences-mod5}; in particular, in
	\cref{lst:multiple-sentences-mod4} the word \texttt{sentence} has not been defined as a
	sentence, because we have not instructed \texttt{latexindent.pl} to begin sentences with
	lower case letters. We have changed this by using the settings in
	\cref{lst:sentences-end2-yaml}, and the associated output in
	\cref{lst:multiple-sentences-mod5} reflects this.

	Referencing \vref{lst:sentencesEndWith}, you'll notice that there is a field called
	\texttt{basicFullStop}, which is set to \texttt{0}, and that the \texttt{betterFullStop}
	is set to \texttt{1} by default.

	Let's consider the file shown in \cref{lst:url}.

	\cmhlistingsfromfile{demonstrations/url.tex}{\texttt{url.tex}}{lst:url}

	Upon running the following commands \index{switches!-l demonstration} \index{switches!-m
	demonstration}
	\begin{commandshell}
latexindent.pl url -m -l=manipulate-sentences.yaml
\end{commandshell}
	we obtain the output given in \cref{lst:url-mod1}.

	\cmhlistingsfromfile{demonstrations/url-mod1.tex}{\texttt{url.tex} using \vref{lst:manipulate-sentences-yaml}}{lst:url-mod1}

	Notice that the full stop within the url has been interpreted correctly. This is because,
	within the \texttt{betterFullStop}, full stops at the end of sentences have the following
	properties:
	\begin{itemize}
		\item they are ignored within \texttt{e.g.} and \texttt{i.e.};
		\item they can not be immediately followed by a lower case or upper case letter;
		\item they can not be immediately followed by a hyphen, comma, or number.
	\end{itemize}
	If you find that the \texttt{betterFullStop} does not work for your purposes, then you
	can switch it off by setting it to \texttt{0}, and you can experiment with the
	\texttt{other} field.%
	\announce{2019-07-13}{fine tuning the betterFullStop} You can also seek to customise the \texttt{betterFullStop}
	routine by using the \emph{fine tuning}, detailed in \vref{lst:fineTuning}.

	The \texttt{basicFullStop} routine should probably be avoided in most situations, as it
	does not accommodate the specifications above. For example, using the following command
	\index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl url -m -l=alt-full-stop1.yaml
\end{commandshell}
	and the YAML in \cref{lst:alt-full-stop1-yaml} gives the output in \cref{lst:url-mod2}.

	\begin{cmhtcbraster}[ raster left skip=-3.5cm,
			raster right skip=-2cm,
			raster force size=false,
			raster column 1/.style={add to width=.1\textwidth},
			raster column skip=.06\linewidth]
		\cmhlistingsfromfile{demonstrations/url-mod2.tex}{\texttt{url.tex} using \cref{lst:alt-full-stop1-yaml}}{lst:url-mod2}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/alt-full-stop1.yaml}[MLB-TCB,width=.5\textwidth]{\texttt{alt-full-stop1.yaml}}{lst:alt-full-stop1-yaml}
	\end{cmhtcbraster}

	Notice that the full stop within the URL has not been accommodated correctly because of
	the non-default settings in \cref{lst:alt-full-stop1-yaml}.

\subsubsection{Features of the oneSentencePerLine routine}
	The sentence manipulation routine takes place \emph{after} verbatim \index{verbatim!in
	relation to oneSentencePerLine} environments, preamble and trailing comments have been
	accounted for; this means that any characters within these types of code blocks will not
	be part of the sentence manipulation routine.

	For example, if we begin with the \texttt{.tex} file in \cref{lst:multiple-sentences3},
	and run the command \index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences3 -m -l=manipulate-sentences.yaml
\end{commandshell}
	then we obtain the output in \cref{lst:multiple-sentences3-mod1}.
	\cmhlistingsfromfile{demonstrations/multiple-sentences3.tex}{\texttt{multiple-sentences3.tex}}{lst:multiple-sentences3}
	\cmhlistingsfromfile{demonstrations/multiple-sentences3-mod1.tex}{\texttt{multiple-sentences3.tex} using \vref{lst:manipulate-sentences-yaml}}{lst:multiple-sentences3-mod1}

	Furthermore, if sentences run across environments then, by default, the line breaks
	internal to the sentence will be removed. For example, if we use the \texttt{.tex} file
	in \cref{lst:multiple-sentences4} and run the commands \index{switches!-l demonstration}
	\index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences4 -m -l=manipulate-sentences.yaml
latexindent.pl multiple-sentences4 -m -l=keep-sen-line-breaks.yaml
\end{commandshell}
	then we obtain the output in
	\cref{lst:multiple-sentences4-mod1,lst:multiple-sentences4-mod2}.
	\cmhlistingsfromfile{demonstrations/multiple-sentences4.tex}{\texttt{multiple-sentences4.tex}}{lst:multiple-sentences4}
	\begin{widepage}
		\cmhlistingsfromfile{demonstrations/multiple-sentences4-mod1.tex}{\texttt{multiple-sentences4.tex} using \vref{lst:manipulate-sentences-yaml}}{lst:multiple-sentences4-mod1}
	\end{widepage}
	\cmhlistingsfromfile{demonstrations/multiple-sentences4-mod2.tex}{\texttt{multiple-sentences4.tex} using \vref{lst:keep-sen-line-breaks-yaml}}{lst:multiple-sentences4-mod2}

	Once you've read \cref{sec:poly-switches}, you will know that you can accommodate the
	removal of internal sentence line breaks by using the YAML in \cref{lst:item-rules2-yaml}
	and the command \index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences4 -m -l=item-rules2.yaml
\end{commandshell}
	the output of which is shown in \cref{lst:multiple-sentences4-mod3}.

	\begin{cmhtcbraster}
		\cmhlistingsfromfile{demonstrations/multiple-sentences4-mod3.tex}{\texttt{multiple-sentences4.tex} using \cref{lst:item-rules2-yaml}}{lst:multiple-sentences4-mod3}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/item-rules2.yaml}[MLB-TCB]{\texttt{item-rules2.yaml}}{lst:item-rules2-yaml}
	\end{cmhtcbraster}

\subsubsection{Text wrapping and indenting sentences}
	The \texttt{oneSentencePerLine} \announce{2018-08-13}{oneSentencePerline text wrap and
	indent} can be instructed to perform text wrapping and indentation upon sentences.
	\index{sentences!text wrapping} \index{sentences!indenting}%

	Let's use the code in \cref{lst:multiple-sentences5}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences5.tex}{\texttt{multiple-sentences5.tex}}{lst:multiple-sentences5}

	Referencing \cref{lst:sentence-wrap1-yaml}, and running the following command
	\index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences5 -m -l=sentence-wrap1.yaml
\end{commandshell}
	we receive the output given in \cref{lst:multiple-sentences5-mod1}.

	\begin{cmhtcbraster}[ raster left skip=-3.5cm,
			raster right skip=-2cm,
			raster force size=false,
			raster column 1/.style={add to width=.1\textwidth},
			raster column skip=.06\linewidth]
		\cmhlistingsfromfile{demonstrations/multiple-sentences5-mod1.tex}{\texttt{multiple-sentences5.tex} using \cref{lst:sentence-wrap1-yaml}}{lst:multiple-sentences5-mod1}
		\cmhlistingsfromfile[style=yaml-LST]{demonstrations/sentence-wrap1.yaml}[MLB-TCB,width=0.5\textwidth]{\texttt{sentence-wrap1.yaml}}{lst:sentence-wrap1-yaml}
	\end{cmhtcbraster}

	If you specify \texttt{textWrapSentences} as 1, but do \emph{not} specify a value for
	\texttt{columns} then the text wrapping will \emph{not} operate on sentences, and you
	will see a warning in \texttt{indent.log}.

	The indentation of sentences requires that sentences are stored as code blocks. This
	means that you may need to tweak \vref{lst:sentencesEndWith}. Let's explore this in
	relation to \cref{lst:multiple-sentences6}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences6.tex}{\texttt{multiple-sentences6.tex}}{lst:multiple-sentences6}

	By default, \texttt{latexindent.pl} will find the full-stop within the first
	\texttt{item}, which means that, upon running the following commands \index{switches!-l
	demonstration} \index{switches!-m demonstration} \index{switches!-y demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml 
latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml -y="modifyLineBreaks:oneSentencePerLine:sentenceIndent:''"
\end{commandshell}
	we receive the respective output in \cref{lst:multiple-sentences6-mod1} and
	\cref{lst:multiple-sentences6-mod2}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences6-mod1.tex}{\texttt{multiple-sentences6-mod1.tex} using \cref{lst:sentence-wrap1-yaml}}{lst:multiple-sentences6-mod1}

	\cmhlistingsfromfile{demonstrations/multiple-sentences6-mod2.tex}{\texttt{multiple-sentences6-mod2.tex} using \cref{lst:sentence-wrap1-yaml} and no sentence indentation}{lst:multiple-sentences6-mod2}

	We note that \cref{lst:multiple-sentences6-mod1} the \texttt{itemize} code block has
	\emph{not} been indented appropriately. This is because the oneSentencePerLine has been
	instructed to store sentences (because \cref{lst:sentence-wrap1-yaml}); each sentence is
	then searched for code blocks.

	We can tweak the settings in \vref{lst:sentencesEndWith} to ensure that full stops are
	not followed by \texttt{item} commands, and that the end of sentences contains
	\lstinline!\end{itemize}! as in \cref{lst:itemize-yaml} (if you intend to use this,
	ensure that you remove the line breaks from the \texttt{other} field). \index{regular
	expressions!lowercase alph a-z} \index{regular expressions!uppercase alph A-Z}
	\index{regular expressions!numeric 0-9} \index{regular expressions!horizontal space
	\textbackslash{h}}

	\cmhlistingsfromfile[style=yaml-LST]{demonstrations/itemized.yaml}[MLB-TCB]{\texttt{itemize.yaml}}{lst:itemize-yaml}

	Upon running \index{switches!-l demonstration} \index{switches!-m demonstration}
	\begin{commandshell}
latexindent.pl multiple-sentences6 -m -l=sentence-wrap1.yaml,itemize.yaml
\end{commandshell}
	we receive the output in \cref{lst:multiple-sentences6-mod3}.

	\cmhlistingsfromfile{demonstrations/multiple-sentences6-mod3.tex}{\texttt{multiple-sentences6-mod3.tex} using \cref{lst:sentence-wrap1-yaml} and \cref{lst:itemize-yaml}}{lst:multiple-sentences6-mod3}

	Notice that the sentence has received indentation, and that the \texttt{itemize} code
	block has been found and indented correctly.
