是否可以自动将数学字符串分成几个部分,例如\mathdecompose
这样的宏\mathdecompose{x^A_B}
和\mathdecompose{{x}_{B}^{A}}
都导致{x}{B}{A}
?
我对一种方法特别感兴趣expl3
,例如巧妙地使用l3regex
。
附加问题:David Carlisle 的以下回答允许我分解一次输入,以便将我的宏定义\ideal
为像 一样工作\ideal{p_1}
。是否可以让它适用于多个输入,以便宏可以(最终)像 一样工作\ideal{p_1 p_2 \cdots p_n}
?(这不是必需的功能,但如果有它会很好)。
动机:我想定义一个
\ideal
适用\mathfrak
于数学论证但忽略脚本的命令。因此\ideal{p_1^q}
应该转移到\mathfrak{p}_1^q
。
答案1
这里不需要显式的 expl3 代码
\documentclass{article}
\NewDocumentCommand\mathdecompose{m}{\mathdecomposex#1}
\NewDocumentCommand\mathdecomposex{me{_^}}{\mathdecomposey{#1}{#2}{#3}}
% just for testing
\NewDocumentCommand\mathdecomposey{mmm}{%
\mathrm{base}=#1,
\mathrm{sub}=\IfNoValueTF{#2}{?}{#2},
\mathrm{sup}=\IfNoValueTF{#3}{?}{#3}
}
\begin{document}
$\mathdecompose{x}$
$\mathdecompose{x_{b}^{a}}$
$\mathdecompose{x^{a}_{b}}$
\end{document}
答案2
仅供参考。根据 David Carlisle 的回答,这是我的\ideal
。可以使用它来\ideal{p_i^q}
获取\mathfrak{p}_i^q
,因此可以使用它来编写,\ideal{p_1}
而不必编写\ideal{p}_1
。但是,这不适用于多个输入,例如\ideal{p_1 p_2}
。
\documentclass{article}
\usepackage{amssymb}
\ExplSyntaxOn
\NewDocumentCommand \mymodule_math_decompose_apply:Nnnn { m m m m }
{
#1{#2} \IfNoValueF{#3}{\sb{#3}} \IfNoValueF{#4}{\sp{#4}}
}
\NewDocumentCommand \ideal { m } { \mymodule_math_ideal_aux:w #1 }
\NewDocumentCommand \mymodule_math_ideal_aux:w { m e{_^} }{ \mymodule_math_decompose_apply:Nnnn \mathfrak { #1 } { #2 } { #3 } }
\ExplSyntaxOff
\begin{document}
\( \ideal{p_1} \)
\end{document}
答案3
使用序列,为其提供记录结构:
平均能量损失
\documentclass{article}
\usepackage{xparse}
\usepackage{amssymb}
\ExplSyntaxOn
\NewDocumentCommand \mymodule_math_decompose_apply:Nnnn { m m m m }
{
#1{#2} \IfNoValueF{#3}{\sb{#3}} \IfNoValueF{#4}{\sp{#4}}
}
\NewDocumentCommand \ideal { m } { \mymodule_math_ideal_aux:w #1 }
\NewDocumentCommand \mymodule_math_ideal_aux:w { m e{_^} }{ \mymodule_math_decompose_apply:Nnnn \mathfrak { #1 } { #2 } { #3 } }
%****************************************************
%*
%****************************************************
%--------------------
\NewDocumentCommand { \idealseq } { +m } { % 1=data
\seq_gset_split:Nnn
\g_tmpa_seq
{ ; }
{ #1 }
% \seq_show:N
% \g_tmpa_seq
\seq_map_function:NN
\g_tmpa_seq
\jw_funcmathfrak:n
}
%------------------
\cs_set:Npn \jw_funcmathfrak:n #1 {
\tl_set:Nx \l_tmpa_tl {#1}
% \tl_show:N \l_tmpa_tl
\exp_args:Nx \ideal{\l_tmpa_tl} \tex_space:D
}
\ExplSyntaxOff
\begin{document}
\[ \ideal{p_1} \]
\[
\idealseq{p_1^q; p_2^q; p_x^q; p_y^q; p_z^q}
\]
\end{document}