有时在创建环境时,你想确保它们始终
- 当两个环境紧接着出现时开始新段落
- 吃掉空间
- 通常是万无一失的(我敢说,也可以称为“完全兼容 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}
使用此处的定义并与其他定义进行比较。以段落开头的环境应该默默接受以段落分隔符开头的环境内容。