diff options
author | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-01-16 03:03:27 +0000 |
commit | 6f9e1680085e7bb4d258f6f8116369d122e196e1 (patch) | |
tree | 9ac0ecb239240d1d672b188f29c1479de215074b /graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex | |
parent | b8345f39630408bb198e7636381ce4240154ca9b (diff) |
CTAN sync 202301160303
Diffstat (limited to 'graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex')
-rw-r--r-- | graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex b/graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex new file mode 100644 index 0000000000..23b7ff672e --- /dev/null +++ b/graphics/pgf/base/tex/generic/libraries/decorations/pgflibrarydecorations.markings.code.tex @@ -0,0 +1,179 @@ +% Copyright 2018 by Mark Wibrow +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Public License. +% +% See the file doc/generic/pgf/licenses/LICENSE for more details. + +\usepgfmodule{decorations}% + + +% A marking decoration is used to add markings (which are just pgf +% scopes, essentially) at certain positions of a path. + +\pgfkeys{ + /pgf/decoration/reset marks/.code=\let\pgf@lib@dec@mark@marks\pgfutil@empty, + /pgf/decoration/mark/.code=\pgf@lib@dec@parsemark#1\pgf@lib@dec@stop, +}% + +\let\pgf@lib@dec@mark@marks=\pgfutil@empty + +\def\pgf@lib@dec@parsemark{\pgfutil@ifnextchar b{\pgf@lib@dec@parsebetween}{\pgf@lib@dec@parseat}}% +\def\pgf@lib@dec@parseat at position#1with#2\pgf@lib@dec@stop{% + \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@lib@dec@mark@marks% + \pgf@lib@dec@domark{#1}{#2}% + }% +}% +\def\pgf@lib@dec@parsebetween between positions#1and#2step#3with#4\pgf@lib@dec@stop{% + \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@lib@dec@mark@marks% + \pgf@lib@dec@dobetweenmark{#1}{#2}{#3}{#4}% + }% +}% + +\def\pgf@lib@dec@arrowhead#1#2{% + \pgftransformxscale{#1} + \pgfarrowdraw{#2}% +}% + +\def\pgf@lib@dec@doarrowhead#1{% + \pgf@lib@dec@arrowhead{1}{#1}% +}% +\def\pgf@lib@dec@doarrowheadrev#1{% + \pgf@lib@dec@arrowhead{-1}{#1}% +}% + + +\pgfdeclaredecoration{markings}{init} +{% + \state{init} + [ + width=0pt, + persistent precomputation={% + \pgfkeys{/pgf/decoration/mark info/sequence number/.initial=0}% + \pgfkeys{/pgf/decoration/mark info/distance from start/.initial=}% + }, + next state=pre + ] + {}% + + \state{pre} + [ + width=0pt, + persistent precomputation={% + \def\pgf@lib@dec@computed@width{0pt}% + \pgf@lib@dec@mark@marks\pgf@lib@dec@mark@last% + \let\arrow=\pgf@lib@dec@doarrowhead% + \let\arrowreversed=\pgf@lib@dec@doarrowheadrev% + }, + next state=skipper + ] + {}% + + \state{skipper}[width=\pgf@lib@dec@computed@width-\pgfdecoratedcompleteddistance-1sp, + next state=\pgf@lib@dec@next@state]{}% + + \state{main} + [ + width=1sp, + next state=pre, + persistent precomputation={% + \pgfutil@tempcnta=\pgfkeysvalueof{/pgf/decoration/mark info/sequence number}\relax% + \advance\pgfutil@tempcnta by1\relax% + \pgfkeys{/pgf/decoration/mark info/sequence number/.expanded=\the\pgfutil@tempcnta}% + \pgfkeys{/pgf/decoration/mark info/distance from start/.expanded=\pgf@lib@dec@computed@width}% + }% + ] + {% + \pgfinterruptpath% + \pgfscope% + \let\pgf@lib@dec@mark@marks=\pgfutil@empty% + \pgfslopedattimefalse + \pgf@lib@dec@computed@action% + \endpgfscope% + \endpgfinterruptpath% + \ifx\pgf@lib@mark@node\pgfutil@empty% + \else% + \pgf@lib@mark@connect@node% + \fi% + }% + + \state{final}[width=\pgfdecoratedremainingdistance]{ + \ifx\pgf@lib@mark@node\pgfutil@empty% + \pgfpathmoveto{\pgfpointdecoratedpathlast} + \else% + \pgfpathlineto{\pgfpointdecoratedpathlast} + \fi% + }% +}% + +\def\pgf@lib@dec@domark#1#2#3\pgf@lib@dec@mark@last{% + \def\pgf@lib@dec@mark@marks{#3}% + \pgf@lib@dec@parsenum{#1}% + \def\pgf@lib@dec@computed@action{#2}% + \def\pgf@lib@dec@next@state{main}% +}% + + +\def\pgf@lib@dec@dobetweenmark#1#2#3#4#5\pgf@lib@dec@mark@last{% + \pgf@lib@dec@parsenum{#1}% + \let\pgf@lib@dec@mark@start=\pgf@lib@dec@computed@width% + \pgf@lib@dec@parsenum{#2}% + \let\pgf@lib@dec@mark@end=\pgf@lib@dec@computed@width% + \ifdim\pgf@lib@dec@mark@end<\pgf@lib@dec@mark@start\relax% + % Skip! + #5\pgf@lib@dec@mark@last% + \else% + % + \pgf@lib@dec@parsenum{#3}% + \pgfmathparse{\pgf@lib@dec@mark@start+\pgf@lib@dec@computed@width}% + % Update entry in mark list + \edef\pgf@temp{\noexpand\pgf@lib@dec@dobetweenmark{\pgfmathresult pt}{\pgf@lib@dec@mark@end}{\pgf@lib@dec@computed@width}}% + \expandafter\def\expandafter\pgf@lib@dec@mark@marks\expandafter{\pgf@temp{#4}#5}% + \let\pgf@lib@dec@computed@width\pgf@lib@dec@mark@start% + \def\pgf@lib@dec@computed@action{#4}% + \def\pgf@lib@dec@next@state{main}% + \fi% +}% + + +\def\pgf@lib@dec@parsenum#1{% + \pgfmathparse{#1}% + \ifpgfmathunitsdeclared% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathparse{\pgfdecoratedpathlength\pgfmathresult pt}% + \else% + \pgfmathparse{\pgfmathresult pt}% + \fi% + \else% + \ifdim\pgfmathresult pt<0pt\relax% + \pgfmathparse{\pgfdecoratedpathlength\pgfmathresult*\pgfdecoratedpathlength}% + \else% + \pgfmathparse{\pgfmathresult*\pgfdecoratedpathlength}% + \fi% + \fi% + \edef\pgf@lib@dec@computed@width{\pgfmathresult pt}% +}% + +\def\pgf@lib@dec@mark@last{% + \def\pgf@lib@dec@next@state{final}% +}% + + +% +% If you set the mark connection node inside a mark picture, the +% output path will contain a line to this node +% + +\pgfkeys{/pgf/decoration/mark connection node/.store in=\pgf@lib@mark@node, + /pgf/decoration/mark connection node=}% +\def\pgf@lib@mark@connect@node{% + % Line to "left" end of the node + \pgfpathlineto{\pgfpointshapeborder{\pgf@lib@mark@node}{\pgfqpoint{-1pt}{0pt}}} + % Move to "right" end of the node + \pgfpathmoveto{\pgfpointshapeborder{\pgf@lib@mark@node}{\pgfqpoint{1pt}{0pt}}} +}% + + +\endinput |