是否有既定的expl3
方法来处理 TeX 中定义的插入?我在尝试修改时遇到了这个问题\footins
。除了重命名的 TeX 基元之外,我在文档中看不到任何其他内容。
我已经开始推出自己的功能,如下面的 MWE 所示,但到目前为止,我所拥有的绝对不适合通用,如果给出错误的输入就会中断。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new:Npn \insert_to_int:N #1 {\tex_count:D #1 \scan_stop:}
\cs_new:Npn \insert_to_dim:N #1 {\tex_dimen:D #1 \scan_stop:}
\cs_new:Npn \insert_to_skip:N #1 {\tex_skip:D #1 \scan_stop:}
\cs_new_protected:Npn \insert_set_int:Nn #1#2 {\tex_count:D #1 \int_eval:n {#2}}
\cs_new_protected:Npn \insert_set_dim:Nn #1#2 {\tex_dimen:D #1 \dim_eval:n {#2}}
\cs_new_protected:Npn \insert_set_skip:Nn #1#2 {\tex_skip:D #1 \skip_eval:n {#2}}
\NewDocumentCommand{\dumpvals}{}
{
Magnification~factor~--~before:~\int_use:N \insert_to_int:N \footins
\insert_set_int:Nn \footins {2 * \insert_to_int:N \footins}~
after:~\int_use:N \insert_to_int:N \footins\par
Maximum~insertion~size~--~before:~\dim_use:N \insert_to_dim:N \footins
\insert_set_dim:Nn \footins {-100pt + \insert_to_dim:N \footins}~
after:~\dim_use:N \insert_to_dim:N \footins\par
Extra~space~--~before:~\skip_use:N \insert_to_skip:N \footins
\insert_set_skip:Nn \footins {6pt plus 1pt minus .5pt + \insert_to_skip:N \footins}~
after:~\skip_use:N \insert_to_skip:N \footins\par
}
\ExplSyntaxOff
\begin{document}
\dumpvals
\end{document}
答案1
Yiannis 引用的包采用了使用技巧\cs_new...
来为 tex 序列\count\footins
等创建别名,并赋予它们常规expl3
变量名。例如:
\cs_new:Npn \g_test_footins_box {\footins}
\cs_new:Npn \g_test_footins_int {\tex_count:D\footins}
\cs_new:Npn \g_test_footins_dim {\tex_dimen:D\footins}
\cs_new:Npn \g_test_footins_skip {\tex_skip:D\footins}
我将其推广到任意插入,但显然生产代码应该有 if-exists 测试来检查问题:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\cs_new_protected:Npn \test_insert_init:N #1
{
\cs_new:cpn {g_test_ \cs_to_str:N #1 _box} {#1}
\cs_new:cpn {g_test_ \cs_to_str:N #1 _int} {\tex_count:D #1}
\cs_new:cpn {g_test_ \cs_to_str:N #1 _dim} {\tex_dimen:D #1}
\cs_new:cpn {g_test_ \cs_to_str:N #1 _skip} {\tex_skip:D #1}
}
\test_insert_init:N \footins
\NewDocumentCommand{\dumpvals}{}
{
Magnification~factor~--~before:~\int_use:N \g_test_footins_int
\int_gset:Nn \g_test_footins_int {2 * \g_test_footins_int}~
after:~\int_use:N \g_test_footins_int\par
Maximum~insertion~size~--~before:~\dim_use:N \g_test_footins_dim
\dim_gset:Nn \g_test_footins_dim {\g_test_footins_dim / 2}~
after:~\dim_use:N \g_test_footins_dim\par
Extra~space~--~before:~\skip_use:N \g_test_footins_skip
\skip_gset:Nn \g_test_footins_skip {\g_test_footins_skip + 6pt plus 1pt minus .5pt}~
after:~\skip_use:N \g_test_footins_skip\par
}
\ExplSyntaxOff
\begin{document}
\dumpvals
\end{document}