如果宏的扩展以点字符结尾,则忽略下一个点字符

如果宏的扩展以点字符结尾,则忽略下一个点字符

简而言之,我想要以下内容...

\def\foo{??????????????}

\def\bar{bar} 
A \foo-foo, a \foo, and a \foo came into a \foo. Says the \foo: Why the \foo?

\def\bar{baz.} 
A \foo-foo, a \foo, and a \foo came into a \foo. Says the \foo: Why the \foo?

...产生以下输出:

A bar-foo, a bar, and a bar came into a bar. Says the bar: Why the bar?

A baz.-foo, a baz., and a baz. came into a baz. Says the baz.: Why the baz.?

也就是说,我希望\foo相当于,但如果以 结尾并且下一个字符也是 ,\bar则要防止打印双点。..\bar..

到目前为止,我只能通过\bar做一些记账来做到这一点(例如\def\bar{bar\endswithpointfalse}vs. \def\bar{baz.\endswithpointtrue}(和\let\foo\bar,即不需要进一步包装)并替换\foo.\foo\ifendswithpoint\else.\fi),但在更复杂的情况下,这很繁琐,如果\bar是第三方,则是不可能的。由于显然没有 这样的事\lastchar,我想知道是否有任何其他没有这种记账的技巧是可能的?

答案1

以下是适用于您的示例的解决方案。它使用\IfEndWithfrom 包xstring检查是否\bar以 结尾.,并使用\ltx@ifnextchar@nospacefrom 包ltxcmds检查下一个字符是否为.。如果两者都为真,则使用 跳过下一个字符\def\ignorenext#1{}。请注意,我必须重命名\foo\foo/以避免出现跳过空格的问题,如这个答案

\documentclass{article}
\usepackage{xstring}
\usepackage{ltxcmds}

\def\ignorenext#1{}

\makeatletter
\def\foo/{\bar\IfEndWith{\bar}{.}{\ltx@ifnextchar@nospace.{\ignorenext}{}}{}}
\makeatother

\begin{document}
    \def\bar{baz}
    A \foo/-foo, a \foo/, and a \foo/ came into a \foo/. Says the \foo/: Why the \foo/?


    \def\bar{baz.}
    A \foo/-foo, a \foo/, and a \foo/ came into a \foo/. Says the \foo/: Why the \foo/?
\end{document}

命令跳过下一个 . 如果它也以 结尾。

答案2

您可以利用周期具有非常独特的空间因子代码这一事实。

在这里我也进行了加载,amsthm因为它重新定义了\frenchspacing保留标点符号的独特空间因素,同时不允许扩大间距。

可能仅当空间因子代码与句点相同时,才会激活吞噬句点的功能。

\documentclass{article}
\usepackage{amsthm}
\usepackage{xspace}

\makeatletter
\newcommand{\possibly@gobble@period}{%
  \ifnum\spacefactor=\sfcode`.
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\@ifnextchar{.}{\@gobble}{\xspace}}%
  {\xspace}%
}
\newcommand{\foo}{\baz\possibly@gobble@period}
\makeatother

\newcommand{\baz}{baz}

\begin{document}

A \foo-foo, a \foo, and a \foo came into a \foo. Says the \foo: Why the \foo?

\renewcommand{\baz}{baz.}

A \foo-foo, a \foo, and a \foo came into a \foo. Says the \foo: Why the \foo?

\frenchspacing

A \foo-foo, a \foo, and a \foo came into a \foo. Says the \foo: Why the \foo?

\end{document}

在此处输入图片描述

相关内容