怎么用texstudio输出_一个texstudio的小问题:文字无法显示

这是一个macOS下才会可能触发出来的问题。

测试版本:https://github.com/texstudio-org/texstudio/releases/download/2.12.16/texstudio-2.12.16-osx.dmg。

触发bug的最小的一个例子如下:

documentclass{article}
usepackage{zhlipsum}
usepackage{xeCJK}
setCJKmainfont{FandolSong-Regular.otf}
begin{document}
zhlipsum
end{document}

正常的编译后,使用texstudio默认的预览器看,会发现页面几乎是空白一片的。(理论上,你要用CFF格式的OTF字体,就有可能碰到这个问题)

实际上,从命令行上执行:

./texstudio.app/Contents/MacOS/texstudio

在terminal上就会出现大量的报错,如下:

"Error: Missing language pack for 'Adobe-GB1' mapping"
"Error: Unknown font tag 'F1'"
"Error (298): No font in show/space"
"Error (412): No font in show/space"
"Error (513): No font in show/space"
"Error (605): No font in show/space"
"Error (699): No font in show/space"
"Error (785): No font in show/space"
"Error (887): No font in show/space"
"Error (976): No font in show/space"

从这些个内容上看,我才知道这是缺乏cmap文件导致的。

这种问题,很可能第一次用linux的用户都碰到过。最终的大概解决方案,就是通过安装poppler-data包来解决的。

所以我猜测是poppler的问题,接下来做了一顶的排查。首先texstudio的可执行文件是在homebrew的环境下编译的,所以我做了一下字符串相关的检查:

strings texstudio.app/Contents/Frameworks/libpoppler.85.dyli | grep Cellar

得到的结果:

/usr/local/Cellar/poppler/0.74.0-texworks/share/poppler/ColorProfiles/
/usr/local/Cellar/poppler/0.74.0-texworks/share/poppler

后一个其实就是poppler读取cmap文件等相关运行时数据的路径。

所以,在得到这些分析后,解决办法很简单( @慕子 的解决方案,更新内容可见评论):

brew install poppler
ln -s /usr/local/Cellar/poppler/0.80.0 /usr/local/Cellar/poppler/0.74.0-texworks

其实还有两个解决的方案。

第一个,就是自行编译poppler,将config.h内的POPPLER_DATADIR修改了之后编译了再把texstudio内的相关库给替换了。我在我自己的macbook上就自行编译了一套poppler。至于texstudio,只要装了qt的环境,直接加到PATH里面折腾一下qmake就能编译出来了。

第二个,还是自行编译,但是要在poppler/http://GlobalParams.cc加些补丁函数,大致的代码如下:

static const char *
get_poppler_datadir(void)
{
    char * final_poppler_datadir = nullptr;
    Dl_info info;

    if (dladdr((void *) get_poppler_datadir, &info)) {
        const char * l = info.dli_fname;
        const char * t = strstr(l, "Frameworks/");

        if (t != nullptr) {
            final_poppler_datadir = new char[(t-l)+24];
            sprintf(final_poppler_datadir, "%.*sResources/share/poppler", (int)(t - l), l);
            printf("POPPLER_DATADIR: %sn", final_poppler_datadir);
        }
    }

    if (final_poppler_datadir != nullptr)
        return final_poppler_datadir;
    else
        return POPPLER_DATADIR;
}

#undef POPPLER_DATADIR
#define POPPLER_DATADIR get_poppler_datadir ()

这段代码的含义,就是在texstudio.app内的Resources文件夹下面寻找poppler-data。动态库编译好了替换了之后,把poppler-data也放在相应位置就能解决问题了。


poppler的这个问题也是老生常谈了,代码和运行时数据分离,其实算不上大问题。但问题是一旦涉及到多平台,分发了之后就会出现问题。这问题,七八年前就能碰见,预计以后也照样会遇到。

实际上,如果是用了MuPDF,甚至是pdfium之类的东西,都不太可能出现这种问题(当然会出现其他的问题)。主要是现在的做法就是把运行时数据也嵌入到代码内,一方面是避免出现这类分发导致的问题,另一方面也能提高一定的运行效率。

不过,这也得看poppler那边的态度了,这也会涉及到一定的数据版权/许可证的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值