检测宏前后是否有空格

检测宏前后是否有空格

我的文档有一个自定义宏,叫做

\newcommand{\myparenthetical}[1]{[#1]}

但是,我想确保文档中的宏前后始终有一个空格。

我想

This\myparenthetical{9}is a\myparenthetical{10} test.

表现为

这个 [9] 是一个 [10] 测试。

不是作为

这是一次[9]测试。

我该如何使用宏来做到这一点?

答案1

\unskip删除前一个空格。根据模式,这是水平或垂直空格。命令后的空格可以通过 忽略。如果后面跟着标点符号,可以通过和测试后面的标记\ignorespaces来设置空格标记,以避免设置空格。作为副作用,它还会删除后面的空格。\space\@ifnextchar

完整示例:

\documentclass{article}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \@ifnextchar{.}{}{%
  \@ifnextchar{,}{}{%
  \@ifnextchar{;}{}{%
  \@ifnextchar{!}{}{%
  \@ifnextchar{?}{}{%
  \@ifnextchar{)}{}{%
  \@ifnextchar\par{}{%
    \space
    \ignorespaces
  }}}}}}}%
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

结果

简化

可以使用包 简化示例xspace,感谢 Barbara。但是,\xspace不能直接使用,因为它适用于没有参数的宏。然后扫描宏名会吞噬下一个空格。但\xspace对于标点符号检测来说没问题。因此,可以通过以下\romannumeral技巧吞噬以下空格,其中空格被字符常量占用,然后通过 删除生成的负数\romannumeral

\documentclass{article}

\usepackage{xspace}

\makeatletter
\newcommand*{\myparenthetical}[1]{%
  \ifhmode
    \unskip
    \space
  \fi
  [#1]%
  \expandafter\xspace\romannumeral-`\x
}

\begin{document}
\myparenthetical{1} starts a sencents and ends it \myparenthetical{2}.
\myparenthetical{3}Lorem ipsum\myparenthetical{4} ,\myparenthetical{5}.

This\myparenthetical{6}is \myparenthetical{7} a\myparenthetical{8} test.
\end{document}

相关内容