为了(重新)编写样板包(即包含大量文本),我看到了两种方法。
a) 将文本包含在代码中并使用每次都进行评估的深度嵌套的 if-then-else 结构。
b) 将所有文本加载到 expl3 数据结构中,然后通过索引访问。
a) 已被证明可行,但需要大量的评估时间,而且代码看起来有点笨拙。b) 将是更现代的代码,但可能会超出一些内存限制
b) 可行吗?我想听听 expl3 专家的建议。
更新回答其他问题。
这是为了更新 hpstatement.sty 包,其中包含全球化学品统一分类和标签制度的声明。
每种语言大约包含 300 个短语。对于最多 24 种语言,这意味着大约 7500 个短语和 500 kB。
答案1
中的164个段落kantlipsum
按顺序存储expl3
,总大小为147957字节。
我尝试连接它的五个副本,得到一个包含 820 个项目且总大小为 739785 字节的序列。
对记忆的影响是
9810 strings out of 492609
192626 string characters out of 6129049
3060841 words of memory out of 5000000
13800 multiletter control sequences out of 15000+600000
正在加载expl3
节目
9774 strings out of 492609
191933 string characters out of 6129049
210796 words of memory out of 5000000
13768 multiletter control sequences out of 15000+600000
您可能可以根据需要加载语言的字符串,方法是将它们存储在单独的文件中,这样影响就不会太大,大约为 21 kiB。为每种语言设置单独的文件也会简化维护。
访问 300 个项目序列不是那么快,但您可以使用 csnames 代替。
这里有一个比较:我首先定义一个 300 个项目序列,然后定义 300 个标记列表;然后我对访问随机项目进行基准测试。
\documentclass{article}
\usepackage{xparse}
%\usepackage{kantlipsum}
\usepackage{l3benchmark}
\ExplSyntaxOn
\int_step_inline:nn { 300 } { \seq_put_right:Nn \l_tmpa_seq { #1 } }
\int_step_inline:nn { 300 }
{
\tl_new:c { l_test_#1_tl }
\tl_set:cn { l_test_#1_tl } { #1 }
}
\begin{document}
\benchmark:n { \seq_item:Nn \l_tmpa_seq { \int_rand:n { 300 } } }
\benchmark:n { \tl_use:c { l_test_\int_rand:n { 300 }_tl } }
结果是
3.47e-4 seconds (1.08e3 ops)
5.6e-6 seconds (17.5 ops)
因此第二种方法有 100 倍的优势。访问序列中的最后一项与访问随机项所需的时间基本相同。对于第二种方法,访问一个或另一个项目是相同的。