0

This question regards centering of tikz picture in geometry layout. The question combines two answers that were answered here in tex.stackexchange.

The first answer explains how to position the tikz picture on the center of the page. But it does not give correct result, at least in this case.

The second answer creates in the loop tikz picture. But it counts the most important coordinates from guessed values (page cs:-0.5045,0.595).

So as a result the tikz picture is not centered and when printed both side, the difference is visible.

The question is: how to center horizontally and vertically the whole tikz picture in the geometry layout area? I can't figure out how to count the coordinates.

MWE:

\documentclass[12pt]{article}
% ############################## geometry
\usepackage{geometry}
\geometry{
 headsep = 0pt,
 headheight= 0pt, 
  hmarginratio =  1:1,
  vmarginratio = 1:1,
  bindingoffset = 0cm,
  onecolumn,
  a3paper,
  layoutwidth = 220 mm,
  layoutheight = 320 mm,
  layouthoffset=\dimexpr(\paperwidth-\csname Gm@layoutwidth\endcsname)/2\relax,
  layoutvoffset=\dimexpr(\paperheight-\csname Gm@layoutheight\endcsname)/2\relax,
  showcrop
}
\usepackage[icelandic, latin, czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{title}{RGB}{16, 13, 32}
\usepackage{mwe}
\usepackage{XCharter}

% ############################### Document

\newcommand{\czHyphen}{\rule[.45ex]{.2em}{.11ex}}
\newcommand*{\addthinS}{\hskip0.06667em\relax}
\newcommand*{\addthinSS}{\hskip0.00007em\relax}
\def\cropmarkgap{1}% mm

\makeatletter
\def\Gm@cropmark(#1,#2,#3,#4){% #1 = x direction, #2 = y direction, #3 & #4 no longet used
  \begin{picture}(0,0)
    \setlength\unitlength{1truemm}%
    \linethickness{0.25pt}%
    \put(\the\numexpr #1*\cropmarkgap\relax,0){\line(#1,0){\the\numexpr 20-\cropmarkgap}}%
    \put(0,\the\numexpr #2*\cropmarkgap\relax){\line(0,#2){\the\numexpr 20-\cropmarkgap}}%
  \end{picture}}%
\makeatother

\makeatletter
\def\parsecomma#1,#2\endparsecomma{\def\page@x{#1}\def\page@y{#2}}
\tikzdeclarecoordinatesystem{page}{
    \parsecomma#1\endparsecomma
    \pgfpointanchor{current page}{north east}
    % Save the upper right corner
    \pgf@xc=\pgf@x%
    \pgf@yc=\pgf@y%
    % save the lower left corner
    \pgfpointanchor{current page}{south west}
    \pgf@xb=\pgf@x%
    \pgf@yb=\pgf@y%
    % Transform to the correct placement
    \pgfmathparse{(\pgf@xc-\pgf@xb)/2.*\page@x+(\pgf@xc+\pgf@xb)/2.}
    \expandafter\pgf@x\expandafter=\pgfmathresult pt
    \pgfmathparse{(\pgf@yc-\pgf@yb)/2.*\page@y+(\pgf@yc+\pgf@yb)/2.}
    \expandafter\pgf@y\expandafter=\pgfmathresult pt
}
\makeatother

\usepackage{eso-pic}
\usepackage{tikzpagenodes}
%\AddToShipoutPicture{\drawbackground}
\newcommand{\shiftleft}{\hspace*{-0.55\dimexpr\csname Gm@layoutwidth\endcsname-\textwidth\relax}}
\newcommand{\shiftup}{\vspace*{-0.13\dimexpr\csname Gm@layoutheight\endcsname-\textwidth\relax}}


%%% Define "Array" interface
\makeatletter
    \newcounter{imgs}
    \setcounter{imgs}{0}
    %#1 is the image
    %#2 is the title
    %#3 is the color
    \newcommand{\addimg}[3]{%
        \stepcounter{imgs}%
        \@namedef{imgimage\theimgs}{#1}%
        \@namedef{imgtitle\theimgs}{#2}%
        \@namedef{imgcolor\theimgs}{#3}}
    \newcommand{\getimage}[1]{\expandafter\@nameuse\expandafter{imgimage#1}}%
    \newcommand{\gettitle}[1]{\expandafter\@nameuse\expandafter{imgtitle#1}}%
    \newcommand{\getcolor}[1]{\expandafter\@nameuse\expandafter{imgcolor#1}}%
\makeatother

%%% Define Cards
\addimg{example-image}{one}{blue}%
\addimg{example-image}{two}{green}%
\addimg{example-image}{three}{red}%
\addimg{example-image}{four}{yellow}%
\addimg{example-image}{five}{orange}%
\addimg{example-image}{six}{yellow}%
\addimg{example-image}{seven}{red}%
\addimg{example-image}{eight}{brown}%
\addimg{example-image}{nine}{green}%
\addimg{example-image}{ten}{blue}%
\addimg{example-image}{eleven}{green}%
\addimg{example-image}{twelve}{red}%
\addimg{example-image}{thirteen}{yellow}%
\addimg{example-image}{fourteen}{orange}%
\addimg{example-image}{fifteen}{yellow}%
\addimg{example-image}{sixteen}{red}%
\addimg{example-image}{seventeen}{brown}%
\addimg{example-image}{eighteen}{green}%
\addimg{example-image}{nineteen}{blue}%
\addimg{example-image}{twenty}{green}%
\addimg{example-image}{twenty one}{red}%
\addimg{example-image}{twenty two}{yellow}%
\addimg{example-image}{twenty three}{orange}%
\addimg{example-image}{twenty four}{yellow}%
\addimg{example-image}{twenty five}{red}%
\addimg{example-image}{twenty six}{brown}%
\addimg{example-image}{twenty seven}{green}%
\addimg{example-image}{twenty eight}{blue}%
\addimg{example-image}{twenty nine}{green}%
\addimg{example-image}{thirty}{red}%
\addimg{example-image}{thirty one}{yellow}%
\addimg{example-image}{thirty two}{orange}%


%%% Global Setup
\newcommand\xspacing{71pt}%<== space between the images
\newcommand\yspacing{71pt}%<== vertical space between rows
\newcommand\imgperrow{4}%<== number of images per row
\tikzset{p_title/.style={text centered, minimum height=0.6cm, minimum width=5cm, font=\bfseries}}
\tikzset{p_title_line/.style={ultra thin, color=violet}}

%%% Define primary for loop
\newcommand{\forloop}[2]{%
    \foreach [count=\i] \x in {#1,...,#2}%<==loop for each image in the array
    {
        \edef\gonode{\noexpand\node[inner sep=0pt] (B) at (A) {\noexpand\includegraphics[width=5cm]{\getimage{\x}}};}%<==Edit to expand the file name
         \gonode%\node [inner sep=0pt] (B) at (A) {\includegraphics[width=5cm]{\getimage{\x}}};%
        \draw [black, ultra thick] ($(B.north west)$) rectangle ($(B.south east)$);%
        \node [p_title] (AA) at ($(B.north west)+(2.5,-0.30)$) {\gettitle{\x}};%
        \draw [p_title_line, color=\getcolor{\x}](AA.south west) -- (AA.south east);%
        \pgfmathparse{Mod(\i,\imgperrow)==0?1:0};%
        \ifnum\pgfmathresult>0
            \coordinate (left) at ([yshift=-\yspacing]left);
            \path let \p1=(left),\p2=(B.south) in coordinate (A) at (\x1,\y2-\yspacing);
        \else   
            \coordinate (A) at ([xshift=\xspacing]B.east);%
        \fi
    }}
%%% Define the for loop for 2 images per row on third page
\newcommand{\forlooptwo}[2]{%
    \begingroup
    \def\imgperrow{2}
    \let\originalxspacing\xspacing
    \def\xspacing{5*\originalxspacing}
    \forloop{#1}{#2}\endgroup}

\begin{document}
    \pagestyle{empty}
    %first page
    \begin{tikzpicture}[remember picture, overlay]
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{1}{24}
    \end{tikzpicture}

    %second page
    \clearpage
    \begin{tikzpicture}[remember picture, overlay]
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{25}{32}
        \forloop{1}{16}
    \end{tikzpicture}

    %third page
    \clearpage
    \begin{tikzpicture}[remember picture, overlay]
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{17}{20}
        \forlooptwo{21}{28}
        \forloop{29}{32}
    \end{tikzpicture}
\end{document}
chejnik
  • 1,441
  • 2
  • 23
  • 42

1 Answers1

1

The incgraph package allows to center content on the page.

Therefore, I added

\usepackage{incgraph}

and enclosed the pictures into inctext environments.

\igrset{currentpaper}
\begin{inctext}
\begin{tikzpicture}
    \coordinate (A) at (page cs:-0.5045,0.595);
    \coordinate (left) at (A);
    \forloop{1}{24}
\end{tikzpicture}
\end{inctext}

The whole code is:

\documentclass[12pt]{article}
% ############################## geometry
\usepackage{geometry}
\geometry{
 headsep = 0pt,
 headheight= 0pt,
  hmarginratio =  1:1,
  vmarginratio = 1:1,
  bindingoffset = 0cm,
  onecolumn,
  a3paper,
  layoutwidth = 220 mm,
  layoutheight = 320 mm,
  layouthoffset=\dimexpr(\paperwidth-\csname Gm@layoutwidth\endcsname)/2\relax,
  layoutvoffset=\dimexpr(\paperheight-\csname Gm@layoutheight\endcsname)/2\relax,
  showcrop
}
\usepackage[icelandic, latin, czech]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\definecolor{title}{RGB}{16, 13, 32}
\usepackage{mwe}
\usepackage{XCharter}
\usepackage{incgraph}

% ############################### Document

\newcommand{\czHyphen}{\rule[.45ex]{.2em}{.11ex}}
\newcommand*{\addthinS}{\hskip0.06667em\relax}
\newcommand*{\addthinSS}{\hskip0.00007em\relax}
\def\cropmarkgap{1}% mm

\makeatletter
\def\Gm@cropmark(#1,#2,#3,#4){% #1 = x direction, #2 = y direction, #3 & #4 no longet used
  \begin{picture}(0,0)
    \setlength\unitlength{1truemm}%
    \linethickness{0.25pt}%
    \put(\the\numexpr #1*\cropmarkgap\relax,0){\line(#1,0){\the\numexpr 20-\cropmarkgap}}%
    \put(0,\the\numexpr #2*\cropmarkgap\relax){\line(0,#2){\the\numexpr 20-\cropmarkgap}}%
  \end{picture}}%
\makeatother

\makeatletter
\def\parsecomma#1,#2\endparsecomma{\def\page@x{#1}\def\page@y{#2}}
\tikzdeclarecoordinatesystem{page}{
    \parsecomma#1\endparsecomma
    \pgfpointanchor{current page}{north east}
    % Save the upper right corner
    \pgf@xc=\pgf@x%
    \pgf@yc=\pgf@y%
    % save the lower left corner
    \pgfpointanchor{current page}{south west}
    \pgf@xb=\pgf@x%
    \pgf@yb=\pgf@y%
    % Transform to the correct placement
    \pgfmathparse{(\pgf@xc-\pgf@xb)/2.*\page@x+(\pgf@xc+\pgf@xb)/2.}
    \expandafter\pgf@x\expandafter=\pgfmathresult pt
    \pgfmathparse{(\pgf@yc-\pgf@yb)/2.*\page@y+(\pgf@yc+\pgf@yb)/2.}
    \expandafter\pgf@y\expandafter=\pgfmathresult pt
}
\makeatother

\usepackage{eso-pic}
\usepackage{tikzpagenodes}
%\AddToShipoutPicture{\drawbackground}
\newcommand{\shiftleft}{\hspace*{-0.55\dimexpr\csname Gm@layoutwidth\endcsname-\textwidth\relax}}
\newcommand{\shiftup}{\vspace*{-0.13\dimexpr\csname Gm@layoutheight\endcsname-\textwidth\relax}}


%%% Define "Array" interface
\makeatletter
    \newcounter{imgs}
    \setcounter{imgs}{0}
    %#1 is the image
    %#2 is the title
    %#3 is the color
    \newcommand{\addimg}[3]{%
        \stepcounter{imgs}%
        \@namedef{imgimage\theimgs}{#1}%
        \@namedef{imgtitle\theimgs}{#2}%
        \@namedef{imgcolor\theimgs}{#3}}
    \newcommand{\getimage}[1]{\expandafter\@nameuse\expandafter{imgimage#1}}%
    \newcommand{\gettitle}[1]{\expandafter\@nameuse\expandafter{imgtitle#1}}%
    \newcommand{\getcolor}[1]{\expandafter\@nameuse\expandafter{imgcolor#1}}%
\makeatother

%%% Define Cards
\addimg{example-image}{one}{blue}%
\addimg{example-image}{two}{green}%
\addimg{example-image}{three}{red}%
\addimg{example-image}{four}{yellow}%
\addimg{example-image}{five}{orange}%
\addimg{example-image}{six}{yellow}%
\addimg{example-image}{seven}{red}%
\addimg{example-image}{eight}{brown}%
\addimg{example-image}{nine}{green}%
\addimg{example-image}{ten}{blue}%
\addimg{example-image}{eleven}{green}%
\addimg{example-image}{twelve}{red}%
\addimg{example-image}{thirteen}{yellow}%
\addimg{example-image}{fourteen}{orange}%
\addimg{example-image}{fifteen}{yellow}%
\addimg{example-image}{sixteen}{red}%
\addimg{example-image}{seventeen}{brown}%
\addimg{example-image}{eighteen}{green}%
\addimg{example-image}{nineteen}{blue}%
\addimg{example-image}{twenty}{green}%
\addimg{example-image}{twenty one}{red}%
\addimg{example-image}{twenty two}{yellow}%
\addimg{example-image}{twenty three}{orange}%
\addimg{example-image}{twenty four}{yellow}%
\addimg{example-image}{twenty five}{red}%
\addimg{example-image}{twenty six}{brown}%
\addimg{example-image}{twenty seven}{green}%
\addimg{example-image}{twenty eight}{blue}%
\addimg{example-image}{twenty nine}{green}%
\addimg{example-image}{thirty}{red}%
\addimg{example-image}{thirty one}{yellow}%
\addimg{example-image}{thirty two}{orange}%


%%% Global Setup
\newcommand\xspacing{71pt}%<== space between the images
\newcommand\yspacing{71pt}%<== vertical space between rows
\newcommand\imgperrow{4}%<== number of images per row
\tikzset{p_title/.style={text centered, minimum height=0.6cm, minimum width=5cm, font=\bfseries}}
\tikzset{p_title_line/.style={ultra thin, color=violet}}

%%% Define primary for loop
\newcommand{\forloop}[2]{%
    \foreach [count=\i] \x in {#1,...,#2}%<==loop for each image in the array
    {
        \edef\gonode{\noexpand\node[inner sep=0pt] (B) at (A) {\noexpand\includegraphics[width=5cm]{\getimage{\x}}};}%<==Edit to expand the file name
         \gonode%\node [inner sep=0pt] (B) at (A) {\includegraphics[width=5cm]{\getimage{\x}}};%
        \draw [black, ultra thick] ($(B.north west)$) rectangle ($(B.south east)$);%
        \node [p_title] (AA) at ($(B.north west)+(2.5,-0.30)$) {\gettitle{\x}};%
        \draw [p_title_line, color=\getcolor{\x}](AA.south west) -- (AA.south east);%
        \pgfmathparse{Mod(\i,\imgperrow)==0?1:0};%
        \ifnum\pgfmathresult>0
            \coordinate (left) at ([yshift=-\yspacing]left);
            \path let \p1=(left),\p2=(B.south) in coordinate (A) at (\x1,\y2-\yspacing);
        \else
            \coordinate (A) at ([xshift=\xspacing]B.east);%
        \fi
    }}
%%% Define the for loop for 2 images per row on third page
\newcommand{\forlooptwo}[2]{%
    \begingroup
    \def\imgperrow{2}
    \let\originalxspacing\xspacing
    \def\xspacing{5*\originalxspacing}
    \forloop{#1}{#2}\endgroup}

\begin{document}
    \pagestyle{empty}
    %first page
    \igrset{currentpaper}
    \begin{inctext}
    \begin{tikzpicture}
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{1}{24}
    \end{tikzpicture}
    \end{inctext}

    %second page
    \clearpage
    \begin{inctext}
    \begin{tikzpicture}
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{25}{32}
        \forloop{1}{16}
    \end{tikzpicture}
    \end{inctext}

    %third page
    \clearpage
    \begin{inctext}
    \begin{tikzpicture}
        \coordinate (A) at (page cs:-0.5045,0.595);
        \coordinate (left) at (A);
        \forloop{17}{20}
        \forlooptwo{21}{28}
        \forloop{29}{32}
    \end{tikzpicture}
    \end{inctext}
\end{document}
JP-Ellis
  • 8,929
  • 2
  • 33
  • 49
  • Can I use \begin{textblock} inside the \begin{inctext} environment? This MWE really works, it is a correct answer. But in my actual project it is still not centered - 1 mm difference is still too much, I guess. – chejnik Mar 03 '16 at 13:04
  • 1
    @chejnik I guess that textblock is a problem, because it is for absolute positioning and will quite likely not work well with inctext. inctext puts the content into a box and positions this box in the page center. – Thomas F. Sturm Mar 03 '16 at 14:06