(前言:这个 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
看起来几乎相同)
现在我在某种程度上知道了间距的来源,因为当我在只包含 的行后面加上\myCmd
a %
(或将所有行放在一行)时,空格就消失了。
我绝对不明白为什么这对应于有可选参数。
但最重要的是,我的问题是如何消除间距(最好的情况下,不添加类似%
“正常”代码中的内容,因为最好在我的包的实现中隐藏它)。
答案1
在单元格的开头,使用 来吞噬空间\ignorespaces
。这是一个原语,它扩展标记并丢弃空间标记,直到找到非空间标记。
当宏定义时没有可选空格,它的展开为空,并且来自之后的行尾的空格\myCmd{x}
将被吞噬\ignorespaces
。
当使用可选参数定义宏时不会发生这种情况,因为在扩展过程中 TeX 会遇到一些不可扩展的东西,它不会产生文本,但仍然会结束工作\ignorespaces
。
如果您希望命令忽略其后的空格(和结束行),请用 结束其定义\ignorespaces
。但当然最好的策略是使用 来屏蔽您不想产生空格的结束行%
。