Warum funktioniert \noindent hier nicht richtig?

Warum funktioniert \noindent hier nicht richtig?

Ich habe eine neue Umgebung definiert, die ähnlich (aber nicht gleich) ist wie 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}

Warum \noindentbleibt vor dem Text ein kleiner Abstand? Habe ich etwas übersehen?

Antwort1

Wenn Sie verwenden, \noindentwird dieses Verhalten fast immer auftreten. Das Leerzeichen ist ein Wortzwischenraum, der vom Zeilenende nach der Umgebung gesetzt wird.

Sie können das Problem vermeiden, indem Sie verwenden, \ignorespacesafterendaber das übertüncht nur die Risse. Der Fehler liegt darin, \noindentdass mit zu früh der horizontale Modus gestartet wurde, weshalb das Zeilenende als Leerzeichen gesetzt wird. LaTeX-Umgebungen tun dies nie. Sie sollten die Umgebung mit definieren, trivlistdann endet die Umgebung im vertikalen Modus, aber wenn keine leere Zeile folgt, wird die Einrückung unterdrückt (sie wird tatsächlich mit entfernt, \lastboxanstatt nicht mit hinzugefügt zu werden \noindent).

Etwa so, Längen je nach Bedarf anpassen.

Bildbeschreibung hier eingeben

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

Antwort2

Sie vermissen \ignorespacesafterend, aber die Definition reicht nicht aus \obeylines, da Sie es in eine Gruppe einschließen und seine Wirkung bei verschwindet \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}

Bildbeschreibung hier eingeben

verwandte Informationen