PostScript 解释器如何知道 PGF 特定运算符(例如“pgfe”和“pgfstr”)的含义?

PostScript 解释器如何知道 PGF 特定运算符(例如“pgfe”和“pgfstr”)的含义?

Z 节点“存在于” TeX 框中。借助latexTeX 引擎,这些框将转换为 PostScript 指令。\showbox按照以下步骤了解如何实现这样的框。

  1. 打开TikZ源文件<tex installation directory>/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex并添加指令

    \showbox\tikz@figbox%
    

    就在评论之后

    % Step 13: Add labels and nodes
    
  2. 创建以下 LaTeX 手稿:

    \documentclass{article}
    \usepackage{tikz}
    \begin{document}
        \tikz \path (0,0) node[draw] {};
    \end{document}
    
  3. 使用 编译手稿latex。编译将以问号停止:

    l.4 \tikz \path (0,0) node[draw] {};
    
    ?
    

    进入q<RET>将结束会话并将日志缓冲区刷新到日志文件。

  4. 打开日志文件。原始框位于文件末尾附近:

    > \box33=
    \hbox(0.0+0.0)x0.0
    .\hbox(0.0+0.0)x0.0
    ..\special{ps:: save }
    ..\glue 0.0
    
    ...
    
    ..\glue 0.0
    ..\special{ps:: 6.64113 6.64113 -3.32056 -3.32056 pgfe }
    ..\special{ps:: pgfstr }
    ..\glue 0.0
    
    ...
    
    ..\glue 0.0
    ..\special{ps:: save }
    ..\special{ps:: [1.0 0.0 0.0 1.0 0.0 0.0 ] concat }
    ..\special{ps:: pgfs}
    ..\special{ps::[end]}
    ..\hbox(0.0+0.0)x0.0
    ...\special{ps:: 0 setgray }
    ..\glue 0.0
    ..\special{ps::[begin]}
    ..\special{ps:: pgfr}
    ..\special{ps:: restore }
    ..\special{ps:: restore }
    
    ! OK.
    

可以看出,用于渲染框的 PostScript 运算符包括save、、和。现在,和是 PostScript 手册中记录的官方运算符,但我相信pgfe,和其他运算符是 PGF 特有的,不是 PostScript 语言的一部分。PostScript 解释器(例如 dvi 查看器和实用程序)如何知道如何处理这些运算符以及如何解释它们?pgfstrconcatsaveconcatpgfepgfstrpgf...dvipdf

答案1

PostScript 定义pgf/TikZ可以在文件中找到

pgfsys-common-postscript.defpgfsys-dvips.defTeX 目录树下

texmf-dist/generic/pgf/systemlayer

/pgfstr在 中定义pgfsys-dvips.def(以及vtex版本中再次定义)

/pgfe定义在pgfsys-common-postscript.def

.pdf在类似名称的文件内也可以找到其他输出“引擎”的定义,例如等。

答案2

这是一个定义所有 pgf 函数的 PostScript 函数:

/pgffunctions {
    /pgfsc{}bind def% stroke color is empty by default
    /pgffc{}bind def% fill color is empty by default
    /pgfstr{stroke}bind def
    /pgffill{fill}bind def
    /pgfeofill{eofill}bind def
    /pgfe{a dup 0 rlineto exch 0 exch rlineto neg 0 rlineto closepath}bind def% rectangle
    /pgfw{setlinewidth}bind def% setlinewidth
    /pgfs{save pgfpd 72 Resolution div 72 VResolution div neg scale 
      magscale{1 DVImag div dup scale}if 
      pgfx neg pgfy neg translate pgffoa .setopacityalpha}bind def% save
    /pgfr{pgfsd restore}bind def %restore
    userdict begin
    /pgfo{pgfsd /pgfx currentpoint /pgfy exch def def @beginspecial}bind def %open
    /pgfc{newpath @endspecial pgfpd}bind def %close
    /pgfsd{globaldict /pgfdelta /delta where {pop delta} {0} ifelse put}bind def% save delta
    /pgfpd{/delta globaldict /pgfdelta get def}bind def % put delta
    /.setopacityalpha where {pop} {/.setopacityalpha{pop}def} ifelse % install .setopacityalpha 
    /.pgfsetfillopacityalpha{/pgffoa exch def
      /pgffill{gsave pgffoa .setopacityalpha fill 1 .setopacityalpha newpath fill grestore newpath}bind def
      /pgfeofill{gsave pgffoa .setopacityalpha eofill 1 .setopacityalpha newpath eofill grestore newpath}bind def}bind def
    /.pgfsetstrokeopacityalpha{/pgfsoa exch def /pgfstr{gsave pgfsoa .setopacityalpha stroke grestore newpath}bind def}bind def
    /pgffoa 1 def
    /pgfsoa 1 def
    end
} def

相关内容