LaTeX 是否包含在宏定义期间忽略空格的支持构造?
默认情况
默认情况下,宏定义中的空格会像其他地方一样被保留。因此,用于代码结构的任何空格(主要是换行符)都必须注释掉。以 结尾的行除外\commandToken
,因为这些行后面的空格会被忽略。
例如在example_a.tex
下面没有注释的宏定义中我获得了一个输出
[[ world. ComQuo.everyone! ]]
同时带有注释的期望输出
[[world.ComQuo.everyone!]]
但代价是增加了编辑工作量并降低了可读性。
示例
\documentclass{article}
\usepackage[a6paper,landscape,scale=0.9]{geometry}
\begin{document}
\newcommand\hello[1]{#1}
\newcommand\CommandsQuoteSubsequentWhitespace{ComQuo.}
\newcommand\MyMacroSpaces{
\hello{world}.
\CommandsQuoteSubsequentWhitespace
\hello{everyone}!
}
\newcommand\MyMacroComments{%
\hello{world}.%
\CommandsQuoteSubsequentWhitespace%
\hello{everyone}!%
}
\ttfamily
SPC[[\MyMacroSpaces]] (space wanted before)
CMT[[\MyMacroComments]] (space wanted before)
\end{document}
答案1
正如在密切相关的问题中提到的那样“定义宏时忽略制表符和换行符是否安全?”,最重要的变化(即忽略换行符和随后的缩进空格)可以通过使用\endlinechar=-1
来抑制换行符和随后的空格来实现。然而,它需要在之后重置,从而导致构造
\endlinechar=-1 % line-break and subsequent whitespace produce nothing
(... MACRO DEFINITIONS ...)
\endlinechar=13 %
示例文档给出了输出
SPC[[world.ComQuo.everyone!]] (space wanted before)
CMT[[world.ComQuo.everyone!]] (space wanted before)
注意事项
正如另一个问题中提到的:
- 小心重置
\endlinechar
前执行其他人的代码(例如\usepackage
)。 - 忽略换行空白可能会对某些需要空白作为分隔符的结构产生意想不到的后果(请参阅其他问题),但在这些情况下使用注释或明确
\space
帮助。