我希望这个宏仅当它是空格时才吞噬输入流中的下一个字符(根据字符代码)或者它是波浪符号(也就是不间断的空格)。
我目前尝试执行以下步骤,其中\~
只是文字波浪号的占位符,因为我知道这不是正确的转义序列或宏。
\NewDocumentCommand \gobblespace { } {
\peek_catcode_remove:NTF ~ {} {
\peek_charcode:NTF \~ {} {}
}
}
更新
考虑到使用环境(biblatex 引用中的后记),我可能需要可扩展的宏。
根据评论中的要求,这里有一些背景信息。
我正在定义在引用后记(biblatex)中使用的命令,其行为类似于\pno
和\ppno
。
% Define commands for citing chapter and section numbers.
\NewDocumentCommand \sno { } { \bibstring{section} }
\NewDocumentCommand \snos { } { \bibstring{sections} }
\NewDocumentCommand \chno { } { \bibstring{chapter} }
\NewDocumentCommand \chnos { } { \bibstring{chapters} }
不过,我想允许参考书目字符串可定制,例如:
\DefineBibliographyStrings{english}{
section = {\S\gobblespace}, % *should not* be followed by space when printed
sections = {\S\S\gobblespace}, % *should not* be followed by space when printed
chapter = {ch.},
chapters = {chs.},
}
但也喜欢:
\DefineBibliographyStrings{english}{
section = {sec.}, % *should* be followed by space when printed
sections = {secs.}, % *should* be followed by space when printed
chapter = {ch.},
chapters = {chs.},
}
答案1
这是一个可以做到这一点的不可扩展的标记循环。在 MWE 中,我将其设置为Q
active 并让它为\gobblespace
,以便在宏调用后轻松引入空格。否则,您将需要类似 的东西\expandafter\gobblespace\space
。
\documentclass{article}
\usepackage{tokcycle}
\def\abortgobble{\tcpush{\empty\endgobblespace}}
\tokcycleenvironment\gobblespace
{\tcpush{\empty##1}\abortgobble}
{\tcpushgroup{\empty##1}\abortgobble}
{\tctestifcon{\if\detokenize{~}\detokenize{##1}}
{}{\tcpush{\empty##1}}\abortgobble}
{\ifimplicittok\tcpush{\empty##1}\fi\abortgobble}
\begin{document}
\catcode`\Q=\active
\letQ\gobblespace
xQx
xQ x
xQ\today
xQ{\itshape x}x
xQ~x
\makeatletter
xQ\@sptoken x % <-IMPLICIT SPACE EXCLUDED FROM GOBBLE
\end{document}
在 MWE 中,隐式空间不会被吸收,因为正常的参数吸收同样不会跳过隐式空间。但是,如果您希望隐式空间被吸收,则可以轻松调整上述代码以省略隐式空间检查。
答案2
假设你的\S
是总是后面跟着一些非括号的标记(无论是开括号还是闭括号),你可以这样做
\newcommand{\gobblespace}[1]{\ifx#1~\else\expandafter#1\fi}
因为这会在查找参数时自动吞噬空格。如果没有,这还会重新插入找到的标记~
。
但我不确定可扩展性的需求从何而来。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\gobblespaceortilde}{}
{
\exp_last_unbraced:NV \peek_charcode_remove_ignore_spaces:NT \c_tilde_str {}
}
\ExplSyntaxOff
\newcommand{\addsectionsymbol}{\S\gobblespaceortilde}
\begin{document}
\addsectionsymbol~X
\expandafter\addsectionsymbol\space X
\addsectionsymbol X
\end{document}