理想环境

理想环境

有时在创建环境时,你想确保它们始终

  • 当两个环境紧接着出现时开始新段落
  • 吃掉空间
  • 通常是万无一失的(我敢说,也可以称为“完全兼容 LaTeX”)

我已经看到了一些技巧。有没有推荐的方法可以避免麻烦?

\documentclass{article}
\usepackage{fontspec}
\usepackage{lipsum}

\newenvironment{test}
  {\par\noindent}% <-- before env hook
  {}% <-- after env hook

\begin{document}
\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}
\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}

\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}
\end{document}

理想环境

这个可以处理\begin{test}\end{test}\begin{test}\end{test}连续。我\par\noindent在之前的环境钩子中使用过。这是正确的怎么做?基于此答案https://tex.stackexchange.com/a/22853/13552,看来我也需要\leavevmode。有人能澄清一下这一点以及任何其他“良好做法”的提示吗? 在此处输入图片描述

没有自动新建段落(\par在前面的钩子中),没有\noindent

在此处输入图片描述

没有自动新建段落(\par在前面的钩子中),有\noindent

在此处输入图片描述

有关的

答案1

如果你希望环境开始一个没有缩进的新段落并且忽略其后的空格,

\newenvironment{test}
 {\par\noindent\ignorespaces}
 {\ignorespacesafterend}

缺失\ignorespaces是导致第三个例子中空格较小的原因。这是因为\noindent开始一个新段落(请注意,\par只有结束\begin{test}一个段落),因此行尾产生的空格不会被忽略。

答案2

几乎总是最好避免在环境的开始代码中启动水平模式,所以不要使用\noindent\leavevmode等。

通常的方式是作为一个 trivlist,其精确的参数可以定制,这就是center quote verbatim等等的工作方式。

请注意,由于 fbox 在已经是全宽的 parbox 周围添加了空间,因此测试文件会产生溢出行。

在此处输入图片描述

\documentclass{article}
%\usepackage{fontspec}
\usepackage{lipsum}

\newenvironment{test}
  {\trivlist{}\item\relax}% <-- before env hook
  {\endtrivlist}% <-- after env hook

\begin{document}

\noindent X\dotfill X

\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}
\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}

\begin{test}
\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}
\end{document}

要查看在环境定义中启动 hmode 的一个(众多)缺点,请尝试以下测试

\begin{test}

\fbox{\parbox{\linewidth}{\lipsum[1]}}
\end{test}

使用此处的定义并与其他定义进行比较。以段落开头的环境应该默默接受以段落分隔符开头的环境内容。

相关内容