\begin{document} 之后出现不需要的水平空间

\begin{document} 之后出现不需要的水平空间

当将某个选项传递给我自己的类(依次基于该类memoir)时,我会加载自己的包。该包是为排版字母而设计的。除了字母本身的主体外,所有内容都在类、包和文档的序言中定义——在后者中,它是以key=value语法的形式定义的。我在包中有以下代码:

\AtBeginDocument{%%
    \pagestyle{UVLetterHdrs}% Page headers 
    \putUVHeading% Just a macro to type some preliminary stuff
    \vspace*{3\baselineskip}\par\noindent%
    Salutation,\ignorespaces% A literal string (no unwanted space appears here) 
    \par\vspace*{\baselineskip}\noindent\ignorespaces\relax%%
}%%

% From atbeginend package
\BeforeBegin{document}{\ignorespaces\relax}% A couple of desperate attempts
\AfterBegin{document}{\ignorespaces\relax}%

然后,在文档的文件中,设置相应的键后,我有以下几行

\begin{document} 
% The problem appears here but it disappears if I add "%" 
% right after the environment's starting command.
Text of the letter.
\end{document}

我的问题是,虽然在起始行 之前没有任何不需要的水平空间Salutation,,但在 之前有一个小的水平空间。如果我在 之后立即Text of the letter输入注释标记,则此空间将被删除。%\begin{document}

我已经尝试了所有能想到的可能出现虚假空格的方法:我在类和包文件中的每一行(实际上是所有行)都以 结尾%(这就是为什么您可以在上面的代码摘录中看到双百分号),并且我尝试过使用\ignorespaces和 ,\relax这超出了合理范围,正如您可能在那里看到的那样。此外,空格不是出现在“称呼”行之前,而是出现在 之后的所有内容之后\begin{document},因此问题似乎位于该代码区域。

很抱歉,我无法提供 MWE;类和包代码太长了。我知道这是一个很大的障碍,但如果有人至少能对可能发生的情况有所了解,那将不胜感激。

编辑:

在评论和步调一致的回答之后,我尝试将代码从\AtBeginDocument移到环境主体中;也就是说,在序言之后,我的文档的主 .tex 文件读取:

\begin{document}
\pagestyle{UVLetterHdrs}
\putUVHeading
\vspace*{3\baselineskip}\par\noindent
Salutation,
\par\vspace*{\baselineskip}\noindent 
Text of the letter.
\end{document}

不需要的空格消失了,一切都正常了。我还用文字字符串启动了这个环境的内容Salutation,,空格也出现在那里。顺便说一句,这不是缩进空格。问题肯定与命令有关\AtBeginDocument,但我还没能找出它是怎么回事。欢迎提出任何建议。

答案1

也许在你的案例中\@afterindentfalse\@afterheading在末尾添加会\AtBeginDocument有所帮助?(这是从 cgnieder 那里借来的回答特定环境后自动 \noindent 的可靠代码?

\documentclass{article}

\makeatletter
\AtBeginDocument{%
    \vspace*{3\baselineskip}\par\noindent
    Salutation,%
    \par\vspace{\baselineskip}\@afterindentfalse\@afterheading
}
\makeatother

\usepackage{lipsum}

\begin{document}

\lipsum[1]

\end{document}

在此处输入图片描述

答案2

尝试更换

Salutation,\ignorespaces% A literal string (no unwanted space appears here) 
    \par\vspace*{\baselineskip}\noindent\ignorespaces\relax%%

Salutation\\[\baselineskip]

这将在“称呼”后留下一个空白行,而不会中断当前段落,并且应该忽略任何后续的空格。

另一种可能性是\ignorespacesafterend,您需要某个地方来忽略环境后的空格,这与忽略环境内最后一个宏后的空格不同。但如果没有完整的 MWE,这只是猜测。

我建议你花点时间从代码中删除所有修复此问题的失败尝试。它们只会增加混淆,正如芭芭拉·比顿所说,有些是自相矛盾的。

相关内容