Ghostscript 在编译 pstricks-figures 时需要 -dALLOWPSTRANSPARENCY

Ghostscript 在编译 pstricks-figures 时需要 -dALLOWPSTRANSPARENCY

pdflatex --shell-escape我尝试使用或编译基于 pstricks 的图形xelatex,但都失败了

%%%% WARNING: Transparency operations ignored - need to use -dALLOWPSTRANSPARENCY

Error: /undefined in .setstrokeconstantalpha
Operand stack:
   1.0
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1974   1   3   %oparray_pop   1973   1   3   %oparray_pop   1961   1   3   %oparray_pop   1817   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--
Dictionary stack:
   --dict:730/1123(ro)(G)--   --dict:0/20(G)--   --dict:197/200(L)--   --dict:103/300(L)--   --dict:40/200(L)--   --dict:143/200(L)--
Current allocation mode is local
Current file position is 346494
GPL Ghostscript 9.53.3: Unrecoverable error, exit code 1
system returned with code 256

由 返回ghostscript。目前唯一可行的方法是通过链接latexdvips -dALLOWPSTRANSPARENCYps2pdf这使其更难以使用。有没有办法在使用或-dALLOWPSTRANSPARENCY编译代码时直接包含,或者以某种方式规避这个问题?pdflatexxelatex

举个例子,下面的代码对我来说触发了这个问题,以main.tex作为主文件,mwe.tex以基于 ps 的图为例:

main.tex

\documentclass[margin=5pt]{standalone}
\usepackage[dvipsnames,svgnames,pdf]{pstricks}
\usepackage{auto-pst-pdf}
\usepackage{pst-optexp}
%\usepackage{booktabs}
\usepackage{stackengine}
\begin{document}
    \input{mwe.tex}
\end{document}

mwe.tex

\begin{pspicture}(18,6)
    \psset[optexp]{fiber=none, usefiberstyle}
    %\newpsstyle{Fiber}{linecolor=orange, linewidth=2\pslinewidth}
    \newpsstyle{Fiber}{linewidth=2\pslinewidth}
    \pnodes(1.5, 4){LaserIn}(2, 4){LaserOut}
    \pnodes(1.5, 2){SESAMIn}(2, 2){SESAMOut}
    \pnodes(4, 4){InputIsolatorIn}(5, 4){InputIsolatorOut}
    \pnodes(6.5, 2){PolarizerIn}(7.5, 2){PolarizerOut}
    \pnodes(9, 4){TSFIn}(11, 4){TSFOut}
    \pnodes(14, 3){LoopIn}(14, 2){LoopOut}
    \pnodes(10, 1){OutputIsolatorIn}(12,1){OutputIsolatorOut}
    \pnodes(16, 1){LaserOutLow}
    \optdiode[compname=PumpDiode, position=start](LaserIn)(LaserOut){\begin{tabular}{@{}c@{}}Laser\\diode\end{tabular}}
    \optisolator[compname=InputIsolator](InputIsolatorIn)(InputIsolatorOut){Pump Isolator}
    \optfiber[compname=ActiveFiber, position=start, linecolor=red](TSFIn)(TSFOut){Active fiber}
    
    \nput{75}{LaserOutLow}{Laser output}
    
    \drawfiber{InputIsolator}{ActiveFiber}
    \drawfiber{PumpDiode}{InputIsolator}
    \drawfiber{ActiveFiber}(LaserOutLow)
\end{pspicture}

答案1

对于xetex/ xelatex,后端驱动程序xdvipdfmx调用 Ghostscript 自动进行 PS 到 PDF 的转换。执行的 Ghostscript 命令行在默认位置为 的xdvipdfmx文件中配置。dvipdfmx.cfg$TEXMFDIST/dvipdfmx/dvipdfmx.cfg

最新的 TeX 安装(例如 TeXLive-2021)应该已经使用 来配置 GS 调用-dALLOWPSTRANSPARENCY。对于您的特定示例,还需要设置-dNOSAFER,因为需要读入一些 PSTricks 头文件。

使用 TeXLive-2021,您可以xelatex调用

xelatex -output-driver="xdvipdfmx -i dvipdfmx-unsafe.cfg -q -E" main

如果你有较旧的 TeX 安装,你可能希望将修改后的版本放在dvipdfmx.cfgGS 命令行配置为的dvipdfmx-unsafe.cfg目录中$TEXMFLOCAL/dvipdfmx/

dvipdfmx.cfg

D  "rungs -q -dALLOWPSTRANSPARENCY -dSAFER -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dAutoRotatePages=/None -sOutputFile='%o' '%i' -c quit"

dvipdfmx-unsafe.cfg

D  "rungs -q -dALLOWPSTRANSPARENCY -dNOSAFER -dNOPAUSE -dBATCH -dEPSCrop -sPAPERSIZE=a0 -sDEVICE=pdfwrite -dCompatibilityLevel=%v -dAutoFilterGrayImages=false -dGrayImageFilter=/FlateEncode -dAutoFilterColorImages=false -dColorImageFilter=/FlateEncode -dAutoRotatePages=/None -sOutputFile='%o' '%i' -c quit"

$TEXMFLOCAL可以使用以下方式找到该目录

kpsewhich --var-value=TEXMFLOCAL

在命令提示符下。


对于pdflatex,配置auto-pst-pdf

\usepackage[pspdf={-dALLOWPSTRANSPARENCY}]{auto-pst-pdf}

Non-PDF special ignored!要在组装主 PDF 时消除警告,请\special通过添加禁用该命令

\usepackage{iftex}
\ifpdf\def\special#1{}\fi

紧接着\documentclass...

相关内容