Insertar espacio vertical automático entre bloques cuando \obeylines está activo

Insertar espacio vertical automático entre bloques cuando \obeylines está activo

A veces, cuando escribo un manuscrito en LaTeX para hablar, quiero formatear partes del mismo como \obeylinesy \obeyspacespermitir, de modo que un único pensamiento coherente se exprese de forma compacta en cada línea, y las relaciones entre líneas se puedan expresar con sangría inicial, como esta:

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

Then a second thought introduced ...

El problema con el que me encuentro es incluir el espacio vertical adicional entre grupos de líneas contiguas ("párrafos"), como antes de la última línea de arriba. La mejor medida ad hoc que se me ha ocurrido hasta ahora es definir el símbolo de tubería, que se puede agregar al final de cada grupo, de esta manera:... coordinate subordinate phrase.|

El código de redefinición se ve así, que he colocado en un paquete externo.

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

Esto funciona más o menos como se desea, pero los caracteres de canalización a lo largo de mi texto fuente son irritantes y, obviamente, son una solución alternativa.

Así que he estado tratando de definir un entorno que logre lo que quiero, sin requerir el carácter de tubería para el espacio adicional. Esto es lo que tengo hasta ahora...

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

Si procedo en esta dirección, ¿cómo debería \newpardefinirse? Intenté usar \\, pero TeX se resiste cuando se inserta automáticamente al final de una línea vacía (donde \parnormalmente se inserta) y no termina el párrafo anterior (porque el carácter es \active, supongo), que es lo que uso. Estoy tratando de hacer.

Hasta donde yo sé, el problema es que la división entre párrafos en dos o más caracteres de retorno se realiza en la boca de TeX, donde no puedo hacer ningún ajuste que distinga entre el espacio vertical que quiero insertar donde hay dos o más caracteres de retorno, y el salto de línea (o nuevo párrafo) que quiero insertar cuando solo hay uno.

¿O hay una mejor manera de lograr esto?

Respuesta1

No deberías redefinir \par, sino el final de línea activo después de \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}

ingrese la descripción de la imagen aquí

Respuesta2

Después de un tiempo, encontré una solución mejor a lo que estaba intentando hacer. Toma prestado de eTeX, que tiene el comando \obeywhitespace. He puesto las definiciones necesarias (que claramente funcionan, aunque algunas parecen bastante complicadas) en un paquete que puedo usar cuando sea necesario. Incluiré el contenido del paquete relevante a continuación.

Tenga en cuenta que hay un comando al final llamado \setblankskip, que permite ajustar el espacio entre "párrafos" como se muestra en la pregunta original.

Tenga en cuenta también que este comportamiento se proporciona dentro de un entorno llamado linewise. La única irritación que queda es que la nueva línea final dentro del linewiseentorno se reflejará en una línea de salida en blanco. Esto se puede evitar anteponiendo esa nueva línea final con un archivo %.

\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}}

información relacionada