我读了一个文件行到\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
是“必须”,则\detokenize
对Q
要处理的\IfStrEq
宏的字符使用明确的说明。
\IfStrEq{\itstr}{\detokenize{Q}}{\global\qsum=1pt}{\global\qsum=5pt}