# Question

How can I keep the current page nodes aligned with the same physical corners of the page in a document where the main layout is portrait, but some pages with longtable are in the landscape environment. In other words, how can I rotate the nodes clockwise like the header, body, margin, and footer. The nodes are from the packages tikz and tikzpagenodes.

## Example

I want to essentially be able to rotate the tikz nodes clockwise without changing the anchor names. In other words, the reference names north west, north, north east, east, south east, south, south west, west should still refer to the same locations as for a portrait page. (In the code below, the showboxes output should be rotated with the page.)

Desired Result:

1. I want to be able to draw lines around the sections without worrying about alignment in landscape or portrait. (just like I don't have to worry about the header or footer being correctly aligned: remember that the physical page will be portrait in the book; just the body will be rotated.)
2. I want the blue bar to be at the same physical location on every page of my book to indicate that that page has the start of a section on it.

## Sample Code

\documentclass{article}
\usepackage{fontspec}
\usepackage[%
a4paper,
foot=1.5cm,  % distance from top of footer to block of text aka \footskip
%   heightrounded,       % ensure an integer number of lines
marginparwidth=2cm,  % right marginal note width
marginparsep=2mm,    % distance from text block to marginal note box
%   height=\textheight,  % height of the text block
%   width=\textwidth,    % width of the text block
top=2.5cm,           % distance of the text block from the top of the page
bottom=3cm,
left=2.5cm,
right=2.5cm,
%     showframe,           % show the main blocks
%     verbose,             % show the values of the parameters in the log file
]{geometry}
\usepackage{pdflscape}
\usepackage{tikz} % Absolute positioning, advanced vector graphics
\usepackage{tikzpagenodes} % Adds nodes around page boxes (e.g. body)
\usetikzlibrary{calc,positioning,decorations} % Extensions for tikz (increase compilation time)
% Title Packages
\usepackage[compact,explicit,noindentafter]{titlesec}
\usepackage[rightlabels,dotinlabels]{titletoc}
\usepackage{tocloft}
\usepackage{needspace}
\usepackage{fancyhdr}
\usepackage{longtable}
% TikZ Definitions
\newcommand{\tikztitlenumber}[1]{%
\begin{tikzpicture}[remember picture, overlay,baseline]
\node [font=\Huge\fontsize{50}{60}\selectfont,text=blue,anchor=south east,inner sep=0pt, outer sep=0pt] (titlenumber)  {#1};
\node [] (titlerighttop) at (titlenumber.north -| current page.east) {};
\node [] (titlerightbottom) at (titlenode -| current page.east) {};
\path [fill=blue] (titlerighttop.north) rectangle ($(titlerightbottom) + (-2mm,0mm)$);
\end{tikzpicture}}

\newcommand{\marginmark}[1]{%
\tikz[overlay,remember picture] \node [minimum height=2cm,anchor=west,rotate=90, color=gray] at (current page marginpar area.south) {\fontsize{20}{30}\selectfont #1}; }

\newcommand{\tikztitleline}{%
\begin{tikzpicture}[overlay,remember picture]
\draw (titlenode.west) -- (titlenode -| current page text area.north east);
\end{tikzpicture}
}%

% TITLE FORMATTING
\titleformat{\section}[hang]{\needspace{6cm}\color{blue}\Huge\bfseries}{}{0pt}{\tikz[remember picture,overlay] \node [anchor=base west,yshift=-4mm] (titlenode) {};#1\hfill\tikztitlenumber{\thesection}}[\thispagestyle{sectionpage}\tikztitleline]
\titlespacing{\section}{0pt}{40pt}{20pt}

\newcommand{\showboxes}{%
\begin{tikzpicture}[remember picture,overlay]
\draw [red] (current page text area.south west) rectangle
(current page text area.north east);
\draw [green] (current page header area.south west) rectangle
\draw [blue] (current page footer area.south west) rectangle
(current page footer area.north east);
\draw [black] (current page marginpar area.south west) rectangle
(current page marginpar area.north east);
\end{tikzpicture}
}%

\fancypagestyle{sectionpage}
{
\fancyhf{} % clear all fields
\lfoot{}
\cfoot{}
\rfoot{%
\begin{minipage}[m]{.3\textwidth}
\begin{flushright}
\bfseries\footnotesize \thepage
\end{flushright}
\end{minipage}
\marginmark{}
}%
}%
\usepackage{lipsum}
\begin{document}
\section{Portrait Section}
\showboxes{}
\lipsum
\begin{landscape}
\showboxes{}
\section{Landscape Section}
\begin{longtable}{|l|p{6cm}|p{11cm}|p{4cm}|} \hline
\label{Table:references}
\textcolor{blue}{\textbf{Nr.}}       & \textcolor{blue}{\textbf{Start of Clause}} & \textcolor{blue}{\textbf{Info}} & \textcolor{blue}{\textbf{End of Clause}}\\ \hline
[1]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[2]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[3]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[4]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[5]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[6]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[7]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[8]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[9]  & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[10] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[11] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[14] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[15] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[16] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[17] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[19] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[20] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[21] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[22] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[23] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
[24] & These numbers  & A whole lotta info       & are not in order.   \\ \hline
\end{longtable}
\end{landscape}
\end{document}


## Honing in on the Problem

### Reduced Minimal Working Example according to Gonzalo

\documentclass{article}
\usepackage{pdflscape}
\usepackage{tikzpagenodes}
\usepackage{lipsum}

\newcommand{\showboxes}{%
\begin{tikzpicture}[remember picture,overlay]
\draw [red] (current page text area.south west) rectangle
(current page text area.north east);
\draw [green] (current page header area.south west) rectangle
\draw [blue] (current page footer area.south west) rectangle
(current page footer area.north east);
\draw [black] (current page marginpar area.south west) rectangle
(current page marginpar area.north east);
\end{tikzpicture}
}

\begin{document}
\section{Portrait Section}
\showboxes{}
\lipsum[4]
\begin{landscape}
\showboxes{}
\section{Landscape Section}
\lipsum[4]
\end{landscape}
\end{document}

• @macmadness86 I know that building truly MWEs can sometimes be difficult, but as I tried to explain before, once you have a working example, you can start trimming it down until it becomes minimal (or almost minimal). For example, see this reduced version of your code: pastebin.com/QPbEkcgr it's shorter and still allows us to understand and reproduce the problem. If you want to, you can use that code in your question (it is almost minimal). – Gonzalo Medina Feb 5 '15 at 13:43
• @macmadness86: It may be difficult for you to discern what code should be included but it is not impossible and you can learn it. Simply spent some time to ponder over every line of code if you can remove it. – Ulrike Fischer Feb 5 '15 at 15:35
• Did you actually try to trim? Did you e.g. try to remove the \fancypagestyle{sectionpage}{...} to check if it is relevant for the problem? Did you try to remove the longtable to test if it is relevant? Sorry but you are hiding behind a "I'm so helpless"-argument. – Ulrike Fischer Feb 5 '15 at 15:45
• Yes there is a chain. And so for the next step you should try to remove the \titleformat and test if it is relevant. Sorry but the fact that you could get it wrong and perhaps remove something relevant is not an excuse not to try it at all. – Ulrike Fischer Feb 5 '15 at 16:17
• The problem starts with \pgfpoint and the current page node. – John Kormylo Feb 5 '15 at 18:14

If you want to leave the page nodes precisely where the were in portrait (except rotated), you can use the following.

\documentclass{article}
%\usepackage{fontspec}
\usepackage[%
letterpaper,
foot=1.5cm,  % distance from top of footer to block of text aka \footskip
%   heightrounded,       % ensure an integer number of lines
marginparwidth=2cm,  % right marginal note width
marginparsep=2mm,    % distance from text block to marginal note box
%   height=\textheight,  % height of the text block
%   width=\textwidth,    % width of the text block
top=2.5cm,           % distance of the text block from the top of the page
bottom=3cm,
left=2.5cm,
right=2.5cm,
%     twoside
%     showframe,           % show the main blocks
%     verbose,             % show the values of the parameters in the log file
]{geometry}
\usepackage{pdflscape}
\usepackage{tikz} % Absolute positioning, advanced vector graphics
\usetikzlibrary{calc,positioning,decorations} % Extensions for tikz (increase compilation time)
\usepackage{tikzpagenodes} % Adds nodes around page boxes (e.g. body)
\usepackage{fancyhdr}
\usepackage[compact,explicit,noindentafter]{titlesec}
\usepackage[rightlabels,dotinlabels]{titletoc}
\usepackage{tocloft}
\usepackage{needspace}
\usepackage{lipsum}

\makeatletter
\newif\if@landscape% add test for landscape mode
\@landscapefalse
\let\old@landscape=\landscape
\def\landscape{\@landscapetrue\old@landscape}
\let\old@endlandscape=\endlandscape
\def\endlandscape{\old@endlandscape
\@landscapefalse}

\expandafter\def\csname pgf@sh@np@current page\endcsname{%
\if@landscape
\def\southwest{\pgfpointorigin}%
\def\northeast{\pgfpoint{\pgfsys@thepageheight}{\pgfsys@thepagewidth}}%
\else
\def\southwest{\pgfpointorigin}%
\def\northeast{\pgfpoint{\pgfsys@thepagewidth}{\pgfsys@thepageheight}}%
\fi}
\expandafter\def\csname pgf@sh@nt@current page\endcsname{%
\if@landscape{1}{0}{0}{1}{\dimexpr\paperwidth-2.17in}{.5cm}%
\else{1}{0}{0}{1}{0pt}{0pt}%
\fi}
\def\pgf@sh@nt@pagenodes{%
\if@landscape{0}{-1}{1}{0}{\dimexpr\paperheight-2.17in}{\dimexpr\paperwidth+0.5cm}%
\else{1}{0}{0}{1}{0pt}{0pt}%
\fi}
\def\@newtikzpagenode#1{%
\expandafter\let\csname pgf@sh@ns@#1\expandafter\endcsname\csname pgf@sh@ns@current page\endcsname
\expandafter\let\csname pgf@sh@nt@#1\endcsname\pgf@sh@nt@pagenodes
\expandafter\let\csname pgf@sh@pi@#1\expandafter\endcsname\csname pgf@sh@pi@current page\endcsname
\expandafter\def\csname pgf@sh@np@#1\endcsname
}
\@newtikzpagenode{current page text area}{%
\if@landscape
\def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top-\linewidth}}%
\def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperwidth-\current@textarea@top}}%
\else
\def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top-\textheight}}%
\def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperheight-\current@textarea@top}}%
\fi}
\if@landscape
\else
\fi}
\@newtikzpagenode{current page footer area}{%
\if@landscape
\def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top-\linewidth-\footskip}}%
\else
\def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top-\textheight-\footskip}}%
\fi}
\@newtikzpagenode{current page marginpar area}{%
\if@landscape
\def\southwest{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep\else-\marginparsep-\marginparwidth\fi}%
{\paperwidth-\current@textarea@top-\linewidth}%
}%
\def\northeast{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep+\marginparwidth\else-\marginparsep\fi}%
{\paperwidth-\current@textarea@top}%
}%
\else
\def\southwest{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep\else-\marginparsep-\marginparwidth\fi}%
{\paperheight-\current@textarea@top-\textheight}%
}%
\def\northeast{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep+\marginparwidth\else-\marginparsep\fi}%
{\paperheight-\current@textarea@top}%
}%
\fi}
\newcommand{\lsrotate}{\if@landscape 90\else 0\fi}
%\tikzset{every node/.style={rotate=\lsrotate}}% this will also affect nodes in the text area
\makeatother

% TikZ Definitions
\newcommand{\tikztitlenumber}[1]{%
\begin{tikzpicture}[remember picture, overlay,baseline]
\node [font=\Huge\fontsize{50}{60}\selectfont,text=blue,anchor=south east,inner sep=0pt, outer sep=0pt] (titlenumber)  {#1};
\node [] (titlerighttop) at (titlenumber.north -| current page.east) {};
\node [] (titlerightbottom) at (titlenode -| current page.east) {};
\path [fill=blue] (titlerighttop.north) rectangle ($(titlerightbottom) + (-2mm,0mm)$);
\end{tikzpicture}}

\newcommand{\marginmark}[1]{%
\tikz[overlay,remember picture] \node [minimum height=2cm,anchor=west,rotate=90, color=gray] at (current page marginpar area.south) {\fontsize{20}{30}\selectfont #1}; }

\newcommand{\tikztitleline}{%
\begin{tikzpicture}[overlay,remember picture]
\draw (titlenode.west) -- (titlenode -| current page text area.north east);
\end{tikzpicture}
}%

% TITLE FORMATTING
\titleformat{\section}[hang]{\needspace{6cm}\color{blue}\Huge\bfseries}{}{0pt}{\tikz[remember picture,overlay] \node [anchor=base west,yshift=-4mm] (titlenode) {};#1\hfill\tikztitlenumber{\thesection}}[\thispagestyle{sectionpage}\tikztitleline]
\titlespacing{\section}{0pt}{40pt}{20pt}

\newcommand{\showboxes}{%
\begin{tikzpicture}[remember picture,overlay]
\draw [red] (current page text area.south west) rectangle
(current page text area.north east);
\draw [green] (current page header area.south west) rectangle
\draw [blue] (current page footer area.south west) rectangle
(current page footer area.north east);
\draw [black] (current page marginpar area.south west) rectangle
(current page marginpar area.north east);
\end{tikzpicture}
}%

\fancypagestyle{sectionpage}
{
\fancyhf{} % clear all fields
\lfoot{}
\cfoot{}
\rfoot{%
\begin{minipage}[m]{.3\textwidth}
\begin{flushright}
\bfseries\footnotesize \thepage
\end{flushright}
\end{minipage}
\marginmark{}
}%
}%

\begin{document}
\begin{landscape}
\section{Landscape Section}
\showboxes{}
\lipsum[1-4]
\begin{tikzpicture}
\node{normal tikzpicture};
\end{tikzpicture}
\end{landscape}
\section{Portrait Section}
\showboxes{}
\lipsum[1-4]
\begin{tikzpicture}
\node{normal tikzpicture};
\end{tikzpicture}
\end{document}


I quit before I got to the column nodes. Still don't know why the 0.5cm is needed.

\documentclass{article}
%\usepackage{fontspec}
\usepackage[%
a4paper,
foot=1.5cm,  % distance from top of footer to block of text aka \footskip
%   heightrounded,       % ensure an integer number of lines
marginparwidth=2cm,  % right marginal note width
marginparsep=2mm,    % distance from text block to marginal note box
%   height=\textheight,  % height of the text block
%   width=\textwidth,    % width of the text block
top=2.5cm,           % distance of the text block from the top of the page
bottom=3cm,
left=2.5cm,
right=2.5cm,
%     twoside
%     showframe,           % show the main blocks
%     verbose,             % show the values of the parameters in the log file
]{geometry}
\usepackage{pdflscape}
\usepackage{tikz} % Absolute positioning, advanced vector graphics
\usetikzlibrary{calc,positioning,decorations} % Extensions for tikz (increase compilation time)
\usepackage{tikzpagenodes} % Adds nodes around page boxes (e.g. body)

\makeatletter
\newif\if@landscape% add test for landscape mode
\@landscapefalse
\let\old@landscape=\landscape
\def\landscape{\@landscapetrue\old@landscape}
\let\old@endlandscape=\endlandscape
\def\endlandscape{\old@endlandscape\@landscapefalse}

\expandafter\def\csname pgf@sh@np@current page\endcsname{%
\if@landscape
\def\southwest{\pgfpointorigin}%
\def\northeast{\pgfpoint{\pgfsys@thepageheight}{\pgfsys@thepagewidth}}%
\else
\def\southwest{\pgfpointorigin}%
\def\northeast{\pgfpoint{\pgfsys@thepagewidth}{\pgfsys@thepageheight}}%
\fi}
\expandafter\def\csname pgf@sh@nt@current page\endcsname{%
\if@landscape{1}{0}{0}{1}{\dimexpr\paperwidth-2.17in}{.5cm}%
\else{1}{0}{0}{1}{0pt}{0pt}%
\fi}
\def\pgf@sh@nt@pagenodes{%
\if@landscape{1}{0}{0}{1}{\dimexpr\paperwidth-1.97in}{.5cm}%
\else{1}{0}{0}{1}{0pt}{0pt}%
\fi}
\def\@newtikzpagenode#1{%
\expandafter\let\csname pgf@sh@ns@#1\expandafter\endcsname\csname pgf@sh@ns@current page\endcsname
\expandafter\let\csname pgf@sh@nt@#1\endcsname\pgf@sh@nt@pagenodes
\expandafter\let\csname pgf@sh@pi@#1\expandafter\endcsname\csname pgf@sh@pi@current page\endcsname
\expandafter\def\csname pgf@sh@np@#1\endcsname
}
\@newtikzpagenode{current page text area}{%
\if@landscape
\def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top-\textheight}}%
\def\northeast{\pgfpoint{\current@textarea@left+\linewidth}{\paperwidth-\current@textarea@top}}%
\else
\def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top-\textheight}}%
\def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperheight-\current@textarea@top}}%
\fi}
\if@landscape
\else
\fi}
\@newtikzpagenode{current page footer area}{%
\if@landscape
\def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top-\textheight-\footskip}}%
\else
\def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top-\textheight-\footskip}}%
\fi}
\@newtikzpagenode{current page marginpar area}{%
\if@landscape
\def\southwest{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\linewidth+\marginparsep\else-\marginparsep-\marginparwidth\fi}%
{\paperwidth-\current@textarea@top-\textheight}%
}%
\def\northeast{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\linewidth+\marginparsep+\marginparwidth\else-\marginparsep\fi}%
{\paperwidth-\current@textarea@top}%
}%
\else
\def\southwest{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep\else-\marginparsep-\marginparwidth\fi}%
{\paperheight-\current@textarea@top-\textheight}%
}%
\def\northeast{\pgfpoint
{\current@textarea@left\ifoddpageoroneside+\textwidth+\marginparsep+\marginparwidth\else-\marginparsep\fi}%
{\paperheight-\current@textarea@top}%
}%
\fi}
\makeatother

\begin{document}
\begin{landscape}
\begin{tikzpicture}[remember picture,overlay,ultra thick]% draw nodes
\draw[red] (current page.south west) -- (current page.north east);
\draw (current page.north west) -- (current page.south east);
\draw[green] (current page header area.south west) rectangle (current page header area.north east);
\draw[red] (current page text area.south west) rectangle (current page text area.north east);
\draw[blue] (current page footer area.south west) rectangle (current page footer area.north east);
\draw[gray] (current page marginpar area.south west) rectangle (current page marginpar area.north east);
\end{tikzpicture}
\end{document}


• Hmm. Well the idea was to maintain the same page node names, because these are used in a global definition for all pages (portrait and landscape). Also, the nodes have not been rotated clockwise like the header, body, margin, and footer. – Jonathan Komar Feb 6 '15 at 7:34
• What do you mean by rotated? The north anchor is on top, etc. If you put text in them it appears right side up. – John Kormylo Feb 6 '15 at 15:16
• Okay, I've got a portable way to handle the (current page) node and am part way through the other page nodes. This will take a while. – John Kormylo Feb 6 '15 at 18:34

Well obviously the page nodes and pdflscape don't work together. Heiko could perhaps say if there is solution. As an alternative you could change the page layout e.g. with the means of the KOMA-classes:

\documentclass[pagesize]{scrartcl}

\usepackage{tikzpagenodes}
\usepackage{lipsum}

\newcommand{\showboxes}{%
\begin{tikzpicture}[remember picture,overlay]
\draw [red] (current page text area.south west) rectangle
(current page text area.north east);
\draw [green] (current page header area.south west) rectangle
\draw [blue] (current page footer area.south west) rectangle
(current page footer area.north east);
\draw [black] (current page marginpar area.south west) rectangle
(current page marginpar area.north east);
\draw [yellow,<->]  (current page.south west)-- (current page.north east) ;
\end{tikzpicture}
}

\begin{document}
\section{Portrait Section}
\showboxes{}
\lipsum[4]
\newpage
\KOMAoptions{paper=landscape}
\recalctypearea
\showboxes{}
\section{Landscape Section}
\lipsum[4]

\end{document}


The drawback is that it also changes the position of the footer - if this is not wanted one would have to install some special pagestyle on these pages.

• KOMA-class is not an option, as you can see in my original code, I am using titlesec, which is not recommended by KOMA-class. (an important detail in my original sample code). Thanks for the answer anyway. – Jonathan Komar Feb 5 '15 at 15:56
• You can use only the typearea package from the KOMAclasses e.g. tex.stackexchange.com/a/21431/2388. You can also use geometryand \newgeometry but will have to set the page size manually as geometry doesn't allow to change the paper size in mid document. – Ulrike Fischer Feb 5 '15 at 16:13
• Also, I tested your code and it does not do what the question asks. "How can I keep the nodes aligned with the SAME corners of the page", "I want to essentially be able to rotate the tikz nodes clockwise", "In the code below, the showboxes output should be ROTATED with the page.". This means for example that north west and north east would be the top right and bottom right corners of the clockwise rotated landscape page. – Jonathan Komar Feb 5 '15 at 23:05
• This doesn't make much sense (and is rather confusing) if a south anchor of a page/text area is suddenly on the left. Beside this: The text area can have an arbitrary size. You can't describe the change from portrait to landscape with a simple (canvas) transformation. Imho you have such a special requirements that you should use John's idea and create new nodes names. – Ulrike Fischer Feb 6 '15 at 14:00