如果宏扩展为零,则宏避免使用空格

如果宏扩展为零,则宏避免使用空格

(前言:这个 lua 东西只是动机,真正的问题在于纯 LaTeX)

我目前正在编写一些软件包,特别是使用 LuaLaTeX。由于我经常有一些命令收集一些数据,将数据存储在表中,以便稍后打印(例如在进行一些排序或分组之后)。因此这些命令只是调用\directlua并有效地扩展到无用。

现在,当使用表格时,我注意到如果涉及可选参数,此类命令会在单元格中产生额外的空间(即使扩展为无),请参阅此示例及其一些变化:

\documentclass{article}
\parindent0pt
\begin{document}
\newcommand{\myCmd}[2][]{}
With opt arg:\\
\begin{tabular}{|l|}
    x \\
    \myCmd{x}
    \myCmd{x}
    \myCmd{x}
    x \\
\end{tabular}
\vspace{.5cm}

\renewcommand{\myCmd}[1]{}
Without opt arg:\\
\begin{tabular}{|l|}
    x \\
    \myCmd{x}
    \myCmd{x}
    \myCmd{x}
    x \\
\end{tabular}
\vspace{.5cm}

\renewcommand{\myCmd}[2][]{}
Outside of a table with opt arg:\\
x \\
\myCmd{x}
\myCmd{x}
\myCmd{x}
x \\
\vspace{.5cm}

\renewcommand{\myCmd}[1]{}
Outside of a table without opt arg:\\
x \\
\myCmd{x}
\myCmd{x}
\myCmd{x}
x \\
\end{document}

例子

(用 编译pdflatex,但lualatex看起来几乎相同)

现在我在某种程度上知道了间距的来源,因为当我在只包含 的行后面加上\myCmda %(或将所有行放在一行)时,空格就消失了。

我绝对不明白为什么这对应于有可选参数。

但最重要的是,我的问题是如何消除间距(最好的情况下,不添加类似%“正常”代码中的内容,因为最好在我的包的实现中隐藏它)。

答案1

在单元格的开头,使用 来吞噬空间\ignorespaces。这是一个原语,它扩展标记并丢弃空间标记,直到找到非空间标记。

当宏定义时没有可选空格,它的展开为空,并且来自之后的行尾的空格\myCmd{x}将被吞噬\ignorespaces

当使用可选参数定义宏时不会发生这种情况,因为在扩展过程中 TeX 会遇到一些不可扩展的东西,它不会产生文本,但仍然会结束工作\ignorespaces

如果您希望命令忽略其后的空格(和结束行),请用 结束其定义\ignorespaces。但当然最好的策略是使用 来屏蔽您不想产生空格的结束行%

相关内容