为什么当我使用 dvisvgm 将 Latex 编译为 SVG 时,“fi”会渲染为㐌?

为什么当我使用 dvisvgm 将 Latex 编译为 SVG 时,“fi”会渲染为㐌?

我想编译以下 Latex

\documentclass[preview]{standalone}
\nonstopmode
\begin{document}
  I want to write f i r s t  but this is the result: first
\end{document}

通过使用latex mylatex.tex->转换为 svg dvisvgm mylatex.dvi。但是在生成的 svg 中我得到了:

...
<tspan x='167.458'>result:</tspan>
<tspan x='198.988'>㐌rst</tspan>

我怀疑这与字符编码有关,所以我尝试添加,\usepackage[utf8]{inputenc}但没有成功。我不知道问题可能出在哪里,非常希望得到帮助。

答案1

您可以使用--no-fonts选项,dvisvgm这样它看起来就没问题了,尽管所有的文本都是 SVG 路径而不是真实文本。

答案2

使用 Firefox 38.0.5 进行测试确实给出了一个奇怪的结果,测试文件中包含不同的连字符和代码较小的字符:

\documentclass[preview]{standalone}
\begin{document}
  first flavored coffee --- in the office
\end{document}

生成的 SVG 文件包含奇怪的字符:

<?xml version='1.0'?>
<!-- This file was generated by dvisvgm 1.9.2 -->
<svg height='14.349pt' version='1.1' viewBox='0 -14.349 326.314 14.349' width='326.314pt' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'>
<defs>
<font horiz-adv-x='0' id='cmr17'>
<font-face ascent='749' descent='-250' font-family='cmr17' units-per-em='1000'/>
<glyph d='M631 146H613C604 100 601 88 596 72C591 57 588 49 530 49H449C460 107 484 150 526 217C578 302 621 371 621 454C621 589 493 699 334 699C171 699 46 588 46 454C46 371 90 300 139 221C183 150 207 107 218 49H137C80 49 77 57 72 71C66 87 64 100 54 146H36L65 0H216C237 0 238 1 238 16C238 87 201 180 184 223C152 301 122 377 122 455C122 604 229 683 333 683C442 683 545 601 545 455C545 378 518 309 481 218C465 177 429 86 429 16C429 0 430 0 451 0H602L631 146Z' glyph-name='Omega' horiz-adv-x='667' unicode='㐊' vert-adv-y='667'/>
<glyph d='M399 404H513V430H397V551C397 634 439 686 482 686C495 686 510 682 520 675C512 673 491 666 491 641C491 615 511 607 525 607S559 615 559 641C559 679 523 702 483 702C444 702 412 683 387 659C364 692 326 702 287 702C209 702 99 657 99 547V430H19V404H99V69C99 31 95 26 31 26V0C55 2 99 2 124 2C150 2 194 2 218 0V26C154 26 150 30 150 69V404H348V69C348 31 344 26 280 26V0C304 2 350 2 376 2C405 2 456 2 483 0V26C411 26 399 26 399 71V404ZM148 430V547C148 638 218 686 285 686C300 686 339 683 363 661C345 660 328 652 328 627C328 601 351 594 353 594C348 576 348 556 348 549V430H148Z' glyph-name='ff' horiz-adv-x='525' unicode='㐋' vert-adv-y='525'/>
<glyph d='M399 439C375 438 301 433 282 431C276 430 274 430 262 430H148V547C148 642 224 686 284 686C303 686 346 681 368 647C358 647 326 647 326 612C326 588 342 576 362 576C380 576 398 586 398 613C398 663 350 702 288 702C209 702 99 657 99 547V430H19V404H99V69C99 31 95 26 31 26V0C55 2 99 2 124 2C150 2 194 2 218 0V26C154 26 150 30 150 69V404H297C340 404 348 395 348 351V69C348 31 344 26 280 26V0C304 2 348 2 373 2C399 2 443 2 467 0V26C403 26 399 30 399 69V439Z' glyph-name='fi' horiz-adv-x='499' unicode='㐌' vert-adv-y='499'/>
<glyph d='M399 694C388 692 379 690 366 687C337 702 299 702 289 702C204 702 99 654 99 547V430H19V404H99V69C99 31 95 26 31 26V0C55 2 99 2 124 2C150 2 194 2 218 0V26C154 26 150 30 150 69V404H348V69C348 31 344 26 280 26V0C304 2 348 2 373 2C399 2 443 2 467 0V26C403 26 399 30 399 69V694ZM148 430V547C148 635 214 686 287 686C292 686 347 684 347 674C347 673 346 672 341 667C332 661 328 651 328 641C328 627 335 615 348 610V430H148Z' glyph-name='fl' horiz-adv-x='499' unicode='㐍' vert-adv-y='499'/>
<glyph d='M649 439C625 438 551 433 532 431C526 430 524 430 512 430H398V547C398 642 474 686 534 686C553 686 596 681 618 647C608 647 576 647 576 612C576 588 592 576 612 576C630 576 648 586 648 613C648 663 600 702 538 702C507 702 442 695 390 646C377 672 344 702 287 702C210 702 99 657 99 547V430H19V404H99V69C99 31 95 26 31 26V0C55 2 99 2 124 2C150 2 194 2 218 0V26C154 26 150 30 150 69V404H349V69C349 31 345 26 281 26V0C305 2 349 2 374 2C400 2 444 2 468 0V26C404 26 400 30 400 69V404H547C590 404 598 395 598 351V69C598 31 594 26 530 26V0C554 2 598 2 623 2C649 2 693 2 717 0V26C653 26 649 30 649 69V439ZM148 430V547C148 641 222 686 284 686C319 686 353 671 368 647C358 647 325 647 325 612C325 594 335 582 351 577C349 568 349 548 349 547V430H148Z' glyph-name='ffi' horiz-adv-x='748' unicode='㐎' vert-adv-y='748'/>
<glyph d='M363 691C358 704 356 707 346 707S334 704 329 691L117 91C98 37 58 26 23 26V0C41 2 81 2 100 2C125 2 165 2 189 0V26C142 28 135 60 135 72C135 81 137 86 139 92L192 241H454L514 71C519 59 519 57 519 53C519 26 476 26 457 26V0C486 2 538 2 569 2C595 2 645 2 669 0V26C616 26 598 26 585 63L363 691ZM323 611L445 267H201L323 611Z' glyph-name='A' horiz-adv-x='693' unicode='A' vert-adv-y='693'/>
<glyph d='M360 259C360 325 360 360 318 399C281 432 238 442 204 442C125 442 68 380 68 314C68 277 98 275 104 275C117 275 140 283 140 311C140 336 121 347 104 347C100 347 95 346 92 345C113 408 167 426 202 426C252 426 307 382 307 298V254C248 252 177 244 121 214C58 179 40 129 40 91C40 14 130 -8 183 -8C238 -8 289 23 311 80C313 36 341 -4 385 -4C406 -4 459 10 459 89V145H441V88C441 27 414 19 401 19C360 19 360 71 360 115V259ZM307 139C307 52 245 8 190 8C140 8 101 45 101 91C101 121 114 174 172 206C220 233 275 237 307 239V139Z' glyph-name='a' horiz-adv-x='458' unicode='a' vert-adv-y='458'/>
<glyph d='M349 350C330 350 302 350 302 315C302 287 325 279 338 279C345 279 374 282 374 317C374 388 306 442 229 442C123 442 33 344 33 216C33 83 127 -8 229 -8C353 -8 384 107 384 118C384 122 383 125 376 125S368 124 364 111C338 30 281 10 238 10C174 10 97 69 97 217C97 369 171 424 230 424C269 424 327 405 349 350Z' glyph-name='c' horiz-adv-x='406' unicode='c' vert-adv-y='406'/>
<glyph d='M292 683V657C351 657 360 651 360 603V369C356 374 315 438 234 438C132 438 33 347 33 215C33 84 126 -8 224 -8C309 -8 353 58 358 65V-8L479 0V26C420 26 411 32 411 80V694L292 683ZM358 120C358 90 340 63 317 43C283 13 249 8 230 8C201 8 97 23 97 214C97 410 213 422 239 422C285 422 322 396 345 360C358 339 358 336 358 318V120Z' glyph-name='d' horiz-adv-x='510' unicode='d' vert-adv-y='510'/>
<glyph d='M381 235C385 239 385 241 385 251C385 353 331 442 217 442C111 442 27 341 27 218C27 88 122 -8 228 -8C340 -8 384 98 384 119C384 126 378 126 376 126C369 126 368 124 364 112C342 44 287 10 235 10C192 10 149 34 122 78C91 129 91 188 91 235H381ZM92 250C99 394 176 426 216 426C284 426 330 362 331 250H92Z' glyph-name='e' horiz-adv-x='406' unicode='e' vert-adv-y='406'/>
<glyph d='M415 304C415 355 405 438 287 438C205 438 165 372 153 339H152V694L33 683V657C92 657 101 651 101 603V69C101 31 97 26 33 26V0C57 2 101 2 127 2S198 2 222 0V26C158 26 154 30 154 69V261C154 353 210 422 280 422C354 422 362 356 362 308V69C362 31 358 26 294 26V0C318 2 362 2 388 2S459 2 483 0V26C419 26 415 30 415 69V304Z' glyph-name='h' horiz-adv-x='510' unicode='h' vert-adv-y='510'/>
<glyph d='M155 616C155 638 137 657 114 657C92 657 73 639 73 616C73 594 91 575 114 575C136 575 155 593 155 616ZM38 427V401C94 401 102 395 102 347V69C102 31 98 26 34 26V0C58 2 101 2 126 2C150 2 191 2 214 0V26C155 26 153 32 153 68V438L38 427Z' glyph-name='i' horiz-adv-x='249' unicode='i' vert-adv-y='249'/>
<glyph d='M415 304C415 355 405 438 287 438C208 438 167 377 152 337H151V438L33 427V401C92 401 101 395 101 347V69C101 31 97 26 33 26V0C57 2 101 2 127 2S198 2 222 0V26C158 26 154 30 154 69V261C154 353 210 422 280 422C354 422 362 356 362 308V69C362 31 358 26 294 26V0C318 2 362 2 388 2S459 2 483 0V26C419 26 415 30 415 69V304Z' glyph-name='n' horiz-adv-x='510' unicode='n' vert-adv-y='510'/>
<glyph d='M431 214C431 342 338 442 229 442S27 342 27 214C27 88 120 -8 229 -8S431 88 431 214ZM229 10C182 10 142 38 119 77C94 122 91 178 91 222C91 264 93 316 119 361C139 394 178 426 229 426C274 426 312 401 336 366C367 319 367 253 367 222C367 183 365 123 338 75C310 29 267 10 229 10Z' glyph-name='o' horiz-adv-x='458' unicode='o' vert-adv-y='458'/>
<glyph d='M150 236C150 332 191 422 266 422C273 422 280 421 287 418C287 418 265 411 265 385C265 361 284 351 299 351C311 351 333 358 333 386C333 418 301 438 267 438C191 438 158 364 148 329H147V438L31 427V401C90 401 99 395 99 347V69C99 31 95 26 31 26V0C55 2 101 2 127 2C156 2 207 2 234 0V26C162 26 150 26 150 71V236Z' glyph-name='r' horiz-adv-x='354' unicode='r' vert-adv-y='354'/>
<glyph d='M309 422C309 440 308 441 302 441C298 441 297 440 285 425C282 421 273 411 270 407C238 441 193 442 176 442C65 442 25 384 25 326C25 236 127 215 156 209C219 196 241 192 262 174C275 162 297 140 297 104C297 62 273 8 181 8C94 8 63 74 45 162C42 176 42 177 34 177S25 176 25 156V12C25 -6 26 -7 32 -7C37 -7 38 -6 43 2C49 11 64 35 70 45C90 18 125 -8 181 -8C280 -8 333 46 333 124C333 175 306 202 293 214C263 245 228 252 186 260C131 272 61 286 61 347C61 373 75 428 176 428C283 428 289 328 291 296C292 291 297 290 300 290C309 290 309 293 309 310V422Z' glyph-name='s' horiz-adv-x='359' unicode='s' vert-adv-y='359'/>
<glyph d='M151 404H291V430H151V615H133C131 512 96 422 11 420V404H98V123C98 104 98 -8 214 -8C273 -8 307 50 307 124V181H289V125C289 56 262 10 220 10C191 10 151 30 151 121V404Z' glyph-name='t' horiz-adv-x='354' unicode='t' vert-adv-y='354'/>
<glyph d='M391 340C400 362 416 402 474 404V430C455 429 430 428 411 428C390 428 357 428 337 430V404C362 402 376 390 376 364C376 355 376 353 370 339L260 61L141 361C135 374 135 376 135 380C135 404 168 404 183 404V430C159 428 115 428 90 428C63 428 32 428 10 430V404C48 404 69 404 81 373L226 9C232 -6 233 -8 242 -8S252 -6 258 9L391 340Z' glyph-name='v' horiz-adv-x='484' unicode='v' vert-adv-y='484'/>
<glyph d='M464 258V274H-6V258H464Z' glyph-name='endash' horiz-adv-x='458' unicode='–' vert-adv-y='458'/>
<glyph d='M928 258V274H-12V258H928Z' glyph-name='emdash' horiz-adv-x='917' unicode='—' vert-adv-y='917'/>
</font>
</defs>
<style type='text/css'><![CDATA[
text.f0 {font-family:cmr17;font-size:20.6625px}
]]>
</style>
<g id='page1'>
<text class='f0' x='0' y='0'>㐌rst<tspan x='38.493'>㐍a</tspan>
<tspan x='57.672'>v</tspan>
<tspan x='67.1108'>ored</tspan>
<tspan x='108.961'>co㐋ee</tspan>
<tspan x='160.551'>—</tspan>
<tspan x='185.671'>in</tspan>
<tspan x='207.564'>the</tspan>
<tspan x='239.973'>o㐎ce</tspan>
<tspan x='287.799'>A–㐊</tspan>
</text>
</g>
</svg>

至少,这些字符与字形描述的键是一致的unicode

作为参考,TeX 文件的 PDF 版本(由 生成pdflatex):

结果 pdflatex

但结果取决于 SVG 查看器:

  • Firefox 38.0.5 似乎根本不使用 SVG 文件的字形:

    结果 Firefox

    字形的形状和间距非常错误。

  • Chromium 37 实际上使用了 SVG 文件的字形描述:

    结果铬

  • Batik 1.8 也能正确栅格化:

    java -jar batik-rasterizer.jar -dpi 300 test.svg
    

    结果蜡染

主要问题是 Firefox,它不使用字体,请参阅

更深入的分析

cmr10与 Unicode 数字中的插槽位置的比较:

Omega cmr10/10 U+340A
ff    cmr10/11 U+340B
fi    cmr10/12 U+340C
...

因此dvisvgm似乎将 0x3400 添加到插槽位置。

可以编写一个程序,使用字形的glyph-nameunicode属性替换 SVG 文件中错误的 Unicode 字符。并替换文本元素中的字符,例如:

fi带有 和 的连字符glyph-name='fi'的字形unicode='㐌'可以用 (U+FB01) 替换unicode='fi'。这还修复了复制和粘贴行为。

解决错误连字符的解决方法:

(旧版答案)

  • 经典的连字符断开方法,例如:f\kern0pt irstf{}irst(但是,当使用连字符时,{}可以消失)。

  • pdfTeX\pdfnoligatures也可以在 DVI 模式下工作:

    \pdfnoligatures\font
    I want to write f i r s t  but this is the result: first
    

但它不能解决其他字符代码较低的字符的问题,参见字母 Ω,它位于连字符 ff 之前的第 10 位。

答案3

我不确定你的问题是什么。但我认为如果你只是想要一个快速而粗糙的解决方案,你可以在和{}之间放置一个,即。fif{}irst

相关内容