我自己是这样定义的:
\newcommand\nothing[1]{#1}
也许同样的东西已经存在于 LaTeX 中,我可以使用它吗?
PS. 这样做的目的是.tex
为了另一个后处理器(拼写检查器)突出显示文档的某些部分。实际上,我的命令名称是\nospellcheck
。
答案1
任何时候使用标准方法吸收参数,您都可能会丢失信息……例如,吸收参数前的空格。另一个例子是,如果吸收的参数是一个单独的标记,您将不知道它最初是否有括号。由于这些不确定性,我倾向于不将参数吸收视为“不执行任何操作”的命令。
在下面的 MWE 中,active-Q
被设置为 OP 的定义\nothing
。它在第二行中使用了两次。在第一个例子中,由于参数吸收而丢失了空格。在第二个例子中,丢失了 周围的括号a
。
\documentclass{article}
\usepackage[T1]{fontenc}
\newcommand\nothing[1]{#1}
\begin{document}
\catcode`\Q=\active
\letQ\nothing
a b\detokenize{{a}}
aQ b\detokenize\expandafter{Q{a}}
\end{document}
更好的“不执行任何操作”命令是
\newcommand\nothing{}
或者,等价地,
\let\nothing\empty
然而,即便如此,这也并非万无一失。任何新引入的代币,即使是\empty
,如果成为扩张或吸收的目标,也可能会造成干扰。
下面是一个例子,其中引入简化\nothing
仍然会改变结果(尽管在这种情况下,会\nothing
改善结果):
\documentclass{article}
\usepackage[T1]{fontenc}
\let\nothing\empty
\begin{document}
\def\z|#1|{\detokenize\expandafter{#1}}
\z|{abc}|
\z|\nothing{abc}|
\end{document}
注意:这个确切的情况是我昨天在 tokcycle 包中发现的一个错误,当时文本逃脱放在分隔符之间时,循环|
就会丢失。如果转义文本是单个括号组,则会丢失括号,如上面第一行所示。我即将提交给 CTAN 的修复方法是使用第二行所示的带 的技术\empty
,这将保留这些括号。