我想检测输入行是否包含某个子字符串,类似于此处讨论的问题: 检查字符串是否包含给定字符
复杂的问题是匹配字符串如下所示:
%* 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
完整的任务是读一行然后:
- 查找是否匹配,
- 它是什么类型(tex 或 pgm)以及
- 将后面的数字读入计数器
- 可能将该行传递到逐字环境或外部文件。
基本上,我正在构建一种可用作代码环境的微型语言。
答案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}