![如何获取 latex3 中宏的类型集参数的长度?](https://linux22.com/image/305107/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%8F%96%20latex3%20%E4%B8%AD%E5%AE%8F%E7%9A%84%E7%B1%BB%E5%9E%8B%E9%9B%86%E5%8F%82%E6%95%B0%E7%9A%84%E9%95%BF%E5%BA%A6%EF%BC%9F.png)
我希望能够决定结果字符序列的长度,以便正确输入表达式。
\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_n
MWE。可以改进解析算法来检测这种情况,但几乎不可能涵盖所有边缘情况。
\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}