我尝试将一个放入xtable
宏中,但遇到了很多问题,这些问题在其他问题中有所记录。解决方法似乎是改为使用embeddedxtable
。这似乎有效。
但是,我想知道当我使用 an 时还会发生什么embeddedxtable
。我是否放弃了一些东西?我查看了源代码 ( tabl-xtb.mkvi
) 并看到一条关于直接缓冲区更快(可能可以忽略不计)的评论,但我真的不够专业,无法真正理解是否还有其他我应该注意的权衡。
答案1
表现
它的一个小缺点embeddedxtable
是它比正常环境稍慢,xtable
但以下示例的结果是最坏的情况。对于正常使用,差异要小得多,因为花费了更多时间来计算单元格的宽度和高度,而这两种环境的宽度和高度是相同的。
\startbuffer[xtable]
\startxtable
\startxrow
\startxcell
Dummy
\stopxcell
\stopxrow
\stopxtable
\stopbuffer
\startbuffer[embeddedxtable]
\startembeddedxtable
\startxrow
\startxcell
Dummy
\stopxcell
\stopxrow
\stopembeddedxtable
\stopbuffer
\starttext
\testfeatureonce
{10000}
{\startnointerference
\getbuffer[xtable]
\stopnointerference}
\testfeatureonce
{10000}
{\startnointerference
\getbuffer[embeddedxtable]
\stopnointerference}
\stoptext
上述测试的结果可以在命令行中看到(以下是我的计算机上的结果):
system > starting feature test (n=10000)
system > 10000 feature tests done (18.584s)
system > starting feature test (n=10000)
system > 10000 feature tests done (29.971s)
限制
embeddedxtable
您更感兴趣的是该环境与常规环境相比的局限性。
所有解释行尾的环境(例如
\startlines
或\starttyping
)在输出中仅产生一行文本。并非所有符号都可以在代码块中使用(例如
%
)或产生意外结果(double#
)。
\startbuffer[xtable]
\startxtable
\startxrow
\startxcell
\startlines
First line
Second line
\stoplines
\stopxcell
\stopxrow
\startxrow
\startxcell
\type
{%
#}
\stopxcell
\stopxrow
\stopxtable
\stopbuffer
\startbuffer[embeddedxtable]
\startembeddedxtable
\startxrow
\startxcell
\startlines
First line
Second line
\stoplines
\stopxcell
\stopxrow
\startxrow
\startxcell
\type
{%
#}
\stopxcell
\stopxrow
\stopembeddedxtable
\stopbuffer
\starttext
\getbuffer[xtable]
\getbuffer[embeddedxtable]
\stoptext
这是输出xtable
这就是你从embeddedxtable