From 7126e67439fccc8851427298ecccd01727575864 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Thu, 16 Mar 2023 03:01:42 +0000 Subject: CTAN sync 202303160301 --- graphics/pgf/contrib/tikz-ext/README.md | 33 +-- .../tikz-ext/doc/tikz-ext-manual-en-calendar.tex | 10 +- .../tikz-ext/doc/tikz-ext-manual-en-intro.tex | 9 +- .../doc/tikz-ext-manual-en-library-layers.tex | 68 ++++++ .../doc/tikz-ext-manual-en-library-misc.tex | 71 +++++-- .../doc/tikz-ext-manual-en-library-nodes.tex | 126 +++++++++++ .../doc/tikz-ext-manual-en-library-paths.timer.tex | 4 + .../doc/tikz-ext-manual-en-library-pgffor.tex | 93 ++++++++ .../tikz-ext/doc/tikz-ext-manual-en-main-body.tex | 18 +- .../doc/tikz-ext-manual-en-main-preamble.tex | 103 ++++++++- .../tikz-ext-manual-en-pgf-shapes-uncentered.tex | 116 ++++++---- .../pgf/contrib/tikz-ext/doc/tikz-ext-manual.bib | 116 ++++++++++ .../pgf/contrib/tikz-ext/doc/tikz-ext-manual.pdf | Bin 424759 -> 649739 bytes .../pgf/contrib/tikz-ext/doc/tikz-ext-manual.tex | 14 +- .../tikz-ext/tex/generic/pgffor-ext.code.tex | 73 +++++++ .../pgfkeyslibraryext.pgfkeys-plus.code.tex | 14 +- ...flibraryext.shapes.uncenteredrectangle.code.tex | 56 ++++- .../generic/tikzlibraryext.calendar-plus.code.tex | 15 ++ .../tex/generic/tikzlibraryext.layers.code.tex | 235 +++++++++++++++++++++ .../tex/generic/tikzlibraryext.misc.code.tex | 113 ++++++---- .../generic/tikzlibraryext.node-families.code.tex | 13 ++ .../tex/generic/tikzlibraryext.nodes.code.tex | 140 ++++++++++++ .../generic/tikzlibraryext.paths.timer.code.tex | 10 +- ...zlibraryext.shapes.uncenteredrectangle.code.tex | 46 ++++ .../pgf/contrib/tikz-ext/tex/latex/pgffor-ext.sty | 44 ++++ .../pgf/contrib/tikz-ext/tex/plain/pgffor-ext.tex | 13 ++ 26 files changed, 1403 insertions(+), 150 deletions(-) create mode 100644 graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-layers.tex create mode 100644 graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-nodes.tex create mode 100644 graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-pgffor.tex create mode 100644 graphics/pgf/contrib/tikz-ext/tex/generic/pgffor-ext.code.tex create mode 100644 graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.layers.code.tex create mode 100644 graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.nodes.code.tex create mode 100644 graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.shapes.uncenteredrectangle.code.tex create mode 100644 graphics/pgf/contrib/tikz-ext/tex/latex/pgffor-ext.sty create mode 100644 graphics/pgf/contrib/tikz-ext/tex/plain/pgffor-ext.tex (limited to 'graphics/pgf') diff --git a/graphics/pgf/contrib/tikz-ext/README.md b/graphics/pgf/contrib/tikz-ext/README.md index 33ec46d366..b4aed92f3e 100644 --- a/graphics/pgf/contrib/tikz-ext/README.md +++ b/graphics/pgf/contrib/tikz-ext/README.md @@ -10,27 +10,30 @@ Name: Qrrbrbirlbel ## Introduction -This is not a LaTeX package but a collection of libraries for PGF and TikZ. +This is not a LaTeX package but a collection of libraries for PGF and TikZ; -These are - - * `ext.calendar-plus` - * `ext.node-families` + * `ext.calendar-plus` extends the `calendar` library with more tests, week numbers and a few goodies. + * `ext.layers` allows to put nodes etc on a separate layer without having to use `pgfonlayer`. + * `ext.nodes` extends the functionalities around nodes. + * `ext.node-families` uses the AUX file to sync the sizes of nodes. * `ext.node-families.shapes.geometric` - * `ext.paths.arcto` - * `ext.paths.ortho` - * `ext.paths.timer` - * `ext.patterns.images` - * `ext.positioning-plus` - * `ext.topaths.arcthrough` - * `ext.transformations.mirror` - * `ext.misc` + * `ext.paths.arcto` uses `\pgfpatharcto` to construct an arc *to* a point. + * `ext.paths.ortho` provides orthogonal path operations `-|-`, `|-|`, `r-rl`, `r-lr`, `r-du` and `r-ud`. + * `ext.paths.timer` adds timers to `rectangle`, `parabola`, `sin` and `cos`. + * `ext.patterns.images` allows images to be used as a path‘s pattern. + * `ext.positioning-plus` adds more ways to position nodes in reference to each other. + * `ext.scalepicture` scales a TikZ picture to the desired dimensions. + * `ext.topaths.arcthrough` installs a `to path` that expects a third point that defines an arc. + * `ext.transformations.mirror` adds transformations that reflect on arbitrary lines. + * `ext.misc` which includes + * the PGFKeys library `ext.pgfkeys-plus` and + * the PGFFor extension `pgffor-ext`. * Shapes: * `ext.shapes.circlearrow` * `ext.shapes.circlecrosssplit` * `ext.shapes.heatmark` * `ext.shapes.rectangleroundedcorners` * `ext.shapes.superellipse` + * `ext.shapes.uncenteredrectangle` - These were developed in response to questions on tex.stackexchange.com. - Some of these can be find by searching for my [user id](https://tex.stackexchange.com/search?q=user%3A16595+%22my+library%22). \ No newline at end of file + These were developed in response to questions on tex.stackexchange.com or texwelt.de. \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-calendar.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-calendar.tex index 09bd261a21..73f1cbf593 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-calendar.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-calendar.tex @@ -10,11 +10,11 @@ \section{Calendar: Weeknumbers and more conditionals} \label{sec:calendar} -\begin{package}{calendar-ext} +\begin{texpackage}{calendar-ext} This package adds week numbers and more conditionals to the \pgfname\space package |pgfcalendar|. - (Despite the code example above, this package is not set up to work with Con\TeX t.) +% (Despite the code example above, this package is not set up to work with Con\TeX t.) \inspiration{WeekNum-Q,CalCond-Q,CalFullWeek-Q}{WeekNum-A,CalCond-A,CalFullWeek-A} -\end{package} +\end{texpackage} %This package extends the |pgfcalendar| package. @@ -79,9 +79,9 @@ are added. These are \subsection{Week numbering (ISO~8601)} \label{calendar:weeknumbering} -\begin{command}{\pgfcalendarjulianyeartoweek\marg{Julian day}\marg{year}\marg{week counter}} +\begin{command}{\pgfcalendarjulianyeartoweek\marg{Julian day}\marg{year}\marg{week count}} This command calculates the week for the \meta{Julian day} of \meta{year}. - The \meta{week counter} must be a \TeX\space counter. + The \meta{week counter} must be a \TeX\space count. The calculation follows the rule of ISO~8601 where the first week has that year's first Thursday in it. diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-intro.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-intro.tex index f9468175cb..179d641c5b 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-intro.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-intro.tex @@ -12,8 +12,8 @@ \section{Usage} This package is called |tikz-ext|, however, one can't load it via |\usepackage|.% -\footnote{Except for \texttt{calendar-ext} of section~\ref{sec:calendar}.} -Instead, this package consists of multiple +\footnote{Except for \texttt{calendar-ext} and \texttt{pgffor-ext}.} +Instead, this package consists mostly of \pgfname\space and \tikzname\space libraries which are loaded by either |\usepgflibrary| or |\usetikzlibrary|. @@ -27,5 +27,10 @@ I don't like reinventing the wheel which is why I've gathered the solutions of my answers in this package. \section{Having problems?} +Note however, that most of these extensions haven't been +stress-tested properly and might be considered +experimental. + Don't hesitate to open an issue on GitHub. +You probably found a bug. \end{multicols} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-layers.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-layers.tex new file mode 100644 index 0000000000..9a32694abb --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-layers.tex @@ -0,0 +1,68 @@ +% !TeX root = tikz-ext-manual.tex +% !TeX spellcheck = en_US +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\section{Layers} +\begin{tikzlibrary}{ext.layers} +This library extends \tikzname's functionalities to put nodes, edges, matrices and pics +on a separate layer without having to use the \referenceEnvironmentandIndexO{pgfonlayer} environment. + +\textbf{Consider this library experimental.} +If you can, avoid it and use the |pgfonlayer| environment +or change the drawing order. +\end{tikzlibrary} + +\begin{multicols}{2} +\subsection{Internal keys} +\begin{key}{/tikz-ext/patch=\meta{specification}} +Since this library is experimental, its functionality needs to be activated explicitly. +The \meta{specification} is one of +\begin{itemize} +\item |node|, +\item |matrix|, +\item |pic|% + \footnote{Only the normal \referenceKeyandIndexO[/tikz/pics/]{code} + can be placed on different layers. + Both \referenceKeyandIndexO[/tikz/pics/]{background code} + and \referenceKeyandIndexO[/tikz/pics/]{foreground code} + will not be affected.}, +\item |edge| or +\item |all| which applies all the patches at once. +\end{itemize} +\end{key} + +These keys only work when a patch is applied but don't need to be used +since the patching activated specific +\begin{key}{/tikz-ext/layers/in box=\meta{box}} +\end{key} + +\begin{key}{/tikz-ext/layers/on layer=\meta{layer}} +\end{key} + +\subsection{User-level keys} +\begin{key}{/tikz/node on layer=\meta{layer}} +\end{key} +\begin{key}{/tikz/node in box=\meta{box}} +\end{key} + +\begin{key}{/tikz/matrix on layer=\meta{layer}} +\end{key} +\begin{key}{/tikz/matrix in box=\meta{box}} +\end{key} + +\begin{key}{/tikz/edge on layer=\meta{layer}} +\end{key} +\begin{key}{/tikz/edge in box=\meta{box}} +\end{key} + +\begin{key}{/tikz/pic on layer=\meta{layer}} +\end{key} +\begin{key}{/tikz/pic in box=\meta{box}} +\end{key} +\end{multicols} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-misc.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-misc.tex index 44228a5445..227317e765 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-misc.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-misc.tex @@ -11,19 +11,19 @@ \section{And a little bit more} \begin{tikzlibrary}{ext.misc} This library adds miscellaneous utilities to \pgfname math, \pgfname\space or \tikzname. - \inspiration{FullArc-Q,ForeachUse-Q}{FullArc-A,ForeachUse-A} + \inspiration{FullArc-Q}{FullArc-A} \end{tikzlibrary} \subsection{\pgfname math} -\begin{multicols}{2} +\begin{multicols}{2}\ \pgfkeys{/codeexample/every codeexample/.append style={width=3cm}} \subsubsection{Postfix operator \texttt{R}} Similar to |\segments[]| in PSTricks, the postfix operator |R| allows the user to use an arbitrary number of segments of a circle to be used instead of an angle. -\begin{key}{/tikz/full arc=\meta{num} (default |{}|)} +\begin{key}{/pgf/full arc=\meta{num} (default |\{\}|)} The number \meta{num} of segments will be set up. Using |full arc| with an empty value disables the segmentation and |1R| equals $1^\circ$. @@ -139,17 +139,20 @@ them in |"|. \subsection{\pgfname for} -Instead of |\foreach \var in {start, start + delta, ..., end}| one can use -|\foreach \var[use int=start to end step delta]|. - -\begin{key}{/pgf/foreach/use int=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} -The values \meta{start}, \meta{end} and \meta{delta} are evaluates by \pgfname math at initialization. -The part |step |\meta{delta} is optional (\meta{delta} = 1). -\end{key} - -\begin{key}{/pgf/foreach/use float=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} -Same as above, however the results are not truncated. -\end{key} +This library loads also most of the functions of the +\referencePackageandIndex{pgffor-ext} of section~\ref{pkg:pgffor-ext} +on page~\pageref{pkg:pgffor-ext}. +%Instead of |\foreach \var in {start, start + delta, ..., end}| one can use +%|\foreach \var[use int=start to end step delta]|. +% +%\begin{key}{/pgf/foreach/use int=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} +%The values \meta{start}, \meta{end} and \meta{delta} are evaluates by \pgfname math at initialization. +%The part |step |\meta{delta} is optional (\meta{delta} = 1). +%\end{key} +% +%\begin{key}{/pgf/foreach/use float=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} +%Same as above, however the results are not truncated. +%\end{key} %TODO: edges to and edges through %\pagebreak @@ -286,4 +289,44 @@ not all of them are. \end{tikzpicture} \end{codeexample} +\pagebreak +\subsection{\tikzname} +\begin{multicols}{2} +\begin{key}{/tikz/reverse clip=\meta{direction} (default counter clockwise)} +This key installs a very big rectangle which is either constructed +|counter clockwise| (like the \referencePathOperationandIndexO{circle} +path operation) or |clockwise|. +\end{key} +\begin{key}{/tikz/clip rule=\meta{direction} (default even odd)} +This key switches directly\footnote{% + Meaning, it directly executes + \referenceCommandandIndexO{\pgfseteorule}/% + \referenceCommandandIndexO{\pgfsetnonzerorule} + and doesn't accumulates where \tikzname\space + throws an error.} +to the specified rule which is +either |even odd| or |nonzero|. +This corresponds to the \referenceKeyandIndexO{even odd rule} and +\referenceKeyandIndexO{nonzero rule} keys. +\end{key} +\end{multicols} +\begin{codeexample}[preamble=\usetikzlibrary{ext.misc},width=6cm] +\newcommand*\myDiagram[1]{ + \fill[left color=blue, right color=green] (0, 0) rectangle (2, 1); + \clip (1, .5) #1 [reverse clip]; + \fill[left color=green, right color=blue] (0, 0) rectangle (2, 1); +} +\begin{tikzpicture}[radius=.4, row sep=5mm, column sep=5mm] +\matrix[ + row 2/.append style={clip rule=even odd}, + column 1/.append style={reverse clip/.default=clockwise} +]{ + \myDiagram{circle[]} & + \myDiagram{+(0:.4) arc[start angle=0, delta angle=-360] -- cycle} +\\ + \myDiagram{circle[]} & + \myDiagram{+(0:.4) arc[start angle=0, delta angle=-360] -- cycle} +\\}; +\end{tikzpicture} +\end{codeexample} \endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-nodes.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-nodes.tex new file mode 100644 index 0000000000..37d4f79de6 --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-nodes.tex @@ -0,0 +1,126 @@ +% !TeX root = tikz-ext-manual.tex +% !TeX spellcheck = en_US +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\section{Nodes} +\begin{tikzlibrary}{ext.nodes} +This library extends \tikzname's functionalities when it comes to nodes. +\inspiration{NodesOnLine-Q, NodesOnCurve-Q}{NodesOnLine-A, NodesOnCurve-A} +\end{tikzlibrary} + +\begin{multicols}{2} + +\subsection{Pic as a node} +\begin{key}{/tikz/pic=\opt{\meta{boolean}} (default true, initially false)} +This key allows one to use a pic where usually only nodes are accepted, +for example as a label. +\begin{codeexample}[preamble=\usetikzlibrary{ext.nodes, ext.misc}] +\begin{tikzpicture}[ + slsl/.pic={\draw (-2pt, 1.5pt) -- (2pt, .5pt) + (2pt, -1.5pt) -- (-2pt, -.5pt);}] +\node[draw, minimum width=3cm, minimum height=1cm, + label={[pic ] east:slsl}, + label={[pic, rotate=90] north:slsl}, + label={[pic ] west:slsl}, + label={[pic, rotate=-90]south:slsl}]{}; +\end{tikzpicture} +\end{codeexample} +\end{key} + +\subsection{Nodes on paths} +When nodes are placed along paths they don't interrupt +the path at that place. +The decoration \referenceLibraryandIndexO{markings} +and its \referenceKeyandIndexO[/pgf/decoration/]{mark connection node} +key can help but only works for straight paths and +doesn't play nicely with arrow tips. + +This library provides alternatives. +These are separated into straight paths, i.\,e. \referencePathOperationandIndexO{--}, +and everything else (including any |to path|). + +\subsubsection{Nodes on Lines} + +\begin{stylekey}{/tikz/node on line=\opt{\meta{anchor specification}} (default |\{\}|)} +This installs a \referenceKeyandIndexO{to path} that places \emph{one} +node along a straight line but connect the line with it. + +This allows a node to be placed \emph{on} a straight line without having to +use |fill = white| or similar tricks to make the line disappear +beneath the node. + +The optional \meta{anchor specification} allows to specify the +anchors to which the line should connect. +It allows one or two anchors divided by | and | to be specified. +\end{stylekey} + +\begin{stylekey}{/tikz/nodes on line} +This is similar to the previous key but allows +multiple nodes to be placed on a straight line +\emph{if} they are in the correct order (from start to target), +don't overlap with each other, the start or the target. + +It allows \emph{no} anchor specification. +\end{stylekey} + +\begin{codeexample}[preamble=\usetikzlibrary{ext.nodes, quotes}] +\tikz[inner sep=.15em, circle, nodes=draw, sloped] + \draw[ultra thick, ->, node on line] (0,0) to["0"] (1,1) + to["1"] (2,0) + to[nodes on line, "2.1" near start, "2.2", "2.3" near end] (5,1); +\end{codeexample} +\begin{codeexample}[preamble=\usetikzlibrary{ext.nodes, quotes}] +\tikz[inner sep=.15em, nodes=draw] + \draw[thick, ->, node on line=west and east] + (0,0) to["0"] (1,1) + to["1"] (2,0) + to["2"] (4,1); +\end{codeexample} + +\subsubsection{Nodes on Curves} +The following keys need the \referenceLibraryandIndexO{intersections} +and the \referenceLibraryandIndexExt{spath3} \cite{spath3} +library to be loaded. They will not be automatically +loaded by this library. + +Any \referenceKeyandIndexO[/pgf/]{outer sep} will be ignored. + +If you can, use \texttt{fill=\meta{bg color}} +instead of these keys, it will be much faster and easier. + +\begin{stylekey}{/tikz/nodes on curve=\meta{to path} (default line to)} +Similar to \referenceKeyandIndex{nodes on line}, this key allows +to have nodes on arbitrary paths. + +This is not suitable for paths connecting nodes. +\end{stylekey} + +\begin{stylekey}{/tikz/nodes on curve'=\meta{to path} (default line to)} +As above but suitable for connecting nodes. +\end{stylekey} + +\begin{codeexample}[preamble=\usetikzlibrary{ext.nodes, intersections, quotes, spath3}] +\begin{tikzpicture}[ultra thick] + \node (A) at (0, 0) {A} ; + \node (B) at (3, 0) {B} ; + \draw [red, ->, nodes on curve'=bend left] + (A) to node[blue,draw]{label} (B) + to ["X" {sloped, near start}, + "Z" {sloped, near end}, + "Y"] (A); +\end{tikzpicture} +\end{codeexample} +\begin{codeexample}[preamble=\usetikzlibrary{ext.nodes, intersections, quotes, spath3}] +\tikz[inner sep=.15em, circle, nodes={draw, green}, sloped, ultra thick] + \draw[->, nodes on curve=bend left] (0,0) to["0"] (1,1) + to["1"] (2,0) + to["2" near start, "3", "4" near end] (4,1) + -- ++(down:1); +\end{codeexample} +\end{multicols} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-paths.timer.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-paths.timer.tex index 595a647917..37fcbc241f 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-paths.timer.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-paths.timer.tex @@ -31,6 +31,10 @@ For the |rectangle| path operator, the timer starts with |pos = 0| (= |at start| the starting coordinate in a counter-clockwise direction along the rectangle. The corners will be at positions 0.0, 0.25, 0.5, 0.75 and 1.0. +\begin{key}{/tikz/rectangle timer=|line| or |rectangle| (default |rectangle|)} +By default, the library activates the new (correct) timer for |rectangle|. +With |rectangle timer = line| the original line timer can be reinstated. +\end{key} \begin{codeexample}[width=10cm,preamble=\usetikzlibrary{ext.paths.timer}] \begin{tikzpicture}[scale=2, every pin edge/.style={latex-, gray}] \coordinate [label=above right:Target] (A) at (0,0); diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-pgffor.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-pgffor.tex new file mode 100644 index 0000000000..4d01acc24e --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-library-pgffor.tex @@ -0,0 +1,93 @@ +% !TeX spellcheck = en_US +% !TeX root = tikz-ext-manual.tex +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +\section{Repeating Things and Other Things} +\label{pkg:pgffor-ext} +\begin{texpackage}{pgffor-ext} + This package adds small niceties to the \referencePackageandIndexO{pgffor} package. + Most of these additions are also available + with the \referenceLibraryandIndex{ext.misc} library. + + \textbf{Warning:} Consider this package experimental. + At the very least, it will break the |...| notation and possibly gobbles spaces after the body. + + \inspiration{ForeachUse-Q, ForeachNoSep-Q, ForeachXparse-Q}{ForeachUse-A, ForeachNoSep-A, ForeachXparse-A} +\end{texpackage} + +Instead of |\foreach \var in {start, start + delta, ..., end}| one can use +|\foreach \var[use int=start to end step delta]|. + +\begin{key}{/pgf/foreach/use int=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} +The values \meta{start}, \meta{end} and \meta{delta} are evaluates by \pgfname math at initialization. +The part |step |\meta{delta} is optional (\meta{delta} = 1). +\end{key} + +\begin{key}{/pgf/foreach/use float=\meta{start}|to|\meta{end}\opt{|step|\meta{delta}}} +Same as above, however the results are not truncated. +\end{key} + +\begin{key}{/pgf/foreach/no separator} +This key disables any separator between elements of the list. +Every token is its own element. This also means that Unicode characters +need to be grouped between |{| and |}| if Lua\TeX\space isn't used. +Spaces will be ignored. + +\begin{codeexample}[preamble=\usetikzlibrary{ext.misc}] +\newcommand*{\board}[3][]{% + \begin{tikzpicture}[#1] + \foreach[ + count=\i from 0, + no separator, + evaluate=\i as \colX using {mod(\i,#2)}, + evaluate=\i as \rowY using {int(\i/#2)} + ] \elem in {#3} { + \draw[black, board/\elem/.try, rectangle timer/.try=line] + (\colX,\rowY) rectangle node {\elem} ++(1, 1);} + \end{tikzpicture}} +\board[ + board/W/.style={fill=red}, + board/X/.style={fill=blue!50}, + board/B/.style={fill=green}, + board/-/.style={fill=gray}, +]{3}{WXX---BXX} +\end{codeexample} +\end{key} + +\begin{key}{/pgf/foreach/normal list} +This key simply disables all other special parsers and returns to the original list parser. +\end{key} + +The following keys only work with \LaTeX\ and cannot be used when only the \referenceLibraryandIndex{ext.misc} +library or the plain\TeX\space |pgffor-ext.tex| are loaded. +For this, you will need to use |\usepackage{pgffor-ext}|. +\begin{key}{/pgf/foreach/xparser=\marg{argument specification}\marg{foreach value}} +This key can be used to specify a \referencePackageandIndeXExt{xparse} +specification for each element in the list. + +For this to work somewhat seamless, the following needs to observed: +\begin{itemize} + \item Every \marg{argument specification} get appended |u,|. + This means there's always one additional mandatory argument at the end of every element. + \item The \marg{foreach value} needs to correspond to the + \referenceKeyandIndexO[/pgf/foreach/]{var} + value. +\end{itemize} +\end{key} + +\begin{key}{/pgf/foreach/xparser Om} +Sets up a list whose elements may contain an optional argment inside |[]| which correspond to +two |\foreach| variables, say |\Options/\Text|. +\end{key} + +\begin{handler}{{.list xparse}|=|\marg{argument specification}\marg{comma-separated list of values}} + This handler causes the key to be used repeatedly, namely + once for every element of the list of values. + The \meta{comma-separated list of values} is processed using |\foreach| + and the given |xparse| \meta{argument specification} with the aforementioned |xparser| key. +\end{handler} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-body.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-body.tex index bf6620a2be..12d96ca7c5 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-body.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-body.tex @@ -8,7 +8,11 @@ % 2. under the GNU Free Documentation License. % \newcommand*\tikzextname{Ti\textit kZ-Extensions} -\newcommand*\tikzextversion{0.4.2} +\newcommand*\tikzextversion{0.5} +%\includeonly{ +% tikz-ext-manual-en-library-misc, +% tikz-ext-manual-en-library-nodes, +%} \begin{document} {\colorlet{blue}{black}% links shall be black \title{\bfseries The \tikzextname\space Package\\ @@ -64,7 +68,9 @@ These libraries only work with \tikzname. \end{center} \tikzsetfigurename{calendar-plus} \include{tikz-ext-manual-en-library-calendar-plus} +\tikzsetfigurename{layers} \include{tikz-ext-manual-en-library-layers} \tikzsetfigurename{node-families} \include{tikz-ext-manual-en-library-node-families} +\tikzsetfigurename{nodes} \include{tikz-ext-manual-en-library-nodes} \tikzsetfigurename{paths.arcto} \include{tikz-ext-manual-en-library-paths.arcto} \tikzsetfigurename{paths.ortho} \include{tikz-ext-manual-en-library-paths.ortho} \tikzsetfigurename{paths.timer} \include{tikz-ext-manual-en-library-paths.timer} @@ -161,9 +167,11 @@ These libraries (should) work with both \pgfname\space and \tikzname. \vfill \tikzsetfigurename{misc.calendar}\include{tikz-ext-manual-en-calendar} +\tikzsetfigurename{misc.pgffor}\include{tikz-ext-manual-en-library-pgffor} \tikzsetfigurename{misc.misc}\include{tikz-ext-manual-en-library-misc} %%% END +\newcommand*{\addPackage}[1]{Added package \texttt{#1-ext}.} \newcommand*{\addTikz}[1]{Added \tikzname\space library \texttt{ext.#1}.} \newcommand*{\addPGF}[1]{Added \pgfname\space library \texttt{ext.#1}.} \newcommand*{\addPGFkeys}[1]{Added \pgfname keys library \texttt{ext.#1}.} @@ -172,6 +180,14 @@ These libraries (should) work with both \pgfname\space and \tikzname. \section*{Changelog}\addcontentsline{toc}{section}{Changelog} \begin{multicols}{2}\raggedright \noindent +Version 0.5 +\begin{itemize} +\item \addPackage{pgffor} +\item \addTikz{nodes} +\item \addTikz{layers} +\item Bugfixes to |ext.calendar-plus|. +\item Allow the original |rectangle| timer with |ext.paths.timer|. +\end{itemize} Version 0.4.2 \begin{itemize} \item \addTikz{scalepicture} diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-preamble.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-preamble.tex index 682b83b435..30b21dee6a 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-preamble.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-main-preamble.tex @@ -1,4 +1,4 @@ -% !TeX spellcheck = en_US +% !TeX spellcheck = % !TeX root = tikz-ext-manual.tex % Copyright 2022 by Qrrbrbirlbel % @@ -110,6 +110,7 @@ ext.misc, ext.node-families, ext.node-families.shapes.geometric, + ext.nodes, ext.paths.arcto, ext.paths.ortho, ext.paths.timer, @@ -128,12 +129,14 @@ calc, cd, fit, + intersections, matrix, shapes.geometric, + spath3, through, trees, } - +\usepackage{pgffor-ext} %% needs Lua! \usetikzlibrary{graphs,graphdrawing} \usegdlibrary{force} @@ -306,6 +309,15 @@ \index{Path operations!#1@\protect\texttt{#1}}% } +\newcommand*{\indexPackage}[1]{% + \index{#1@\protect\texttt{#1} package}% + \index{Packages and files!#1@\protect\texttt{#1}}% +} +\newcommand*{\indexPackageO}[1]{% + \index{#1@\originalprefix\protect\texttt{\original{#1}} package\originalsuffix}% + \index{Packages and files!#1@\originalprefix\protect\texttt{\original{#1}}\originalsuffix}% +} + %% references to original \newcommand*{\indexLibraryO}[1]{% \index{#1@\originalprefix\protect\texttt{\original{#1}} library\originalsuffix}% @@ -374,33 +386,75 @@ \index{Path operations!#1@\originalprefix\protect\texttt{\original{#1}}\originalsuffix}% } +\newcommand*{\indexCommand}[1]{% + \removeats{#1}% + \index{\strippedat @\protect\texttt{\protect\string\protect#1}}% +} \newcommand*{\indexCommandO}[1]{% \removeats{#1}% \index{\strippedat @\originalprefix\protect\texttt{\original{\protect\string\protect#1}}\originalsuffix}% } +\newcommand*{\indexDecorationO}[1]{% + \index{#1@\originalprefix\protect\texttt{\original{#1}} decoration\originalsuffix}% + \index{Decorations!#1@\originalprefix\protect\texttt{\original{#1}}\originalsuffix}% +} + +\newcommand*{\indexEnvironment}[1]{% + \index{#1@\protect\texttt{#1} environment}% + \index{Environments!#1@\protect\texttt{#1}}% +} +\newcommand*{\indexEnvironmentO}[1]{% + \index{#1@\originalprefix\protect\texttt{\original{#1}} environment\originalsuffix}% + \index{Environments!#1@\originalprefix\protect\texttt{\original{#1}}\originalsuffix}% +} +\newcommand*{\referenceEnvironmentandIndexO}[1]{\texttt{#1}\indexEnvironmentO{#1}} +\newcommand*{\referenceDecorationandIndexO}[1]{\texttt{#1}\indexDecorationO{#1}} \newcommand*{\referenceKeyandIndexO}[2][/tikz/]{\texttt{#1#2}\indexKeyO[#1]{#2}} \newcommand*{\referenceKeyandIndex}[2][/tikz/]{\texttt{#1#2}\indexKey[#1]{#2}} \newcommand*{\referenceShapeandIndex}[1]{\texttt{#1}\indexShape{#1}} \newcommand*{\referenceShapeandIndexO}[1]{\texttt{#1}\indexShapeO{#1}} \newcommand*{\referenceLibraryandIndexO}[1]{\texttt{#1}\indexLibraryO{#1}} - +\newcommand*{\referenceLibraryandIndexExt}[1]{\texttt{#1}\indexLibraryExt{#1}} +\newcommand*{\referenceLibraryandIndex}[1]{\texttt{#1}\indexLibrary{#1}} +\newcommand*{\referencePackageandIndex}[1]{\texttt{#1}\indexPackage{#1}} +\newcommand*{\referencePackageandIndexO}[1]{\texttt{#1}\indexPackageO{#1}} +\newcommand*{\referencePackageandIndeXExt}[1]{\texttt{#1}\indexPackageExt{#1}} +\newcommand*{\referencePathOperationandIndex}[1]{\texttt{#1}\indexPathOperation{#1}} +\newcommand*{\referencePathOperationandIndexO}[1]{\texttt{#1}\indexPathOperationO{#1}} +\newcommand*{\referenceCommandandIndex}[1]{\texttt{\string#1}\indexCommand{#1}} +\newcommand*{\referenceCommandandIndexO}[1]{\texttt{\string#1}\indexCommandO{#1}} \colorlet{originalindex}{gray} -\newcommand*{\original}[1]{\textcolor{originalindex}{#1}} +\newcommand*{\original}[1]{\textcolor{originalindex}{#1}}% \newcommand*{\originalsuffix}{}%\textsuperscript{\textdagger}}%\normalsize \newcommand*{\originalprefix}{}%\footnotesize -%\newcommand*{\original}[1]{\textcolor{originalindex}{#1}} -%\newcommand*{\original}[1]{#1}%\textcolor{originalindex}{#1}} -%\newcommand*{\originalsuffix}{}%\textsuperscript{\color{blue}\tikzname}} -%\DeclareRobustCommand*{\originalprefix}{\smash{\footnotesize\llap{\textbullet\space}}} +\newcommand*{\indexPackageExt}[1]{% + \begingroup +% \originalExternals + \index{#1@\originalExternals{\originalprefix\protect\texttt{\original{#1}} package\originalsuffix}}% + \index{Packages and files!#1@\originalExternals{\originalprefix\protect\texttt{\original{#1}}\originalsuffix}}% + \endgroup +} +\newcommand*{\indexLibraryExt}[1]{% + \index{#1@\originalExternals{\originalprefix\protect\texttt{\original{#1}} library\originalsuffix}}% + \index{Libraries!#1@\originalExternals{\originalprefix\protect\texttt{\original{#1}}\originalsuffix}}% +} +\DeclareRobustCommand*{\originalExternals}[1]{% + \begingroup + \colorlet{originalindex}{blue!50!gray}% +% \renewcommand*{\original}[1]{\textcolor{originalindex}{##1}}% + #1% + \endgroup +} \newcommand*{\filetype}[1]{\textsc{#1}} \makeatletter \def\index@prologue{\section*{Index}\addcontentsline{toc}{section}{Index} This index contains automatically generated entries as well as {\originalprefix\original{references}\originalsuffix} to - original functionalities of \pgfname/\tikzname. + original functionalities of \pgfname/\tikzname\space + and \originalExternals{\originalprefix\original{references}\originalsuffix} to functionalities outside of \pgfname/\tikzname. \bigskip } \makeatother @@ -417,4 +471,33 @@ \newcommand*{\inspiration}[2]{% \par\textbf{Q\,\&\,A:} \cite{#1} \& \cite{#2}\par } -\newcommand*\inspirationQ[1]{\par\textbf{Q:} \cite{#1}} \ No newline at end of file +\newcommand*\inspirationQ[1]{\par\textbf{Q:} \cite{#1}} + +\newenvironment{texpackage}[1]{% no context + \begin{pgfmanualentry} + \pgfmanualentryheadline{% + \pgfmanualpdflabel{#1}{}% + {\ttfamily\char`\\usepackage\char`\{\declare{#1}\char`\}\space\space \char`\%\space\space \LaTeX}} + \index{#1@\protect\texttt{#1} package}% + \index{Packages and files!#1@\protect\texttt{#1}}% + \pgfmanualentryheadline{{\ttfamily\char`\\input \declare{#1}.tex\space\space\space \char`\%\space\space plain \TeX}} +% \pgfmanualentryheadline{{\ttfamily\char`\\usemodule[\declare{#1}]\space\space \char`\%\space\space Con\TeX t}} + \pgfmanualbody +} +{ + \end{pgfmanualentry} +} +\newenvironment{latexpackage}[1]{ + \begin{pgfmanualentry} + \pgfmanualentryheadline{% + \pgfmanualpdflabel{#1}{}% + {\ttfamily\char`\\usepackage\char`\{\declare{#1}\char`\}\space\space \char`\%\space\space \LaTeX}} + \index{#1@\protect\texttt{#1} package}% + \index{Packages and files!#1@\protect\texttt{#1}}% +% \pgfmanualentryheadline{{\ttfamily\char`\\input \declare{#1}.tex\space\space\space \char`\%\space\space plain \TeX}} +% \pgfmanualentryheadline{{\ttfamily\char`\\usemodule[\declare{#1}]\space\space \char`\%\space\space Con\TeX t}} + \pgfmanualbody +} +{ + \end{pgfmanualentry} +} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-pgf-shapes-uncentered.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-pgf-shapes-uncentered.tex index cb79e4ac7b..818408a9aa 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-pgf-shapes-uncentered.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual-en-pgf-shapes-uncentered.tex @@ -9,10 +9,10 @@ % \section{Shape: Uncentered Rectangle} -\begin{pgflibrary}{ext.shapes.uncenteredrectangle} +\begin{purepgflibrary}{ext.shapes.uncenteredrectangle} A rectangle that has a variable horizontal center with three node parts. \inspiration{UncRectCD-Q,UncRectForest-Q}{UncRectCD-A,UncRectForest-A} -\end{pgflibrary} +\end{purepgflibrary} \begin{shape}{uncentered rectangle} For some alignment problems, this shape could be useful. @@ -31,54 +31,21 @@ calculate the appropriate point on the border. In the picture below, this are marked red. \end{key} +\begin{key}{/pgf/uncentered rectangle use saved center=\meta{true}\textrm{ or }\meta{false} (default true)} +When this is set to true, the border anchors will use the horizontal center that was used when +the node was created. +\end{key} + For support of the \referenceLibraryandIndexO{cd} library of the |tikz-cd| package, this shape also supports a dynamic $y$ value for its anchors |center|, |west| and |east|. \begin{key}{/pgf/uncentered rectangle center yshift=\meta{dimension} (initially \{\})} This determines the distance between the baseline and the |center| anchors. - If \meta{dimension} is empty, the real center will be used which is the default. + If \meta{dimension} is empty, the real vertical center will be used. For use with |cd|, set this to |axis_height|. - Due to a bug with \referenceKeyandIndexO{execute at end node} - this needs a lot of fixing to be able to use in a commutative diagram, though. - -\tikzexternaldisable -\catcode`\|=12 -\begin{codeexample}[leave comments, preamble=\usetikzlibrary{cd, ext.shapes.uncenteredrectangle}] -\makeatletter -\tikzcdset{ - every diagram/.append style={ - /pgf/uncentered rectangle center=text, - /tikz/math align/.style={ - shape=uncentered rectangle, - /pgf/uncentered rectangle center yshift=axis_height, - commutative diagrams/math mode=false}, - /tikz/math align left/.style={ - math align, - /utils/exec={\def\mathalign####1=####2;{$####2$\nodepart{left}$####1={}$}}}, - /tikz/math align right/.style={ - math align, - /utils/exec={\def\mathalign####1=####2;{$####1$\nodepart{right}${}=####2$}}}, - /tikz/matrix of math nodes/.style={ - matrix of nodes, - nodes={ - execute at begin node=\iftikzcd@mathmode$\fi, - execute at end node =\iftikzcd@mathmode$\fi}}}} -\makeatother -\tikzcdset{install C shortcut/.code=\newcommand*\C[1]{C_{\%_{##1}}}} -\begin{tikzcd}[ - install C shortcut, - sep=tiny, - arrows={-, gray}, - cells={font=\strut, inner xsep=.2ex, inner ysep=.1ex} -] -\C{1} \drar & & |[math align right]| \mathalign m_{r_1} = \C{2}-C_\%; \dlar\\ - & C_\% \\ -\C{2} \urar & & |[math align right]| \mathalign m_{r_2} = \C{1}-C_\%; \ular -\end{tikzcd} -\end{codeexample} \end{key} -\pagebreak +%\pagebreak \begin{codeexample}[preamble=\usepgflibrary{ext.shapes.uncenteredrectangle}] \begin{tikzpicture}[style north/.style=red, style south/.style=red, style center/.style=red, style base/.style=red, style mid/.style=red] \Huge @@ -96,4 +63,69 @@ this shape also supports a dynamic $y$ value for its anchors |center|, |west| an \end{tikzpicture} \end{codeexample} \end{shape} + +\begin{tikzlibrary}{ext.shapes.uncenteredrectangle} +This library extends the \referenceLibraryandIndexO{cd} library (from the |tikz-cd| package) +so that it can be used with the |uncentered rectangle| shape. + +\inspirationQ{UncRectCD2-Q} +\end{tikzlibrary} + +This library provides only one key. +\begin{stylekey}{/tikz-ext/tikz-cd fix} +This key installs various \enquote{fixes} to the \referenceKeyandIndexO[/tikz/commutative diagrams/]{every diagram} style: + +\begin{itemize} +\item Firstly, is defines a \referenceKeyandIndexO{matrix of math nodes} key (only for the \referenceEnvironmentandIndexO{tikzcd} environment) + which allows to toggle the \referenceKeyandIndexO[/tikz/commutative diagrams/]{math mode} for each node.% + \footnote{Due to a bug with \referenceKeyandIndexO{execute at end node}, the \enquote{automatic} math mode in matrices can't be used + with multipart nodes.} +\item The helpful macro |\uncrec| will be installed. +\begin{command}{\uncrec\marg{left}\marg{center}\marg{right}} + When used as the content of |uncentered rectangle|, + the node parts will be setup so that \meta{left} is in the left part of the node part etc. +\end{command} +\item Since math mode will be disabled with the |uncentered rectangle|, it is automatically enabled for each node part with |\uncrec| but it can be disabled with the following key. +\begin{key}{/tikz/uncrec math mode=\meta{true}\textrm{ or }\meta{false} (default true)} +When enabled the contents of |\uncrec| will be set in math mode. +\end{key} +\item For easy access to the |uncentered rectangle| shape, the following keys are available inside a Commutative Diagram. +\begin{stylekey}{/tikz/uncrec=\meta{left}\textrm{ or }\meta{text}\textrm{ or }\meta{right}\textrm{ or }\meta{real} (initially text)} +This key sets the shape to |uncentered rectangle| and \referenceKeyandIndex[/pgf/]{uncentered rectangle center} to its argument. +\end{stylekey} +\begin{stylekey}{/tikz/commutative diagrams/install uncentered rectangle in columns=\meta{column}} +All nodes in column \meta{column} will be set to the |uncentered rectangle| shape. +\end{stylekey} +\end{itemize} +\end{stylekey} + +\begingroup +\tikzexternaldisable +%\catcode`\|=12 +\begin{codeexample}[leave comments, width=8cm, preamble=\usetikzlibrary{cd, ext.shapes.uncenteredrectangle}] +\tikzcdset{/tikz-ext/tikz-cd fix} +\newcommand*\C[1]{C_{\%_{#1}}} +\begin{tikzcd}[ + sep=tiny, + arrows={-, gray}, + cells={font=\strut, inner xsep=.2ex, inner ysep=.1ex}, + install uncentered rectangle in column=3 +] +\C{1} \drar & & \uncrec{}{m_{r_1}}{{} = \C{2}-C_\%} \dlar\\ + & C_\% \\ +\C{2} \urar & & \uncrec{}{m_{r_2}}{{} = \C{1}-C_\%} \ular +\end{tikzcd} +\end{codeexample} +\begin{codeexample}[leave comments, width=8cm, preamble=\usetikzlibrary{cd, ext.shapes.uncenteredrectangle}] +\tikzset{/tikz-ext/tikz-cd fix} +\begin{tikzcd}[install uncentered rectangle in column/.list={1,2}] + \uncrec{S \supset {}}{U_\tau}{} \arrow[r, "\varphi_0"] + \arrow[d, "\tau", "\sim"'] +& \uncrec{}{U_\pi}{{} \subset T} \arrow[d, "\pi", "\sim"'] +\\ + \uncrec{\operatorname{Bl}_{(0,0)}(\mathbb{A}^2) \supset{}}{V_\tau}{} \arrow[r, "\epsilon"] +& \uncrec{}{V_\pi}{{} \subset \mathbb{A}^2} +\end{tikzcd} +\end{codeexample} +\endgroup \endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.bib b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.bib index 60cf094472..25c736c7cd 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.bib +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.bib @@ -378,4 +378,120 @@ year = {2022}, } +' +@Online{ForeachNoSep-Q, + author = {daan}, + file = {Snapshot:https\://tex.stackexchange.com/questions/666263/string-conditional-tikz/666265#666265:text/html}, + month = nov, + title = {String conditional tikz}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/q/666263/16595}, + urldate = {2022-12-03}, + year = {2022}, +} + +@Online{ForeachNoSep-A, + author = {Qrrbrbirlbel}, + file = {Snapshot:https\://tex.stackexchange.com/questions/666263/string-conditional-tikz/666265#666265:text/html}, + month = nov, + title = {Answer to \enquote{String conditional tikz}}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/a/666265/16595}, + urldate = {2022-12-03}, + year = {2022}, +} + +' +@Online{ForeachXparse-Q, + author = {uulinux}, + file = {Snapshot:https\://tex.stackexchange.com/questions/618047/is-there-a-package-to-implement-this-style-of-register-diagrams-with-field-desc/667155#667155:text/html}, + month = oct, + title = {Is there a package to implement this style of "Register diagrams with field descriptions"}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/q/618047/16595}, + urldate = {2022-12-03}, + year = {2021}, +} + +@Online{ForeachXparse-A, + author = {Qrrbrbirlbel}, + file = {Snapshot:https\://tex.stackexchange.com/questions/618047/is-there-a-package-to-implement-this-style-of-register-diagrams-with-field-desc/667155#667155:text/html}, + month = dec, + title = {Answer to \enquote{Is there a package to implement this style of "Register diagrams with field descriptions"}}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/a/667155/16595}, + urldate = {2022-12-03}, + year = {2022}, +} + +' +@Software{spath3, + abstract = {{TikZ}/{PGF} package for manipulating soft paths, includes the knots and calligraphy {TikZ} libraries.}, + author = {Stacey, Andrew}, + month = dec, + note = {original-date: 2014-05-26T12:08:12Z}, + title = {spath3 {TikZ} library}, + url = {https://github.com/loopspace/spath3}, + urldate = {2022-12-10}, + year = {2022}, +} + +' +@Online{NodesOnLine-Q, + author = {Dimitris}, + file = {Snapshot:https\://tex.stackexchange.com/questions/667338/draw-two-concentric-circles-and-a-shaded-area-with-associated-text/667341#667341:text/html}, + month = dec, + title = {Draw two concentric circles and a shaded area with associated text}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/q/667338/16595}, + urldate = {2022-12-12}, + year = {2022}, +} + +@Online{NodesOnLine-A, + author = {Qrrbrbirlbel}, + file = {Snapshot:https\://tex.stackexchange.com/questions/667338/draw-two-concentric-circles-and-a-shaded-area-with-associated-text/667341#667341:text/html}, + month = dec, + title = {Answer to \enquote{Draw two concentric circles and a shaded area with associated text}}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/a/667341/16595}, + urldate = {2022-12-12}, + year = {2022}, +} + +' +@Online{NodesOnCurve-Q, + author = {Liblit, Ben}, + file = {Snapshot:https\://tex.stackexchange.com/questions/99945/path-with-both-mark-connection-node-and-arrow-tip/667487#667487:text/html}, + month = feb, + title = {path with both mark connection node and arrow tip}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/q/99945/16595}, + urldate = {2022-12-12}, + year = {2013}, +} + +@Online{NodesOnCurve-A, + author = {Qrrbrbirlbel}, + file = {Snapshot:https\://tex.stackexchange.com/questions/99945/path-with-both-mark-connection-node-and-arrow-tip/667487#667487:text/html}, + month = dec, + title = {Answer to \enquote{path with both mark connection node and arrow tip}}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/a/667487/16595}, + urldate = {2022-12-12}, + year = {2022}, +} + +' +@Online{UncRectCD2-Q, + author = {sro5h}, + file = {Snapshot:https\://tex.stackexchange.com/questions/652540/achieve-desired-alignment-of-arrows-in-tikz-cd-diagram:text/html}, + month = jul, + title = {Achieve desired alignment of arrows in tikz-cd diagram}, + titleaddon = {{TeX} - {LaTeX} Stack Exchange}, + url = {https://tex.stackexchange.com/q/652540/16595}, + urldate = {2023-02-19}, + year = {2022}, +} + @Comment{jabref-meta: databaseType:bibtex;} diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.pdf b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.pdf index 855ee19374..c04e209f81 100644 Binary files a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.pdf and b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.pdf differ diff --git a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.tex b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.tex index 3070585487..1f2400847a 100644 --- a/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.tex +++ b/graphics/pgf/contrib/tikz-ext/doc/tikz-ext-manual.tex @@ -11,18 +11,22 @@ % \documentclass[a4paper,doc2,landscape]{ltxdoc} + \input{tikz-ext-manual-en-main-preamble.tex} \usetikzlibrary{external} +%\newif\iftikzextmanualexternalize +%\tikzextmanualexternalizetrue +%\iftikzextmanualexternalize \tikzexternalize[ prefix=tikz/, % mode=convert with system call, %mode=list and make, %mode=list only,export=true,% simply skips EVERY picture -> good for debugging the text. ] -% \tikzexternalenable - \tikzexternaldisable - \tikzifexternalizing{ - \pgfkeys{/pdflinks/codeexample links=false} - }{} + \tikzexternalenable + \tikzifexternalizing{% + \pgfkeys{/pdflinks/codeexample links=false}% + }{}% +%\fi \input{tikz-ext-manual-en-main-body.tex} diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/pgffor-ext.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/pgffor-ext.code.tex new file mode 100644 index 0000000000..b4d9e60f50 --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/pgffor-ext.code.tex @@ -0,0 +1,73 @@ +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +%% foreach +%% http://tex.stackexchange.com/a/126418/16595 +%% instead of \foreach \var in {start, start + delta, ..., end} +%% this allows to use \foreach[use int={start to end step delta}] without(!) a list in {} +%% the values start, end and delta are evaluated by PGFmath at the start of the loop. +%% In addition to use int, there's also use float. +\newif\iftikzext@pgf@foreach@no@list +\pgfqkeys{/pgf/foreach}{ + normal list/.code={% + \tikzext@pgf@foreach@no@listfalse + \def\pgffor@scan{\pgfutil@ifnextchar({\pgffor@scanround}{\pgffor@scanone}}% + }, + no separator/.code={% token for token + \def\pgffor@scan@custom##1{% + \def\pgffor@value{##1}% + \pgffor@scanned + }% + \def\pgffor@scan@custom@comma,{% + \pgfutil@ifnextchar\pgffor@stop + \pgffor@scanone + {\pgffor@scan@custom,}% + }% + \def\pgffor@scan{% + \pgfutil@ifnextchar,% + \pgffor@scan@custom@comma + {% + \pgfutil@ifnextchar\pgffor@stop + \pgffor@scanone + \pgffor@scan@custom + }% + }% + }, + use int/.code={% + \tikzext@pgf@foreach@no@list@parse@to\pgfmathtruncatemacro#1\pgffor@stop + }, + use float/.code={% + \tikzext@pgf@foreach@no@list@parse@to\pgfmathsetmacro#1\pgffor@stop + } +} + +\def\tikzext@pgf@foreach@no@list@parse@to#1#2to#3\pgffor@stop{% + \tikzext@pgf@foreach@no@listtrue + #1\foreachStart{#2}% + \pgfutil@in@{step}{#3} + \ifpgfutil@in@ + \tikzext@pgf@foreach@no@list@parse@step{#1}#3\pgffor@stop + \else + \tikzext@pgf@foreach@no@list@parse@step{#1}#3step1\pgffor@stop + \fi + \edef\tikzext@pgf@foreach@no@list@list{\foreachStart,\foreachSecond,...,\foreachEnd}% +} +\def\tikzext@pgf@foreach@no@list@parse@step#1#2step#3\pgffor@stop{% + #1\foreachEnd{#2}% + #1\foreachSecond{\foreachStart+#3}% +} +\def\pgffor@vars{% + \pgfutil@ifnextchar i{\pgffor@@vars@end}{% + \pgfutil@ifnextchar[{\pgffor@@vars@opt}{%] + \pgfutil@ifnextchar/{\pgffor@@vars@slash@gobble}{% + \iftikzext@pgf@foreach@no@list\expandafter\pgfutil@firstoftwo\else + \expandafter\pgfutil@secondoftwo\fi + {\tikzext@pgf@foreach@no@listfalse\pgffor@macro@list\tikzext@pgf@foreach@no@list@list} + {\pgffor@@vars}}}}}% + +\endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/pgfkeyslibraryext.pgfkeys-plus.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/pgfkeyslibraryext.pgfkeys-plus.code.tex index 49aedb64c6..50cbe7a60c 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/pgfkeyslibraryext.pgfkeys-plus.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/pgfkeyslibraryext.pgfkeys-plus.code.tex @@ -88,13 +88,22 @@ }, %% http://tex.stackexchange.com/a/144187/16595 %% key/.List={(point-1),(point-2),(point-...),(point-6)} will call - %% key=(point-1)(point-2)(point-3)(point-4)(point-5),(point-6) + %% key=(point-1)(point-2)(point-3)(point-4)(point-5)(point-6) .List/.code=% \let\pgfkeys@global@temp\pgfutil@empty \foreach\pgfkeys@temp in{#1}{% \expandafter\pgfutil@g@addto@macro\expandafter\pgfkeys@global@temp\expandafter{\pgfkeys@temp}% }% - \expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@global@temp}% + \expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@global@temp}, + .--/.code=% decrements a value (only TeX integers!) + \pgfkeyssetevalue{\pgfkeyscurrentpath} + {\the\numexpr\pgfkeysvalueof{\pgfkeyscurrentpath}-1\relax}, + .++/.code=% increments a value (only TeX integers!) + \pgfkeyssetevalue{\pgfkeyscurrentpath} + {\the\numexpr\pgfkeysvalueof{\pgfkeyscurrentpath}+1\relax}, + .value/.code=% copies the value of one key to another w/o expanding it + \pgfkeysgetvalue{#1}\pgfkeys@temp + \expandafter\pgfkeys@exp@call\expandafter{\pgfkeys@temp}} } \pgfqkeys{/utils}{ @@ -134,6 +143,7 @@ \pgfutil@ifempty{#1}{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}% }, tex/.search also=/utils/TeX, + loops/do until/.code 2 args={\pgfutil@loop\pgfkeysalso{#1}#2\relax\pgfutil@repeat}% } \endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/pgflibraryext.shapes.uncenteredrectangle.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/pgflibraryext.shapes.uncenteredrectangle.code.tex index 182ebbbcb7..f0ed9c5c46 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/pgflibraryext.shapes.uncenteredrectangle.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/pgflibraryext.shapes.uncenteredrectangle.code.tex @@ -12,7 +12,11 @@ \let\pgfnodepartleftbox\pgfnodeparttwobox \let\pgfnodepartrightbox\pgfnodepartthreebox } + +\newif\iftikzext@uncenteredrectangle@usesavedcenter + \pgfset{ + uncentered rectangle use saved center/.is if=tikzext@uncenteredrectangle@usesavedcenter, uncentered rectangle center yshift/.initial=, uncentered rectangle center/@center/.initial=2, uncentered rectangle center/.is choice, @@ -176,8 +180,16 @@ \advance\pgf@y by \pgf@ya }% % + \savedmacro\center{% + \pgfkeysgetvalue{/pgf/uncentered rectangle center/@center}\center + } \anchor{center}{% - \ifcase\pgfkeysvalueof{/pgf/uncentered rectangle center/@center}\relax + \ifcase + \iftikzext@uncenteredrectangle@usesavedcenter + \center + \else + \pgfkeysvalueof{/pgf/uncentered rectangle center/@center}% + \fi\relax \realCenter\or \leftCenter\or \middleCenter\or @@ -203,7 +215,8 @@ \pgfmathsetlength\pgf@y{.5ex}}% \anchor{base}{% \csname pgf@anchor@uncentered rectangle@center\endcsname - \pgf@y=0pt }% + \pgf@y=0pt + }% \anchor{left mid} {\leftCenter \pgfmathsetlength\pgf@y{+.5ex}} \anchor{text mid} {\middleCenter\pgfmathsetlength\pgf@y{+.5ex}} \anchor{right mid} {\rightCenter \pgfmathsetlength\pgf@y{+.5ex}} @@ -273,30 +286,51 @@ \pgf@xa=\pgf@x \pgf@ya=\pgf@y % xc/yc is "center" - \pgf@sh@reanchor{uncentered rectangle}{center}% + \pgf@process{\csname pgf@anchor@uncentered rectangle@center\endcsname}% \pgf@xc=\pgf@x \pgf@yc=\pgf@y \ifdim\pgf@xa<0pt % left side \southwest - \advance\pgf@x by -\pgf@xc - \advance\pgf@y by -\pgf@yc - \pgf@x=-\pgf@x - \pgf@y=-\pgf@y + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + \advance\pgf@xb by -\pgf@xc + \ifdim\pgf@ya<0pt + % south west side + \advance\pgf@yb by -\pgf@yc + \pgf@yb=-\pgf@yb + \else + % north west side + \northeast + \pgf@yb=\pgf@y + \advance\pgf@yb by -\pgf@yc + \fi + \pgf@xb=-\pgf@xb \edef\pgf@marshal{% \noexpand\pgfpointborderrectangle {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}} - {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}% }% \else % right side \northeast - \advance\pgf@x by -\pgf@xc - \advance\pgf@y by -\pgf@yc + \pgf@xb=\pgf@x + \pgf@yb=\pgf@y + \advance\pgf@xb by -\pgf@xc + \ifdim\pgf@ya>0pt + % north east side + \advance\pgf@yb by -\pgf@yc + \else + % south east side + \southwest + \pgf@yb=\pgf@y + \advance\pgf@yb by -\pgf@yc + \pgf@yb=-\pgf@yb + \fi \edef\pgf@marshal{% \noexpand\pgfpointborderrectangle {\noexpand\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}} - {\noexpand\pgfqpoint{\the\pgf@x}{\the\pgf@y}}% + {\noexpand\pgfqpoint{\the\pgf@xb}{\the\pgf@yb}}% }% \fi \pgf@process{\pgf@marshal}% diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.calendar-plus.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.calendar-plus.code.tex index 195ecf9414..1ad4c9fe52 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.calendar-plus.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.calendar-plus.code.tex @@ -13,18 +13,33 @@ \def\tikz@lib@cal@xshift{\pgfkeysvalueof{/tikz/day xshift}} \def\tikz@lib@cal@yshift{\pgfkeysvalueof{/tikz/day yshift}} +\pgfkeyslet{/tikz/day xshift/.@cmd}\@undefined +\pgfkeyslet{/tikz/day xshift/.@body}\@undefined +\pgfkeyslet{/tikz/day xshift/.@def}\@undefined +\pgfkeyslet{/tikz/day yshift/.@cmd}\@undefined +\pgfkeyslet{/tikz/day yshift/.@body}\@undefined +\pgfkeyslet{/tikz/day yshift/.@def}\@undefined \tikzset{day xshift/.initial=3ex,day yshift/.initial=3.5ex} % Shift between months \def\tikz@lib@cal@month@xshift{\pgfkeysvalueof{/tikz/month xshift}} \def\tikz@lib@cal@month@yshift{\pgfkeysvalueof{/tikz/month yshift}} +\pgfkeyslet{/tikz/month xshift/.@cmd}\@undefined +\pgfkeyslet{/tikz/month xshift/.@body}\@undefined +\pgfkeyslet{/tikz/month xshift/.@def}\@undefined +\pgfkeyslet{/tikz/month yshift/.@cmd}\@undefined +\pgfkeyslet{/tikz/month yshift/.@body}\@undefined +\pgfkeyslet{/tikz/month xshift/.@def}\@undefined \tikzset{month xshift/.initial=9ex,month yshift/.initial=9ex} % Internal option for storing the "width" of a calendar as a number of % days \def\tikz@lib@cal@width{\pgfkeysvalueof{/tikz/tikz@lib@cal@width}} +\pgfkeyslet{/tikz/tikz@lib@cal@width/.@cmd}\@undefined +\pgfkeyslet{/tikz/tikz@lib@cal@width/.@body}\@undefined +\pgfkeyslet{/tikz/tikz@lib@cal@width/.@def}\@undefined \tikzset{tikz@lib@cal@width/.initial=1} % Weeks diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.layers.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.layers.code.tex new file mode 100644 index 0000000000..c981190f4d --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.layers.code.tex @@ -0,0 +1,235 @@ +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\pgfdeclarelayer{discard} + +\def\tikzext@layers@swapfirstsetbox#1\setbox#2\tikzext@stop{% + #1\tikzext@layers@setbox@which#2% +} +\let\tikzext@layers@setbox@which\setbox + +\def\tikzshowdiscardlayeranyway{\box\pgf@layerbox@discard} +\tikzset{ + discard layer/.code=\expandafter\let\csname pgf@layerbox@#1\endcsname\pgfutil@voidb@x, + discard layer global/.code=\expandafter\global\expandafter\let\csname pgf@layerbox@#1\endcsname\pgfutil@voidb@x, +} +\def\tikzext@layers@whichbox{\tikz@figbox}% +\pgfqkeys{/tikz-ext/layers}{ + in box/.code={% + \expandafter\ifx\tikzext@layers@whichbox#1% + \pgfutil@packagewarning{tikz-ext}{Layer is already set. Setting will be skipped.}% + \else + \def\tikzext@layers@whichbox{#1}% + \def\tikz@whichbox{#1}% + \def\tikzext@layers@setbox@which{\global\setbox}% + \fi + }, + on layer/.style={ + /tikz-ext/layers/in box/.expand once=\csname pgf@layerbox@#1\endcsname + }, + discard/.style={ + /tikz-ext/layers/on layer=discard + }, + @common patch/.style={ + /tikz/behind path/.append code =\let\tikzext@layers@setbox@which\setbox, + /tikz/in front of path/.append code =\let\tikzext@layers@setbox@which\setbox, + /tikz-ext/layers/@common patch/.code=% + }, + patch/.is choice, + patch/all/.style={ + /tikz-ext/layers/@common patch, + /tikz-ext/layers/patch/node, + /tikz-ext/layers/patch/matrix, + /tikz-ext/layers/patch/pic, + /tikz-ext/layers/patch/edge, + }, + patch/node/.style={% + /utils/exec=% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\tikz@fig@continue + \expandafter\expandafter\expandafter{\expandafter\tikzext@layers@swapfirstsetbox\tikz@fig@continue\tikzext@stop},% + /tikz-ext/layers/@common patch, + /tikz-ext/layers/patch/node/.code=\pgfutil@packagewarning{tikz-ext}{You can't apply the layers patch twice.}, + /tikz/discard node/.style ={/tikz-ext/layers/discard}, + /tikz/node on layer/.style={/tikz-ext/layers/on layer={##1}}, + /tikz/node in box/.style ={/tikz-ext/layers/in box={##1}}, + }, + patch/matrix/.style={% + /utils/exec=% + \expandafter\expandafter\expandafter\def + \expandafter\expandafter\expandafter\tikz@do@matrix + \expandafter\expandafter\expandafter{\expandafter\tikzext@layers@swapfirstsetbox\tikz@do@matrix\tikzext@stop},% + /tikz-ext/layers/@common patch, + /tikz-ext/layers/patch/matrix/.code=\pgfutil@packagewarning{tikz-ext}{You can't apply the layers patch twice.}, + /tikz/execute at begin matrix={% in case patched node/edge/pic is used inside matrix + \let\tikzext@layers@setbox@which\setbox + \def\tikz@whichbox{\tikz@figbox}% + \pgfkeys{/tikz-ext/layers/in box/.code=\pgfutil@packageerror{tikz-ext}{Layers inside a matrix can't be used.}}% + }, + /tikz/discard matrix/.style ={/tikz-ext/layers/discard}, + /tikz/matrix on layer/.style={/tikz-ext/layers/on layer={##1}}, + /tikz/matrix in box/.style ={/tikz-ext/layers/in box={##1}}, + }, + patch/edge/.style={% + /utils/exec=\let\tikz@do@edge\tikzext@layers@tikz@do@edge, + /tikz-ext/layers/@common patch, + /tikz-ext/layers/patch/edge/.code=\pgfutil@packagewarning{tikz-ext}{You can't apply the layers patch twice.}, + /tikz/discard edge/.style={/tikz-ext/layers/discard}, + /tikz/edge on layer/.style={ + /tikz-ext/layers/on layer={##1} + }, + /tikz/edge in box/.style={/tikz-ext/layers/in box={##1}}, + }, + patch/pic/.style={% + /utils/exec=\let\tikz@subpicture@handle@\tikzext@layers@tikz@subpicture@handle@, + /tikz-ext/layers/@common patch, + /tikz-ext/layers/patch/pic/.code=\pgfutil@packagewarning{tikz-ext}{You can't apply the layers patch twice.}, + /tikz/discard pic/.style={/tikz-ext/layers/discard}, + /tikz/pic on layer/.style={/tikz-ext/layers/on layer={##1}}, + /tikz/pic in box/.style={/tikz-ext/layers/in box={##1}}, + } +} +\def\tikzext@layers@tikz@do@edge{% + \ifx\tikz@edge@macro\pgfutil@empty% + \tikzext@layers@setbox@which\tikz@whichbox=\hbox\bgroup% + \unhbox\tikz@whichbox% + \hbox\bgroup + \bgroup% + \pgfinterruptpath% + \pgfscope% + \let\tikz@transform=\pgfutil@empty% + \let\tikz@options=\pgfutil@empty% + \tikz@clear@rdf@options% + \let\tikz@tonodes=\tikz@collected@onpath% + \def\tikztonodes{{\pgfextra{\tikz@node@is@a@labeltrue}\tikz@tonodes}}% + \let\tikz@collected@onpath=\pgfutil@empty% + \tikz@options% + \tikz@do@rdf@pre@options% + \pgfidscope% + \tikz@do@rdf@post@options% + \tikz@transform% + \let\tikz@transform=\relax% + % Typeset node: + \let\tikz@after@path\pgfutil@empty% + \tikz@atbegin@to% + \tikz@enable@edge@quotes% + % in case patched nodes/edges/pics/matrices are used + \let\tikzext@layers@setbox@which\setbox + \def\tikz@whichbox{\tikz@figbox}% + \path[style=every edge]\expandafter[\tikz@@to@local@options](\tikztostart)\tikz@to@path + \pgfextra{\global\let\tikz@after@path@smuggle=\tikz@after@path};% + \tikz@atend@to% + \endpgfidscope% + \endpgfscope% + \endpgfinterruptpath% + \egroup + \egroup% + \egroup% + \ifx\tikzext@layers@setbox@which\setbox + \global\setbox\tikz@tempbox=\box\tikz@whichbox% + \expandafter\endgroup% + \expandafter\setbox\tikz@whichbox=\box\tikz@tempbox% + \else + \endgroup + \fi + \else% + \expandafter\expandafter\expandafter\tikz@edge@macro% + \expandafter\expandafter\expandafter{\expandafter\tikz@@to@local@options\expandafter}\expandafter{\tikz@collected@onpath}% + \endgroup% + \let\tikz@after@path@smuggle=\pgfutil@empty% + \fi% + \expandafter\tikz@scan@next@command\tikz@after@path@smuggle% +}% +\def\tikzext@layers@tikz@subpicture@handle@#1{ + \pgfkeys{/tikz/pics/.cd,#1}% + \tikz@node@transformations% + \let\tikz@transform=\relax% + \let\tikz@picmode\tikz@mode% + \tikzset{name prefix ../.style/.expanded={/tikz/name prefix=\pgfkeysvalueof{/tikz/name prefix}}}% + \ifx\tikz@fig@name\pgfutil@empty\else% + \tikzset{name prefix/.expanded=\tikz@fig@name}% + \fi% + \pgfkeysvalueof{/tikz/pics/setup code}% + \pgfkeysgetvalue{/tikz/pics/code}{\tikz@pic@code} + \ifx\tikz@pic@code\pgfutil@empty\else% Qrr: next line + \tikzext@layers@setbox@which\tikz@whichbox=\hbox\bgroup% + \unhbox\tikz@whichbox% + \hbox\bgroup + \bgroup% + \pgfinterruptpath% + \pgfscope% + \tikz@options% + % Qrr: in case patched node/matrix/edge/pic is used inside the pic + \let\tikzext@layers@setbox@which\setbox + \def\tikz@whichbox{\tikz@figbox}% + \setbox\tikz@figbox=\box\pgfutil@voidb@x% + \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x% + \tikz@atbegin@scope% + \scope[every pic/.try]% + \tikz@pic@code% + \endscope% + \tikz@atend@scope% + \endpgfscope% + \endpgfinterruptpath% + \egroup + \egroup% + \egroup% + \fi% + \pgfkeysgetvalue{/tikz/pics/foreground code}{\tikz@pic@code} + \ifx\tikz@pic@code\pgfutil@empty\else% + \unless\ifx\tikzext@layers@setbox@which\setbox + \pgfutil@packagewarning{tikz-ext}{Only the main pic code can be placed on selective layers.} + \fi + \setbox\tikz@figbox=\hbox\bgroup% + \unhbox\tikz@figbox% + \hbox\bgroup + \bgroup% + \pgfinterruptpath% + \pgfscope% + \tikz@options% + \setbox\tikz@figbox=\box\pgfutil@voidb@x% + \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x% + \tikz@atbegin@scope% + \scope[every front pic/.try]% + \tikz@pic@code% + \endscope% + \tikz@atend@scope% + \endpgfscope% + \endpgfinterruptpath% + \egroup + \egroup% + \egroup% + \fi% + \pgfkeysgetvalue{/tikz/pics/background code}{\tikz@pic@code} + \ifx\tikz@pic@code\pgfutil@empty\else% + \unless\ifx\tikzext@layers@setbox@which\setbox + \pgfutil@packagewarning{tikz-ext}{Only the main pic code can be placed on selective layers.} + \fi + \setbox\tikz@figbox@bg=\hbox\bgroup% + \unhbox\tikz@figbox@bg% + \hbox\bgroup + \bgroup% + \pgfinterruptpath% + \pgfscope% + \tikz@options% + \setbox\tikz@figbox=\box\pgfutil@voidb@x% + \setbox\tikz@figbox@bg=\box\pgfutil@voidb@x% + \tikz@atbegin@scope% + \scope[every behind pic/.try]% + \tikz@pic@code% + \endscope% + \tikz@atend@scope% + \endpgfscope% + \endpgfinterruptpath% + \egroup + \egroup% + \egroup% + \fi% + \tikz@node@finish% +}% +\endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.misc.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.misc.code.tex index a5a982020f..0f06079e74 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.misc.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.misc.code.tex @@ -35,45 +35,9 @@ \pgfmath@returnone\pgfmath@x \endgroup} -%% foreach -%% http://tex.stackexchange.com/a/126418/16595 -%% instead of \foreach \var in {start, start + delta, ..., end} -%% this allows to use \foreach[use int={start to end step delta}] without(!) a list in {} -%% the values start, end and delta are evaluated by PGFmath at the start of the loop. -%% In addition to use int, there's also use float. -\newif\iftikzext@pgf@foreach@no@list -\pgfqkeys{/pgf/foreach}{ - use int/.code={% - \tikzext@pgf@foreach@no@list@parse@to\pgfmathtruncatemacro#1\pgffor@stop - }, - use float/.code={% - \tikzext@pgf@foreach@no@list@parse@to\pgfmathsetmacro#1\pgffor@stop - } -} - -\def\tikzext@pgf@foreach@no@list@parse@to#1#2to#3\pgffor@stop{% - \tikzext@pgf@foreach@no@listtrue - #1\foreachStart{#2}% - \pgfutil@in@{step}{#3} - \ifpgfutil@in@ - \tikzext@pgf@foreach@no@list@parse@step{#1}#3\pgffor@stop - \else - \tikzext@pgf@foreach@no@list@parse@step{#1}#3step1\pgffor@stop - \fi - \edef\tikzext@pgf@foreach@no@list@list{\foreachStart,\foreachSecond,...,\foreachEnd}% -} -\def\tikzext@pgf@foreach@no@list@parse@step#1#2step#3\pgffor@stop{% - #1\foreachEnd{#2}% - #1\foreachSecond{\foreachStart+#3}% -} -\def\pgffor@vars{% manually extended, better etoolbox - \pgfutil@ifnextchar i{\pgffor@@vars@end}{% - \pgfutil@ifnextchar[{\pgffor@@vars@opt}{%] - \pgfutil@ifnextchar/{\pgffor@@vars@slash@gobble}{% - \iftikzext@pgf@foreach@no@list\expandafter\pgfutil@firstoftwo\else - \expandafter\pgfutil@secondoftwo\fi - {\tikzext@pgf@foreach@no@listfalse\pgffor@macro@list\tikzext@pgf@foreach@no@list@list} - {\pgffor@@vars}}}}}% +\pgfutil@IfUndefined{tikzext@pgf@foreach@no@list@parse@to}{% stupid test + \input pgffor-ext.code.tex +}{} %% PGFmath %% strrepeat("x", 5) = "xxxxx" @@ -134,6 +98,7 @@ \pgfmathdeclarefunction{distancebetween}{2}{% only coordinates/nodes \begingroup + \nullfont \pgfpointdiff{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}% \edef\pgfmath@temp{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% \expandafter\pgfmathveclen@\pgfmath@temp @@ -141,6 +106,7 @@ \endgroup} \pgfmathdeclarefunction{qdistancebetween}{1}{% only coordinates/nodes \begingroup + \nullfont \pgfpointdiff{\pgfpointorigin}{\pgfpointanchor{#1}{center}}% \edef\pgfmath@temp{{\pgf@sys@tonumber\pgf@x}{\pgf@sys@tonumber\pgf@y}}% \expandafter\pgfmathveclen@\pgfmath@temp @@ -148,10 +114,20 @@ \endgroup} \pgfmathdeclarefunction{qanglebetween}{1}{% - \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfpointanchor{#1}{center}}} + \begingroup + \nullfont + \pgfmathanglebetweenpoints{\pgfpointorigin}{\pgfpointanchor{#1}{center}}% + \pgfmath@smuggleone\pgfmathresult + \endgroup +} \pgfmathdeclarefunction{anglebetween}{2}{% - \pgfmathanglebetweenpoints{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}} + \begingroup + \nullfont + \pgfmathanglebetweenpoints{\pgfpointanchor{#1}{center}}{\pgfpointanchor{#2}{center}}% + \pgfmath@smuggleone\pgfmathresult + \endgroup +} \pgfmathdeclarefunction{isEmpty}{1}{% \begingroup @@ -177,4 +153,57 @@ \pgfutil@g@addto@macro\pgfmathdeclareconstant@@@{\pgfmathdeclarepseudoconstant{#1}{\def\pgfmathresult{#2}}}% \pgfmathdeclareconstant@#3\pgf@stop }% -} \ No newline at end of file +} + +%%% Some shape + +\tikzset{% quick versions of reverse clips + reverse clip/.is choice, + reverse clip/clockwise/.code={% + \begingroup + \pgfsetcornersarced{\pgfpointorigin}% + \pgfpathqmoveto{16000pt}{16000pt}% + \pgfpathqlineto{16000pt}{-16000pt}% + \pgfpathqlineto{-16000pt}{-16000pt}% + \pgfpathqlineto{-16000pt}{16000pt}% + \pgfpathclose + \endgroup + }, + reverse clip/counter clockwise/.code={% + \begingroup + \pgfsetcornersarced{\pgfpointorigin}% + \pgfpathqmoveto{16000pt}{16000pt}% + \pgfpathqlineto{-16000pt}{16000pt}% + \pgfpathqlineto{-16000pt}{-16000pt}% + \pgfpathqlineto{16000pt}{-16000pt}% + \pgfpathclose + \endgroup + }, + clip rule/.is choice, + clip rule/even odd/.code=\pgfseteorule, + clip rule/nonzero/.code=\pgfsetnonzerorule, + reverse clip/.default=counter clockwise, + remember path/.code={% + \tikz@addmode{% + \expandafter\pgfsyssoftpath@getcurrentpath\csname tikz@intersect@path@name@remember path-#1\endcsname + \immediate\write\pgfutil@auxout{% + \noexpand\expandafter\gdef\noexpand\csname tikz@intersect@path@name@remember path-#1\endcsname{% + \expandafter\expandafter\expandafter\unexpanded + \expandafter\expandafter\expandafter{% + \csname tikz@intersect@path@name@remember path-#1\endcsname + }% + }% + }% + }% + }, + remembered path/.code={% + \pgfutil@IfUndefined{tikz@intersect@path@name@remember path-#1}{}{% + \tikz@addmode{% + \expandafter\pgfsyssoftpath@setcurrentpath + \expandafter{% + \csname tikz@intersect@path@name@remember path-#1\endcsname + }% + }% + }% + },% +} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.node-families.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.node-families.code.tex index c0ecda441a..8661ec637a 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.node-families.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.node-families.code.tex @@ -67,6 +67,19 @@ }% } +% #1 = family type +% #2 = family +\def\tikzext@nf@get#1#2{% + \pgfutil@IfUndefined{tikzext@nf@#1@\pgfkeysvalueof{/tikz/node family/prefix}#2@previous} + {0pt} + {\csname tikzext@nf@#1@\pgfkeysvalueof{/tikz/node family/prefix}#2@previous\endcsname}% +} +\def\tikzextnodefamiliesgetwidth{\tikzext@nf@get{width}} +\def\tikzextnodefamiliesgetheight{\tikzext@nf@get{height}} +\def\tikzextnodefamiliesgettextwidth{\tikzext@nf@get{text width}} +\def\tikzextnodefamiliesgettextdepth{\tikzext@nf@get{text depth}} +\def\tikzextnodefamiliesgettextheight{\tikzext@nf@get{text height}} + \pgfdeclareshape{Rectangle}{% \savedanchor\northeast{% % Calculate x diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.nodes.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.nodes.code.tex new file mode 100644 index 0000000000..ab7678022b --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.nodes.code.tex @@ -0,0 +1,140 @@ +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\newcount\tikzext@nodesonpath +\tikzset{ + pic/.is if=tikz@node@is@pic, + /tikz-ext/nodes/node on line/.style 2 args={ + /tikz/to path={ + \pgfextra{% + \edef\tikz@temp{% rescuing nodes and target for edge + edge[ + line to,% -- + path only,% no draw, no fill, … + every edge quotes/.append style={auto=false},% node *on* the line + nodes={alias=tikzext-node on line}] + coordinate(tikzext-node on line)% fallback coordinate + \unexpanded\expandafter{\tikz@tonodes}(\tikztotarget) + }\expandafter + }\tikz@temp + -- (tikzext-node on line#1) + (tikzext-node on line#2) + -- (\tikztotarget) + } + }, + /tikz-ext/nodes/@node on line/.style args={#1 and #2}{ + /tikz-ext/nodes/node on line={.#1}{.#2} + }, + node on line/.default=, + node on line/.code={% + \pgfutil@ifempty{#1}{% + \pgfkeys{/tikz-ext/nodes/node on line={}{}}% + }{% + \pgfutil@in@{ and }{#1}% + \ifpgfutil@in@ + \pgfkeys{/tikz-ext/nodes/@node on line={#1}}% + \else + \pgfkeys{/tikz-ext/nodes/@node on line={#1 and #1}}% + \fi + }% + }, + nodes on line/.style={ + /tikz/to path={ + \pgfextra{% + \tikzext@nodesonpath=0 + \edef\tikz@temp{% rescuing nodes and target for edge + edge[ + line to,% -- + path only,% no draw, no fill, … + every edge quotes/.append style={auto=false},% node *on* the line + nodes={ + /utils/exec=\global\noexpand\advance\tikzext@nodesonpath by 1, + alias=tikzext-node on line-\noexpand\the\tikzext@nodesonpath + }] + \pgfutil@unexpanded\expandafter{\tikz@tonodes}(\tikztotarget) + }\expandafter + }\tikz@temp + \ifnum\tikzext@nodesonpath=0 + -- (\tikztotarget) + \else + -- (tikzext-node on line-1) + \unless\ifnum\tikzext@nodesonpath=1 + foreach[expand list] \tikzext@counter in {2, ..., \the\tikzext@nodesonpath} { + (tikzext-node on line-\pgfinteval{\tikzext@counter-1}) + -- (tikzext-node on line-\tikzext@counter) + } + \fi + (tikzext-node on line-\the\tikzext@nodesonpath) -- (\tikztotarget) + \fi + } + }, + %%% nodes on curve, needs spath3 + /tikz-ext/spath/split multiple at intersections/.style n args={3}{ + /utils/temp/.style={ + /tikz/spath/split at intersections with={#1}{#2##1} + }, + /utils/temp/.list={#3} + }, + nodes on curve/.default=line to, + nodes on curve'/.default=line to, + nodes on curve/.style={% normal path + /tikz-ext/nodes/nodes on curve={#1}{/tikz/spath/append}{} + }, + nodes on curve'/.style={% for edges and tos + /tikz-ext/nodes/nodes on curve={#1}{/tikz/spath/use}{% + \ifx\tikz@to@or@edge@function\tikz@do@to(\tikztotarget)\fi + } + }, + % spath/prefix/tikzext-nodes/.style={ + % set prefix=tikzext-node on curve + % }, + % spath/suffix/tikzext-nodes/.style={ + % set suffix= + % }, + /tikz-ext/nodes/nodes on curve/.code n args={3}{% + \pgfutil@IfUndefined{tikz@library@spath3@loaded}{% + \pgfutil@packagerror{tikz-ext}{% + You need to say \string\usetikzlibrary{spath3} to use nodes on curve.}{}% + }{% + \tikzset{to path={% + % \def\tikz@to@path{% to path = + \pgfextra{% + \tikzext@nodesonpath=0 + \edef\tikz@temp{% rescuing nodes and target for edge + edge[% + #1, path only,% path only = no draw, no fill, … + every edge quotes/.append style={auto=false},% node *on* the line + nodes={ + /utils/exec=\global\noexpand\advance\tikzext@nodesonpath by 1, + % spath/set name=tikzext-nodes, + spath/save global=tikzext-node on curve-\noexpand\the\tikzext@nodesonpath, + }, + % spath/set name=tikzext-nodes, + spath/save global=tikzext-node on curve-curve + ] + \pgfutil@unexpanded\expandafter{\tikz@tonodes}(\tikztotarget) + }\expandafter + }\tikz@temp + [% + /tikz-ext/spath/split multiple at intersections/.expanded=% + {tikzext-node on curve-curve}% + {tikzext-node on curve-}% + {1\ifnum\tikzext@nodesonpath>1 ,...,\the\tikzext@nodesonpath\fi}, + spath/remove components/.expanded={tikzext-node on curve-curve}{% + 2% + \ifnum\tikzext@nodesonpath>1 + ,4,...,\pgfinteval{2*\the\tikzext@nodesonpath}% + \fi + }, + #2=tikzext-node on curve-curve% + ]% + #3% + }}% + } + } +} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.paths.timer.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.paths.timer.code.tex index 3a4d30e68f..5fadd1738d 100644 --- a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.paths.timer.code.tex +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.paths.timer.code.tex @@ -5,6 +5,7 @@ % 1. under the LaTeX Project Public License and/or % 2. under the GNU Free Documentation License. % + \def\tikz@rectB#1{% originally from tikz.code.tex \tikz@make@last@position{#1}% \edef\tikz@timer@end{\noexpand\pgfqpoint{\the\tikz@lastx}{\the\tikz@lasty}}% @@ -63,7 +64,7 @@ \tikz@scan@next@command } -\def\tikz@timer@rectangle{% +\def\tikzext@timer@rectangle{% \pgfutil@tempdima\tikz@time pt \ifdim\pgfutil@tempdima<.5pt\else % if we're at the return pos-ition we switch start and end \advance\pgfutil@tempdima-.5pt @@ -185,4 +186,11 @@ {\noexpand\tikz@timer@end}}% \tikz@marshall } + +\tikzset{ + rectangle timer/.is choice, + rectangle timer/line/.code=\let\tikz@timer@rectangle\tikz@timer@line, + rectangle timer/rectangle/.code=\let\tikz@timer@rectangle\tikzext@timer@rectangle, + rectangle timer=rectangle +} \endinput \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.shapes.uncenteredrectangle.code.tex b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.shapes.uncenteredrectangle.code.tex new file mode 100644 index 0000000000..71ee1d6be8 --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/generic/tikzlibraryext.shapes.uncenteredrectangle.code.tex @@ -0,0 +1,46 @@ +% Copyright 2023 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% +\usepgflibrary{ext.shapes.uncenteredrectangle} +\newif\iftikzext@uncrec@mathmode +\pgfqkeys{/tikz-ext}{ + tikz-cd fix/.code={% #1 + \tikzcdset{ + /tikz-ext/tikz-cd fix/.code=, + urc/.style={/pgf/uncentered rectangle center={##1}}, + every diagram/.append style={% ##1 + /pgf/uncentered rectangle center yshift=axis_height, + /tikz/uncentered rectangle/.style={ + /tikz/shape=uncentered rectangle, + /tikz/commutative diagrams/math mode=false, + }, + /tikz/matrix of math nodes/.style={ + /tikz/matrix of nodes, + /tikz/nodes={ + execute at begin node=\iftikzcd@mathmode$\fi, + execute at end node=\iftikzcd@mathmode$\fi + } + }, + /utils/exec=% + \def\uncrec####1####2####3{% + \iftikzext@uncrec@mathmode$\fi####2\iftikzext@uncrec@mathmode$\fi + \nodepart{left}\iftikzext@uncrec@mathmode$\fi####1\iftikzext@uncrec@mathmode$\fi + \nodepart{right}\iftikzext@uncrec@mathmode$\fi####3\iftikzext@uncrec@mathmode$\fi + }, + /tikz/uncrec math mode/.is if=tikzext@uncrec@mathmode, + /tikz/uncrec math mode=true, + /tikz/uncrec/.style={% ####1 + /tikz/uncentered rectangle, + /pgf/uncentered rectangle center={####1} + }, + install uncentered rectangle in column/.style={ + /tikz/column ####1/.append style={/tikz/uncentered rectangle} + } + } + } + } +} \ No newline at end of file diff --git a/graphics/pgf/contrib/tikz-ext/tex/latex/pgffor-ext.sty b/graphics/pgf/contrib/tikz-ext/tex/latex/pgffor-ext.sty new file mode 100644 index 0000000000..28f359a813 --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/latex/pgffor-ext.sty @@ -0,0 +1,44 @@ +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\RequirePackage{pgffor} +\ifcsname tikzext@pgf@foreach@no@list@parse@to\endcsname + \expandafter\@gobble +\else + \expandafter\@firstofone +\fi +{ + \input{pgffor-ext.code.tex} +} + +\pgfqkeys{/pgf/foreach}{ + xparser/.code 2 args={% + \DeclareDocumentCommand\pgffor@scan@custom{ #1 u, }{% + \def\pgffor@value{#2}% + \pgffor@scanned + }% + \def\pgffor@scan{% + \pgfutil@ifnextchar\pgffor@stop\pgffor@scanone\pgffor@scan@custom + }% + }, + xparser Om/.style={ + xparser={ O{} }{{##1}/{##2}} + }, +} +\pgfqkeys{/handlers}{ + .list xparse/.code n args={3}{% + \def\pgf@keys@temp{}% + \foreach[xparser={#1}{#2}]\pgf@keys@key in{#3}{% + \expandafter\pgfutil@g@addto@macro\expandafter\pgf@keys@temp\expandafter{\expandafter{\pgf@keys@key}}}% + \edef\pgf@keys@list@path{\pgfkeyscurrentpath}% + \expandafter\expandafter\expandafter\pgf@keys@do@list% + \expandafter\expandafter\expandafter{% + \expandafter\pgf@keys@list@path\expandafter}% + \pgf@keys@temp\pgf@stop}% +} +\endinput diff --git a/graphics/pgf/contrib/tikz-ext/tex/plain/pgffor-ext.tex b/graphics/pgf/contrib/tikz-ext/tex/plain/pgffor-ext.tex new file mode 100644 index 0000000000..6d2527a241 --- /dev/null +++ b/graphics/pgf/contrib/tikz-ext/tex/plain/pgffor-ext.tex @@ -0,0 +1,13 @@ +% Copyright 2022 by Qrrbrbirlbel +% +% This file may be distributed and/or modified +% +% 1. under the LaTeX Project Public License and/or +% 2. under the GNU Free Documentation License. +% + +\input pgffor.tex +\catcode`\@=11 +\input pgffor-ext.code.tex +\catcode`\@=\pgfforatcode +\endinput -- cgit v1.2.3