我尝试在 LaTeX 中计算边界框,并通过 DVI 特效将值传递给 dvisvgm。生成的代码(我从互联网上复制粘贴过来)如下所示:
\newlength{\mywidth}
\newlength{\myheight}
% ...
\special{dvisvgm:bbox a 0 0 \the\mywidth \the\myheight}
这导致(事后可以预见)DVI文件中出现以下输出:
dvisvgm:bbox a 0 0 147.00748pt26.3999pt
经过大量的谷歌搜索后,我想出了以下解决方法:
\newtoks\spacetoken
\spacetoken={ }
\special{dvisvgm:bbox a 0 0 \the\mywidth\the\spacetoken\the\myheight}
然而,在我看来,这看起来非常不对劲。因此,我的问题是:
- 怎么
\special
運作? - 有没有更好的方法可以做到这一点?
答案1
\special
就像\write
:它扩展其参数直到找到不可扩展的标记,然后将结果写入 DVI 文件。
由于\the\mywidth \the\myheight
没有空格(由于它遵循控制序列,因此在标记化过程中会忽略明显的空格),结果就是您发现的。
不过,还有一个更简单的解决方案:
\the\mywidth\space\the\myheight
因为的扩展\space
恰好是一个空间标记。
正如 Joseph Wright 在评论中所说,TeX 对 的参数中包含的内容不承担任何责任\special
:只要它是“完全可扩展的”并且相对于大括号是平衡的,它可以是任何东西,并且打印机/预览器驱动程序的工作就是对其进行解释。