有人能解释一下如何去掉文本主体中花括号中提供的参数周围自动添加的空格吗?这是一个简单的例子:
\documentclass{article}
\usepackage[normalem]{ulem}
\newcommand{\oldtext}[1]{}
% \newcommand{\oldtext}[1]{\sout{#1}}
\begin{document}
There is absolute no doubt {} {} {} {} that the difference between $x=3$ and $x=4$ shall
not be ignored. After all, $3$ and $4$ are different numbers.
So why in the world would \oldtext{anybody} \oldtext{somebody} anyone argue for that?
\end{document}
结果是:
可以看出,重复出现的“{}”会添加空格。“\oldtext”宏显示了为什么这在实践中会出现问题。它在这里用于表示旧文本,以后需要时应该可以将其显示出来(通过交换 oldtext 宏的定义)。当然,文本主体部分的最后一行可以写成:
So why in the world would\oldtext{anybody}\oldtext{somebody} anyone argue for that?
但这在代码中很难读懂,会使版本控制软件感到困惑,并且需要在宏 oldtext 内添加一个空格,以避免旧文本被拼接在一起,这有点难看。此外,在校对文档时,\oldtext 之前或之后的空格很容易被忽略。
理想情况下,我想用一些行为类似于“\relax”而不是“{\relax}”的表达式替换命令“\newcommand{\oldtext}[1]{}”。
答案1
解决问题的另一个一般答案:
\makeatletter
\newcommand{\oldtext}[1]{\@bsphack\@esphack}
\makeatother
while\ignorespaces
总是吃掉所有空格,\@bsphack\@esphack
在某些情况下检查是否需要空格:当命令后有空格,但命令前没有空格时
hi\oldtext{bla} there.
在这种情况下,\ignorespaces
解决方案是
hithere.
而\@bsphack
另一个则会正确地在两个单词之间插入空格:
hi there.
这是 LaTeX 的宏所使用的解决方案,它不排版诸如此类的东西\label
。
答案2
\ignorespaces
在空对内使用{}
。使用和不使用它的区别由两个宏\oldtext
和\evenoldertext
\documentclass{article}
\usepackage[normalem]{ulem}
\newcommand{\oldtext}[1]{\ignorespaces}
\newcommand{\evenoldertext}[1]{}
% \newcommand{\oldtext}[1]{\sout{#1}}
\begin{document}
There is absolute no doubt {} {} {} {} that the difference between $x=3$ and $x=4$ shall
not be ignored. After all, $3$ and $4$ are different numbers.
So why in the world would \oldtext{anybody} \oldtext{somebody} anyone \evenoldertext{Hello} argue for that?
\end{document}