diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex')
-rwxr-xr-x | Master/texmf-dist/tex/latex/gmverse/gmverse.sty | 822 |
1 files changed, 822 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/gmverse/gmverse.sty b/Master/texmf-dist/tex/latex/gmverse/gmverse.sty new file mode 100755 index 00000000000..51c1140fee1 --- /dev/null +++ b/Master/texmf-dist/tex/latex/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 |