为什么 \tl_if_in (和 \clist_if_in)使用 \mathrm 插入额外的标记

为什么 \tl_if_in (和 \clist_if_in)使用 \mathrm 插入额外的标记

我遇到了一个无法解释的奇怪行为。在我的高亮宏代码中,我尝试使用它\tl_if_in来进行基本的数学课测试。但是当\mathrm是要测试的标记的一部分时,会插入一些额外的标记(即后面的内容\mathrm{…})。

\documentclass{article}

\usepackage{xparse}

\ExplSyntaxOn

\tl_const:Nn \c_pirkl_math_rel_symbols_tl { +-=/ }

\NewDocumentCommand{ \highlight }{ m }{
   \tl_if_in:NnT \c_pirkl_math_rel_symbols_tl { #1 } {
      % ...
   }
   #1
}

\ExplSyntaxOff

\begin{document}
Inserts what comes after \verb|\mathrm{...}|
\[ \highlight{x} + \highlight{\mathrm{d}x} \]

works with additional group
\[ \highlight{x} + \highlight{{\mathrm{d}x}} \]
\end{document}

在此处输入图片描述

它与 相同\clist_is_in,只是输出中还多了一个逗号。


笔记:实际上我的问题是一种 xy 问题,我在研究捕获数学类的解决方案时遇到了这个问题:http://tex.stackexchange.com/q/369903/4918


更新:添加\tl_to_string测试是缓解真的

\NewDocumentCommand{ \highlight }{ m }{
   \tl_if_in:NnT \c_pirkl_math_rel_symbols_tl { \tl_to_string:n { #1 } } {
      T
   }
   #1
}

更新2:对于大多数 TL 字符串,我也无法让它工作……

\tl_const:Nn \c_pirkl_math_rel_symbols_tl { \tl_to_string:n { +-=/ } }

\cs_generate_variant:Nn \tl_if_in:NnT { NfT }

\NewDocumentCommand{ \highlight }{ m }{
   \tl_if_in:NfT \c_pirkl_math_rel_symbols_tl { \tl_to_string:n { #1 } } {
      T
   }
   #1
}

答案1

据记载:<token list>要搜索的不能包含{}

在此处输入图片描述

将两个 TL(常量和测试)都字符串化应该可以解决问题,但是这个解决方案需要两个额外的 cs 变体:

\cs_generate_variant:Nn \tl_if_in:NnT { NfT }

\tl_const:Nx \c_pirkl_math_rel_symbols_tl { \tl_to_str:n { +-=/ } }

\NewDocumentCommand{ \highlight }{ m }{
   \tl_if_in:NfT \c_pirkl_math_rel_symbols_tl { \tl_to_str:n { #1 } } {
      T
   }
   #1
}

相关内容