
Às vezes, enquanto escrevo um manuscrito em LaTeX para falar, quero formatar partes dele como \obeylines
e \obeyspaces
permitir, 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 \newpar
ser definido? Eu tentei usar \\
, mas o TeX hesita quando ele é inserido automaticamente no final de uma linha vazia (onde \par
normalmente é 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}
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 linewise
ambiente 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}}