summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/gmverse
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/gmverse
Initial commit
Diffstat (limited to 'macros/latex/contrib/gmverse')
-rw-r--r--macros/latex/contrib/gmverse/README64
-rw-r--r--macros/latex/contrib/gmverse/gmverse.pdfbin0 -> 218619 bytes
-rw-r--r--macros/latex/contrib/gmverse/gmverse.sty822
3 files changed, 886 insertions, 0 deletions
diff --git a/macros/latex/contrib/gmverse/README b/macros/latex/contrib/gmverse/README
new file mode 100644
index 0000000000..15d6abc9da
--- /dev/null
+++ b/macros/latex/contrib/gmverse/README
@@ -0,0 +1,64 @@
+The gmverse package
+is a work of Grzegorz `Natror' Murzynowski,
+<natror at o2 dot pl>
+
+
+1. Copyright 2006, 2008 by Grzegorz `Natror' Murzynowski
+
+This program is subject to the LaTeX Project Public License.
+See http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html
+for the details of that license.
+
+
+2. Introduction
+
+The gmverse.sty package redefines the verse environment to introduce
+right alignment of the rest of the broken lines. With the voc package
+option the verse environment typesets its contents optically centered
+(horizontally) on the page.
+
+
+3. Installation
+
+Just put the gmverse.sty somewhere in the texmf/tex/latex
+branch. Creating a /texmf/tex/latex/gm directory may be advisable if
+you consider using other packages written by me.
+
+Then you should refresh your TeX distribution's files'
+database most probably.
+
+
+4. Contents
+
+The distribution of this package consists of the following three files.
+
+gmverse.sty
+README
+gmverse.pdf
+
+
+5. Documentation
+
+The last of the above files (the .pdf) is a documentation compiled
+from the .sty file by running LaTeX on the gmverse.sty file twice:
+xelatex gmverse.sty
+ in the directory you wish the documentation to be in,
+you don't have copy the .sty file there---TeX will find it,
+then MakeIndex on the gmverse.idx file, and then LaTeX
+on gmverse.sty once more.
+
+MakeIndex shell command:
+ makeindex -r gmverse
+The -r switch is to forbid MakeIndex make implicit ranges since the
+(code line) numbers will be hyperlinks
+
+Compiling of the documentation requires the packages: gmdoc
+(gmdoc.sty and gmdocc.cls), gmverb.sty, gmutils.sty and also some
+standard packages: hyperref.sty, xcolor.sty, geometry.sty,
+multicol.sty, lmodern.sty, fontenc.sty that should have been installed
+on your computer by default.
+
+If you have not installed the mwart.cls class (available on CTAN in
+mwcls package), the result of your compilation may differ a bit from
+the .pdf provided in this .zip archive in formattings: If you have not
+installed mwart.cls, the standard article.cls will be used.
diff --git a/macros/latex/contrib/gmverse/gmverse.pdf b/macros/latex/contrib/gmverse/gmverse.pdf
new file mode 100644
index 0000000000..9b278324e6
--- /dev/null
+++ b/macros/latex/contrib/gmverse/gmverse.pdf
Binary files differ
diff --git a/macros/latex/contrib/gmverse/gmverse.sty b/macros/latex/contrib/gmverse/gmverse.sty
new file mode 100644
index 0000000000..51c1140fee
--- /dev/null
+++ b/macros/latex/contrib/gmverse/gmverse.sty
@@ -0,0 +1,822 @@
+%
+% \GetFileInfo{gmverse.sty}
+% \title{The \pk{gmverse} Package\thfileinfo}
+% \author{Grzegorz Murzynowski}
+% \date{\today}
+% \maketitle
+%%
+%% This is (a~documentation of) file \pk{gmverse.sty}, intended to be
+%% used with \LaTeXe. % This package redefines \env{verse} environment
+%% to optionize |\\| for line ends and gives it a~possibility of
+%% optical centering and `right-hanging' alignment of lines
+%% broken because of length.
+%%
+%% \medskip
+%%
+% \begin{copyrnote}
+%
+%% Written by Natror (Grzegorz Murzynowski),
+%% natror at o2 dot pl
+%%
+%% \copyright\,2006, 2008 by Natror (Grzegorz Murzynowski).
+%%
+%% This program is subject to the \LaTeX\ Project Public License.
+%% See \url{http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html} ^^A
+%% for the details of that license.
+%%
+%% LPPL status: "author-maintained".\par
+%%
+%% Many thanks to my \TeX\ Guru Marcin Woli\'nski for his \TeX nical ^^A
+%% support.\par
+%\end{copyrnote}
+%
+%
+% \chschange{v0.71}{2008/8/6}{825}
+% \chschange{v0.72}{2008/8/30}{823}
+% \chschange{v0.73}{2008/9/4}{822}
+%
+%
+
+%\iffalse we skip the driver
+\ifnum\catcode`\@=12
+\documentclass[countalllines, codespacesgrey, pagella, fontspec=quiet]{gmdocc}
+\twocoltoc
+ \DeclareSymbolFont{operators} {T1}{TeXGyrePagella(0)} {m}{n}
+% moved from body of text.
+\begin{document}
+\exhyphenpenalty\hyphenpenalty
+\DocInput{\jobname.sty}
+\typeout{%
+ Produce index with^^J%
+ makeindex -r \jobname^^J}
+\afterfi{\end{document}
+
+% And for the future, when the changes' history is nonempty
+\typeout{%
+ Produce change log with^^J%
+ makeindex -r -s gmglo.ist -o \jobname.gls \jobname.glo^^J
+ (gmglo.ist should be put into some texmf/makeindex directory.)^^J}
+}
+\fi
+%\fi\FileInfo
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{gmverse}
+ [2008/09/04 v0.73 A redefinition of verse env. (GM)]
+
+%
+% \tableofcontents
+%
+%
+% \division{Intro, General Usage}
+%
+% An inspiration for me was the \pk{verse} package by Peter Wilson and
+% Herries Press but, as you will see, I~take a~slightly different task.
+% The main goal is to make verse typeset long and broken lines flush right
+% (i.e., the beginning line flush left as usual and the ending one flush right)
+% and optionally gives the ending a~square bracket ([), as sometimes
+% practiced in Polish typesetting of poetry.
+% This main task is fulfilled by \TextUsage\versehangright\
+% declaration executed by
+% default and the |[| option is provided by
+% \TextUsage\versehangrightsquare\ declaration, executed if the
+% package is loaded with \TextUsage*{squarebr}
+% option.
+%
+% One more declaration is \TextUsage\verseopticalcenter\ that makes
+% \env{verse}s centered due to their baric centre. I~gently deprecate
+% this declaration since it requires also another,
+% |\defvocgamma[true]| or |[false]|, and what you need most probably
+% is \TextUsage\vocweigh|3|---\hskip0spa~declaration of optical centering due
+% to the sum of cubics of the line lengths (it looks best) and
+% declares all what's needed. If you type |\vocweigh[]3|, the long
+% lines will be broken with [ preceding the lower part. ^^A]
+%
+%
+% \stanza
+% My (little) experience is with typesetting great poetry the power of
+% which is not in the shape of verses and stanzas but in the words
+% so I~did not pay much attention such things as sophisticated
+% indentation. And my opinion is that all verses in one document
+% (book) should be typeset as similarly as possible so that the power
+% of their words could rather talk not the variety of their
+% shapes. That's why my redefinition of \env{verse} is done at the
+% beginning and once forever.
+%
+% But if someone \emph {really} has to use different versions of
+% \env{verse}, I~left \himher\ a~doorway: the \TextUsage*{local}
+% option of the package,
+% with which the declarations redefining \env{verse} are not executed (and,
+% of course, may be put anywhere the user wishes, with all the scoping
+% rules). If |local| option is used, there's no use of |squarebr|
+% option and the latter does no harm.
+%
+% Another task I~set myself was to "preserve'' known commands so that they
+% work in a~known way, namely \TextUsage*{\\*}\arg[skip] and blank line.
+% But in these redefined \env{verse}'s one isn't forced to end every line
+% with |\\|. Ending a~line with just the |^^M| character will work too.
+%
+%
+% \subdivision{Parameters}
+%
+% As you can see below, my \env{verse}, unlike the \LaTeX's and \pk{verse}'s ones,
+% does not create a~\env{list} environment. It uses the following
+% parameters:
+% \begin{verse}
+% |\verseskipbefore|
+% |\verseskipafter|
+% |\stanzaskip|
+% |\betweenstanzaspenalty|
+% |\instanzapenalty|
+% |\versegenericlinewidth|
+% |\versemaxlinewidth|
+%\end{verse}
+% I~suppose their names are self-explaining. Maybe except the last
+% two. \TextUsage\versegenericlinewidth\ is a~dimen register intended
+% to store an average line width of a~verse. It'll be used to set the
+% optical centering.
+%
+% What optical centering is? The basic assumption of this package is
+% that all the verses are aligned left (ragged right). Optical
+% centering of a~verse is such setting the left margin that the verse
+% (a~ragged body of text) seems to be balanced at the vertical axis of
+% the page. In other words, to human eyes the baric centre of the
+% verse seems to lie on the vertical axis of the page.
+%
+% \stanza
+% The \TextUsage\versemaxlinewidth\ is a~dimen register to store
+% a~maximum acceptable line width. The lines exceeding this width will
+% be broken and (if the default declaration |\versehangright(square)|
+% is in force) the broken ending will be aligned right.
+%
+% Those two parameters should only be set with
+% \TextUsage\versecenterdue\arg{generic line (text)} and
+% \TextUsage\versemaxline\arg{longest acceptable line (text)}
+% commands, which set the dimens \emph{and} switch proper
+% switches, \TextUsage\ifcenterverse\ and \TextUsage\ifmaxversewidth\
+% respectively.
+%
+% If you have used |\versecenterdue| or |\versemaxline| and since some
+% point you don't want center the verse due to generic line width
+% (n)or delimit line's width, just write |\centerversefalse| or
+% |\maxversewidthfalse| respectively.
+%
+% |\versecenterdue| takes one argument, which should be any text, rule
+% or |\hskip| of desired width. The starred version |\versecenterdue*|
+% takes explicit width (dimen) as its argument.
+%
+% |\versemaxline| works the same way.
+%
+% \stanza
+% \TextUsage\betweenstanzaspenalty\ is the penalty put between
+% the stanzas, as its name suggests. Its goal is to encourage the
+% pagebreaks between two stanzas not in the middle of a~stanza. By
+% default, it is set equal |\interlinepenalty| at
+% |\begin{document}| but thanks to a~little trick you can set it also
+% in the preamble\footnote{Unless you don't want it to be ^^B
+% \cs{maxdimen}.}.
+%
+% \stanza
+% \TextUsage\instanzapenalty\ is the penalty but between two lines of
+% a~stanza. Its goal is to discourage the pagebreaks within
+% a~stanza. By default, it's set equal |\clubpenalty| at
+% |\begin{document}| and thanks to the same trick as above you can set
+% it also in the preamble.
+%
+% \stanza
+% The default value both of \TextUsage\verseskipbefore\ and
+% \TextUsage\verseskipafter\ is |\medskipamount|.
+%
+% ^^A%% I~found also funny to write a~possibility a~verse has alternately
+% ^^A%% indented stanzas (e.g.\ in stanza and refrain case) or just lines.
+%
+% \subdivision{Four flavours of optical centering}
+% The \pk{gmverse} package provides optical centering of verse. By
+% `optical centering' I~mean such a~placing of the box containing
+% a~verse that it seems be balanced on the vertical axis of the page.
+%
+% The optical centering may be automatic or manual. The automatic comes
+% in four flavours, all of them cases of a~general formula.
+% The idea is to compute some average of the lines' lengths and set the
+% rectangle's width to that average.
+%
+% The first kind of average one can think of is arithmetical
+% mean. That
+% \let\mi\mathit \let\mr\mathrm
+% \newcommand*\eq {\mathrel{\hbox{=}}}^^A~to use pagella = not LMR.
+% \newcommand*\eqs {\mathrel{\hbox{\scriptsize=}}}
+% is the case $W_{1}$. The last kind of average is `only the longest line
+% counts', that's $W_\infty$. Between them are $\continuum$
+% possibilities: consider a~formula
+%^^A |\EU1/TeXGyrePagella(0)/m/n/11|
+%% \[W_\alpha\eq \sum_{\mi k\eqs \mr1}^{\mi n}
+% {\mi l_{\mi k}}^{\mi\alpha}\Big/\sum_{\mi k\eqs \mr1}^{\mi n}
+% {\mi l_{k^^B\showthe\textfont0
+% }}^{\alpha-\mr1}\]
+% where $\mi l_{\mi k}$, $\mi k\eq \mr1\hbox{,}\dots \mi n$ are the lengths of the
+% lines\footnote{Assume they all have nonzero length when $\alpha\eq \mr1$.}
+% and $\alpha\in\hbox{[}\mr1,\hbox{+}\infty\hbox{)}$.
+%
+% When $\alpha\eq \mr1$, all the lines have `equal right to decide' about the
+% mean. When $\alpha$ grows, the longer lines become `r\'owniejsze'
+% (`more equal', a~term from the \acro{PRL} epoch to describe unjust
+% privileges of the Party Aparatchiks), which means they mean
+% more to the mean.
+%
+% We define $\mi W_\infty$ most naturally, as the limit:
+% \[\mi W_\infty \eq \lim_{\alpha\rightarrow\infty} \mi W_\alpha\]
+% and we notice easily that $\mi W_\alpha$ corresponds with taking only the
+% longest line into account.
+%
+% Me personally like $\mi W_{\mr3}$ most and that's the default
+% when optical centering is on.
+%
+% If you prefer to set the centering manually, you are given
+% two ways to do that: the |\vocpussyhair|
+% parameter (dimen) intended for a~slight modifications of the result of
+% automatical
+% computation, and the declaration(s)
+% \[|\versecenterdue|\arg{benchmark text}\] or
+% \[|\versecenterdue*|\arg{benchmark dimen}.\]
+%
+%
+% \subdivision{New environments}
+% You can define new verse environments in a~way \TextUsage*{verse0}
+% is defined in line \ref{new envs}, that is in such definitions write |\verse| and
+% |\endverse| and not |\begin{verse}| \dots\ |\end{verse}|.
+%
+% \division{The Code}
+% \subdivision{Package options}
+
+\newif\ifverseloc@l
+\DeclareOption{local}{\verseloc@ltrue}
+
+\newif\ifsqu@rebr
+\DeclareOption{squarebr}{\squ@rebrtrue}
+
+\newif\ifv@c
+\DeclareOption{voc}{\v@ctrue}
+
+\DeclareOption{vocweigh1}{\v@ctrue\AtEndOfPackage{\vocweigh1 }}
+\DeclareOption{vocweigh2}{\v@ctrue\AtEndOfPackage{\vocweigh2 }}
+\DeclareOption{vocweigh3}{\v@ctrue\AtEndOfPackage{\vocweigh3 }}
+\DeclareOption{vocweigh8}{\v@ctrue\AtEndOfPackage{\vocweigh8 }}
+
+
+\ProcessOptions
+
+% \subdivision{Preliminaries and parameters}
+%
+\long\def\firstofone#1{#1}
+\bgroup\catcode`\^^M=\active%
+\firstofone{\egroup%
+\def\defobeylines{\catcode`\^^M=\active \def^^M{\par}}}%
+
+\long\def\afterfi#1#2\fi{\fi#1}
+
+\newtoks\everyverse
+\everyverse={}
+\newdimen\verseleftskip
+\verseleftskip=1,5em\relax
+
+\newlength{\versealtleftskip}
+\versealtleftskip=1,5em\relax
+
+\newcommand*\begversesquareh@ck{\relax}
+\newcommand*\parversesquareh@ck{\relax}
+\newcommand*\eversesquareh@ck{\relax}
+\newcounter{verselinenum}
+\newskip\verseinstanzaparskip
+
+
+\@ifundefined{stanzaskip}{\newlength\stanzaskip}{}
+\stanzaskip=\medskipamount
+
+\newlength\verseskipbefore
+\newlength\verseskipafter
+\verseskipbefore=\medskipamount
+\verseskipafter=\medskipamount
+
+\newcount\instanzapenalty \instanzapenalty=\maxdimen
+\AtBeginDocument{%
+ \ifnum\instanzapenalty=\maxdimen
+ \instanzapenalty=\clubpenalty
+ \fi}
+
+\newcount\betweenstanzaspenalty \betweenstanzaspenalty=\maxdimen
+\AtBeginDocument{%
+ \ifnum\betweenstanzaspenalty=\maxdimen
+ \betweenstanzaspenalty=100
+ \fi}
+% Primarily the five parameters above were set |\AtBeginDocument|
+% unconditionally , but it was
+% not good, 'cause thus they couldn't be set other way in
+% the~preamble. As you see, we use the fact that in some circumstances
+% a~|\dimen| register works as a~|\count|.
+%
+%
+%
+% \subdivision{Long line rest alignment to the right}
+
+\newcounter{stanzanum}
+\newif\ifalterstanzas
+
+
+\newif\if@linetogether
+% \changes{v0.68}{07/04/12}{added to meet ls-R needs}
+\@linetogethertrue
+
+\newcommand*\versehangright{%
+\renewenvironment{verse}{%
+ \par \setcounter{verselinenum}{0}\relax
+ % As you'll see, stanza break is done by changing |\parskip| by |\par|
+ % in vmode and then by |\everypar|. Below is preliminary---\hskip0spstoring old
+ % value of |\parskip|. Idea of this hack comes from Marcin Woli\'nski.
+ \verseinstanzaparskip=\parskip\relax
+ \if@linetogether\interlinepenalty=\@M\fi
+ \clubpenalty=0\relax \widowpenalty=0\relax
+ \parindent=0pt\relax%here 'cause later optical centering deals with it.
+ \ifcenterverse \parindent=\linewidth
+ \advance \parindent by -\versegenericlinewidth
+ \advance \parindent by -0.5\parindent
+ \verseleftskip=\z@\relax% added 2006-07-15
+ \fi% of \cs{ifcenterverse}
+ \leftskip=\verseleftskip plus1fill\relax
+ \advance\leftskip by\vocpussyhair\relax
+ \ifmaxversewidth
+ \dimen0=\linewidth
+ \advance\dimen0 by -\parindent
+ \ifdim\dimen0>\versemaxlinewidth
+ \rightskip=\linewidth
+ \advance\rightskip by-\parindent
+ \advance\rightskip by-\versemaxlinewidth
+ \advance\rightskip by0pt plus1fil
+ \else\rightskip=0pt plus1fil
+ \fi% of \cs{ifdim}
+ \else\rightskip=0pt plus1fil\relax
+ \fi% of \cs{ifmaxversewidth}
+ \parfillskip=0pt plus1fil \hyphenpenalty=100 %
+ \newif\ifstanzabreak
+ \def\par{%
+ \ifvmode %^^A\ifstanzabreak\penalty10000 \vskip\stanzaskip
+ \ifnum0<\c@verselinenum\relax% we don't want stanza break before verse
+ \ifstanzabreak
+ \stepcounter{stanzanum}%
+ \penalty10000 \vfil\penalty\betweenstanzaspenalty\vfilneg\relax
+ % As announced, we change |\parskip| to make a~stanza break
+ \parskip=\stanzaskip\relax \stanzabreakfalse\relax
+ \ifalterstanzas
+ \ifodd\c@stanzanum
+ \ifnum\c@stanzanum>1\advance\leftskip-\versealtleftskip\fi
+ \else\advance\leftskip\versealtleftskip
+ \fi
+ \fi
+ \fi% of \cs{ifstanzabreak}
+ \else
+ \setcounter{stanzanum}{1}%
+ \fi% of \cs{ifnum\bslash c@verselinenum}
+ \else
+ \penalty\instanzapenalty\relax\stanzabreaktrue\relax
+ \fi% of \cs{ifvmode}
+ \ifhmode \strut% to make square bracketing case work properly
+ % where there'll be |\nointerlineskip|
+ \stepcounter{verselinenum}\relax
+ \endgraf\parversesquareh@ck\fi}
+ \everypar{% At new hmode we restore old value of |\parskip|.
+ \parskip=\verseinstanzaparskip\relax
+ % and then we hack with stretchability
+ \hskip0ptplus-1fill\relax}
+ % At the beginning of verse we give some skip
+ \addvspace\verseskipbefore% not just |\vskip| 'cause this \LaTeX\
+ % command will check if there's another
+ % skip and 'll use the bigger one, not two.
+ \def\br@cketskip [####1]{\vspace{####1}}% four |#|s, indeed!
+ \def\\{\@ifstar{\nopagebreak\@ifnextchar{[}{\br@cketskip}{}}%^^A]
+ {\@ifnextchar{[}{\br@cketskip}{}}}%^^A]
+ \renewcommand*\newpage{\nopagebreak\vfil\pagebreak}%
+ % I~redefine |\newpage| because the original one spoils |\leftskip| or
+ % |\rightskip|, very important and delicate here.
+%
+\let\@doendpe\relax% so that |\par| redefing environments don't spoil
+ % verse's redef'ed |\par|
+\def\^^M{\ \par}% to make it work as in normal catcodes
+
+\let\@sanitize\gmverse@sanitize% for |\index| macros in active ^^M's
+ % scope (see below)
+ \obeylines \the\everyverse \begversesquareh@ck%
+}% of begdef{verse}
+% enddef of \env{verse}:
+{\ifhmode \par \fi \eversesquareh@ck%
+ % ^^A\ifstanzabreak\else\vskip-\stanzaskip\fi% hope there'll be no need of
+ % ^^A~reverse skip if stanza break is launched by \everypar
+ \setbox0=\hbox{12324567890qypf[]gp}\prevdepth=\dp0 %
+ % so that \TeX\ deal with usual |\baselineskip| not add |\lineskiplimit|
+ \vskip\verseskipafter \relax
+ \global\vocpussyhair=\z@\relax
+ \@endpetrue
+}% of enddef
+}% of |\versehangright|
+
+% \subdivision{Long line rest begun with a~[}^^A]
+%
+% The hacks given below i~wrote with Marcin Woli\'nski's help
+% 2006/06/26
+\newcommand*\versehangrightsquare{\versehangright
+ \renewcommand*\begversesquareh@ck{\relax\dimen0=\prevdepth
+ \setbox0=\vbox\bgroup\prevdepth=\dimen0 \strut\e@tlineends}%
+ \renewcommand*\parversesquareh@ck{\relax\ifnum\prevgraf>1
+ \setbox0=\lastbox \nointerlineskip% not |\unskip|---we don't
+ % remove interline glue and set new
+ % but we assure there'll be a~proper
+ % glue afrer first pass (see |\strut|
+ % before |\endgraf|) and don't add any
+ % new glue with [ pass ^^A]
+ \hbox to \hsize{\hfill [\hskip-\leftskip\unhbox0}%^^A]
+ \fi\relax}
+ \renewcommand*\eversesquareh@ck{\relax\egroup\unvbox0\relax}%
+\squ@rebrtrue% so that local calling of |\verseopticalcenter| call
+ % this redefinition if called after it
+}
+
+% The pair of macros below is used to gobble ^^M's in |\obeylines|'
+% scope. It uses the fact that Knuthian |\obeylines| |\let|s not |\def|s.
+\def\e@tlineends{\futurelet\tokennotyete@ten\e@tlineend}
+\def\e@tlineend{\ifx\par\tokennotyete@ten
+ \expandafter\expandafter\expandafter\e@tlineends\expandafter\@gobble
+ \fi}
+
+
+% \subdivision{Centering and optical centering}
+
+\newlength\versegenericlinewidth
+\newlength\versemaxlinewidth
+\newlength\versepussyhair% for additional correction in case of
+ % automatic optical centering.
+
+\newif\ifcenterverse
+\newcommand*\versecenterduest@r[1]{%
+ \versegenericlinewidth=#1\relax \centerversetrue}
+\newcommand*\versecenterduest@rless[1]{
+ \settowidth{\versegenericlinewidth}{#1}%
+ \centerversetrue}
+\newcommand*\versecenterdue{%
+ \@ifstar{\versecenterduest@r}{\versecenterduest@rless}}
+
+\newif\ifmaxversewidth
+\newcommand*\versemaxlinest@r[1]{%
+ \versemaxlinewidth=#1\relax}
+\newcommand*\versemaxlinest@rless[1]{%
+ \settowidth{\versemaxlinewidth}{#1}%
+ \maxversewidthtrue}
+\newcommand*\versemaxline{%
+ \@ifstar{\versemaxlinest@r}{\versemaxlinest@rless}}
+
+
+
+\newdimen\re@ltextw% to store the real |\textwidth|
+\newdimen\vocpussyhair% for a~finishing touch after optical
+% centering. The name is owed to A.T. (one of Polish
+% typography Gurus), who used to say
+% ''Ja bym to jeszcze przesun\k a\l\ o~piczny w\l os w~lewo'' (`I'd
+% move it left a~pussy hair') As you'll see, this register is cleared
+% after each \env{verse} so you don't care about scopes.
+
+\newcount\gmvs@counta
+% A~scratch count for global assignments (originally it was |\count1|,
+% not a~good idea.
+
+\newcommand*\verseoptic@lcenter{%
+ {\ifsqu@rebr\versehangrightsquare%
+ \else\versehangright\fi%
+ \global\let\inn@verse=\verse%
+ \global\let\endinn@verse=\endverse\relax}%
+%
+ \renewenvironment{verse}{\par%
+ \newtoks\verse@contens \verse@contens={}\relax%
+ \long\def\per@verse####1\end####2{%
+ \addto@hook\verse@contens{####1}\checkifpr@perend{####2}}%
+ \def\checkifpr@perend####1{\def\pr@perend@test{####1}%
+ \ifx\pr@perend@test\@currenvir%
+ \addto@hook\verse@contens{\par}\expandafter\end{####1}%
+ \else
+ \addto@hook\verse@contens{\end{####1}}\expandafter\per@verse%
+ \fi}%
+ \defobeylines\per@verse}%of begdef
+ % So we have all the environment's contents in the |\verse@contens|
+ % tokslist
+ {%
+ {% we switch off some commands
+ \def\br@cketskip [####1]{}% parameters are not allowed in enddef
+ \def\\{\@ifstar{\@ifnextchar{[}{\br@cketskip}{}}%^^A]
+ {\@ifnextchar{[}{\br@cketskip}{}}}%^^A]
+ \renewcommand*\newpage{}%
+ % and set |\par| for the first boxing (to measure)
+ \def\par{%
+ \ifhmode\endgraf%
+ \ifnum\prevgraf=1 %
+ \setbox0=\lastbox\setbox2=\hbox{\unhbox0}%
+ \else
+ \setbox2=\hbox to\re@ltextw{}%
+ \fi%
+% If the last paragraph typeset has only one line, we give it
+% the weighing subroutine. If that paragraph has another number of
+% lines, which means the respective line of the verse is longer than
+% |\textwidth|, then we give a~|\textwidth|-long box the weighing
+% subroutine.
+%
+% The question is still open how to center a~verse with very long
+% lines. The solution chosen here seems to be reasonable if the long
+% lines are rather seldom. (Note that weighing full-length lines
+% |\prevgraf|${}-\mr1$ times and then the last paragraph line isn't
+% advisable since the line rest is aligned right so it rather acts as
+% a~full-length in perception of the verse.) Note that the weighing
+% subroutine always gets a~line not longer than
+% |\textwidth|.\label{textW}
+ \voc@weighline 2 1 \gmvs@counta %parameters: |#1| box register, |#2| dimen
+ % for total length, |#3| count for sum of weights
+ \fi% of outermost |\ifhmode| and of |\par|
+ }%of |\def\par|
+ %
+ % the very boxing and weighing
+ % preliminaries
+ \re@ltextw=\textwidth\relax
+ \ifvoccubic\global\voc@edivs=0\relax\fi% in cubic case we are
+ % quite close arithmetics' limitations. This count is for
+ % number of emergency divisions to avoid overflow.
+ \textwidth=0.5\maxdimen\relax%
+ \global\gmvs@counta=0\relax\global\dimen1=\z@\relax%
+ % they'll be the number of lines and their scaled total length
+ \setbox0=\vbox{%
+ \the\verse@contens}% of |\vbox|
+ % ^^A \message{@it should be measured@}%
+ % ^^A \showthe\count1\showthe\dimen1%
+ %
+ %
+ % And the finale of weighing:
+ \voc@weightotal 1 \gmvs@counta% |#1| input/result dimen, |#2| input count.\\
+ % If there were emergency divisions just restore original
+ % |\voc@scale| and nullize \nlpercent|\voc@edivs|
+ \ifnum\voc@edivs>0\global\voc@scale=\@@voc@scale\relax
+ \global\voc@edivs=0\relax
+ \fi% of \cs{ifnum}\par
+ % Common sense's touch:
+ \ifdim\dimen1<\z@\global\dimen1=\z@\relax\fi
+ \ifdim\dimen1>\re@ltextw\global\dimen1=\re@ltextw\relax\fi
+ % ^^A\showthe\dimen1\relax%
+ }% of group for first boxing
+ \versecenterdue*{\dimen1}%
+ \global\dimen1=\z@\relax%
+ % and the very verse at last
+ \expandafter\inn@verse%
+ % \expandafter so that |\inn@verse| could see leading |^^M| signs
+ \the\verse@contens%
+ \endinn@verse%
+ }% of verse's enddef
+}% of |\verseoptic@lcenter|
+
+
+\newif\ifvocgamma% to be able to make longer lines weigh more than
+ % short ones in the average.
+\newif\ifvoccubic% switch for cubic weight function.
+\voccubictrue
+\newif\ifvocmax% switch for max weight function
+%
+% Two parameters below were experimentally set to given values
+% under \pdfeTeX. The trial text was Wis\l awa Szymborska's
+% ,,Pod jedn\k a~gwiazdk\k a'' verse typed in one verse environment 11
+% times (and the cubic weighing option was taken)
+% Chosen verse has many lines and all are long.
+% If someone writes text with lines much than those more than 2
+% times, \heshe\ should consider if what \heshe\ writes is really
+% a~verse and therefore if should it be typeset in a~\env{verse}
+% environment.
+\newcount\voc@scale \global\voc@scale="2000 % it'll give us .125pt precision
+\def\@@voc@scale{"2000}
+\newdimen\vocunitlength \global\vocunitlength=8pt %
+\newcount\voc@edivs% voc emergency divisions
+
+\newcommand*\defvocgamma[1][false]{%
+ \csname vocgamma#1\endcsname
+ \ifvocgamma
+ \def\voc@weighline##1##2##3{%\begin{enumargs}[2]
+% \item box register,
+% \item dimen for total length,
+% \item count for sum of weights
+% \end{enumargs}
+%
+% \stanza
+% The box |##1| is |\re@ltextw|-wide at most, see the remark after
+% line \ref{textW}.
+ \dimen0=\wd##1 %
+ % we divide the length of a~line by |\vocunitlength|
+ \dimen2=\vocunitlength
+ %^^A\count2=\dimen2\relax \divide\count2 by \voc@scale\relax
+ \count0=\dimen0 %
+ \divide\count0 by\dimen2 %^^A\count2\relax
+ % and advance |##3| by (square of) it.
+ \ifvoccubic\multiply\count0 by \count0 \fi
+ \global\advance##3by\count0 %
+ % Now we scale the line length and add it's multiple to the
+ % total scaled length.
+ \divide\dimen0 by\voc@scale
+ \multiply\dimen0 by\count0 %
+ \global\advance\dimen##2by\dimen0 %
+ \ifvoccubic% check if not danger of overflow and maybe emerg.\ divide
+ \ifdim\dimen##2>0.875\maxdimen
+ \global\divide\dimen##2 by2 %
+ \global\multiply\voc@scale by2 %
+ \global\advance\voc@edivs by1 %
+ \dimen8=\voc@scale sp\relax
+ \PackageWarningNoLine{gmverse}{%
+ To avoid overflow \on@line\MessageBreak
+ I had to diminish precision of optical centering.\MessageBreak
+ Current precision is \the\dimen8.\MessageBreak
+ (so far I have done \the\voc@edivs\space such emergency
+ divisions.)}%
+ \fi% of ifdim
+ \fi% of \cs{ifvoccubic}
+ }% of |\voc@weighline|
+%
+ \def\voc@weightotal##1##2{%\begin{enumargs}[2]
+ % \item input/result dimen,
+ % \item input count
+ % \end{enumargs}
+ \ifnum##2>0\global\divide\dimen##1 by##2 \fi%
+ \global\multiply\dimen##1 by\voc@scale}%
+ % If we wish to use ${}_\infty$ weight function:
+ \ifvocmax
+ \def\voc@weighline##1##2##3{%\begin{enumargs}[2]
+ % \item box register,
+ % \item dimen for total length,
+ % \item count for sum of weights
+ % \end{enumargs}
+ %
+ % The box |##1| is |\re@ltextw|-wide at most, see the remark after
+ % line \ref{textW}.
+ \dimen0=\wd##1 %
+ \divide\dimen0 by\voc@scale
+ \ifdim\dimen0>\dimen##2\global\dimen##2=\dimen0 \fi
+ \global##3=1\relax
+ }% of |\def\voc@weighline|
+ \fi% of ifvocmax
+ \else% (= |vocgammafalse|)
+ \def\voc@weighline##1##2##3{% \begin{enumargs}[2]
+ % \item box register,
+ % \item dimen for total length,
+ % \item count for sum of weights
+ % \end{enumargs}
+ \global\advance##3by1\relax%
+ % The box |##1| is |\re@ltextw|-wide at most, see the remark after
+ % line \ref{textW}.
+ \dimen0=\wd##1 %
+ \divide\dimen0by\voc@scale
+ \global\advance\dimen##2by\dimen0 }%
+ \def\voc@weightotal##1##2{%\begin{enumargs}[2]
+ % \item input/result dimen,
+ % \item input count.
+ % \end{enumargs}
+ \ifnum\count##1>0\global\divide\dimen##1 by##2 \fi%
+ \global\multiply\dimen##1 by\voc@scale}%
+\fi%of \cs{ifvocgamma}
+}%of |\defvocgamma|
+
+
+
+\def\verseopticalcenter{\@ifnextchar{[}{\voce@tbrackets}%^^A]
+ {\verseoptic@lcenter}}
+\def\voce@tbrackets[#1]{\squ@rebrtrue\verseoptic@lcenter}
+% As you see, the
+% |\verseopticalcenter|
+% declaration has an optional parameter: if you write (anything in) []
+% after it, it shall call squarebracket verse'ion.
+% Anyway, if you call it where |\versehangrightsquare| declaration is at
+% work, |\verseopticalcenter| will work with square bracket.
+
+
+% From my personal \pk{gedlyr} package, to make possible put some
+% prose into a~\env{verse} i.e., justified paragraphs with no indent,
+% separated by |\stanzaskip|:
+\newlength{\justrskip}
+% |\justrskip| should be assigned in the very document to store value of
+% |\rightskip| out of {verse}. We assign nothing, so by default it's |\z@|.
+%
+\newenvironment*{prosato}{\catcode`\^^M=5\relax%
+ \rightskip=\justrskip\relax%
+ \dimen0\leftskip\relax%
+ \leftskip\dimen0\relax%
+ \parfillskip\z@ plus1fil\relax%
+ \def\par{\ifhmode\stepcounter{verselinenum}\fi\endgraf}%
+ \interlinepenalty=10\relax%
+ \linepenalty=10\relax%
+ \clubpenalty=10000 \widowpenalty=10000%
+ \everypar{\parskip1\stanzaskip%
+ \everypar{}%
+}%
+ \let\itm\relax% back compatibility
+ \let\\\newline%
+ \let\itl\\% back compatibility
+%^^A \leavevmode\dwaem % in verses1.01.pdf it's not present.
+}% of begdef.
+{\par}% enddef.
+%\nostanza You can still use \cs{prosato} as a~command
+%(a~declaration).
+
+\newcommand*\psalmato{\alterstanzastrue
+ \stanzaskip0sp plus0,5ex\relax\ignoreactiveM}
+
+
+
+%%%%%%%% last hooking
+\ifverseloc@l\else
+\ifsqu@rebr\AtBeginDocument{\versehangrightsquare}
+ \else\AtBeginDocument{\versehangright}
+ \fi%of \cs{ifsqu@rebr}
+ \ifv@c\AtBeginDocument{\defvocgamma[true]\centerversetrue\verseoptic@lcenter}\fi
+ \fi
+
+
+
+\def\gmverse@sanitize{\@makeother\ \@makeother\\\@makeother\$\@makeother\&%
+ \@makeother\#\@makeother\^\@makeother\_% |%%\@makeother\%|
+% other \% made me some trouble in |\index|ing long texts in
+% |\obeyllines|' scope.
+\@makeother\~%
+\catcode`\^^M=5\relax}
+
+
+\bgroup\obeylines
+\firstofone{\egroup
+ \long\def\ignoreactiveM#1{%
+ \ifx
+ #1\afterfi\ignoreactiveM%
+ \else\afterfi#1\fi}}
+
+
+\newenvironment*{verse0}
+% \label{new envs}
+{\verseskipbefore\z@skip\verseskipafter\z@skip\verse}
+{\endverse}
+
+
+% For easier declaring the degree of the weighing function:
+
+\newcommand*\vocweigh[2][\newcommand]{%
+ \ifx\newcommand#1\relax\afterfi\verseopticalcenter
+ \else\afterfi{\verseopticalcenter[]}%
+ \fi
+ \ifcase#2%
+ \or%1
+ \afterfi{\voccubicfalse\vocmaxfalse\defvocgamma\relax}%
+ \or%2
+ \afterfi{\voccubicfalse\vocmaxfalse\defvocgamma[true]}%
+ \or%3
+ \afterfi{\voccubictrue\vocmaxfalse\defvocgamma[true]}
+ \else
+ \afterfi{\vocmaxtrue\voccubicfalse\defvocgamma[true]}%
+ \fi}
+
+
+\endinput
+
+% \ChangesGeneral
+%
+%
+%
+% \changes{v0.69}{2008/01/15}{Global use of \cs{count1} replaced with
+% \cs{gmvs@counta} in \cs{voc@weighline} and \cs{voc@weightotal}}
+%
+% \changes{v0.73}{2008/09/04}{A~bug fix: obsolete \cs{afterelsefi}
+% changed to \cs{afterfi}}
+
+% \PrintChanges
+% \NoEOF
+%
+% removed, first approach to gamma voc
+%
+%
+% \def\@sixteenth{0.0625}\def\@sixteen{16}%
+%
+%
+% \dimen0=\re@ltextw\relax% d0 = tw
+% \advance\dimen0 by-\wd2\relax% d0 = tw-wd2
+% \dimen2=\re@ltextw\relax% d2 = tw
+% \divide\dimen2 by\dimen0\relax% d2 = tw/(tw-wd2), the
+% % less the better
+% \count0=17\relax% c0= 16+1
+% \ifnum8>\dimen2\advance\count0 by-\dimen2%
+% \else\advance\count0 by-8\relax\fi
+% % c0= 16-min(8,d2)
+% \dimen0=\@sixteenth\wd2\relax
+% \else% \wd2>=\re@ltextw
+% \count0=16\relax
+% \dimen0=\re@ltextw\relax
+% \fi% of \ifdim
+% \multiply\dimen0 by\count0
+
+
+% (For my GNU Emacs:)
+%%% Local Variables:
+%%% mode: doctex
+%%% TeX-master: "../../../../LaTeX/TeXGuru/gmverse/gmverseDoc.tex"
+%%% End: \ No newline at end of file