简而言之,我想要以下内容...
\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
以下是适用于您的示例的解决方案。它使用\IfEndWith
from 包xstring
检查是否\bar
以 结尾.
,并使用\ltx@ifnextchar@nospace
from 包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}