7

Note: I'm using plain TeX

I'm trying to create a layout for theatrical plays that shows stage directions aligned to the right.

I had to enclose the directions in a \vbox to prevent them from being split across pages. My problem is that I'm not getting the correct vertical spacing (I want \parskip) before the \vbox, only after.

I could insert a \vskip inside the \vbox, but that would cause problems when the directions block is at the top of the page. How do I get my spacing right? Thanks!

\parindent 0pt
\parskip8pt

\long\def\stage[#1]{
    \par
    \vbox{
        \hsize=6in
        \leftskip2.5in
        \parindent10pt
        \hfill
        {\it #1}
    }
}

\long\def\says #1:#2|{
    \bgroup
    \hskip-1in
    \vbox{\hsize=0.75in\hfill #1:}
    \hsize5.5in
    \leftskip1in
    \vskip-20pt
    #2\par
    \egroup}

\says Man: This is a rather odd problem to have, I'm not sure what to do with it.|

\says Chorus: Look behind you! You'll find it there!|

\stage [The man spins wildly in his chair]

\says Man: I don't see anything. Anything at all!|

\bye
  • \stage usage is wrong in your example -- \stage<foo> is meant rather, I think – user31729 Jul 9 '16 at 20:58
  • 1
    \vbox doesn't start a paragraph, so you don't get \parskip glue. Just do \par\vskip\parskip\vbox{...}. As an aside, I find the definition of \says very peculiar. Wouldn't \hbox to0.75in{\hfil #1:} be simpler than using a \vbox? – egreg Jul 9 '16 at 21:09
  • May be you have that in mind, but remember that you can delimit the arguments by a \par, so you wouldn't need | which seems rather awkward (i.e. \long\def\says#1:#2 \par{..}), just in case you didn't consider that. The \stage [..] seems more natural. – Manuel Jul 9 '16 at 21:27
6

A \vbox doesn't start a paragraph, so \parskip glue is not added.

\parindent 0pt
\parskip8pt

\long\def\stage[#1]{
    \par\nobreak\vskip\parskip
    \vbox{
        \hsize=6in
        \leftskip2.5in
%        \parindent10pt %%% What for???
        \hfill
        \it #1\par
    }
}

\long\def\says #1:#2|{
    \par
    {
    \hskip-1in
    \hbox to 0.75in{\hfil #1:}
    \hsize5.5in
    \leftskip1in
    \vskip-20pt
    #2\par
    }
}

\says Man: This is a rather odd problem to have, I'm not sure what to do with it.|

\says Chorus: Look behind you! You'll find it there!|

\stage [The man spins wildly in his chair]

\says Man: I don't see anything. Anything at all!|

\bye

I changed some bits of code. In particular

\vbox{\hsize=0.75in\hfill #1:}

should be

\hbox to 0.75in{\hfil #1:}

Simpler and more efficient. The setting of \parindent in \stage is meaningless, in my opinion. On the other hand, if the directive is long, the effect will be quite peculiar.

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.