使用 expl3 分解数学模式字符串

使用 expl3 分解数学模式字符串

是否可以自动将数学字符串分成几个部分,例如\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}

相关内容