TeX 代码中“{}”处添加空格

TeX 代码中“{}”处添加空格

有人能解释一下如何去掉文本主体中花括号中提供的参数周围自动添加的空格吗?这是一个简单的例子:

\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}

在此处输入图片描述

相关内容