为什么 dvisvgm 对于某些涉及分数和某些字体的表达式会产生错误的 svg 代码?

为什么 dvisvgm 对于某些涉及分数和某些字体的表达式会产生错误的 svg 代码?

我想寻求帮助,弄清楚究竟是什么引发了有关使用某些字体渲染文本样式分数的奇怪现象韋斯維爾(版本 2.6.3,作为 Arch Linux 上 texlive-bin 2019.51075-3 包的一部分分发)。

(我在玩动画库时偶然发现了这一点马尼姆,它通过在 LaTeX 中运行公式,然后使用 dvisvgm 将 dvi 转换为 svg 来呈现公式。)

这是一个非常简单的例子,造成了麻烦,svg测试.tex

\documentclass[preview]{standalone}
\usepackage{fourier}
\begin{document}
$y = \sin \frac{1}{x}$
\end{document}

处理这个

latex svgtest.tex; dvisvgm svgtest.dvi -n -o svgtest.svg

生成以下文件,svg测试.svg

<?xml version='1.0' encoding='UTF-8'?>
<!-- This file was generated by dvisvgm 2.6.3 -->
<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='33.871205pt' height='12.091864pt' viewBox='0.498134 -8.571499 33.871205 12.091864'>
<defs>
<path id='g3-49' d='M3.990416 0V-0.26481L3.22338 -0.32873C3.03162 -0.346993 2.922044 -0.420044 2.922044 -0.776168V-6.154555L2.876387 -6.209343L0.995321 -5.889745V-5.66146L1.84454 -5.561015C1.999774 -5.542752 2.063693 -5.469701 2.063693 -5.204891V-0.776168C2.063693 -0.602672 2.036299 -0.493095 1.981511 -0.429175C1.935854 -0.365255 1.862803 -0.337861 1.762358 -0.32873L0.995321 -0.26481V0H3.990416Z'/>
<path id='g1-198' d='M5.798431 -1.305788V-1.835409H0.776168V-1.305788H5.798431ZM5.798431 -3.314693V-3.844314H0.776168V-3.314693H5.798431Z'/>
<path id='g8-120' d='M3.518509 -0.957701C3.351952 -0.645407 3.164576 -0.277594 2.97026 -0.277594C2.838403 -0.277594 2.782884 -0.437211 2.630207 -1.054859L2.408131 -1.96398C2.657966 -2.408131 3.011899 -2.96332 3.213155 -2.96332C3.275614 -2.96332 3.331133 -2.94944 3.407471 -2.907801C3.47687 -2.880042 3.546268 -2.852282 3.629547 -2.852282C3.782224 -2.852282 3.927961 -2.998019 3.927961 -3.185396C3.927961 -3.400531 3.768344 -3.48381 3.574028 -3.48381C3.206215 -3.48381 2.893921 -3.150696 2.651026 -2.762064L2.345673 -2.290154H2.331793L2.054198 -3.45605L2.012559 -3.48381L0.867482 -3.136817L0.888302 -2.97026L1.408792 -3.004959C1.533709 -3.011899 1.582288 -2.9772 1.658626 -2.657966L1.908461 -1.651687L1.714145 -1.318573C1.415731 -0.811964 1.158957 -0.451091 0.9924 -0.451091C0.923001 -0.451091 0.853603 -0.47885 0.791144 -0.51355C0.721745 -0.548249 0.631527 -0.617648 0.51355 -0.617648C0.333113 -0.617648 0.215136 -0.437211 0.215136 -0.270655C0.215136 -0.069399 0.381692 0.083278 0.659287 0.083278C1.131197 0.083278 1.401852 -0.388632 1.686386 -0.853603L1.96398 -1.311633H1.97786L2.102777 -0.770324C2.234635 -0.215136 2.366492 0.083278 2.720425 0.083278C3.227035 0.083278 3.490749 -0.437211 3.698945 -0.860543L3.518509 -0.957701Z'/>
<use id='g13-121' xlink:href='#g8-121' transform='scale(1.315788)'/>
<use id='g18-105' xlink:href='#g3-105'/>
<use id='g18-110' xlink:href='#g3-110'/>
<use id='g18-115' xlink:href='#g3-115'/>
<use id='g15-49' xlink:href='#g3-49' transform='scale(0.760001)'/>
</defs>
<g id='page1'>
<use x='0.498134' y='0' xlink:href='#g13-121'/>
<use x='7.333545' y='0' xlink:href='#g1-198'/>
<use x='15.633477' y='0' xlink:href='#g18-115'/>
<use x='19.628496' y='0' xlink:href='#g18-105'/>
<use x='22.29848' y='0' xlink:href='#g18-110'/>
<use x='30.405611' y='-3.925267' xlink:href='#g15-49'/>
<rect x='30.136829' y='-2.846123' height='0.531591' width='4.232511'/>
<use x='30.288264' y='3.437093' xlink:href='#g8-120'/>
</g>
</svg>

在我测试过的每个程序(Firefox、Inkscape、Emacs)中,此 svg 的呈现方式如下:

SVG 渲染错误

查看 svg 代码,例如,我们看到“page1”组中的第一个 <use> 标签(应该是“y”字符)引用元素 g13-121,而前几行引用元素 g8-121,该元素未在任何地方定义,因此毫不奇怪图片中只有空格而不是“y”。

将此与使用默认 Computer Modern 字体的相同示例进行对比,其工作方式符合预期:

\documentclass[preview]{standalone}
\begin{document}
$y = \sin \frac{1}{x}$
\end{document}
latex svgtest.tex; dvisvgm svgtest.dvi -n -o svgtest.svg
<?xml version='1.0' encoding='UTF-8'?>
<!-- This file was generated by dvisvgm 2.6.3 -->
<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='38.131002pt' height='11.852377pt' viewBox='0 -8.416865 38.131002 11.852377'>
<defs>
<path id='g0-121' d='M4.841843 -3.795766C4.881694 -3.935243 4.881694 -3.955168 4.881694 -4.024907C4.881694 -4.204234 4.742217 -4.293898 4.592777 -4.293898C4.493151 -4.293898 4.333748 -4.234122 4.244085 -4.084682C4.224159 -4.034869 4.144458 -3.726027 4.104608 -3.5467C4.034869 -3.287671 3.965131 -3.01868 3.905355 -2.749689L3.457036 -0.956413C3.417186 -0.806974 2.988792 -0.109589 2.331258 -0.109589C1.823163 -0.109589 1.713574 -0.547945 1.713574 -0.916563C1.713574 -1.374844 1.882939 -1.992528 2.221669 -2.86924C2.381071 -3.277709 2.420922 -3.387298 2.420922 -3.58655C2.420922 -4.034869 2.102117 -4.403487 1.603985 -4.403487C0.657534 -4.403487 0.288917 -2.958904 0.288917 -2.86924C0.288917 -2.769614 0.388543 -2.769614 0.408468 -2.769614C0.508095 -2.769614 0.518057 -2.789539 0.56787 -2.948941C0.836862 -3.88543 1.235367 -4.184309 1.574097 -4.184309C1.653798 -4.184309 1.823163 -4.184309 1.823163 -3.865504C1.823163 -3.616438 1.723537 -3.35741 1.653798 -3.16812C1.255293 -2.11208 1.075965 -1.544209 1.075965 -1.075965C1.075965 -0.18929 1.703611 0.109589 2.291407 0.109589C2.67995 0.109589 3.01868 -0.059776 3.297634 -0.33873C3.16812 0.179328 3.048568 0.667497 2.650062 1.195517C2.391034 1.534247 2.012453 1.823163 1.554172 1.823163C1.414695 1.823163 0.966376 1.793275 0.797011 1.404732C0.956413 1.404732 1.085928 1.404732 1.225405 1.285181C1.325031 1.195517 1.424658 1.066002 1.424658 0.876712C1.424658 0.56787 1.155666 0.52802 1.05604 0.52802C0.826899 0.52802 0.498132 0.687422 0.498132 1.175592C0.498132 1.673724 0.936488 2.042341 1.554172 2.042341C2.580324 2.042341 3.606476 1.135741 3.88543 0.009963L4.841843 -3.795766Z'/>
<path id='g1-120' d='M1.736488 -0.739228C1.66675 -0.502117 1.436613 -0.125529 1.080946 -0.125529C1.060025 -0.125529 0.850809 -0.125529 0.704359 -0.223163C0.990286 -0.313823 1.011208 -0.564882 1.011208 -0.606725C1.011208 -0.760149 0.892653 -0.864757 0.732254 -0.864757C0.536986 -0.864757 0.334745 -0.697385 0.334745 -0.439352C0.334745 -0.09066 0.72528 0.069738 1.066999 0.069738C1.387796 0.069738 1.673724 -0.132503 1.84807 -0.425405C2.015442 -0.055791 2.399004 0.069738 2.677958 0.069738C3.47995 0.069738 3.905355 -0.801993 3.905355 -0.99726C3.905355 -1.08792 3.814695 -1.08792 3.793773 -1.08792C3.696139 -1.08792 3.689166 -1.053051 3.66127 -0.969365C3.514819 -0.488169 3.096389 -0.125529 2.705853 -0.125529C2.426899 -0.125529 2.280448 -0.313823 2.280448 -0.578829C2.280448 -0.760149 2.447821 -1.39477 2.643088 -2.168867C2.782565 -2.705853 3.096389 -2.880199 3.326526 -2.880199C3.340473 -2.880199 3.556663 -2.880199 3.703113 -2.782565C3.47995 -2.719801 3.396264 -2.524533 3.396264 -2.399004C3.396264 -2.245579 3.514819 -2.140971 3.675218 -2.140971S4.065753 -2.273474 4.065753 -2.566376C4.065753 -2.956912 3.619427 -3.075467 3.340473 -3.075467C2.991781 -3.075467 2.712827 -2.84533 2.559402 -2.580324C2.433873 -2.866252 2.113076 -3.075467 1.72254 -3.075467C0.941469 -3.075467 0.495143 -2.217684 0.495143 -2.008468C0.495143 -1.917808 0.592777 -1.917808 0.613699 -1.917808C0.704359 -1.917808 0.711333 -1.945704 0.746202 -2.036364C0.920548 -2.580324 1.3599 -2.880199 1.701619 -2.880199C1.931756 -2.880199 2.12005 -2.75467 2.12005 -2.419925C2.12005 -2.280448 2.036364 -1.931756 1.973599 -1.694645L1.736488 -0.739228Z'/>
<path id='g3-49' d='M2.336239 -4.435367C2.336239 -4.623661 2.322291 -4.630635 2.127024 -4.630635C1.680697 -4.191283 1.046077 -4.184309 0.760149 -4.184309V-3.93325C0.927522 -3.93325 1.387796 -3.93325 1.771357 -4.128518V-0.571856C1.771357 -0.341719 1.771357 -0.251059 1.073973 -0.251059H0.808966V0C0.934496 -0.006974 1.792279 -0.027895 2.050311 -0.027895C2.266501 -0.027895 3.145205 -0.006974 3.29863 0V-0.251059H3.033624C2.336239 -0.251059 2.336239 -0.341719 2.336239 -0.571856V-4.435367Z'/>
<path id='g2-61' d='M6.844334 -3.257783C6.993773 -3.257783 7.183064 -3.257783 7.183064 -3.457036S6.993773 -3.656289 6.854296 -3.656289H0.886675C0.747198 -3.656289 0.557908 -3.656289 0.557908 -3.457036S0.747198 -3.257783 0.896638 -3.257783H6.844334ZM6.854296 -1.325031C6.993773 -1.325031 7.183064 -1.325031 7.183064 -1.524284S6.993773 -1.723537 6.844334 -1.723537H0.896638C0.747198 -1.723537 0.557908 -1.723537 0.557908 -1.524284S0.747198 -1.325031 0.886675 -1.325031H6.854296Z'/>
<path id='g2-105' d='M1.763387 -4.403487L0.368618 -4.293898V-3.985056C1.016189 -3.985056 1.105853 -3.92528 1.105853 -3.437111V-0.757161C1.105853 -0.308842 0.996264 -0.308842 0.328767 -0.308842V0C0.647572 -0.009963 1.185554 -0.029888 1.424658 -0.029888C1.77335 -0.029888 2.122042 -0.009963 2.460772 0V-0.308842C1.803238 -0.308842 1.763387 -0.358655 1.763387 -0.747198V-4.403487ZM1.803238 -6.136986C1.803238 -6.455791 1.554172 -6.665006 1.275218 -6.665006C0.966376 -6.665006 0.747198 -6.396015 0.747198 -6.136986C0.747198 -5.867995 0.966376 -5.608966 1.275218 -5.608966C1.554172 -5.608966 1.803238 -5.818182 1.803238 -6.136986Z'/>
<path id='g2-110' d='M1.09589 -3.427148V-0.757161C1.09589 -0.308842 0.986301 -0.308842 0.318804 -0.308842V0C0.667497 -0.009963 1.175592 -0.029888 1.444583 -0.029888C1.703611 -0.029888 2.221669 -0.009963 2.560399 0V-0.308842C1.892902 -0.308842 1.783313 -0.308842 1.783313 -0.757161V-2.590286C1.783313 -3.626401 2.49066 -4.184309 3.128269 -4.184309C3.755915 -4.184309 3.865504 -3.646326 3.865504 -3.078456V-0.757161C3.865504 -0.308842 3.755915 -0.308842 3.088418 -0.308842V0C3.437111 -0.009963 3.945205 -0.029888 4.214197 -0.029888C4.473225 -0.029888 4.991283 -0.009963 5.330012 0V-0.308842C4.811955 -0.308842 4.562889 -0.308842 4.552927 -0.607721V-2.510585C4.552927 -3.367372 4.552927 -3.676214 4.244085 -4.034869C4.104608 -4.204234 3.775841 -4.403487 3.198007 -4.403487C2.470735 -4.403487 2.002491 -3.975093 1.723537 -3.35741V-4.403487L0.318804 -4.293898V-3.985056C1.016189 -3.985056 1.09589 -3.915318 1.09589 -3.427148Z'/>
<path id='g2-115' d='M2.072229 -1.932752C2.291407 -1.892902 3.108344 -1.733499 3.108344 -1.016189C3.108344 -0.508095 2.759651 -0.109589 1.982565 -0.109589C1.145704 -0.109589 0.787049 -0.67746 0.597758 -1.524284C0.56787 -1.653798 0.557908 -1.693649 0.458281 -1.693649C0.328767 -1.693649 0.328767 -1.62391 0.328767 -1.444583V-0.129514C0.328767 0.039851 0.328767 0.109589 0.438356 0.109589C0.488169 0.109589 0.498132 0.099626 0.687422 -0.089664C0.707347 -0.109589 0.707347 -0.129514 0.886675 -0.318804C1.325031 0.099626 1.77335 0.109589 1.982565 0.109589C3.128269 0.109589 3.58655 -0.557908 3.58655 -1.275218C3.58655 -1.803238 3.287671 -2.102117 3.16812 -2.221669C2.839352 -2.540473 2.450809 -2.620174 2.032379 -2.699875C1.474471 -2.809465 0.806974 -2.938979 0.806974 -3.516812C0.806974 -3.865504 1.066002 -4.273973 1.92279 -4.273973C3.01868 -4.273973 3.068493 -3.377335 3.088418 -3.068493C3.098381 -2.978829 3.188045 -2.978829 3.20797 -2.978829C3.337484 -2.978829 3.337484 -3.028643 3.337484 -3.217933V-4.224159C3.337484 -4.393524 3.337484 -4.463263 3.227895 -4.463263C3.178082 -4.463263 3.158157 -4.463263 3.028643 -4.343711C2.998755 -4.303861 2.899128 -4.214197 2.859278 -4.184309C2.480697 -4.463263 2.072229 -4.463263 1.92279 -4.463263C0.707347 -4.463263 0.328767 -3.795766 0.328767 -3.237858C0.328767 -2.889166 0.488169 -2.610212 0.757161 -2.391034C1.075965 -2.132005 1.354919 -2.072229 2.072229 -1.932752Z'/>
</defs>
<g id='page1'>
<use x='0' y='0' xlink:href='#g0-121'/>
<use x='8.009276' y='0' xlink:href='#g2-61'/>
<use x='18.525356' y='0' xlink:href='#g2-115'/>
<use x='22.455073' y='0' xlink:href='#g2-105'/>
<use x='25.222482' y='0' xlink:href='#g2-110'/>
<use x='33.886483' y='-3.922607' xlink:href='#g3-49'/>
<rect x='33.613201' y='-2.68991' height='0.398484' width='4.517787'/>
<use x='33.613201' y='3.435512' xlink:href='#g1-120'/>
</g>
</svg>

正确的 svg 渲染

但接下来才是真正奇怪的部分。回到傅里叶字体,以下所有公式按预期工作(一次一个,但为了简单起见,我在这里将它们全部放在一个示例中):

\documentclass[preview]{standalone}
\usepackage{fourier}
\begin{document}
$$y = \sin \frac{1}{x}$$
$y = \frac{1}{x}$
$y = \sin \frac{z}{x}$
$y = \sin \left( \frac{1}{x} \right)$
\end{document}

但是这个不起作用(结果看起来很像上面的第一个例子):

\documentclass[preview]{standalone}
\usepackage{fourier}
\begin{document}
$y = \sin ( \frac{1}{x} )$
\end{document}

\usepackage{mathpazo}

结果与 Fourier 相同。另一方面,

\usepackage{newtxmath}

一切都按预期运行,就像 Computer Modern 一样。

所有 dvi 文件都可以用 xdvi、dvips、dvipng 等格式显示,但显然 dvi 文件中有一些

$y = \sin \frac{1}{x}$

$y = \sin ( \frac{1}{x} )$

使用 fourier 和 mathpazo 包,它与其他所有示例都不同,从而触发了 dvisvgm 中的这种奇怪行为(错误?)。由于 dvi 是二进制格式,我无法准确解释这个神秘属性是什么,但也许一些 TeX 专家可以提供帮助?

答案1

经过进一步调查,我终于找到了字符缺失的原因。与我在评论中提到的相反,我现在能够使用 dvisvgm 2.6.3 重现该问题,并且可以对变更集进行二分。这实际上是 dvisvgm 中的一个错误,已经已报告但直到现在,这种情况才偶尔发生,并且只出现在多页 DVI 文件中。几个月前我在 2.7.3 版本中修复了这个问题。因此,遗憾的是,除了等待更新的版本,您无能为力。

相关内容