如何在 ConTeXt Mk IV 中使用 Tikz 插入装饰?例如,在ornaments
包手册的第 12 页:
\begin{tikzpicture} % to be changed in \starttikzpicture
\foreach \a in {0,45,...,315}
\node[anchor=west,rotate=\a,inner sep=0pt] {%
\pgfornament[width=1cm]{88}};
\end{tikzpicture} % to be changed in \stopttikzpicture
问题是\pgfornament[width=1cm]{88}};
它不被识别为命令。
如果无法解决这个问题,你知道这些装饰品是否有源代码吗?据我所知,它们是用 Tikz 制作的?
谢谢
答案1
尝试pgfornament
从移植pgfornament.sty
到 ConTeXt ( t-pgfornament.mkiv
)。目前,它在 ConTeXt Mark IV 和 ConTeXt LMTX 中均有效:
%Suggestion
%Save this in /texmf-modules/tex/context/third/pgfornament/t-pgfornament.mkiv
\startmodule[pgfornament]
\setupmodule[object=vectorian]
\writestatus{pgfornament}{2020/05/26 v1.2 vector ornaments}
\usemodule[tikz]
\let\typeout\writestring
\edef\pgfornamentcurrentobject{\currentmoduleparameter{object}}
\def\makeatletter{\catcode`\@=11}
\def\makeatother{\catcode`\@=12}
\gdef\pgfOrnamentsObject{pgflibraryvectorian.code.tex}
\gdef\OrnamentsFamily{vectorian}
\pgfkeys{%
/pgfOrnaments/object/.cd,
/pgfOrnaments/object/.code = \gdef\pgfOrnamentsObject{pgflibrary#1.code.tex}
\gdef\OrnamentsFamily{#1}%
}
\pgfkeys{/pgfOrnaments/object=\pgfornamentcurrentobject}
\input{\pgfOrnamentsObject}%
\makeatletter
\def\startnewfamily{\dosingleempty\dostartnewfamily}
\def\dostartnewfamily[#1]{%
\global\let\SavedOrnamentsFamily\OrnamentsFamily
\iffirstargument
\newpgfornamentfamily{#1}
\else
\newpgfornamentfamily{vectorian}
\fi
}
\def\stopnewfamily{\newpgfornamentfamily{\SavedOrnamentsFamily}}%
\def\pgf@@ornament#1{%
\begingroup
\def\ubb{\pgfusepath{use as bounding box}}
\def\i{\pgfusepath{clip}}%
\def\k{\pgfusepath{stroke}}%
\let\o\pgfpathclose
\let\s\pgfusepathqfillstroke
\def\p ##1##2{\pgfqpoint{##1bp}{##2bp}}%
\def\m ##1 ##2 {\pgfpathmoveto{\p{##1}{##2}}}%
\def\l ##1 ##2 {\pgfpathlineto{\p{##1}{##2}}}%
\def\r ##1 ##2 ##3 ##4 {\pgfpathrectangle{\p{##1}{##2}}{\p{##3}{##4}}}%
\def\c ##1 ##2 ##3 ##4 ##5 ##6 {%
\pgfpathcurveto{\p{##1}{##2}}{\p{##3}{##4}}{\p{##5}{##6}}}%
\input \OrnamentsFamily#1.pgf%
\endgroup}%
\def\callornament#1{%
\begingroup
\def\ubb{\pgfusepath{use as bounding box}}
\def\i{\pgfusepath{clip}}%
\let\o\pgfpathclose
\let\s\pgfusepathqfillstroke
\def\p ##1##2{\pgfqpoint{##1bp}{##2bp}}%
\def\m ##1 ##2 {\pgfpathmoveto{\p{##1}{##2}}}%
\def\l ##1 ##2 {\pgfpathlineto{\p{##1}{##2}}}%
\def\r ##1 ##2 ##3 ##4 {\pgfpathrectangle{\p{##1}{##2}}{%
\p{##3}{##4}}}%
\def\c ##1 ##2 ##3 ##4 ##5 ##6 {%
\pgfpathcurveto{\p{##1}{##2}}{\p{##3}{##4}}{\p{##5}{##6}}}%
\input #1\relax
\endgroup}
\tikzset{pgfornamentstyle/.style={}}%
\pgfkeys{%
/ornament/.cd,
scale/.code = {\def\pgfornamentscale{#1}},
width/.code = {\def\pgfornamentwidth{#1}},
height/.code = {\def\pgfornamentheight{#1}},
color/.code = {\def\pgfornamentcolor{#1}},
opacity/.code = {\def\pgfornamentopacity{#1}},
anchor/.code = {\def\pgfornamentanchor{#1}},
ydelta/.code = {\def\pgfornamentydelta{#1}},
symmetry/.is choice,
symmetry/v/.code = {\tikzset{pgfornamentstyle/.append
style={cm={-1,0,0,1,(0,0)}}}},
symmetry/c/.code = {\tikzset{pgfornamentstyle/.append
style={cm={-1,0,0,-1,(0,0)}}}},
symmetry/h/.code = {\tikzset{pgfornamentstyle/.append
style={cm={1,0,0,-1,(0,0)}}}},
symmetry/none/.code = {\tikzset{pgfornamentstyle/.append style={cm={1,0,0,1,(0,0)}}}}%
}%
\def\pgfornament{\pgfutil@ifnextchar[{\pgf@ornament}{\pgf@ornament[]}}%
\def\pgf@ornament[#1]#2{%
\pgfkeys{%
/ornament/.cd,
scale = 1,
opacity = {},
width = {},
height = {},
color = {},
ydelta = 0 pt,
symmetry = none ,
anchor = center
}%
\pgfqkeys{/ornament}{#1}%
\ifx\pgfornamentcolor\empty
\tikzset{pgfornamentstyle/.append style={}}%
\else
\tikzset{pgfornamentstyle/.append style={color=\pgfornamentcolor}}%
\fi
\ifx\pgfornamentopacity\empty
\tikzset{pgfornamentstyle/.append style={}}%
\else
\tikzset{pgfornamentstyle/.append style={opacity=\pgfornamentopacity}}%
\fi
\ifx\pgfornamentwidth\empty
\else
\@pgfornamentDim{#2}
\pgfmathsetmacro{\pgfornamentscale}{\pgfornamentwidth/\@pgfornamentX bp}%
\fi
\ifx\pgfornamentheight\empty
\else
\@pgfornamentDim{#2}
\pgfmathsetmacro{\pgfornamentscale}{\pgfornamentheight/\@pgfornamentY bp}%
\fi
\starttikzpicture[%
baseline={([yshift=\pgfornamentydelta]current bounding box.\pgfornamentanchor)},
pgfornamentstyle]
\pgftransformscale{\pgfornamentscale}%
\pgf@@ornament{#2}%
\stoptikzpicture%
\tikzset{pgfornamentstyle/.style={cm={1,0,0,1,(0,0)}}}
}
\gdef\ornamenttopos{.5}
\gdef\ornamenttoanchor{center}
\gdef\ornamenttosymmetry{none}
\tikzset{options default/.style={anchor=center,
sloped,
allow upside down,
inner sep=0pt}}
\tikzset{ornament/at/.code={\def\ornamenttopos{#1}},
options/.style={options default,#1},
ornament symmetry/.code={\def\ornamenttosymmetry{#1}},
node anchor/.code={\def\ornamenttoanchor{#1}},
ornament/.style={%
to path={%
\pgfextra{%
\tikz@scan@one@point\pgfutil@firstofone(\tikztostart)\relax
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\tikz@scan@one@point\pgfutil@firstofone(\tikztotarget)\relax
\pgf@xb=\pgf@x
\pgf@yb=\pgf@y
\advance\pgf@xa by-\pgf@xb
\advance\pgf@ya by-\pgf@yb
\pgfmathveclen{\pgf@xa}{\pgf@ya}%
\global\let\ornamentlen\pgfmathresult}
-- node [pos=\ornamenttopos,options,
anchor=\ornamenttoanchor]{%
\pgfornament[width = \ornamentlen,
symmetry=\ornamenttosymmetry]{#1}}
(\tikztotarget)\tikztonodes
}
}
}
\def\pgfornamenthline#1#2#3#4{%
\pgfextractx{\pgf@x}{\pgfpointanchor{#1}{#3 east}}
\pgf@xa=\pgf@x
\pgfextractx{\pgf@x}{\pgfpointanchor{#2}{#3 west}}
\pgf@xb=\pgf@x
\advance\pgf@xb by -\pgf@xa
\node[inner sep=0pt] at ($(#1.#3 east)!.5!(#2.#3 west)$) {\pgfornament[width=\pgf@xb]{#4}} ;
}
\def\pgfornamentvline#1#2#3#4{%
\pgfextracty{\pgf@y}{\pgfpointanchor{#1}{south #3}}
\pgf@ya=\pgf@y
\pgfextracty{\pgf@y}{\pgfpointanchor{#2}{north #3}}
\pgf@yb=\pgf@y
\advance\pgf@yb by -\pgf@ya
\node[inner sep=0pt,rotate=90] at ($(#1.south #3)!.5!(#2.north #3)$) {\pgfornament[width=\pgf@yb]{#4}} ;
}%
\def\getornamentlength#1#2#3#4{%
\pgfpointdiff{\pgfpointanchor{#1}{#2}}%
{\pgfpointanchor{#3}{#4}}%
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathveclen{\pgf@xa}{\pgf@ya}%
\global\let\ornamentlen\pgfmathresult
}%
\def\getornamentangle#1#2#3{%
\pgfpointdiff{\pgfpointanchor{#2}{center}}{\pgfpointanchor{#3}{center}}%
\pgfmathsetmacro{#1}{atan2(\pgf@x,\pgf@y)}%
}%
\makeatother
\def\resetpgfornamentstyle{\tikzset{pgfornamentstyle/.style={}}}
\def\newpgfornamentfamily#1{%
\edef\OrnamentsFamily{#1}
\gdef\pgfOrnamentsObject{pgflibrary\OrnamentsFamily.code.tex}
\input{\pgfOrnamentsObject}%
}%
\makeatletter
\pgfkeys{/ornamentline/.cd,
color/.store in = \ornamentcolor,
color = black,
/ornamentline/.search also={/tikz}}
\def\pgfornamentline{\pgfutil@ifnextchar[{\pgf@ornamentline}{\pgf@ornamentline[]}}%
\def\pgf@ornamentline[#1]#2#3#4#5{%
\pgfqkeys{/ornamentline}{#1}%
\pgfmathsetmacro\nbo{#4}
\path (#2) -- (#3) foreach \i in {0,...,\nbo} {coordinate[pos=\i/\nbo] (p\i)}
[color=\ornamentcolor] foreach \i [count=\j] in {0,...,\number\numexpr\nbo-1} { (p\i) to [ornament=#5] (p\j)};
}
\makeatother
\stopmodule
\endinput
还有一些测试
\usecolors[svg] %nice colors
\usemodule[tikz]
\usetikzlibrary[chains]
\usemodule[pgfornament][object=vectorian]
\startTEXpage
\newpgfornamentfamily{pgfhan}
\pgfornament[width = 2cm, color = darkgreen]{59}
\newpgfornamentfamily{vectorian}
\pgfornament[width = 2cm, color = darkgreen]{59}
\startnewfamily[pgfhan]
\starttikzpicture
\node{ \pgfornament[color=gold,width=2cm]{1}};
\stoptikzpicture
\stopnewfamily
\starttikzpicture[start chain=circle placed {at=(\tikzchaincount*30:2)}]
\foreach \i in {1,...,12} \node [on chain]%
{\pgfornament[width=1cm]{4}};
\stoptikzpicture
\stopTEXpage
我等待反馈,因为我很少使用 TikZ(除了tikzducks
)