我想使用 来抑制文本缩进\noindent
。但是,我发现\noindent
在命令前使用 并没有像我预期的那样工作,我不明白为什么。
这是一个显示我的问题的最小工作示例:
\documentclass[12pt]{article}
\newcommand{\InsertTextA}{
This is some text.
}
\newcommand{\InsertTextB}{
\noindent This is some text.
}
\begin{document}
This is some text. % Indented, as expected
\noindent This is some text. % Not indented, as expected
\InsertTextA{} % Indented, as expected
\noindent\InsertTextA{} % Why is this line still "somewhat" indented?
\InsertTextB{} % Not indented, as expected
\end{document}
该行\noindent\InsertTextA{}
看起来仍然有些缩进:
\noindent
在这种情况下我该如何工作?
答案1
尝试这个:
\documentclass[12pt]{article}
\newcommand{\InsertTextA}{%
This is some text.
}
\newcommand{\InsertTextB}{%
\noindent This is some text.
}
\begin{document}
This is some text. % Indented, as expected
\noindent This is some text. % Not indented, as expected
\InsertTextA{} % Indented, as expected
\noindent\InsertTextA{}
\InsertTextB{} % Not indented, as expected
\end{document}
添加注释符号%
,防止空格字符潜入tex肚子里。
答案2
答案已经在这里了,我补充一下你问题的这部分答案:“我不明白为什么”。
您的宏\InsertTextA
将\InsertTetxB
扩展为space
(从行尾标记化)后跟This is some text.
(或\noindent
后跟This is some text.
)后跟space
(从行尾标记化)。
TeX 的标记处理器会在行尾生成空格,并\par
在空行处生成空格。 在 之后,TeX 处于垂直模式\par
。 垂直模式下的空格会被忽略。\noindent
是 TeX 基元,它以不缩进的方式启动水平模式。 水平模式下的空格不会被忽略。
您在文档中的行:
\noindent\InsertTextA{} % Why is this line still "somewhat" indented?
\noindent
从文档、space
从宏、、This is some text.
(space
最后一个来自宏)、、open group
(close group
它们来自您的文档{}
,是文档中不相关的代码)、space
(百分号之前)。第一个\noindent
打开水平模式,因此会打印以下空格。以下空行生成,\par
它从水平列表中删除单个最后一个空格并创建段落。倒数第二个空格仍保留在段落中,但您看不到它,因为段落已由结束\parfillskip
,即 TeX 粘贴到文档的右边距。
另一方面,你的线路
\InsertTextB{} % Not indented, as expected
从您的宏中执行的操作space
,由于 TeX 处于垂直模式,因此会被忽略,然后\noindent
打开水平模式,This is some text.
以水平模式打印,space
添加,,open group
不close group
执行任何操作,space
(在百分比字符之前)。\par
从以下空行中删除最后一个空格并从水平模式下累积的材料生成段落。
段落末尾的双倍空格是第二个潜在问题,因为\par
只删除了最后一个空格。如果您不编写冗余代码,则此处只有一个空格,{}
因为行尾位于控制序列的末尾\InsertTextB
,并且在这种情况下标记处理器不会生成空格。
如果您正在创建 TeX 宏,则必须了解标记处理器原理、水平/垂直模式切换、TeX 胶水等。