Por que \noindent não funciona corretamente aqui?

Por que \noindent não funciona corretamente aqui?

Eu defini um novo ambiente, semelhante (mas não igual) a listings:

\documentclass{ltxdoc}
\usepackage{lipsum}
\newenvironment{lines}
{\par\begingroup\nobreak
\vspace{3pt}\parindent0pt\hrule\kern5pt
\nobreak\obeylines\everypar{\strut}\endgroup}
{\par\begingroup\nobreak
\vspace{3pt}\parindent0pt\hrule\kern5pt
\nobreak\obeylines\everypar{\strut}\endgroup%
\noindent%
}
\begin{document}
\lipsum[1]
\begin{lines}
Some nifty code and stuffz
\end{lines}
\lipsum[2]
\end{document}

Por que mantenho \noindentum pequeno espaço antes do texto? Perdi algo?

Responder1

Se você usar, \noindentquase sempre terá esse comportamento. O espaço é um espaço entre palavras sendo composto a partir do final da linha após o ambiente.

Você pode evitar o problema usando, \ignorespacesafterendmas isso é tapar as rachaduras. O erro é usar \noindento qual iniciou o modo horizontal prematuramente e é por isso que o final da linha é escrito como um espaço. Ambientes LaTeX nunca fazem isso. Você deve definir o ambiente usando trivlistentão o ambiente terminará no modo vertical, mas se nenhuma linha em branco seguir o recuo será suprimido (na verdade, ele é removido usando \lastboxem vez de não ser adicionado usando \noindent).

Algo assim, ajuste os comprimentos de acordo.

insira a descrição da imagem aqui

\documentclass{ltxdoc}
\usepackage{lipsum}
\newenvironment{linez}
 {\trivlist\nopagebreak
  \parindent0pt
  \vspace{3pt}%
  \hrule
  \vspace{-3pt}%
  \item\relax\obeylines}
 {\par
  \nopagebreak
  \vspace{3pt}%
  \hrule
  \vspace{3pt}%
  \endtrivlist}

\begin{document}
\lipsum[1]
\begin{linez}
Some nifty code and stuffz
Some nifty code and stuffz
Some nifty code and stuffz
Some nifty code and stuffz
\end{linez}
\lipsum[2]
\end{document}

Responder2

Você está faltando \ignorespacesafterend, mas a definição não funciona \obeylines, porque você a coloca em um grupo e seu efeito desaparece em \endgroup:

\documentclass{ltxdoc}
\usepackage{lipsum}
\newenvironment{linez}
 {\par\nopagebreak
  \vspace{3pt}
  \parindent0pt
  \hrule\kern5pt
  \obeylines}
 {\par
  \nopagebreak
  \vspace{3pt}
  \hrule\kern5pt
  \noindent\ignorespacesafterend}

\begin{document}
\lipsum[1]
\begin{linez}
Some nifty code and stuffz
Some nifty code and stuffz
Some nifty code and stuffz
Some nifty code and stuffz
\end{linez}
\lipsum[2]
\end{document}

insira a descrição da imagem aqui

informação relacionada