DVI 具有每个字符的明确定位

DVI 具有每个字符的明确定位

我遇到了一个专有软件 (Matlab) 的问题,该软件在内部使用 LaTeX 解释器,然后渲染生成的 dvi 文件。问题是渲染部分没有使用正确的字体度量。渲染包含正确的符号,但它们不在正确的位置,因为它们是根据错误的度量定位的。我可以影响生成 dvi 的部分,但不能影响渲染部分。

我的想法是通过使用 dvi 明确定位每个字符来规避此问题。我可以使用奇怪的 LaTeX 代码大致实现这一点。例如

$E = m c^2$

导致显示错误,基本上将所有字符都堆放在同一个位置(渲染器使用的字体宽度指标太小)。使用

$\mbox{E} \mbox{=} \mbox{m} \mbox{c}^2$

导致大致正确的显示,大概是因为生成的 dvi 明确编码了每个 mbox 的宽度,从而明确编码了每个符号的宽度。另一个示例:

$\hat D_s$

正确呈现了带有帽子的 D,但下标 s 显示在 D 的顶部,而不是后面。我可以使用相同的技巧再次修复此问题:

$\hat{\mbox{D}}_s$

顺便说一句,这个问题不仅适用于数学模式,它正是我一直在具体研究的问题。

我的问题:有没有办法让 (La)TeX 生成一个 dvi 文件,以我通过插入 es 近似的方式明确定位每个符号\mbox?或者有没有办法将 dvi 文件后处理为另一个包含此类明确定位信息的 dvi 文件?

答案1

的文档dvitype包含第节中 DVI 格式的描述“与设备无关的文件格式”.dvitype还可以用于分析 DVI 文件。

例子:

\documentclass{article}
\pagestyle{empty}
\begin{document}
  $E = m c^2$
\end{document}

“mc” 设置方式如下(摘自dvitype):

169: fntnum10 current font is cmmi10 
170: setchar109 h:=6441634+575415=7017049, hh:=444 
171: setchar99 h:=7017049+283611=7300660, hh:=462 
[mc]

DVI 处理器设置m(字符代码 109),查找字体度量以cmmi10获取字符的宽度并输出下一个字符c(字符代码 99)。

\mbox{$m$}\mbox{$c$}创建:

110: push 
level 3:(h=0,v=4128768,w=0,x=0,y=0,z=0,hh=0,vv=262) 
111: right3 5046272 h:=0+5046272=5046272, hh:=320 
[ ]
115: fntdef1 10: cmmi10 
137: fntnum10 current font is cmmi10 
138: setchar109 h:=5046272+575415=5621687, hh:=356 
[m]
139: pop 
level 3:(h=0,v=4128768,w=0,x=0,y=0,z=0,hh=0,vv=262) 
140: push 
level 3:(h=0,v=4128768,w=0,x=0,y=0,z=0,hh=0,vv=262) 
141: right3 5621687 h:=0+5621687=5621687, hh:=356 
145: setchar99 h:=5621687+283611=5905298, hh:=374 
[ c]
146: pop 

现在的位置保存字符 ( push),使用 定位字符right3,然后恢复原位置pop。这样,就无需查阅字体度量来获取字符的宽度。

如果您想在 DVI 阶段解决问题,请编写一个后处理器,读取和解析 DVI 文件,在字体度量的帮助下计算字符的正确位置,然后使用定位方法重写文件,而无需字体度量,请参见上文。

另一方面,据我所知,Matlab 是一款商业软件。如果你已经购买了它,请投诉并提交错误报告。

相关内容