为什么 `xstring` 的 `\StrBefore` 有效,而 `\IfBeginWith` 无效?

为什么 `xstring` 的 `\StrBefore` 有效,而 `\IfBeginWith` 无效?

我目前正在使用该包showkeys调试文档中的标签。使用命令\renewcommand{\showkeyslabelformat}[1]{...}可以自定义标签的显示。我想以不同于其他标签的方式处理方程式标签(以 开头的标签)。因此,我想使用eq:测试标签是否以 开头。不知何故,这似乎不起作用。eqxstring

这是一个最小的工作示例:

\documentclass{article}

\usepackage{amsmath}
\usepackage{showkeys}
\usepackage{xstring}

\begin{document}

% FIRST BLOCK
\renewcommand*\showkeyslabelformat[1]{%
  \fbox{\small\ttfamily\StrBefore{#1}{:}}}

\textbf{Lemma.} \label{lemma:no_equation}
\begin{equation} \label{eq:my_equation}
    \sum_{i=0}^\infty 2^{-1} = 2
\end{equation}

% SECOND BLOCK
\renewcommand*\showkeyslabelformat[1]{%
  \fbox{\small\ttfamily\IfBeginWith{#1}{eq}{equation}{no equation}}}
  
\textbf{Lemma.} \label{lemma:no_equation}
\begin{equation} \label{eq:my_equation}
    \sum_{i=0}^\infty 2^{-1} = 2
\end{equation} 
\end{document}

输出如下所示:

在此处输入图片描述

如您所见,xstring能够正确解析标签的第一部分。但它仍然无法以字符串开头作为条件。我在这里遗漏了什么?

答案1

正则表达式与expl3类别代码无关。

\documentclass{article}

\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{showkeys}

\newtheorem{lemma}{Lemma}

\ExplSyntaxOn
\NewDocumentCommand{\beginwithTF}{mmmm}
 {% #1 = string to search in, #2 = string to search, #3 = true, #4 = false
  \regex_match:nnTF { \A #2\: } { #1 } { #3 } { #4 }
 }
\ExplSyntaxOff

\renewcommand*\showkeyslabelformat[1]{%
  \fbox{\small\ttfamily\beginwithTF{#1}{eq}{equation}{no equation}}}

\begin{document}

\begin{lemma} \label{lemma:B}
\begin{equation} \label{eq:B}
    \sum_{i=0}^\infty 2^{-1} = 2
\end{equation}
\end{lemma}

\end{document}

使用\regex_match:nnTF我们查看给定的正则表达式(第一个参数)是否与给定的字符串(第二个参数)匹配。不过,我保留了 中的参数顺序\IfBeginWith

在此处输入图片描述

答案2

showkeys 使事情变得安全,\meaning以便带有&$或其他特殊字符的标签在排版时不会爆炸。因此,您正在比较 catcode 12(“其他”)eq和 catcode 11(字母)eq,而它们是不相等的。

相关内容