Automatischen vertikalen Abstand zwischen Blöcken einfügen, wenn \obeylines aktiv ist

Automatischen vertikalen Abstand zwischen Blöcken einfügen, wenn \obeylines aktiv ist

Wenn ich ein Manuskript für einen Vortrag in LaTeX schreibe, möchte ich manchmal Teile davon so formatieren \obeylines, \obeyspacesdass in jeder Zeile ein einzelner zusammenhängender Gedanke kompakt zum Ausdruck kommt und die Beziehungen zwischen den Zeilen durch führende Einrückungen ausgedrückt werden können, etwa so:

One thought introduced with a coherent phrase,
    followed by a subordinate phrase,
    and a coordinate subordinate phrase.

Then a second thought introduced ...

Das Problem, auf das ich stoße, ist die Einbeziehung des zusätzlichen vertikalen Abstands zwischen Gruppen von zusammenhängenden Zeilen („Absätzen“), wie vor der letzten Zeile oben. Die beste Ad-hoc-Maßnahme, die mir bisher eingefallen ist, ist die Definition des Pipe-Symbols, das am Ende jeder Gruppe hinzugefügt werden kann, wie folgt:... coordinate subordinate phrase.|

So sieht der Neudefinitionscode aus, den ich in ein externes Paket gelegt habe.

\catcode`|=\active
\def|{\smallskip}

Dies funktioniert mehr oder weniger wie gewünscht, aber die Pipe-Zeichen in meinem gesamten Quelltext sind irritierend und offensichtlich eine Problemumgehung.

Ich habe also versucht, eine Umgebung zu definieren, die das gewünschte Ergebnis liefert, ohne dass das Pipe-Zeichen für den zusätzlichen Abstand erforderlich ist. Das ist, was ich bisher habe ...

\newenvironment{linewise}{%
\let\@oldpar=\par \let\par=\newpar \obeylines \let\par=\@oldpar}
{}

Wenn ich in diese Richtung vorgehe, wie sollte \newpardefiniert werden? Ich habe versucht, zu verwenden \\, aber TeX sträubt sich, wenn dies automatisch am Ende einer leeren Zeile eingefügt wird (wo \parnormalerweise eingefügt wird) und es beendet nicht den vorherigen Absatz (weil das Zeichen ist \active, nehme ich an), was ich aber versuche zu tun.

Soweit ich das beurteilen kann, liegt das Problem darin, dass die Trennung zwischen Absätzen bei zwei oder mehr Zeilenumbruchzeichen im „Mund“ von TeX erfolgt, wo ich keine Anpassungen vornehmen kann, die zwischen dem vertikalen Leerzeichen, das ich bei zwei oder mehr Zeilenumbruchzeichen einfügen möchte, und dem Zeilenumbruch (oder neuen Absatz), den ich einfügen möchte, wenn nur eines vorhanden ist, unterscheiden würden.

Oder gibt es einen besseren Weg, dies zu erreichen?

Antwort1

Sie sollten nicht neu definieren \par, sondern das aktive Zeilenende nach \obeylines.

\documentclass{article}
\newenvironment{linewise}
  {\parindent=0pt
   \obeyspaces\obeylines
   \begingroup\lccode`~=`\^^M
   \lowercase{\endgroup\def~}{\par\leavevmode}}
  {\ignorespacesafterend}

\begin{document}
\noindent X\leaders\hrule\hfill X

\begin{linewise}
One thought introduced with a coherent phrase,
    followed by a subordinate phrase,
    and a coordinate subordinate phrase.

Then a second thought introduced ...
\end{linewise}
Something after
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Nach einiger Zeit habe ich eine bessere Lösung für mein Vorhaben gefunden. Sie basiert auf eTeX, das den Befehl hat \obeywhitespace. Ich habe die benötigten Definitionen (die offensichtlich funktionieren, obwohl einige ziemlich kompliziert aussehen) in ein Paket gepackt, das ich bei Bedarf verwenden kann. Ich werde den relevanten Paketinhalt unten angeben.

Beachten Sie, dass am Ende ein Befehl namens steht \setblankskip, der eine Anpassung des Abstands zwischen „Absätzen“ ermöglicht, wie in der ursprünglichen Frage gezeigt.

Beachten Sie auch, dass dieses Verhalten in einer Umgebung namens bereitgestellt wird linewise. Das einzige verbleibende Ärgernis ist, dass der letzte Zeilenumbruch in der linewiseUmgebung in einer leeren Ausgabezeile widergespiegelt wird. Dies kann vermieden werden, indem dem letzten Zeilenumbruch ein vorangestellt wird %.

\def\makeactive#1{\catcode`#1 = \active \ignorespaces}%
\def\gobble#1{}%
\newskip\blanklineskipamount
\blanklineskipamount = -.8\baselineskip
\begingroup
   \makeactive\^^M \makeactive\ % No spaces or ^^M's from here on.
\gdef\obeywhitespace{%
\makeactive\^^M\def^^M{\par\futurelet\next\@finishobeyedreturn}%
\makeactive\ \def {\ }%
\aftergroup\@removebox%
\futurelet\next\@finishobeywhitespace%
}%
\gdef\@finishobeywhitespace{{%
\ifx\next %
\aftergroup\@obeywhitespaceloop%
\else\ifx\next^^M%
\aftergroup\gobble%
\fi\fi}}%
\gdef\@finishobeyedreturn{%
\ifx\next^^M\vskip\blanklineskipamount\fi%
\indent%
}%
\endgroup
\def\@obeywhitespaceloop#1{\futurelet\next\@finishobeywhitespace}%
\def\@removebox{%
   \setbox0 = \lastbox
   \ifdim\wd0=\parindent
     \setbox2 = \hbox{\unhbox0}%
     \ifdim\wd2=0pt
       \ignorespaces
     \else
       \box2 % Put it back: it wasn't empty.
     \fi
   \else
      \box0 % Put it back: it wasn't the right width.
   \fi
}%
\newenvironment{linewise}{\begingroup\obeywhitespace}{\endgroup}%
% By default, a blank line will result in .2\baselineskip.  This allows
% other values to be set
\RequirePackage{calc}
\newcommand{\setblankskip}[1]{\setlength{\blanklineskipamount}{-\baselineskip+#1}}

verwandte Informationen