Two Columns whose content is positioned relative to each other

In theatre (and film) there's a tendency for actors to let each other finish what they're saying, possibly even making a small pause before starting their turn. But that is not how real life conversation work and it leads to a particular stiff "theatre tone".

To counter that I'm letting my actors practise speaking at the same time (intentionally, that is, in real life they're doing it all the time). And in order to help them gain an idea of what the result is supposed to be like, I want to give them their text already in a format that visualises this.

I made a text/plain example for what I need:

ALICE: I‘m saying something in
this mock drama of ours, it is      BOB: Yes.
supposed to be a little             CHARLES: No doubt.
monologue of medium length. I‘m
still supposed to be talking,       BOB: I can see that.
because our author needs an
example for you trying to
interrupt me. But, while I‘m
certainly perceiving what you‘re
saying, I‘m not yet letting you
take what linguists call your       BOB: I want to ...
„turn“, for I really want to
finish my thought.                  BOB: I want to say something right
now. I have to admit, I don‘t really
CHARLES: I feel that, too ...       have something to say. But I would
feel left out, if I did not get my
ALICE: Of course.                   turn. I would feel that I‘d be
vanishing in this piece, if I
wouldn‘t say something. I feel that
my sole purpose is to have a little
CHARLES: That‘s ...                 speech right here. And although I
rather feel compelled to talk right
CHARLES: That‘s great, because      now, I also derive some strange kind
it expresses exactly my             of joy from it.
sentiments also. You‘re really
giving voice to ...                 ALICE: Of course, Bob, and now we
all had our turn, except Charles,
whom I‘m interrupting right now, but
that is intentional. And now we
can finish this little farce,
right? I mean, like: Stop it
right now!


So, basically, I need two columns. The content of each column needs to be positioned relative to the text in the other column. In the example, when Bob says "Yes." in the right column, this should occur on the same line as the word "drama" in Alice's speech in the left column. And the other way around: When Charles says "I feel that, too ..." in the left column, this should occur after Bob's "I don't really have" in the right column.

I guess, that, provided it is feasible at all, this is rather non-trivial to achieve in LaTeX. Basically, I need a solution right now, but also a possibly more thorough one for future projects. I have a nagging suspicion that for right now I'm better off with Inkscape or Scribus. I'd love to be wrong about this. For the future, I'd like to find a solution with LaTeX or TeX. I have little to no experience with LaTeX hacking, but I'm confident that I can get into it, given enough time. Pointers on where to look and tips as for the general logic on how to achieve it could greatly facilitate it. Also, I'm an org-mode user and feel quite at home with Emacs-Lisp hacking. So, one possibility would be to write an emacs interface and produce TeX code programmatically.

A possible LaTeX interface could, for instance, include a command \turn{LABEL} to indicate the start of a new turn in the other column and \turnlabel{LABEL} to indicate where it should be vertically positioned in relation to the previous turn. The interface could, again just for instance, include a command \interruption for interruptions that don't constitute a turn. For instance:

%% mock LaTeX

\turn{Alice}

ALICE: I‘m saying something in this mock drama
\interruption{BOB: Yes.} \interruption{CHARLES: No doubt.}
of ours, it is supposed to be a little monologue of medium
length. I‘m still supposed to be talking \interruption{BOB:
I can see that.}, because our author needs an example for
you trying to interrupt me. But, while I‘m certainly
perceiving what you‘re saying, I‘m not yet letting you take
what linguists \interruption{BOB: I want to ...} call your
„turn“, for I really want to finish \turnlabel{Bob} my
thought.

\turn{Bob}
BOB: I want to say something right now. [...]

• Try »paracol«, »parallel« or »parcolumns«. – Thorsten Donig Sep 10 '13 at 10:17
• could you edit your question to include that text as text rather than as a screen dump. – David Carlisle Sep 10 '13 at 10:49
• @DavidCarlisle: I'd love to; in fact, I tried originally both with a <pre> tag and; but the text/plain example is based on absolute positioning of the right column based on characer count. In the preview, this appeared ragged, and because of the amount of text, completely messy. – Oliver Scholz Sep 10 '13 at 10:59
• @ThorstenDonig Great! Thank you very much, this might be a starting point. – Oliver Scholz Sep 10 '13 at 10:59
• You could use the code button {} (or simply indent by 4 spaces) to lay out the text exactly – David Carlisle Sep 10 '13 at 11:20

This isn't too smart about multi-line interruptions near a page break, or interruptions too close together.

Commented out you will see some code that records the vertical start and end positions in a .pos file at the end of the run, this could be used on a later pass to automatically move things around but that gets tricky and unstable, and possibly for a play you ultimately want manual control anyway, so this uses a simpler scheme that \turn and \interruption take an optional first parameter than shifts the text by that number of baselineskip.

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter

\setlength\columnsep{20pt}

\newwrite\iterpos

%\immediate\openout\iterpos=\jobname.pos

\raggedbottom
\parskip\z@

\newcount\turncnt
\newcount\intercnt

\def\dialog{%
\par
\global\turncnt\z@
\linewidth=\dimexpr(\textwidth-\columnsep)/2\relax
\hsize\linewidth}

\def\enddialog{\par}

\newcommand\turn[2][0]{%
\setbox0\hbox{\textbf{#2: }}%
\everypar{\setbox2\lastbox\box0\everypar{}}
\par
\ifnum#1=\z@\else\vskip#1\baselineskip\fi
\ifodd\turncnt
\hsize\linewidth
\leftskip\z@
\else
\hsize\dimexpr2\linewidth+\columnsep\relax
\leftskip\dimexpr\linewidth+\columnsep\relax
\fi
\ignorespaces}

\newcommand\interruption[3][0]{%
\@bsphack
\ifodd\turncnt
\hspace*{\dimexpr\linewidth+\columnsep\relax}%
\else
\hspace*{\dimexpr-\linewidth-\columnsep\relax}%
\fi
\raisebox{\dimexpr\dp\strutbox
\ifnum#1=\z@\else-(#1\baselineskip)\fi
\relax}[\z@][\z@]{\parbox[t]{\linewidth}{%
%\pdfsavepos
%\edef\tmp{\write\iterpos{\string\def\string\intterstart\romannumeral\intercnt{\noexpand\the\pdflastypos}}}\tmp
\textbf{#2: }#3%
\ifhmode\unskip\fi
%\pdfsavepos
%\edef\tmp{\write\iterpos{\string\def\string\intterend\romannumeral\intercnt{\noexpand\the\pdflastypos}}}\tmp
}}}%
\@esphack}

\makeatother

\begin{document}
\begin{dialog}
\turn{ALICE}I‘m saying something in
this mock drama
\interruption{BOB}{Yes.} \interruption[1]{CHARLES}{No doubt.}
of ours, it is supposed to be a little
monologue of medium length. I‘m
still supposed to be talking\interruption{BOB}{I can see that.},
because our author needs an
example for you trying to
interrupt me. But, while I‘m
certainly perceiving what you‘re
saying, I‘m not yet letting you
take what linguists\interruption{BOB}{I want to ...} call your
„turn“, for I really want to
finish my thought.                  \turn[-2]{BOB}

I want to say something right
now. I have to admit, I don‘t really
have something to say.\interruption{CHARLES}{ feel that, too ...} But I would
feel left out, if I did not get my
turn.\interruption{ALICE}{Of course.} I would feel that I‘d be
vanishing in this piece, if I
wouldn‘t say something. I feel that
my sole purpose is to have a little
speech right here.\interruption{CHARLES}{That‘s ...} And although I
rather feel compelled to talk right
now, I also derive some strange kind
of joy from it.
\turn[-2]{CHARLES}
That‘s great, because
it expresses exactly my
sentiments also. You‘re really
giving voice to ...               \turn{ALICE}

Of course, Bob, and now we
all had our turn, except Charles,
whom I‘m interrupting right now, but
that is intentional. And now we
can finish this little farce,
right? I mean, like: Stop it
right now!

\end{dialog}
\end{document}

• I'm speechless. Thank you very much! Yes, for a play I need manual control anyways, since the exact positioning of cues is part of the creative work. This definitely gets the job done; and it's a HUGE help for me. Again: Thank you! – Oliver Scholz Sep 11 '13 at 10:36