如果下一个字符是空格或波浪符号,则吞噬它

如果下一个字符是空格或波浪符号,则吞噬它

我希望这个宏仅当它是空格时才吞噬输入流中的下一个字符(根据字符代码)或者它是波浪符号(也就是不间断的空格)。

我目前尝试执行以下步骤,其中\~只是文字波浪号的占位符,因为我知道这不是正确的转义序列或宏。

\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 中,我将其设置为Qactive 并让它为\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}

相关内容