钛钾Z 节点“存在于” TeX 框中。借助latex
TeX 引擎,这些框将转换为 PostScript 指令。\showbox
按照以下步骤了解如何实现这样的框。
打开TikZ源文件
<tex installation directory>/tex/generic/pgf/frontendlayer/tikz/tikz.code.tex
并添加指令\showbox\tikz@figbox%
就在评论之后
% Step 13: Add labels and nodes
创建以下 LaTeX 手稿:
\documentclass{article} \usepackage{tikz} \begin{document} \tikz \path (0,0) node[draw] {}; \end{document}
使用 编译手稿
latex
。编译将以问号停止:l.4 \tikz \path (0,0) node[draw] {}; ?
进入
q<RET>
将结束会话并将日志缓冲区刷新到日志文件。打开日志文件。原始框位于文件末尾附近:
> \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 查看器和实用程序)如何知道如何处理这些运算符以及如何解释它们?pgfstr
concat
save
concat
pgfe
pgfstr
pgf...
dvipdf
答案1
PostScript 定义pgf/TikZ
可以在文件中找到
pgfsys-common-postscript.def
在pgfsys-dvips.def
TeX 目录树下
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