Inserindo espaço vertical automático entre blocos quando \obeylines está ativo

Inserindo espaço vertical automático entre blocos quando \obeylines está ativo

Às vezes, enquanto escrevo um manuscrito em LaTeX para falar, quero formatar partes dele como \obeylinese \obeyspacespermitir, de modo que um único pensamento coerente seja expresso de forma compacta em cada linha, e as relações entre as linhas possam ser expressas com recuo à esquerda, como este:

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

Then a second thought introduced ...

O problema que encontro é incluir o espaçamento vertical extra entre grupos de linhas contíguas ("parágrafos"), como antes da última linha acima. A melhor medida ad-hoc que criei até agora é definir o símbolo de barra vertical, que pode ser adicionado ao final de cada grupo, assim:... coordinate subordinate phrase.|

O código de redefinição se parece com este, que coloquei em um pacote externo.

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

Isso funciona mais ou menos conforme desejado, mas os caracteres verticais em todo o meu texto fonte são irritantes e, obviamente, uma solução alternativa.

Então, tenho tentado definir um ambiente que realize o que desejo, sem exigir a barra vertical para espaçamento extra. Isto é o que tenho até agora...

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

Se eu prosseguir nessa direção, como deveria \newparser definido? Eu tentei usar \\, mas o TeX hesita quando ele é inserido automaticamente no final de uma linha vazia (onde \parnormalmente é inserido) e não termina o parágrafo anterior (porque o caractere é \active, presumo), que é o que eu' estou tentando fazer.

Pelo que sei, o problema é que a divisão entre parágrafos em dois ou mais caracteres de retorno ocorre na boca do TeX, onde não consigo fazer nenhum ajuste que diferencie o espaço vertical que quero inserir onde há dois ou mais caracteres de retorno e a quebra de linha (ou novo parágrafo) que desejo inserir quando houver apenas um.

Ou existe uma maneira melhor de conseguir isso?

Responder1

Você não deve redefinir \par, mas o fim de linha ativo depois 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}

insira a descrição da imagem aqui

Responder2

Depois de algum tempo, encontrei uma solução melhor para o que estava tentando fazer. Ele é emprestado do eTeX, que possui o comando \obeywhitespace. Coloquei as definições necessárias (que funcionam claramente, embora algumas pareçam bastante complicadas) em um pacote que posso usar quando necessário. Incluirei o conteúdo relevante do pacote abaixo.

Observe que existe um comando no final chamado \setblankskip, que permite um ajuste no espaçamento entre “parágrafos” conforme mostrado na pergunta original.

Observe também que esse comportamento é fornecido em um ambiente chamado linewise. A única irritação restante é que a nova linha final no linewiseambiente será refletida em uma linha de saída em branco. Isso pode ser evitado precedendo a nova linha final com um %.

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

informação relacionada