嵌套使用 \xspace 不留额外空格

嵌套使用 \xspace 不留额外空格

我感觉这是我的另一个问题,答案将是“Duh!!”,但我似乎无法弄清楚如何正确地做到这一点:我想将一个使用 的宏包装起来\xspace,但在第一次使用宏时行为会有所不同。以下在第一次使用时不会产生正确的结果,并留下一个额外的空格:

在此处输入图片描述

我希望通过一个宏来控制所有的格式:\NameStyle,但我对其他选择持开放态度。

代码:

\documentclass{article}
\usepackage{etoolbox}
\usepackage{xcolor}
\usepackage{xspace}

\newtoggle{FirstUseOfNameStyle}%
\toggletrue{FirstUseOfNameStyle}%

\newcommand*{\NameStyle}[1]{\textit{#1}\xspace}%
\newcommand*{\NameStyleForFirstUse}[1]{\textcolor{red}{\NameStyle{#1}}}%

\newcommand*{\Name}[1]{%
    \iftoggle{FirstUseOfNameStyle}{%
        \NameStyleForFirstUse{#1}%
        \global\togglefalse{FirstUseOfNameStyle}
    }{%
        \NameStyle{#1}%
    }%
}%

\begin{document}
The first name is \Name{Peter}.

The name \Name{Peter},  also known as some other name.

The name \Name{Peter} Grill is well known in TeX circles.
\end{document}

答案1

首先,你的代码中有一个虚假的空间,即

\global\togglefalse{FirstUseOfNameStyle}

线。

第二:\xspace这里什么也不做,因为后面的空格\Name{Peter}无论如何都不会被吞掉。这个宏\xspace只对没有参数的宏有用(有点可疑)。

如果您的目的是定义一个类似于“首字母缩略词解析器宏”的宏,那么您可以很容易地做到这一点:

\makeatletter
\newcommand{\Name}[1]{%
  \ifcsname peter@\detokenize{#1}\endcsname
    \textit{#1}%
  \else
    \textcolor{red}{\textit{#1}}%
    \global\expandafter\let\csname peter@\detokenize{#1}\endcsname\@empty
  \fi
}
\makeatother

(不要在“脆弱的环境”中使用它,例如章节标题和标题,因为它们会在不需要的地方触发“首次出现”;如果需要,可以进行纠正。)

因此,的第一次出现\Name{Peter}将以红色打印名称,就像的第一次出现一样\Name{egreg}

\Name{Peter}你可以通过以下方式为调用添加别名

\newcommand{\peter}{\Name{Peter}\xspace}

这里\xspace就可以完成它的使命了。

答案2

egreg 指出了\xspace你的解决方案中的问题和不必要的部分。但我仍然觉得你的解决方案效率低下。以下解决方案复制自ltxtools2包裹。

\documentclass{article}
\usepackage{catoptions}
\usepackage{xspace}
\makeatletter
\robust@def*\newname#1#2{%
  \ifescapedTF{#1}{%
    \edef\cpt@tempa{\cptgobblescape#1}%
  }{%
     \edef\cpt@tempa{#1}%
  }%
  \cptexpanded{\cpt@testopt{\cpt@newname{\cpt@tempa}{#2}}}{}%
}
\robust@def*\cpt@newname#1#2[#3]{%
  \csn@def{#1long}{#2\xspace}%
  \ifblankTF{#3}{%
    \csn@def{#1first}{#2\xspace}%
  }{%
    \csn@def{#1short}{#3\xspace}%
    \csn@def{#1first}{#2~(#3)\xspace}%
  }%
  \expandafter\@ifdefinable\csname#1\endcsname\relax
  \csn@def{#1}{%
    \ifnamedefTF{newname@#1}{%
      \usename{#1short}%
    }{%
      \csn@def{newname@#1}{}%
      \usename{#1first}%
    }%
  }%
}
\makeatother

\newname\peter{Peter Gill}[Peter]
\newname\pics{Production and Inventory Control Society}[PICS]

\begin{document}
\noindent
\peter said it. \peter did it. It was brought here by \peter. 
It was taken there by \peterlong, and not \petershort.

What connects \TeX\ with \pics? \pics deals with turning raw materials into 
finished goods that \peter buys from the shops.
\end{document}

在此处输入图片描述

相关内容