为什么 \noindent 在这里不能正常工作?

为什么 \noindent 在这里不能正常工作?

我定义了一个新的环境,类似(但不等于)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}

为什么我的\noindent文本前面会留一个小空格?我是不是漏掉了什么?

答案1

如果您使用,\noindent您几乎总是会遇到这种行为。空格是在环境之后从行尾开始排版的单词间空格。

您可以使用 来避免此问题\ignorespacesafterend,但这只是掩盖漏洞。错误在于使用\noindent过早启动了水平模式,这就是为什么行尾被排版为空格的原因。LaTeX 环境永远不会这样做。您应该使用 定义环境,trivlist然后环境将以垂直模式结束,但如果后面没有空行,缩进将被抑制(实际上是使用 删除缩进,\lastbox而不是使用 不添加缩进\noindent。)

像这样,调整长度以适应。

在此处输入图片描述

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

答案2

您缺少了\ignorespacesafterend,但是定义不起作用\obeylines,因为您将它括在一个组中并且它的效果在 处消失\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}

在此处输入图片描述

相关内容