我需要一个可以以多种方式使用的字符串比较函数。
- 简单比较
- 嵌套
- 使用多列
- 作为表格的最后一行,而不创建新行
- 简单比较但其中包含文本下标
我的所有用例都可以使用pdfstrcmp
,但是5号停了miktex 更新/重新安装后出现错误Incomplete \iffalse; all text was ignored after line xxx.
这是错误吗?还是我做错了什么?我该如何修复/调整它?
\documentclass[a4paper,11pt]{report}
\makeatletter
%%%%%%%%%%%%%
% MY FUNCTION
%%%%%%%%%%%%%
\newcommand{\STRCMP}[2]{%
\ifnum\pdfstrcmp{{#1}}{{#2}}=\z@%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi%
}
\makeatother
\begin{document}
%%%%%%%%%%%%%%
% MY USE CASES
%%%%%%%%%%%%%%
% 1. Simple compare
\STRCMP{a}{b}{1. ERROR}{1. OK} \\
% 2. Nested
\def\b{}
\def\a{\b}
\STRCMP{\a}{}{2. OK}{2. ERROR}
\begin{tabular}{|l|}
\hline
% 3. Using multicolumn in it
\STRCMP{a}{}{ERROR \\}{\multicolumn{1}{|l|}{3. OK} \\}
% 4. As the last line of a tabular, without creating a new line.
\STRCMP{a}{b}{4. ERROR \\}{}
\hline
\end{tabular}
% 5. Simple compare, but with textsubscript.
% This does not work anymore.
% Error: Incomplete \iffalse; all text was ignored after line 41.
\STRCMP{a\textsubscript{c}}{b}{5. ERROR}{5. OK} \\
\end{document}
我已经尝试了以下宏,但无法解决所有用例。
- ifthenelse(来自 ifthen)
- IfEq (来自 xstring)
- \cs_new_eq:NN \strcompare \str_if_eq:nnTF(来自 expl3)
使用它来检查字符串是否为空会因为 而引发相同的错误\edef
。但是如果没有,它就无法解释嵌套用例。
\newcommand{\STRCMP}[2]{%
\edef\TTTTT{#1}
\if\relax\detokenize{\TTTTT}\relax%
\expandafter\@firstoftwo%
\else%
\expandafter\@secondoftwo%
\fi%
}
答案1
2020-10-01 发布的 latex\textsubscript
由
\def\@textsubscript#1{%
{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\z@#1}}}}}
到
\def\@textsubscript#1{%
{\m@th\ensuremath{_{\mbox{\fontsize\sf@size\sf@size#1}}}}}
因此下标文本设置了适当的行高(这只会在明确测试上标中的基线跳过以构造凸起符号等的构造中产生差异)
在仅扩展的上下文中,旧版本扩展为无意义的,但意外避免了一个错误,所以你的 strcmp 正在比较
\protect {\mathsurround \z@ \protect $\relax ^{\protect \unhbox \voidb@x \hbo
x {\protect \afterassignment \edef 10.95{10.95}\afterassignment \edef 13.6pt{13
.6pt}\edef {}\let \def \size@update {\baselineskip 13.6pt\relax \baselineskip \
baselineskip \normalbaselineskip \baselineskip \setbox \strutbox \hbox {\vrule
height.7\baselineskip depth.3\baselineskip width\z@ }\let \size@update \relax }
\protect \xdef \OT1/cmr/m/n/10.95 {\OT1/cmr/m/n/10.95 }\OT1/cmr/m/n/10.95 \size
@update \enc@update c}}$}
但是(在某个地方)使用\sf@size
而不是\z@
会使新代码出错(这实际上在很多方面都是更好的结果)
你可以\textsubcript
通过以下方式阻止扩张
\let\mytextsubscript\textsubscript
\protected\def\textsubscript{\mytextsubcript}