% !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{Shape: Uncentered Rectangle}
\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{purepgflibrary}
\begin{ext_shape}{uncentered rectangle}
For some alignment problems, this shape could be useful.
It has three node parts: the standard |text| part,
the |left| part that is to the left of |text|
and the |right| part that is to the right of |text|.
When edges are to be connected with this shape, the
following key changes to which inner center this shape will
calculate the appropriate point on the border.
\begin{key}{/\pgfext/uncentered rectangle center=\meta{left}\textrm{ or }\meta{text}\textrm{ or }\meta{right}\textrm{ or }\meta{real} (initially text)}\keycompat{pgf}
Sets the center that is to be used for connecting edges.
This will also move the anchors |north|, |mid|, |base| and |south| along.
In the picture below, this are marked red.
\end{key}
\begin{key}{/\pgfext/uncentered rectangle use saved center=\meta{true}\textrm{ or }\meta{false} (default true)}\keycompat{pgf}
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}{/\pgfext/uncentered rectangle center yshift=\meta{dimension} (initially \{\})}\keycompat{pgf}
This determines the distance between the baseline and the |center| anchors.
If \meta{dimension} is empty, the real vertical center will be used.
For use with |cd|, set this to |axis_height|.
\end{key}
%\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
\node[shape example, name=n, ext_uncentered rectangle]
{centered \nodepart{left} Un \nodepart{right} \space Rectangle\vrule width 1pt height 2cm}
foreach \anchor/\pos in {
north west/above left, north/below, north east/above right, real north/above, left north/above, right north/above, text north/above,
west/left, center/above, east/right, real center/above, left center/above,right center/above,text center/below,
mid west/left, mid/left, mid east/right, real mid/above, left mid/above, right mid/above, text mid/above,
base west/left, base/right, base east/right, real base/below, left base/below, right base/below, text base/below,
south west/below left, south/above, south east/below right, real south/below, left south/below, right south/below, text south/below,
10/right, 130/below, left/left, right/right, text/right}{
plot[mark=x, only marks] coordinates {(n.\anchor)}
node[inner sep=.1em, style \anchor/.try, style/.expand once=\pos] {\tiny\ttfamily\anchor}};
\end{tikzpicture}
\end{codeexample}
\end{ext_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}{/\tikzext/tikz-cd fix}\keycompat{tikz-ext}
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 a |ext_uncentered rectangle| shape,
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 |ext_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 |ext_uncentered rectangle| and \referenceKeyandIndex[/\pgfext/]{uncentered rectangle center} to its argument.
\end{stylekey}
\begin{stylekey}{/tikz/commutative diagrams/install uncentered rectangle in column=\meta{column}}
All nodes in column \meta{column} will be set to the |ext_uncentered rectangle| shape.
\end{stylekey}
\end{itemize}
\end{stylekey}