字符串操作和 catcodes

字符串操作和 catcodes

我想检测输入行是否包含某个子字符串,类似于此处讨论的问题: 检查字符串是否包含给定字符

复杂的问题是匹配字符串如下所示:

%* tex 1;
%* pgm 4;

第一步是查找是否有匹配项。我正在尝试使用xstring包来执行此操作。以下代码是我尝试入门的,只是为了测试字符串是否包含符号%。它抱怨段落在\x完成之前就结束了。

\begingroup
  \catcode`\%=12\relax
  \def\x#1{\def\dotest{\catcode`\%=12\relax\IfSubStr{#1}{%}{YES}{NO}}}
  \expandafter\endgroup\x

完整的任务是读一行然后:

  1. 查找是否匹配,
  2. 它是什么类型(tex 或 pgm)以及
  3. 将后面的数字读入计数器
  4. 可能将该行传递到逐字环境或外部文件。

基本上,我正在构建一种可用作代码环境的微型语言。

答案1

这应该就是你要找的:

\documentclass{minimal}
\usepackage{xstring}
\usepackage[T1]{fontenc}
\begingroup
\makeatletter
\catcode`\%12
\gdef\ifpourcent{\catcode`\%12 \ifpourcent@i}
\gdef\ifpourcent@i#1{\IfSubStr{#1}{%}}
\endgroup
\begin{document}
\ifpourcent{% tex1;}{YES}{NO}

\ifpourcent{abcd ef}{YES}{NO}

\ifpourcent{123 % 456}{YES}{NO}
\end{document}

编辑:抱歉,我忘了在最后恢复%的catcode:

\documentclass{minimal}
\usepackage{xstring}
\usepackage[T1]{fontenc}
\begingroup
\makeatletter
\catcode`\%12
\gdef\ifpourcent{\catcode`\%12\expandafter\relax\expandafter\ifpourcent@i\expandafter{\number\catcode`\% }}
\gdef\ifpourcent@i#1#2{\IfSubStr{#2}{%}{\catcode`\%#1 \@firstoftwo}{\catcode`\%#1 \@secondoftwo}}
\endgroup
\begin{document}
\ifpourcent{% tex1;}{YES}{NO}

\ifpourcent{abcd ef}{YES}{NO}

\ifpourcent{123 % 456}{YES}{NO}

% is still the comment char
\end{document}

相关内容