Copyright (c) 1994-2003 Matthias Eckermann

This program may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.2 of this license or (at your option) any later version. The latest version of this license is in http://www.latex-project.org/lppl.txt and version 1.2 or later is part of all distributions of LaTeX version 1999/12/01 or later.

This program consists of the files parallel.dtx, parallel.ins, readme

The Parallel-Package^{∗} release beta 4

Matthias Eckermann, Berlin mge@arcor.de, mge@suse.de

2003/04/13

Abstract

This package provides a small tool to typeset in two columns or on two pages parallel; this might be helpful, e.g. if you want to set two languages besides in translations or if you want to compare two texts. There are some caveats and some limitations which are described in this documentation.

The gentle reader might excuse wrong words or bad constructions, but I’m not a “native speaker”.

Please remember: this is only an “interim-public-beta” until I’ll have finished the complete documentation, the code should be fine.

Contents

1 Usage 3 1.1 Simple Usage – for the Impatient . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2 Advanced Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2 Limitations, Warnings 4

3 Todo-List 5

4 Documentation-Driver 5

5 macro package source code 6 5.1 implementation rules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.2 preamble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.3 lengths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 5.4 boxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.5 tokens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.6 counts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 5.7 options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.8 internal commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 5.9 user commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 5.10 Environment “Parallel” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 5.11 postamble, settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

∗I want to mention and thank Bernd Raichle (Stuttgart) and Wonkoo Kim (Pittsburgh, PA), who helped developing this packages with their ideas, debugging and pieces of code.

6 examples for parallel.sty 17 6.1 typesetting in columns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.2 typesetting on two pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 6.3 Common Text for the two Examples . . . . . . . . . . . . . . . . . . . . . . 17 6.4 Final commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

7 Sample-text 18

1 Usage

1.1 Simple Usage – for the Impatient

It is recommended, that you first read the complete section Usage to understand Parallel’s behavior and limitations, but if one wants to begin immediately and there is only one paragraph in two columns parallel, one may try this code:

    \usepackage{parallel}
    ...
    \begin{Parallel}{<left-width>}{<right-width>}
       \ParallelLText{<left-text>}
       \ParallelRText{<right-text>}
    \end{Parallel}

It generates the two texts typesetted parallel in two columns, footnotes at the end of the Parallel-Environment.

1.2 Advanced Usage

But, I think, most people want a more flexible handling of their parallel texts. So they will have to use a more difficult structure of environment parallel:

   \usepackage[<package_options>]{parallel}
   ...
   \begin{Parallel}[<environment_options>]{<left-width>}{<right-width>}
     \ParallelLText{<left-text>}
     \ParallelRText{<right-text>}
     \ParallelPar
     \ParallelLText{<left-text>}
     ...
     \renewcommand{\ParallelAtEnd}{<text>}
   \end{Parallel}

\ParallelPar \ParallelPar is the most important Macro of this package; it tells the environment to begin a new parallel paragraph, i.e.: left and right texts are printed out to their lengths and then we begin new on the same vertical position, as if you close the environment Parallel and begin a new one. Therefore \ParallelPar must not be left out after a pair of \ParallelLText – \ParallelRText (only at the total end of the environment).

\ParallelAtEnd With the help of \ParallelAtEnd
 (\renewcommand{\ParallelAtEnd}{<Your text here>})

you can set some text between the parallel columns and the footnotes.

Parallel Now we’ll have a look at the options of Parallel.

Package options (the options, which can be chosen when loading parallel in the document-preamble). The following options are possible, but only Verbose and SeparatedFootnotes can be combined with one of the others, while out of the *Nums-options only one can be set at one time. This behaviour may change in a later release.

OldStyleNums set the footnote-numbers with L^{A}TEX’s \oldstylnums-command RaiseNums like \footnote ItalicNums the footnote-numbers are set in Italics

RomanNums using \romannnumeral

SeparatedFootnotes The footnotes of the left and right columns are separately numbered and printed. The right footnotes are signed with the content of

    \ParallelDot (usual $\cdot$).

Verbose tell the author used environment and its options…

Environment options Due to the work of W.Kim (see below) the <left-width> and/or <right-width> may be left empty; the package will set the two widths to about 50% of \textwidth. But it is also possible to set both widths with absolute (e.g. 3cm) or relative (e.g. 0.37\textwidth) values.

One may use only one of the real options; if none is used, “c” is assumed, if a bad character is chosen, an error-message will appear, but the user may go on by pressing

<return>.

“c” (Columns) print in columns “v” (Vertical line between columns) print in columns, but with intermediate \vline “p” (Pages) print on two pages; if one box is empty, the corresponding page is left

blank (not a bug, but feature!)

2 Limitations, Warnings

• tabulars, minipages, ... inside of \ParallelLText or \ParallelRText will cause unexpected results. But you may use these constructions outside \ParallelLText or \ParallelRText, but inside the environment, when typesetting in columns; you must not use those things (within the environment), when typesetting on pages parallel.

• footnotes are printed at the end of the environment. I hope, this is a begin of a solution on further footnote-problems.

• The max. size of “left-text” and “right-text” is limited.

• The lines are typesetted really parallel, i.e. large size-differences will cause bad or dirty output.

3 Todo-List

There are some ideas and todos, that will be fixed in the final release or in later releases:

• Most important: complete documentation.

• Dominik Neidinger, Munich, asked for leaving out \ParallelPar and setting to be

  done automatically by \ParallelLText and/or \ParallelRText.

• Add more environment-options:

“a” (Autocomputed pages) print on two pages, autocompute the width of the text that holds less characters.

“s” (Save/Store once autocalculated widths) Using this option, the widths autocalculated in the first \ParallelPar will be used for the other paragraphs of this environment. This option is introduced, to enable autocalculation and the same look-alike of every paragraph of an environment Parallel.

“r” (Resume/Reload once autocalculated widths) This option allows to transfer the widths-values between environments.

• Use “\newif” instead of many integer variables.

• different footnote-types for left and right footnotes

• There might be a bug in the algorithm to typeset on two pages. I must have a look at this later.

4 Documentation-Driver

1 ⟨∗driver⟩

2 \NeedsTeXFormat{LaTeX2e}
3 \documentclass[a4paper]{ltxdoc}
4 \usepackage{parallel}
5 \CodelineNumbered
6 \parskip2ex plus1ex minus1ex
7 \parindent0em
8 \setlength\hfuzz{10pt}
9 \setcounter{tocdepth}{2}
10 \hbadness=5000
11 \addtolength{\textwidth}{0.5in}
12 \pagestyle{myheadings}

13 \markboth{``Parallel''-package (\fileversion, \filedate)}%
14 {``Parallel''-package (\fileversion, \filedate)}
15 \begin{document}
16 \DocInput{parallel.dtx}
17 \begin{Parallel}[v]{0.4\textwidth}{0.51\textwidth}
18 \tolerance=1000

19 ⟨/driver⟩

5 macro package source code

5.1 implementation rules

Even if some people will find this confusing or too much to type: I decided to use real long names for all dimensions, counters, boxes and macros. Every name introduced in this package starts with \Parallel, so that it is unary (I hope) in the L^{A}TEX-world.

5.2 preamble

Here is the standard header for a L^{A}TEX-package. This package is called parallel and we just work with release 2.

20 ⟨∗package⟩

21 \NeedsTeXFormat{LaTeX2e}
22 \ProvidesPackage{parallel}[\filedate, setting two texts parallel (me)]
23 \message{`parallel': setting two texts parallel, (\fileversion) \filedate.}

5.3 lengths

The two dimensions \ParallelLWidth and \ParallelRWidth hold the actual size of the left and right column (or page).

24 \newdimen\ParallelLWidth
25 \newdimen\ParallelRWidth
\ParallelTextWidth is mainly a copy of \textwidth, while \ParallelLeftMargin holds

the \leftmargin, e.g. if one sets a Parallel-Environment inside of another construction (e.g. list).

26 \newdimen\ParallelTextWidth
27 \newdimen\ParallelLeftMargin

While the user can redefine \ParallelUserMidSKip (and this is used for calculating the sizes and skips), \ParallelMainMidSkip holds the skip which finally is used for typesetting.

28 \newdimen\ParallelUserMidSkip
29 \newdimen\ParallelMainMidSkip

5.4 boxes

30 \newbox\ParallelLBox
31 \newbox\ParallelRBox
32 \newbox\ParallelBoxVar

5.5 tokens

33 \newbox\ParallelLTok
34 \newbox\ParallelRTok

5.6 counts

First we need some “boolean” variables. As you see, I’am a C-programmer using integervariables for boolean operations. Perhaps it would be better, to use \newif here – later!?

35 \newcount\ParallelBoolVar
36 \newcount\ParallelBoolMid

\ParallelWhichBox tells the program, if the left (=0) or the right text-box (=1) shall be typesetted (when in page-mode).

In \ParallelMainMode the information is stored, if the environment is “on pages”, “in columns” or “in columns with vertical line”.

37 \newcount\ParallelWhichBox
38 \newcount\ParallelMainMode

These are the variables dealing with the special footnote-implementation used in environ-

ment “Parallel”. \ParallelLFNCounter, \ParallelRFNCounter and \ParallelMaxFN are

self-explaining.

\ParallelFNMode is again a boolean-like variable. If \ParallelFNMode=1, footnotes are countered and set separated for each columns, if \ParallelFNMode≠1, only one footnotecounter is used: all footnotes are set in one block (columns mixed!).

But \ParallelFNNumMode needs some description. It holds the style in which the footnotenumbers (not those in the text, but those before the footnote-text) are set:

0 normal numbers

1 old style numbers (\oldstylenums)

2 raised numbers

3 italic numbers

4 roman numbers (\romannumeral)

39 \newcount\ParallelFNMode
40 \newcount\ParallelLFNCounter
41 \newcount\ParallelRFNCounter
42 \newcount\ParallelMaxFN
43 \newcount\ParallelFNNumMode

“Parallel”-package (beta 4, 2003/04/13) 8

5.7 options

The following options (given to the package in \usepackage) set the footnote-variables in an appropriate way. Obviously only one of “OldStyleNums”, “RaiseNums”, “ItalicNums” or “RomanNums” is possible, but one can combine these with “SeparatedFootnotes” and “Verbose”. Perhaps - one day far away – it will be possible, to have arabic-numbered left-footnotes and roman-numbered right-footnotes; but today the right ones are marked by a little dot (or something like that, see below, \ParallelDot).

44 \newcommand{\ParallelMessage}[1]{\relax}
45 \DeclareOption{Verbose}{%
46 \renewcommand{\ParallelMessage}[1]{\message{#1}}
47 \message{Verbose}

48 }

49 \DeclareOption{OldStyleNums}{%
50 \ParallelFNNumMode=1\ParallelMessage{OldStyleNums}}
51 \DeclareOption{RaiseNums}{%
52 \ParallelFNNumMode=2\ParallelMessage{RaiseNums}}
53 \DeclareOption{ItalicNums}{%
54 \ParallelFNNumMode=3\ParallelMessage{ItalicNums}}
55 \DeclareOption{RomanNums}{%
56 \ParallelFNNumMode=4\ParallelMessage{RomanNums}}
57 \DeclareOption{SeparatedFootnotes}{%
58 \ParallelFNMode=1\ParallelMessage{SeparatedFootnotes}}

5.8 internal commands

5.8.1 footnotes

The \footnotes were the most important problem when first trying to implement our package. So here is a description of

• why footnotes are a problem in our task,

• which problems are solved and in which way,

• what is not solved and what seems to be not possible.

\ParallelLFootnote
59 \newcommand{\ParallelLFootnote}[1]{%
60 \global\advance\ParallelLFNCounter\@ne
61 \footnotemark[\number\ParallelLFNCounter]%
62 \expandafter\gdef%
63  \csname ParallelLFN\romannumeral\ParallelLFNCounter\endcsname{#1}}
\ParallelRFootnote
64 \newcommand{\ParallelRFootnote}[1]{%
65 \global\advance\ParallelRFNCounter\@ne
66 \footnotemark[\number\ParallelRFNCounter]%
67 \expandafter\gdef%
68  \csname ParallelRFN\romannumeral\ParallelRFNCounter\endcsname{#1}}

ParallelFNEnviron
69 \newenvironment{ParallelFNEnviron}{%
70 \footnotesize
71 \begin{list}{}{%
72  \leftmargin=4em \rightmargin=\z@
73  \topsep=\z@skip \itemsep=\z@skip
74  \labelwidth=3em \labelsep=1em%
75  \renewcommand{\makelabel}[1]{{\hfill\footnotesize ##1}}%
76  }%
77 }{%
78 \end{list}%

79 }

\ParallelShowFNList
80 \newcommand{\ParallelShowFNList}{%
81 % footnotes in left or right column, i.e. left+right>0?
82 \ParallelMaxFN=\ParallelLFNCounter
83 \advance\ParallelMaxFN \ParallelRFNCounter
84 \ifnum\ParallelMaxFN>\z@
85  \ParallelMessage{Parallel Footnotes (}%
86  \begin{ParallelFNEnviron}%
87  \ParallelMaxFN=\ParallelLFNCounter
88  \global\ParallelLFNCounter=\z@
89  \loop
90  \ifnum\ParallelLFNCounter<\ParallelMaxFN
91  \global\advance\ParallelLFNCounter \@ne
92  \item[\ifcase\ParallelFNNumMode \number\ParallelLFNCounter%
93  \or \oldstylenums{\the\ParallelLFNCounter}%
94  \or \raisebox{1ex}{\the\ParallelLFNCounter}%
95  \or \textit{\number\ParallelLFNCounter}%
96  \or \romannumeral\ParallelLFNCounter%
97  \else  \number\ParallelLFNCounter \fi]%
98  \par
99  {\csname ParallelLFN\romannumeral\ParallelLFNCounter\endcsname}%
100  \par
101  \repeat
102  \end{ParallelFNEnviron}%
103  \ifnum\ParallelFNMode=\@ne
104  \begin{ParallelFNEnviron}%
105  \ParallelMaxFN=\ParallelRFNCounter
106  \global\ParallelRFNCounter=\z@
107  \loop
108  \ifnum\ParallelRFNCounter<\ParallelMaxFN
109  \global\advance\ParallelRFNCounter \@ne
110  \item[\ifcase\ParallelFNNumMode
111  \number\ParallelRFNCounter\ParallelDot
112  \or \oldstylenums{\the\ParallelRFNCounter}\ParallelDot
113  \or \raisebox{1ex}{\the\ParallelRFNCounter\ParallelDot}%
114  \or \textit{\number\ParallelRFNCounter\ParallelDot}%
115  \or \romannumeral\ParallelLFNCounter%
116  \else \number\ParallelRFNCounter\ParallelDot \fi]%
117  \par

118  {\csname ParallelRFN\romannumeral\ParallelRFNCounter\endcsname}%
119  \par
120  \repeat
121  \end{ParallelFNEnviron}%
122  \fi
123  \global\ParallelLFNCounter=\z@
124  \global\ParallelRFNCounter=\z@
125  \ParallelMessage{)}%
126 \else
127  \ParallelMessage{No Parallel Footnotes}%
128 \fi

129 }

5.8.2 typesetting on one page

\ParallelParOnePage I’m glad that Bernd Raichle^{1} spent his rare time to debug the code of this function and of the environment ParallelFNEnviron. Frank Mittelbach enhanced it in 2002/2003.

130 \newcommand{\ParallelParOnePage}{%
131 \ifnum\ParallelBoolVar=\@ne
132  \par\begingroup
133  \leftmargin=\z@ \rightmargin=\z@
134  \parskip=\z@skip \parindent=\z@
135  \vbadness=10000
136  \vfuzz=3ex
137  \splittopskip=\z@skip
138  \loop%
139  \ifnum\ParallelBoolVar=\@ne%
140  \noindent
141  \hbox to\textwidth{%
142  \hskip\ParallelLeftMargin
143  \hbox to\ParallelTextWidth{%
144  \ifvoid\ParallelLBox
145  \hskip\ParallelLWidth
146  \else
147  \ParallelWhichBox=\z@
148  \vbox{\setbox\ParallelBoxVar
149  =\vsplit\ParallelLBox to\dp\strutbox%
150  \unvbox\ParallelBoxVar}%
151  \fi
152  \strut
153  \ifnum\ParallelBoolMid=\@ne
154  \hskip\ParallelMainMidSkip
155  \vrule
156  \else
157  \hss
158  \fi
159  \hss
160  \ifvoid\ParallelRBox
161  \hskip\ParallelRWidth
162  \else

1Stuttgart; raichle@informatik.uni-stuttgart.de; 1996/10/01

163  \ParallelWhichBox=\@ne
164  \vbox{\setbox\ParallelBoxVar
165  =\vsplit\ParallelRBox to\dp\strutbox%
166  \unvbox\ParallelBoxVar}%
167  \fi}}%
168  \ifvoid\ParallelLBox \ifvoid\ParallelRBox
169  \global\ParallelBoolVar=\z@
170  \fi\fi%
171  \fi%
172  \ifnum\ParallelBoolVar=\@ne%
173  \penalty\interlinepenalty
174  \repeat
175  \par
176  \endgroup
177 \fi}

5.8.3 typesetting on two page

\ParallelParTwoPages
178 \newcommand{\ParallelParTwoPages}{%
179 \ifnum\ParallelBoolVar=\@ne
180  \par\begingroup
181  \global\ParallelWhichBox=\@ne
182  \newpage
183  \vbadness=10000
184  \vfuzz=3ex
185  \splittopskip=\z@skip
186  \loop%
187  \ifnum\ParallelBoolVar=\@ne%
188  \ifnum\ParallelWhichBox=\@ne
189  \ifvoid\ParallelLBox \mbox{} \newpage
190  \else\global\ParallelWhichBox=\z@\fi
191  \else
192  \ifvoid\ParallelRBox \mbox{} \newpage
193  \else\global\ParallelWhichBox=\@ne\fi
194  \fi
195  \ifnum\ParallelWhichBox=\z@
196  \ifodd\thepage \mbox{} \newpage \fi
197  \hbox to\textwidth{%
198  \vbox{\vsplit\ParallelLBox to.98\textheight}}%
199  \else
200  \ifodd\thepage\relax\else \mbox{} \newpage \fi
201  \hbox to\textwidth{%
202  \vbox{\vsplit\ParallelRBox to.98\textheight}}%
203  \fi
204  \vspace*{\fill}\newpage
205  \fi
206  \ifvoid\ParallelLBox\ifvoid\ParallelRBox
207  \global\ParallelBoolVar=\z@
208  \fi\fi
209  \ifnum\ParallelBoolVar=\@ne
210  \repeat

211  \par
212  \endgroup
213 \fi}

5.9 user commands

\ParallelAfterText
214 \newcommand{\ParallelAfterText}{%
215 \global\ParallelBoolVar=\@ne
216 \let\footnote=\ParallelOldFootnote\endgroup}
\ParallelCheckOpenBrace
217 \newcommand{\ParallelCheckOpenBrace}{%
218 \ifx\x\bgroup \else
219  \errmessage{Missing opening brace}%
220 \fi
221 \endgroup}
\ParallelLText
222 \newcommand{\ParallelLText}{%
223 \everypar{}\@restorepar\begingroup
224 \hbadness=3000
225 \let\footnote=\ParallelLFootnote
226 \ParallelWhichBox=0
227 \global\setbox\ParallelLBox=\vbox\bgroup \hsize=\ParallelLWidth
228 \aftergroup\ParallelAfterText
229 \begingroup \afterassignment\ParallelCheckOpenBrace \let\x=}
\ParallelRText
230 \newcommand{\ParallelRText}{%
231 \everypar{}\@restorepar\begingroup
232 \hbadness=3000
233 \ifnum\ParallelFNMode=\@ne
234  \let\footnote=\ParallelRFootnote
235 \else
236  \let\footnote=\ParallelLFootnote
237 \fi
238 \ParallelWhichBox=\@ne
239 \global\setbox\ParallelRBox=\vbox\bgroup \hsize=\ParallelRWidth
240 \aftergroup\ParallelAfterText
241 \begingroup \afterassignment\ParallelCheckOpenBrace \let\x=}

\ParallelAtEnd \ParallelAtEnd must be defined: the user just types \renewcommand, and everything is right (I hope); it’s a dummy.

242 \newcommand{\ParallelAtEnd}{}

\ParallelPar Actually, this is a dummy again or a “Pointer” to the \ParallelPar, which is choosen.

243 \newcommand{\ParallelPar}{}  % Dummy
\ParallelDot
244 \newcommand{\ParallelDot}{\ensuremath{\cdot}}

5.10 Environment “Parallel”

Parallel
245 \newenvironment{Parallel}[3][c]{%
246 \begingroup%
247  \ParallelTextWidth=\linewidth
248  \ParallelLeftMargin=\textwidth
249  \advance\ParallelLeftMargin by-\linewidth

The following code checks for the optional argument: it tells the environment, if the user wants typesetting on page (’p’), in columns (’c’) or in columns with an intermediate \vline (’v’). If none of these options is given, column mode is chosen, but if there is a wrong char (as an argument), an error message appears, but the user may go on by pressing <return>.

250  \if #1p\relax
251  \ParallelMessage{ on Pages (}%
252  \ParallelMainMode=\z@
253  \renewcommand{\ParallelPar}{\ParallelParTwoPages}
254  \else
255  \if #1a\relax
256  \ParallelMessage{ autocomputed Pages (}%
257  \ParallelMainMode=\tw@
258  \renewcommand{\ParallelPar}{\ParallelParTwoPages}
259  \else
260  \tolerance=600         % sorry, but neccessary
261  \emergencystretch=.5em % dto.
262  \ParallelMainMode=\@ne
263  \renewcommand{\ParallelPar}{\ParallelParOnePage}
264  \if #1v\relax
265  \ParallelBoolMid=\@ne
266  \ParallelMessage{ in Columns, with VLine (}%
267  \else
268  \if #1c\relax\else
269  \errhelp{possible options:
270  'p'age, 'c'olumn or columns with 'v'line ---
271  type <return> to proceed in column-mode}
272  \errmessage{bad option '#1' to environment 'Parallel'}
273  \fi
274  \ParallelMessage{ in Columns (}%
275  \fi\fi\fi

Smart column width support was mainly done by Wonkoo Kim^{2}. \ParallelLWidth or \ParallelRWidth fields can be left blank in user document. Their default width (in column-mode) is 0.5\textwidth − \ParallelUserMidSkip for null widths. Even the \ParallelUserMidSkip can be set by user; its default value is 0.5em. If only one width is given, the other width will be computed.

First we must see, if the arguments of the environment are given or not. If not, the value is set to zero inches, for that we have a value, that can be calculated.

2Pittsburgh, PA; wkim+@pitt.edu; 1996/09/29

276  \def\ParallelArgL{#2} \def\ParallelArgR{#3}
277  \ifx\ParallelArgL\empty\ParallelLWidth=0in\else\ifx\ParallelArgL\space
278  \ParallelLWidth=0in\else\setlength\ParallelLWidth{#2}\fi\fi
279  \ifx\ParallelArgR\empty\ParallelRWidth=0in\else\ifx\ParallelArgR\space
280  \ParallelRWidth=0in\else\setlength\ParallelRWidth{#3}\fi\fi

If we are in column-mode (\ParallelMainMode= 1):

281  \ifnum\ParallelMainMode=\@ne
282  \ifdim\ParallelLWidth>1em
283  \ifdim\ParallelRWidth>1em

• If both dimensions are set, we calculate the left width and set the vertical line centered (by calculating)

284  \ParallelMainMidSkip=\linewidth
285  \advance\ParallelMainMidSkip by-\ParallelLWidth
286  \advance\ParallelMainMidSkip by-\ParallelRWidth
287  \advance\ParallelMainMidSkip by-.5pt
288  \advance\ParallelMainMidSkip by-\ParallelLeftMargin
289  \divide\ParallelMainMidSkip by 2
290  \else

• If only the left width is given, the mid-skip (between vertical line and text) is set to \ParallelUserMidSkip), the width of right text is calculated.

291  \ParallelRWidth=\linewidth
292  \advance\ParallelRWidth by-\ParallelLWidth
293  \advance\ParallelRWidth by-2\ParallelUserMidSkip
294  \advance\ParallelRWidth by-\ParallelLeftMargin
295  \ParallelMainMidSkip=\ParallelUserMidSkip
296  \fi
297  \else
298  \ifdim\ParallelRWidth>1em

• If only the right width is given, the mid-skip (between vertical line and text) is set to \ParallelUserMidSkip), the width of left text is calculated.

299  \ParallelLWidth=\linewidth
300  \advance\ParallelLWidth by-\ParallelRWidth
301  \advance\ParallelLWidth by-2\ParallelUserMidSkip
302  \advance\ParallelLWidth by-\ParallelLeftMargin
303  \ParallelMainMidSkip=\ParallelUserMidSkip
304  \else

• If none of the dimensions is given, the mid-skip (between vertical line and text) is set to \ParallelUserMidSkip, the left and right dimensions are calculated – each the

      same width: 0.5\linewidth − \ParallelLeftMargin − \ParallelUserMidSkip.

305  \ParallelLWidth=.5\linewidth
306  \advance\ParallelLWidth by-\ParallelLeftMargin
307  \advance\ParallelLWidth by-\ParallelUserMidSkip
308  \ParallelRWidth=\ParallelLWidth
309  \ParallelMainMidSkip=\ParallelUserMidSkip
310  \fi
311  \fi
312  \else

If we are in page-mode (\ParallelMainMode≠1):

• If both dimensions are given (standard usage): nothing happens

• If only left size is given: right is set to \linewidth − \ParallelLeftMargin.

313  \ifdim\ParallelLWidth>1em
314  \ifdim\ParallelRWidth>1em
315  \else
316  \ParallelRWidth=\linewidth
317  \advance\ParallelRWidth by-\ParallelLeftMargin
318  \fi
319  \else

• If only right size is given: left is set to \linewidth − \ParallelLeftMargin.

320  \ifdim\ParallelRWidth>1em
321  \ParallelLWidth=\linewidth
322  \advance\ParallelLWidth by-\ParallelLeftMargin
323  \else

• If none of the sizes is given: each is set to \linewidth − \ParallelLeftMargin.

324  \ParallelLWidth=\linewidth
325  \advance\ParallelLWidth by-\ParallelLeftMargin
326  \ParallelRWidth=\linewidth
327  \advance\ParallelRWidth by-\ParallelLeftMargin
328  \fi
329  \fi
330  \fi

Now we do some standard-settings.

331  \global\ParallelLFNCounter=\z@
332  \global\ParallelRFNCounter=\z@
333  \let\ParallelOldFootnote=\footnote

We finished the start-part of this environment with setting the footnote-counters to zero and saved the old \footnote-macro.

334 }{%

Before leaving Parallel-environment with \end{Parallel}, we enshure, that all text was typesetted (by invoking \ParallelPar), then we call \ParallelAtEnd, to display some (optional) text before the footnotes.

335  \ParallelPar%
336  \ParallelAtEnd%
337 \endgroup%

Now, it’s time to show the footnotes (by invoking \ParallelShowFNList) and to restore the original \footnote-macro. The only thing to do is, to close the message-braces opened at the beginning of our Environment.

338 \ParallelShowFNList%
339 \let\footnote=\ParallelOldFootnote
340 \ParallelMessage{)}}

5.11 postamble, settings

When the package is loaded, it’s neccessary to reset some of our Variables to standardvalues; the options must be processed.

341 \ParallelFNNumMode=\z@
342 \ParallelFNMode=\z@
343 \ParallelBoolMid=\z@
344 \ParallelUserMidSkip=.5em
345 \ProcessOptions

346 ⟨/package⟩

 6 examples for parallel.sty

6.1 typesetting in columns

347 ⟨∗example1⟩

348 \NeedsTeXFormat{LaTeX2e}
349 \documentclass[12pt]{article}
350 \usepackage{parallel}
351 \linespread{1.9}
352 \textwidth10.5cm
353 \textheight15cm
354 \begin{document}
355 This is a sample \LaTeX{}-file  for the \texttt{Parallel}-environment.
356 It is typesetted with \verb+\linespread{1.9}+, \verb+\textheight15cm+,
357 \verb+\textwidth10.5cm+, for that we need more space on
358 the pages and some pagebreaks are visible. This really is no masterpiece
359 of typesetting, but the user should see, what the package is able to do
360 and what \texttt{not}.\par
361 The following text is from St.~Augustin, De corr.~et gratia XII,~34%
362 \footnote{De corr. et gratia XII, 34, ALG VII, 214f.},
363 latin and german.\par
364 \begin{Parallel}[v]{0.4\textwidth}{0.51\textwidth}
365 \tolerance=1000

366 ⟨/example1⟩

6.2 typesetting on two pages

367 ⟨∗example2⟩

368 \NeedsTeXFormat{LaTeX2e}
369 \documentclass[12pt]{article}
370 \usepackage[Verbose]{parallel}
371 \linespread{1.9}
372 \textwidth10.5cm
373 \textheight14cm
374 \begin{document}
375 \Large\par
376 This is a sample \LaTeX{}-file  for the \texttt{Parallel}-environment. It
377 is typesetted with \verb+\linespread{1.9}+, \verb+\textheight14cm+,
378 \verb+\textwidth10.5cm+ and \verb+\Large+ for that we need more space on
379 the pages and some pagebreaks are visible. This really is no masterpiece
380 of typesetting, but the user should see, what the package is able to do
381 and what \texttt{not}.\par
382 The following text is from St.~Augustin, De corr.~et gratia XII,~34%
383 \footnote{De corr. et gratia XII, 34, ALG VII, 214f.},
384 latin and german.\par
385 \begin{Parallel}[p]{}{}

386 ⟨/example2⟩

6.3 Common Text for the two Examples

Here we see the common text for our examples.

387 ⟨∗example1 | example2 | driver⟩

388 \ParallelLText{Itemque ipsa adiutoria distinguenda sunt. Aliud est
389  adiutorium sine quo aliquid non fit, et aliud est adiutorium quo
390  aliquid fit.  \ldots}
391 \ParallelRText{Und ebenso mu\ss\ man die Gnadenhilfen selbst
392  unterscheiden. Etwas anderes ist eine Hilfe, ohne die etwas nicht
393  geschieht, und etwas anderes eine Hilfe, durch die etwas
394  geschieht.\ldots}
395 \ParallelPar
396 \ParallelLText{Primo itaque homini, qui in eo bono quo factus fuerat
397  rectus acceperat posse non peccare, posse non mori, posse ipsum bonum
398  non deserere, datum est adiutorium perseverantiae, non quo fieret ut
399  perseveraret, sed sine quo per liberum arbitrium perseverare non
400  posset. Nunc vero sanctis in regnum Dei per gratiam Dei praedestinatis
401  non tale adiutorium perseverantiae datur, sed tale ut eis perseverantia
402  ipsa donetur; non solum ut sine isto dono perseverantes esse non
403  possint, verum etiam ut per hoc donum non nisi perseverantes sunt.}
404 \ParallelRText{Dem ersten Menschen, der in dem Gute, worin er gerecht
405  erschaffen war, die F\"ahigkeit empfangen hatte, nicht zu s\"undigen,
406  nicht zu sterben und vom Guten selbst nicht ab\-zufallen, ist demnach
407  die Gnade der Beharrlichkeit verliehen worden, nicht jene, wo\-durch
408  seine Beharrlichkeit bewirkt worden w\"are, sondern jene, ohne die er
409  nicht imstande gewesen w\"are, mit seinem freien Willen auszuharren.
410  Jetzt aber wird den Heiligen, die durch die Gnade Gottes f\"ur das Reich
411  Gottes vorher\-bestimmt sind, nicht eine solche Gnade der Beharrlichkeit
412  gegeben, sondern eine derartige, da\ss\ ihnen die Beharrlichkeit selbst
413  geschenkt wird; daher sind sie ohne dieses Gnadengeschenk nicht nur
414  unf\"ahig zur Beharrlichkeit, sondern sind auch durch dieses Geschenk
415  Nurbeharrende.}
416 \end{Parallel}
417 \end{document}

418 ⟨/example1 | example2 | driver⟩

6.4 Final commands

419 ⟨∗package⟩

420 \endinput

421 %

422 %% End of parallel.sty

423 ⟨/package⟩

7 Sample-text

And finally we see the output of our sample-text typesetted parallel on one page with vertical-line. The text is from St. Augustin, De correptione et gratia XII, 34^{3}, latin and german. Itemque ipsa adiutoria distinguenda sunt. Aliud est adiutorium sine quo Und ebenso muß man die Gnadenhilfen selbst unterscheiden. Etwas anderes ist eine Hilfe,

aliquid non fit, et aliud est adiuto- ohne die etwas nicht geschieht, und etwas anrium quo aliquid fit. … deres eine Hilfe, durch die etwas geschieht.. . .

3De corr. et gratia XII, 34, ALG VII, 214f.

Primo itaque homini, qui in eo bono quo factus fuerat rectus acceperat Dem ersten Menschen, der in dem Gute, worin er gerecht erschaffen war, die Fähigkeit emp-

posse non peccare, posse non mori, fangen hatte, nicht zu sündigen, nicht zu sterposse ipsum bonum non deserere, ben und vom Guten selbst nicht abzufallen, datum est adiutorium perseveran- ist demnach die Gnade der Beharrlichkeit vertiae, non quo fieret ut perseveraret, liehen worden, nicht jene, wodurch seine Besed sine quo per liberum arbitrium harrlichkeit bewirkt worden wäre, sondern perseverare non posset. Nunc vero jene, ohne die er nicht imstande gewesen wäre, sanctis in regnum Dei per gratiam mit seinem freien Willen auszuharren. Jetzt Dei praedestinatis non tale adiuto- aber wird den Heiligen, die durch die Gnade rium perseverantiae datur, sed tale Gottes für das Reich Gottes vorherbestimmt ut eis perseverantia ipsa donetur; sind, nicht eine solche Gnade der Beharnon solum ut sine isto dono per- rlichkeit gegeben, sondern eine derartige, daß severantes esse non possint, verum ihnen die Beharrlichkeit selbst geschenkt wird; etiam ut per hoc donum non nisi daher sind sie ohne dieses Gnadengeschenk perseverantes sunt. nicht nur unfähig zur Beharrlichkeit, sondern

sind auch durch dieses Geschenk Nurbeharrende.