我遇到了一个专有软件 (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 是一款商业软件。如果你已经购买了它,请投诉并提交错误报告。