解决Latex输出PDF纸张自适应大小及中文无法显示问题

1,791 阅读3分钟

遗留的问题

之前我们进行了基于texlive定制chemfig化学式转换Python服务镜像,虽然完成pdf的输出服务改造,但是输出效果并不是太好,如下图:

这个图有两个比较严重问题

  • 不支持中文
  • 空白区域过大,纸张空间浪费

其实最主要的问题是用户很难接受,这样东西放在前端无法很好地展示,自己也看不下去,奈何第一次接触latex,有心无力,就支持了一个蠢萌的换纸功能。不过mol2chemfig在他们的官网中的Web Interface的PDF preview链接显示的PDF是没有空白区域的很小一块,觉得非常不错。那就调研一下,记录解决这两个问题过程及遇到的问题

解决中文问题

我们选用的宏包是CJKutf8,这个宏包无需安装其他东西,使用起来也是比较方便的,tex文件修改如下:

\documentclass{minimal}
\usepackage{xcolor, mol2chemfig}
\usepackage[a5paper, margin=10px, total={6in, 8in}]{geometry}
\usepackage{CJKutf8}
\usepackage[helvet]{sfmath}
\setcrambond{2.5pt}{0.4pt}{1.0pt}
\setbondoffset{1pt}
\setdoublesep{2pt}
\setatomsep{%(atomsep)spt}
\renewcommand{\printatom}[1]{\fontsize{8pt}{10pt}\selectfont{\ensuremath{\mathsf{#1}}}}
\setlength{\parindent}{0pt}
\setlength{\fboxsep}{0pt}
\begin{document}
\begin{CJK}{UTF8}{gbsn}

\chemfig{H_3C-[:30]N**6(-(=O)-(**5(-N(-CH_3)--N-))--N(-CH_3)-(=O)-)}

\end{CJK}
\end{document}

用复杂的分子式看下效果,用a3paper渲染的效果(a4放不下): 我们的中文成功显示了,但是空白区域还是十分巨大,不堪用

去除空白区域

standalone

不得不说,Latex的中文文档真的是很少,只能到google搜索,但是奈何English水平捉鸡,往往词不达意,不过还是被我找到了:ctan.org/pkg/standal…
原文如下:

standalone – Compile TEX pictures stand-alone or as part of a document
A class and package is provided which allows TEX pictures or other TEX code to be compiled standalone or as part of a main document. Special support for pictures with beamer overlays is also provided.

The package is used in the main document and skips extra preambles in sub-files. The class may be used to simplify the preamble in sub-files. By default the preview package is used to display the typeset code without margins.

The behaviour in standalone mode may adjusted using a configuration file standalone.cfg to redefine the standalone environment.

重点语句:By default the preview package is used to display the typeset code without margins,意思是默认情况下,预览包用于显示没有边距的排版代码,这个不就是我们想要的吗,修改\documentclass{standalone}

\documentclass{standalone}
……
……
……

我们用小化学式再看下效果:

发现没什么变化,而且边上还多出一堆pt之类文字,这些文字应当是引入CJKutf8宏包导致的

去除geometry,重新修改样式

使用纸张应当我使用了geometry宏包并设置a5paper为默认纸张而导致的问题,我们重新编辑tex模板文件

\documentclass{standalone}
\usepackage{mol2chemfig}
\usepackage{CJKutf8}
\usepackage[helvet]{sfmath}
\begin{document}
\begin{CJK}{UTF8}{gbsn}

\chemfig{H_3C-[:30]N**6(-(=O)-(**5(-N(-CH_3)--N-))--N(-CH_3)-(=O)-)}

\end{CJK}
\end{document}

我们看下效果:

图变小了,但是换行又不生效了,而且图形顶着边框

解决换行问题

使用varwidth解决换行问题

Google latex standalone newline ,第一条记录:tex.stackexchange.com/questions/4… ,示例里面说的很清楚,使用varwidth可以解决我们的换行问题,再看下效果:

几乎完美!我们再试下大的化学式,效果如下:

这不a5paper的尺寸吗?varwidth只能支持a5大小吗?standalone也是默认套的a5paper吗?说好的去空白自适应,怎么把图给截了?尝试的方向错了吗?我又回到原点了吗?我裂开了啊!!!

解决图片缺失问题

经过一番艰难的搜索,找到一篇varwidth选项限制输出宽度的文章,varwidth默认的限制824x543px,而默认使用的宽度是 \linewidth ,推荐我们使用 \maxdimen,我们再来优化一下tex模板

\documentclass[margin=3mm,varwidth=\maxdimen]{standalone}
\usepackage{mol2chemfig}
\usepackage{CJKutf8}
\usepackage[helvet]{sfmath}
\begin{document}
\begin{CJK}{UTF8}{gbsn}
\begin{center}

\chemfig{H_3C-[:30]N**6(-(=O)-(**5(-N(-CH_3)--N-))--N(-CH_3)-(=O)-)}

\end{center}
\end{CJK}
\end{document}

我们看下效果:
Prefect! So Prefect!

参考链接

standalone:ctan.org/pkg/standal… LaTex支持中文的三种方式:blog.csdn.net/z_feng12489…
new line in standalone:tex.stackexchange.com/questions/4…
standalone: varwidth option limits output width:tex.stackexchange.com/questions/9…