我如何识别一个点后跟一个空格并输出点?

我如何识别一个点后跟一个空格并输出点?

在下面的代码中,我无法弄清楚如何使用 \SPACE 和 \DOT,以便将 \peektoken 与空格()进行比较,并生成点(.)作为输出以及测试 T(rue)或 F(alse)的结果。

\catcode`\.=\active
\def\dotnext{\ifx\peektoken\SPACE\DOT T\else \DOT F\fi}
\def.{\futurelet\peektoken\dotnext}
Lorem. Ipsum.  is. simply.  dummy text.
\bye

答案1

您想要\SPACE将其\let转换为空间标记以进行\ifx测试,并将\DOT其转换\let为 catcode12 。 或者\def扩展为 catcode 12 。 (我在这里执行后者)

在此处输入图片描述

\def\DOT{.}
\catcode`\.=\active
\lowercase{\let\SPACE= } %

\def\dotnext{\ifx\peektoken\SPACE\DOT T\else \DOT F\fi}
\def.{\futurelet\peektoken\dotnext}
Lorem. Ipsum.  is. simply.  dummy text.

a.b.c.

\bye

答案2

我针对 OP 提出的一个评论做出回应:“我希望将其构建成可以在受控环境中识别句子结束的东西。例如,可以将句子结束指定为当一个点后面跟着两个空格时发生。”

在这里,我使用一个标记循环作为 OP 的“受控设置”,如果找到一个点,则立即更改空格的 catcode,以便可以检查后面是否存在两个或多个空格来表示(END-OF-SENTENCE)。单个空格或非空格字符不会触发该标准。

在没有前导点的情况下,多个空格将按照预期的 TeX 方式处理......作为单个空格标记。

\documentclass{article}
\usepackage{tokcycle}
\bgroup
\catcode32=12 %
\global\def\charsp{ }%
\egroup
\Characterdirective{%
  \addcytoks{#1}%
  \ifx.#1%
    \catcode32=12 %
    \tcpop\Q%
    \ifx\charsp\Q
      \tcpop\QQ\ifx\charsp\QQ\addcytoks{(END-OF-SENTENCE)}%
          \catcode32=10 \tcpop\QQQ\tcpush\QQQ%
        \else
        \addcytoks[1]{ \QQ}\fi%
    \else\addcytoks[1]{\Q}\fi
    \catcode32=10 %
  \fi
}
\begin{document}
\tokencyclexpress
Four spaces follow dot.    %
Three spaces follow dot.   %
Two spaces follow dot.  %
One space follows dot. %
No spaces follow dot.%
End
\endtokencyclexpress
\end{document}

在此处输入图片描述

相关内容