时隔一年,一个简化版的coffin递归实现可见:
\documentclass[border=5pt]{standalone}
\usepackage{fourier}
\usepackage{cmupint}
\usepackage{fixdif}
\DeclareRobustCommand{\myint}{$\displaystyle\int\nolimits$}
\begin{document}
\ExplSyntaxOn
% 基础内容盒子
\coffin_new:N \l_base_int_coffin
\hcoffin_set:Nn \l_base_int_coffin { \myint }
\coffin_new:N \l_base_dx_coffin
\hcoffin_set:Nn \l_base_dx_coffin { $x \d x$ }
% 递归用的临时变量
\coffin_new:N \l_rec_root_coffin
\coffin_new:N \l_rec_child_coffin
\coffin_new:N \l_rec_dx_coffin
% 全局变量
\coffin_new:N \g_export_tmp_coffin
\coffin_new:N \l_final_result_coffin
\cs_new_protected:Npn \typeset_integral_recursive:Nnn #1 #2 #3
{
\group_begin:
% 当前层的 Root
\coffin_set_eq:NN \l_rec_root_coffin \l_base_int_coffin
\coffin_scale:Nnn \l_rec_root_coffin { #3 } { #3 }
% 当前层的 dx
\coffin_set_eq:NN \l_rec_dx_coffin \l_base_dx_coffin
\coffin_scale:Nnn \l_rec_dx_coffin { #3 } { #3 }
\int_compare:nNnTF { #2 } = { 0 }
{
\coffin_join:NnnNnnnn
\l_rec_root_coffin { r } { vc }
\l_rec_dx_coffin { l } { vc } { 0pt } { 0pt }
}
{
% 递归
% 计算子层缩放比例
\fp_set:Nn \l_tmpa_fp { #3 * 0.5 }
% 递归生成子节点
\typeset_integral_recursive:Nnn \l_rec_child_coffin
{ \int_eval:n { #2 - 1 } }
{ \l_tmpa_fp }
% 拼接子节点到 Root
\coffin_join:NnnNnnnn
\l_rec_root_coffin { r } { t }
\l_rec_child_coffin { l } { vc } { 0pt } { 0pt }
\coffin_join:NnnNnnnn
\l_rec_root_coffin { r } { b }
\l_rec_child_coffin { r } { vc } { 0pt } { 0pt }
\coffin_join:NnnNnnnn
\l_rec_root_coffin { r } { vc }
\l_rec_dx_coffin { l } { vc } { 0pt } { 0pt }
}
\coffin_gset_eq:NN \g_export_tmp_coffin \l_rec_root_coffin
\group_end:
\coffin_set_eq:NN #1 \g_export_tmp_coffin
}
\typeset_integral_recursive:Nnn \l_final_result_coffin { 5 } { 2.0 }
\coffin_typeset:Nnnnn \l_final_result_coffin { l } { vc } { 0pt } { 0pt }
\ExplSyntaxOff
\end{document}
其实可以不用coffin的,但是注意到整体积分上下限的位置并不好控制,进一步的不成功实践如下:
\documentclass[border=5pt,multi=tmpenv]{standalone}
\usepackage{amsmath}
\usepackage{fouriernc}
\usepackage{cmupint}
\usepackage{fixdif}
\parindent=0pt
% \DeclareMathOperator{\myint}{\int\nolimits}
\DeclareRobustCommand{\myint}{\int\nolimits}
\newcommand{\basicint}{\myint_0^1xdx}
\newcommand{\basicintt}{\myint_{\basicint}^{\basicint}xdx}
% https://tex.stackexchange.com/a/5192/322482
\makeatletter
\newcommand{\raisemath}[1]{\mathpalette{\raisem@th{#1}}}
\newcommand{\raisem@th}[3]{\raisebox{#1}{$#2#3$}}
\makeatother
\newcommand{\originintunit}{%
\displaystyle\myint_{
\textstyle\myint^{0}_{\basicintt}
}^{
\textstyle\myint_{1}^{\basicintt}
}
}%
\newcommand{\intunit}[2]{%
\myint_{
\myint^{0}_{\myint_{#1}^{\basicint}xdx}
}^{
\myint_{1}^{\myint_{\basicint}^{#2}xdx}
}
}
\ExplSyntaxOn
% \cs_generate_variant:Nn \tl_use:N {V}
\tl_new:N \l_explorer_base_tl
\tl_new:N \l_explorer_tmp_tl
\tl_new:N \l_explorer_script_tl
\tl_new:N \g_export_tmp_tl
\cs_new_protected:Npn \typeset_integral_recursive:Nn #1#2
{
% #1:tl to store
% #2:depth
\group_begin:
\tl_set_eq:NN \l_explorer_tmp_tl #1
\int_compare:nNnTF { #2 } = { 0 }
{
\tl_put_right:Ne \l_explorer_tmp_tl { \intunit{\basicint}{\basicint} }
}
{
\tl_clear:N \l_explorer_script_tl
\typeset_integral_recursive:Nn \l_explorer_script_tl { \int_eval:n { #2 - 1 } }
\tl_put_right:Ne \l_explorer_tmp_tl { \intunit{\l_explorer_script_tl}{\l_explorer_script_tl} }
}
\tl_put_right:Nn \l_explorer_tmp_tl { xdx }
\tl_gset_eq:NN \g_export_tmp_tl \l_explorer_tmp_tl
\group_end:
\tl_set_eq:NN #1 \g_export_tmp_tl
}
% \typeset_integral_recursive:Nn \l_explorer_base_tl { 4 }
\NewDocumentCommand{\exploreint}{ m }{
\begingroup
\typeset_integral_recursive:Nn \l_explorer_base_tl { #1 }
\begin{tmpenv}
$\l_explorer_base_tl$
\end{tmpenv}
\endgroup
}
\ExplSyntaxOff
\newenvironment{tmpenv}{}{}
\begin{document}
\exploreint{0}
\exploreint{1}
\exploreint{2}
\exploreint{3}
\end{document}
























问 如何使用l3coffin找到合适的锚点拼接以实现嵌套积分号排版