如何获取 latex3 中宏的类型集参数的长度?

如何获取 latex3 中宏的类型集参数的长度?

我希望能够决定结果字符序列的长度,以便正确输入表达式。

\varepsilon考虑像或这样的参数\mathscr{A},它们都产生一个字符。

我知道我们可以编制一个可行宏名列表并在列表中查找参数。

但是,是否存在更规范的方法来了解参数的宽度恰好是一个字符的宽度(在这种情况下,除了其他操作之外,我会省略括号)?


考虑一个宏

\NewDocumentCommand{\fn}{m m}{
    {#1} \left( {#2} \right)
}

其中#1代表函数的名称(预计长度为一个或多个字符)并#2代表函数的参数。

该宏旨在正确排版如下表达式

\fn{f}{\frac{a}{b}}

\fn{\varepsilon}{\frac{a}{b}}

\fn{\mathscr{A}}{\frac{a}{b}}

\fn{Velocity}{vwx}

其中第一个参数的宽度可能不同,如果它的长度(或宽度)恰好是一个字符,则应该保持不变,\mathrm如果它更长(或更宽),则应用于。

我打算正确解析特定标记的输入,例如\circle,并查看第一个参数是否\fn是复杂表达式。我确实知道我们使用简写符号来表示函数组合,特别是——这应该是一个极端情况。

总而言之,

我正在寻找一种方法来计算字符序列的字符数(以及可能的维度宽度),因为它将被排版。

答案1

这是一个使用 的“解决方案” 。它只计算第一个参数中 catcode 11 和 12 的标记,并根据这个减少的计数expl3决定是否使用。\mathrm

由于这是一个自动化解决方案,因此可能会出现误报,例如f_nMWE。可以改进解析算法来检测这种情况,但几乎不可能涵盖所有边缘情况。

\documentclass{article}
\usepackage{xparse,mathrsfs}

\ExplSyntaxOn

\int_new:N \l_user_charcount_int

\cs_new_protected:Npn \user_parsefn:nn #1#2
 {
  \int_zero:N \l_user_charcount_int
  \tl_map_inline:nn { #1 }
   {
    \bool_if:nT { \token_if_letter_p:N ##1 || \token_if_other_p:N ##1 }
     { \int_incr:N \l_user_charcount_int }
   }
  \int_compare:nTF { \l_user_charcount_int > 1 }
   { \mathrm { #1 } }
   { #1 }
  \left( #2 \right)
 }

\NewDocumentCommand \fn { m m }
 {
  \user_parsefn:nn { #1 } { #2 }
 }

\ExplSyntaxOff

\begin{document}

$\fn{f}{\frac{a}{b}}$

$\fn{f_n}{\frac{a}{b}}$

$\fn{\varepsilon}{\frac{a}{b}}$

$\fn{\mathscr{A}}{\frac{a}{b}}$

$\fn{Velocity}{vwx}$

\end{document}

在此处输入图片描述

相关内容