%% %% This is file `bidipoem.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% bidi.dtx (with options: `table,bidipoem.sty') %% %% __________________________________________________ %% Vafa Khalighi %% tex-persian@vafa.ac %% %% Copyright (c) 2007--2022 Vafa Khalighi %% Copyright (c) 2018--2020 bidi-tex GitHub Organization %% %% It may be distributed and/or modified under the LaTeX Project Public License, %% version 1.3c or higher (your choice). The latest version of %% this license is at: http://www.latex-project.org/lppl.txt %% %% This work is “author-maintained” (as per LPPL maintenance status) %% by Vafa Khalighi. %% %% %% \CheckSum{50439} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} %% \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{bidipoem}% [2019/03/03 v1.0 Environments for typesetting Persian traditional and modern poems] \newcommand*{\bidipoem@spreadbox}[2]{\hbox to #1{#2}} \newdimen \bidipoem@hvlen \newdimen \bidipoem@hvsep \newdimen \bidipoem@hvind \newdimen \bidipoem@@hvlen \newcommand*{\Setversedim}[2]{% set lengths of half-verse, [separation] \bidipoem@hvind \textwidth \bidipoem@hvlen #1\relax \advance \bidipoem@hvind -\bidipoem@hvlen \ifx [#2\def \bidipoem@next {\bidipoem@set@verseI [}\else \bidipoem@@hvlen \bidipoem@hvlen \def \bidipoem@next {\bidipoem@set@@verse {#2}}\fi \bidipoem@next } \def \bidipoem@set@verseI [#1]{% optional parameter \bidipoem@@hvlen #1\relax \bidipoem@set@@verse } \newcommand*{\bidipoem@set@@verse}[1]{% separation \advance \bidipoem@hvind -\bidipoem@@hvlen \bidipoem@hvsep #1\relax \advance \bidipoem@hvind -\bidipoem@hvsep \divide \bidipoem@hvind 2 } \newcommand*{\traditionalconnverses}[3]{% first half-verse, connection, second half-verse \ifdim 0pt > \bidipoem@hvind % \bidipoem@spreadbox \bidipoem@hvlen {#1}\\ \hfill % first block \else \noindent \hskip \bidipoem@hvind \relax \bidipoem@spreadbox \bidipoem@hvlen {#1}\fi \bidipoem@spreadbox \bidipoem@hvsep {#2}% separator \bidipoem@spreadbox \bidipoem@@hvlen {#3}% second block \par } \newcommand*{\traditionalhalfverses}[2]{% optional parameter? \ifx [#2\def\bidipoem@half@verses@next{\bidipoem@half@verses {#1}[}% \else\def\bidipoem@half@verses@next{\bidipoem@half@verses {#1}[\hfill]{#2}}\fi% \bidipoem@half@verses@next} \def \bidipoem@half@verses #1[#2]#3{% first[mid]second \traditionalconnverses {#1}{#2}{#3}} {\catcode`\^^M=\active % these lines must end with % \gdef\traditionalpoem@obeylines{\catcode`\^^M\active \let^^M\traditionalpoem@par}% \global\let^^M\traditionalpoem@par} % this is in case ^^M appears in a \write {\catcode`\^^M=\active % these lines must end with % \gdef\modernpoem@obeylines{\catcode`\^^M\active \let^^M\modernpoem@par}% \global\let^^M\modernpoem@par} % this is in case ^^M appears in a \write \def\poemcolsepskip{.1\versewidth plus .1\versewidth minus .05\versewidth} \def\poemmarginskip{1em plus 1fil minus 1em} \def\poemextrabaselineskip{0\baselineskip} \def\poemskip{\medskip} \newcommand{\bidipoem@openbox}{\leavevmode \hbox to.77778em{% \hfil\vrule \vbox to.675em{\hrule width.6em\vfil\hrule}% \vrule\hfil}} \def\poemblocksep{\quad\hbox{\bidipoem@openbox}} \newdimen\versewidth \newtoks\bidipoem@p@ftn \def\poem@verse#1{% \ifdim\wd#1>\new@poem@width \xdef\new@poem@width{\the\wd#1}% \ifdim\new@poem@width>\poem@width \xdef\poem@width{\new@poem@width}% \global\let\poem@needrun\relax \fi \fi \hbox to\poem@width{\unhbox#1}% \global\bidipoem@p@ftn\expandafter{\expandafter}\the\bidipoem@p@ftn% } \def\poem@linebegin{\vadjust{}\hskip\@flushglue\hskip\poemmarginskip\relax} \def\poem@lineend{\nobreak\hskip\poemmarginskip\hskip\@flushglue\vadjust{}} \def\poem@lineversesep{% \nobreak \hskip\z@ plus 1filll% \penalty600% \hskip\poemcolsepskip \hskip\z@ plus -2filll% \vadjust{}% \nobreak \hskip\z@ plus 1filll% } \def\poem@lineparsebegin{% \halign\bgroup \global\setbox\verse@i=\hbox{% \let\@footnotetext\bidipoem@p@ftntext% \let\@LTRfootnotetext\bidipoem@p@LTRftntext% \let\@RTLfootnotetext\bidipoem@p@RTLftntext% \let\@xfootnotenext\bidipoem@p@xftntext% \let\@xfootnote\bidipoem@p@xfootnote% \let\@xLTRfootnotenext\bidipoem@p@xLTRftntext% \let\@xLTRfootnote\bidipoem@p@xLTRfootnote% \let\@xRTLfootnotenext\bidipoem@p@xRTLftntext% \let\@xRTLfootnote\bidipoem@p@xRTLfootnote% \ignorespaces##\unskip}&& \global\setbox\verse@ii=\hbox{% \let\@footnotetext\bidipoem@p@ftntext% \let\@LTRfootnotetext\bidipoem@p@LTRftntext% \let\@RTLfootnotetext\bidipoem@p@RTLftntext% \let\@xfootnotenext\bidipoem@p@xftntext% \let\@xfootnote\bidipoem@p@xfootnote% \let\@xLTRfootnotenext\bidipoem@p@xLTRftntext% \let\@xLTRfootnote\bidipoem@p@xLTRfootnote% \let\@xRTLfootnotenext\bidipoem@p@xRTLftntext% \let\@xRTLfootnote\bidipoem@p@xRTLfootnote% \ignorespaces##\unskip} \cr } \def\poem@lineparseend{% \crcr\egroup \vskip-\baselineskip } \def\traditionalpoem@cr{% \cr\poem@line } \newbox\verse@i \newbox\verse@ii \newif\ifpoem@started \def\poem@line{% \poem@lineparseend \ifdim\wd\verse@i>\z@\global\poem@startedtrue\fi \ifdim\wd\verse@ii>\z@\global\poem@startedtrue\fi \ifpoem@started \ifdim\wd\verse@ii>\z@\else \nopagebreak[3] \fi \leavevmode \poem@linebegin \poem@verse\verse@i \ifdim\wd\verse@ii>\z@ \poem@lineversesep \poem@verse\verse@ii \fi \poem@lineend \par \vskip\poemextrabaselineskip \fi \poem@lineparsebegin } \def\@traditionalpoem{% \stepcounter{poem@no} \ifnum\max@poem@no<\number\c@poem@no% \xdef\poem@width{\z@}% \else \xdef\poem@width{\poem@prop{poem@width}}% \fi \xdef\new@poem@width{\z@}% \global\versewidth=\poem@width \poemskip\par \begingroup \tabskip=\z@ \parskip=\z@ \parindent=\z@ \parfillskip=\z@ \rightskip=\z@ \leftskip=\z@ \widowpenalty=10000% No break between verses of the same line. \clubpenalty=10000% Same as above. Not really needed. \def\newblock{\hfil\poemblocksep\hfil\null}% \def\traditionalpoem@par{\traditionalpoem@cr}% Redefine \par for possible \obeylines \def\\{\global\poem@startedtrue\traditionalpoem@cr}% \global\poem@startedfalse \csname poem@obeylines\endcsname \let\poem@obeylines\relax \poem@lineparsebegin } \def\@endtraditionalpoem{% \cr \ifdim\wd\verse@i>\z@\poem@line\else\ifdim\wd\verse@ii>\z@\poem@line\else \noalign{% \skip0=\poemextrabaselineskip \vskip-\skip0 \vskip-\baselineskip }% \fi\fi \poem@lineparseend \endgroup \par \vskip\baselineskip \poemskip \ifdim\new@poem@width<\poem@width \global\let\poem@needrun\relax \fi \poem@write@aux{poem@width@\romannumeral\c@poem@no}{\new@poem@width}% \ifx\AtEndDocument\undefined\poem@finish\fi \@endparenv } \long\def\bidipoem@p@ftntext#1{% \edef\@tempx{\the\bidipoem@p@ftn\noexpand\footnotetext[\the\csname c@\@mpfn\endcsname]}% \global\bidipoem@p@ftn\expandafter{\@tempx{#1}}}% \long\def\bidipoem@p@LTRftntext#1{% \edef\@tempxi{\the\bidipoem@p@ftn\noexpand\LTRfootnotetext[\the\csname c@\@mpfn\endcsname]}% \global\bidipoem@p@ftn\expandafter{\@tempxi{#1}}}% \long\def\bidipoem@p@RTLftntext#1{% \edef\@tempxii{\the\bidipoem@p@ftn\noexpand\RTLfootnotetext[\the\csname c@\@mpfn\endcsname]}% \global\bidipoem@p@ftn\expandafter{\@tempxii{#1}}}% \long\def\bidipoem@p@xftntext[#1]#2{% \global\bidipoem@p@ftn\expandafter{\the\bidipoem@p@ftn\footnotetext[#1]{#2}}} \long\def\bidipoem@p@xLTRftntext[#1]#2{% \global\bidipoem@p@ftn\expandafter{\the\bidipoem@p@ftn\LTRfootnotetext[#1]{#2}}} \long\def\bidipoem@p@xRTLftntext[#1]#2{% \global\bidipoem@p@ftn\expandafter{\the\bidipoem@p@ftn\RTLfootnotetext[#1]{#2}}} \def\bidipoem@p@xfootnote[#1]{% \begingroup \csname c@\@mpfn\endcsname #1\relax \unrestored@protected@xdef\@thefnmark{\thempfn}% \endgroup \@footnotemark\bidipoem@p@xftntext[#1]} \def\bidipoem@p@xLTRfootnote[#1]{% \begingroup \csname c@\@mpfn\endcsname #1\relax \unrestored@protected@xdef\@thefnmark{\thempfn}% \endgroup \@footnotemark\bidipoem@p@xLTRftntext[#1]} \def\bidipoem@p@xRTLfootnote[#1]{% \begingroup \csname c@\@mpfn\endcsname #1\relax \unrestored@protected@xdef\@thefnmark{\thempfn}% \endgroup \@footnotemark\bidipoem@p@xRTLftntext[#1]} \newenvironment{traditionalpoem}{\@traditionalpoem}{\@endtraditionalpoem} \expandafter\def\csname traditionalpoem*\endcsname{\let\poem@obeylines=\traditionalpoem@obeylines\traditionalpoem} \expandafter\def\csname endtraditionalpoem*\endcsname{\endtraditionalpoem} \def\poem@finish{% \poem@write@aux{max@poem@no}{\number\c@poem@no}% \ifx\poem@needrun\relax \PackageWarning{bidipoem}{Unjustified poem. Rerun XeLaTeX to get poem right}% \global\let\poem@needrun\undefined \fi } \ifx\AtEndDocument\undefined\else\AtEndDocument\poem@finish\fi \newcounter{poem@no}\setcounter{poem@no}{\z@} \ifx\max@poem@no\undefined \def\max@poem@no{0}% \fi \newcommand{\poem@prop}[1]{\@nameuse{#1@\romannumeral\c@poem@no}} \newcommand{\poem@write@aux}[2]{% \def\@x{\immediate\write\@auxout{\global\noexpand\@namedef{#1}{#2}}}% \@x } \def\@modernpoem{% \par \begingroup \parskip=\z@ \parindent=\z@ \def\[{\@settab\@tabplus\ignorespaces}% \def\]{\@tabminus\ignorespaces}% \def\newblock{\poemblocksep}% \let\newpoem@tabcr\@tabcr \def\modernpoem@par{% Redefine \par for possible \obeylines \ifpoem@started\else \ifdim\wd\@curline>\z@\global\poem@startedtrue\else \@stopfield \ifdim\wd\@curfield>\z@\global\poem@startedtrue\fi \@contfield \fi \fi \ifpoem@started\newpoem@tabcr\fi}% \def\@tabcr{\global\poem@startedtrue\newpoem@tabcr}% \global\poem@startedfalse \csname poem@obeylines\endcsname \let\poem@obeylines\relax \begin{tabbing}% } \def\@endmodernpoem{% \global\poem@startedfalse \ifdim\wd\@curline>\z@\global\poem@startedtrue\else \@stopfield \ifdim\wd\@curfield>\z@\global\poem@startedtrue\fi \@contfield \fi \ifpoem@started\else\let\@stopline\@stopfield\fi \end{tabbing}% \endgroup \par \if@noparlist \else \ifdim\lastskip >\z@ \@tempskipa\lastskip \vskip -\lastskip \advance\@tempskipa\parskip \advance\@tempskipa -\@outerparskip \vskip\@tempskipa \fi \@endparenv \fi } \newenvironment{modernpoem}{\@modernpoem}{\@endmodernpoem} \expandafter\def\csname modernpoem*\endcsname{\let\poem@obeylines=\modernpoem@obeylines\modernpoem} \expandafter\def\csname endmodernpoem*\endcsname{\endmodernpoem} \gdef\@startfield{% \global\setbox\@curfield\hbox\bgroup% \let\@footnotetext\bidipoem@p@ftntext% \let\@LTRfootnotetext\bidipoem@p@LTRftntext% \let\@RTLfootnotetext\bidipoem@p@RTLftntext% \let\@xfootnotenext\bidipoem@p@xftntext% \let\@xfootnote\bidipoem@p@xfootnote% \let\@xLTRfootnotenext\bidipoem@p@xLTRftntext% \let\@xLTRfootnote\bidipoem@p@xLTRfootnote% \let\@xRTLfootnotenext\bidipoem@p@xRTLftntext% \let\@xRTLfootnote\bidipoem@p@xRTLfootnote% \color@begingroup} \gdef\@stopfield{% \color@endgroup\egroup\global\bidipoem@p@ftn\expandafter{\expandafter}\the\bidipoem@p@ftn} \gdef\@contfield{% \global\setbox\@curfield\hbox\bgroup% \let\@footnotetext\bidipoem@p@ftntext% \let\@LTRfootnotetext\bidipoem@p@LTRftntext% \let\@RTLfootnotetext\bidipoem@p@RTLftntext% \let\@xfootnotenext\bidipoem@p@xftntext% \let\@xfootnote\bidipoem@p@xfootnote% \let\@xLTRfootnotenext\bidipoem@p@xLTRftntext% \let\@xLTRfootnote\bidipoem@p@xLTRfootnote% \let\@xRTLfootnotenext\bidipoem@p@xRTLftntext% \let\@xRTLfootnote\bidipoem@p@xRTLfootnote% \color@begingroup\unhbox\@curfield} \endinput %% %% End of file `bidipoem.sty'.