\IfStrEq(来自 xstring 包)无法正常工作

\IfStrEq(来自 xstring 包)无法正常工作

我读了一个文件行到\a。假设\a等于A Q B,在 A 之前和 B 之后有一个空格。然后我使用\StrBetween[2,3]{\a}{ }{ }[\itstr],这样就\itstr等于了Q。现在\IfStrEq{\itstr}{Q}{true}{false}应该是true,但事实并非如此。你能帮我解决这个问题吗?

答案1

如果需要读取字母或字符串并将其与稍后的xstring宏进行比较\read,则应使用宏而不是\readline,后者进行去标记化(即将除字符 32 之外的所有字符的 catcode 更改为 12,这将获得 catcode 10 的内容,这是这里不需要的。\read维护 catcode,因此属于“字母”的字符以后仍会有这个类别。

\space必须使用显式而不是空的{}{ }来匹配内容。

\documentclass[12pt]{article} 
\usepackage{xstring} 
\begin{document} 
\newdimen\qsum 
\newread\Karnameh
\immediate\openin\Karnameh=Karnameh 
\read\Karnameh to \a 
\closein\Karnameh
\StrBetween[6,7]{\a}{\space}{\space}[\itstr]% 
\fbox{\itstr}

\IfStrEq{\itstr}{Q}{\global\qsum=1pt}{\global\qsum=5pt} 

qsum=\the\qsum
\end{document} 

请注意,这\read也会抓住\endlinechar这里,但让我们暂时忽略这一点。

这将为1pt暗淡\qsum的寄存器提供。

文件Karmaneh

StNumber LastName FirstName Dotssss D Q Q Q A A A Q A Examm A Q A A Q Q A A Examm Q Q Q A A A A Q A Q Examm Examm ExCr

在此处输入图片描述

更新

如果\readline是“必须”,则\detokenizeQ要处理的\IfStrEq宏的字符使用明确的说明。

\IfStrEq{\itstr}{\detokenize{Q}}{\global\qsum=1pt}{\global\qsum=5pt}

相关内容