我的文档有一个自定义宏,叫做
\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}