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
。目前唯一可行的方法是通过链接latex
和dvips -dALLOWPSTRANSPARENCY
,ps2pdf
这使其更难以使用。有没有办法在使用或-dALLOWPSTRANSPARENCY
编译代码时直接包含,或者以某种方式规避这个问题?pdflatex
xelatex
举个例子,下面的代码对我来说触发了这个问题,以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.cfg
GS 命令行配置为的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...