当将某个选项传递给我自己的类(依次基于该类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,这只是猜测。
我建议你花点时间从代码中删除所有修复此问题的失败尝试。它们只会增加混淆,正如芭芭拉·比顿所说,有些是自相矛盾的。