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
3
  • \stage usage is wrong in your example -- \stage<foo> is meant rather, I think
    – user31729
    Commented Jul 9, 2016 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
    Commented Jul 9, 2016 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
    Commented Jul 9, 2016 at 21:27

1 Answer 1

7

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

0

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .