我刚刚发现 LaTeX3 编程层 ( expl3
),并对其提供的非常优雅的解决方案感到满意。考虑到它已经存在了很长一段时间,但仍在开发中(是否计划发布最终的“稳定”版本,或者这只是一些平稳过渡?),有什么理由不是现在可以使用 LaTeX3 来做所有事情吗(可能)?
例如,我编写了一些较小的包供自己使用,而 LaTeX3 大大简化了这一过程,但我不确定是否要完全致力于此。
答案1
请注意,以前分发的代码expl3
现在是 LaTeX 格式的一部分(名称为 L3 编程层)。尽管如此(并且将继续如此),\usepackage{expl3}
但从 2020 年开始,除非您想传递某些调试选项,否则就没有必要了。
有非常好的理由使用 L3 编程层。该层完全受支持,LaTeX 项目团队将逐步将代码从旧版 2e 移至使用 L3 编程层。所有新代码(例如 Hook 管理系统(于 2020 年推出))都已完全构建在 L3 编程层上。
另一篇文章中提出的问题需要说明:列表看起来很长,但如果你看一下删除日期(即函数弃用后一年或两年),它们基本上都是从 L3 编程层仍与 LaTeX 格式分离的时代开始的,并且(当时基本上是稳定的)作为单独的“实验”包分发,名为expl3
。我们甚至可能在将来弃用某个函数,因为事实证明界面需要改进或名称选择不当,但正如 Joseph 在回复中所说,我们已决定将来不会从内核中删除此类弃用的接口。
答案2
有一个原因不是使用 LaTeX3 内核:几乎每年,都会从 LaTeX3 中删除一些函数和/或变量。这意味着如果您不跟上 LaTeX3,您的 LaTeX3 软件包将来可能会崩溃。
对于 LaTeX2 软件包,您的用户仍然可以使用 LaTeX2 内核的回滚版本,只需使用latexrelease
package 即可。但对于 LaTeX3 软件包,这是不可能的,这就是我打开这个的原因问题几个月前。
以下 LaTeX3 内核删除的函数和变量列表来自 l3过时.txt并且我已按日期排序。
----------------------------------------------------------
Date removed Function or variables
----------------------------------------------------------
2021-07-07 \vbox_unpack_clear:c
2021-07-07 \vbox_unpack_clear:N
2021-07-07 \token_get_replacement_spec:N
2021-07-07 \token_get_prefix_spec:N
2021-07-07 \token_get_arg_spec:N
2021-07-07 \tl_set_from_file_x:cnn
2021-07-07 \tl_set_from_file_x:Nnn
2021-07-07 \tl_set_from_file:cnn
2021-07-07 \tl_set_from_file:Nnn
2021-07-07 \tl_gset_from_file_x:cnn
2021-07-07 \tl_gset_from_file_x:Nnn
2021-07-07 \tl_gset_from_file:cnn
2021-07-07 \tl_gset_from_file:Nnn
2021-07-07 \hbox_unpack_clear:c
2021-07-07 \hbox_unpack_clear:N
2021-07-07 \c_term_ior
2021-07-07 \box_set_eq_clear:cc
2021-07-07 \box_set_eq_clear:cN
2021-07-07 \box_set_eq_clear:Nc
2021-07-07 \box_set_eq_clear:NN
2021-07-07 \box_gset_eq_clear:cc
2021-07-07 \box_gset_eq_clear:cN
2021-07-07 \box_gset_eq_clear:Nc
2021-07-07 \box_gset_eq_clear:NN
2020-01-01 \xetex_...:D
2020-01-01 \utex_...:D
2020-01-01 \uptex_...:D
2020-01-01 \tl_show_analysis:n
2020-01-01 \tl_show_analysis:N
2020-01-01 \str_if_eq_x_p:nn
2020-01-01 \str_if_eq_x:nnTF
2020-01-01 \str_if_eq_x:nnT
2020-01-01 \str_if_eq_x:nnF
2020-01-01 \str_case_x:nnTF
2020-01-01 \str_case_x:nnT
2020-01-01 \str_case_x:nnF
2020-01-01 \str_case_x:nn
2020-01-01 \ptex_...:D
2020-01-01 \pdftex_...:D
2020-01-01 \msg_term:n
2020-01-01 \msg_log:n
2020-01-01 \msg_interrupt:nn
2020-01-01 \luatex_...:D
2020-01-01 \lua_shipout_x:n
2020-01-01 \lua_now_x:n
2020-01-01 \lua_escape_x:n
2020-01-01 \etex_....:D
2020-01-01 \c_zero
2020-01-01 \c_two_hundred_fifty_six
2020-01-01 \c_two_hundred_fifty_five
2020-01-01 \c_two
2020-01-01 \c_twelve
2020-01-01 \c_three
2020-01-01 \c_thirty_two
2020-01-01 \c_thirteen
2020-01-01 \c_ten_thousand
2020-01-01 \c_ten
2020-01-01 \c_sixteen
2020-01-01 \c_six
2020-01-01 \c_seven
2020-01-01 \c_one_thousand
2020-01-01 \c_one_hundred
2020-01-01 \c_one
2020-01-01 \c_nine
2020-01-01 \c_fourteen
2020-01-01 \c_four
2020-01-01 \c_five
2020-01-01 \c_fifteen
2020-01-01 \c_eleven
2020-01-01 \c_eight
2018-12-29 \token_new:Nn
2018-12-27 \sort_reversed:
2018-12-27 \sort_ordered:
2018-12-27 \iow_log_streams:
2018-12-27 \iow_list_streams:
2018-12-27 \ior_log_streams:
2018-12-27 \ior_list_streams:
2018-12-27 \g_file_current_name_tl
2018-12-27 \file_path_remove:n
2018-12-27 \file_path_include:n
2018-12-27 \file_list:
2018-12-27 \file_add_path:nN
2018-12-27 \c_minus_one
2018-12-27 \box_use_clear:c
2018-12-27 \box_use_clear:N
2018-12-27 \box_resize:cnn
2018-12-27 \box_resize:Nnn
2018-03-05 \tl_to_uppercase:n
2018-03-05 \tl_to_lowercase:n
2018-03-05 \ior_get_str:NN
2018-03-05 \file_if_exist_input:nTF
2018-03-05 \file_if_exist_input:nT
2017-01-01 \xetex_if_engine_p:
2017-01-01 \xetex_if_engine:TF
2017-01-01 \xetex_if_engine:T
2017-01-01 \xetex_if_engine:F
2017-01-01 \scan_align_safe_stop:
2017-01-01 \pdftex_if_engine_p:
2017-01-01 \pdftex_if_engine:TF
2017-01-01 \pdftex_if_engine:T
2017-01-01 \pdftex_if_engine:F
2017-01-01 \luatex_if_engine_p:
2017-01-01 \luatex_if_engine:TF
2017-01-01 \luatex_if_engine:T
2017-01-01 \luatex_if_engine:F
2017-01-01 \c_job_name_tl
2016-01-05 \prop_get:cn
2016-01-05 \prop_get:Nn
2016-01-05 \int_to_octal:n
2016-01-05 \int_to_hexadecimal:n
2016-01-05 \int_to_binary:n
2016-01-05 \int_from_octal:n
2016-01-05 \int_from_hexadecimal:n
2016-01-05 \int_from_binary:n
2015-07-14 \tl_case:cnn
2015-07-14 \tl_case:Nnn
2015-07-14 \str_case_x:nnn
2015-07-14 \str_case:onn
2015-07-14 \str_case:nnn
2015-07-14 \quark_if_recursion_tail_break:n
2015-07-14 \quark_if_recursion_tail_break:N
2015-07-14 \int_case:nnn
2015-07-14 \dim_case:nnn
2014-08-09 \vbox_set_inline_end:
2014-08-09 \vbox_set_inline_begin:c
2014-08-09 \vbox_set_inline_begin:N
2014-08-09 \vbox_gset_inline_end:
2014-08-09 \vbox_gset_inline_begin:c
2014-08-09 \vbox_gset_inline_begin:N
2014-08-09 \hbox_set_inline_end:
2014-08-09 \hbox_set_inline_begin:c
2014-08-09 \hbox_set_inline_begin:N
2014-08-09 \hbox_gset_inline_end:
2014-08-09 \hbox_gset_inline_begin:c
2014-08-09 \hbox_gset_inline_begin:N
2014-05-28 \fp_tan:cn
2014-05-28 \fp_tan:Nn
2014-05-28 \fp_sin:cn
2014-05-28 \fp_sin:Nn
2014-05-28 \fp_round_places:cn
2014-05-28 \fp_round_places:Nn
2014-05-28 \fp_round_figures:cn
2014-05-28 \fp_round_figures:Nn
2014-05-28 \fp_pow:cn
2014-05-28 \fp_pow:Nn
2014-05-28 \fp_neg:c
2014-05-28 \fp_neg:N
2014-05-28 \fp_mul:cn
2014-05-28 \fp_mul:Nn
2014-05-28 \fp_ln:cn
2014-05-28 \fp_ln:Nn
2014-05-28 \fp_if_zero_p:N
2014-05-28 \fp_if_zero:NTF
2014-05-28 \fp_if_zero:NT
2014-05-28 \fp_if_zero:NF
2014-05-28 \fp_if_undefined_p:N
2014-05-28 \fp_if_undefined:NTF
2014-05-28 \fp_if_undefined:NT
2014-05-28 \fp_if_undefined:NF
2014-05-28 \fp_gtan:cn
2014-05-28 \fp_gtan:Nn
2014-05-28 \fp_gsin:cn
2014-05-28 \fp_gsin:Nn
2014-05-28 \fp_ground_places:cn
2014-05-28 \fp_ground_places:Nn
2014-05-28 \fp_ground_figures:cn
2014-05-28 \fp_ground_figures:Nn
2014-05-28 \fp_gpow:cn
2014-05-28 \fp_gpow:Nn
2014-05-28 \fp_gneg:c
2014-05-28 \fp_gneg:N
2014-05-28 \fp_gmul:cn
2014-05-28 \fp_gmul:Nn
2014-05-28 \fp_gln:cn
2014-05-28 \fp_gln:Nn
2014-05-28 \fp_gexp:cn
2014-05-28 \fp_gexp:Nn
2014-05-28 \fp_gdiv:cn
2014-05-28 \fp_gdiv:Nn
2014-05-28 \fp_gcos:cn
2014-05-28 \fp_gcos:Nn
2014-05-28 \fp_gabs:c
2014-05-28 \fp_gabs:N
2014-05-28 \fp_exp:cn
2014-05-28 \fp_exp:Nn
2014-05-28 \fp_div:cn
2014-05-28 \fp_div:Nn
2014-05-28 \fp_cos:cn
2014-05-28 \fp_cos:Nn
2014-05-28 \fp_compare:NNNTF
2014-05-28 \fp_compare:NNNT
2014-05-28 \fp_compare:NNNF
2014-05-28 \fp_abs:c
2014-05-28 \fp_abs:N
2014-05-28 \c_undefined_fp
----------------------------------------------------------