[Tex/LaTex] How to maintain the current page nodes for portrait when temporarily entering landscape mode in TikZ

geometrylandscapepositioningtikz-pgftitlesec

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.

Related Questions

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,
 %   includeheadfoot,
     head=1.5cm,%\baselineskip,  % distance from bottom of header to block of text aka \headsep e.g. \baselineskip
     foot=1.5cm,  % distance from top of footer to block of text aka \footskip
     headheight=12pt,     % height for the header block (no equivalent for footer)
 %   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
        (current page header area.north east);
    \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
   \renewcommand{\headrulewidth}{0pt}
   \lhead{}
   \rhead{}
   \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}

Output

Page 1
Page 2

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
        (current page header area.north east);
    \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}

Best Answer

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,
 %   includeheadfoot,
     head=1.5cm,%\baselineskip,  % distance from bottom of header to block of text aka \headsep e.g. \baselineskip
     foot=1.5cm,  % distance from top of footer to block of text aka \footskip
     headheight=12pt,     % height for the header block (no equivalent for footer)
 %   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}
\@newtikzpagenode{current page header area}{%
\if@landscape
    \def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top+\headsep}}%
    \def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperwidth-\current@textarea@top+\headsep+\headheight}}%
\else
    \def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top+\headsep}}%
    \def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperheight-\current@textarea@top+\headsep+\headheight}}%
\fi}
\@newtikzpagenode{current page footer area}{%
\if@landscape
    \def\southwest{\pgfpoint{\current@textarea@left}{\paperwidth-\current@textarea@top-\linewidth-\footskip}}%
    \def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperwidth-\current@textarea@top-\linewidth-\footskip+\headheight}}%
\else
    \def\southwest{\pgfpoint{\current@textarea@left}{\paperheight-\current@textarea@top-\textheight-\footskip}}%
    \def\northeast{\pgfpoint{\current@textarea@left+\textwidth}{\paperheight-\current@textarea@top-\textheight-\footskip+\headheight}}%
\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
        (current page header area.north east);
    \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
   \renewcommand{\headrulewidth}{0pt}
   \lhead{}
   \rhead{}
   \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}

alternate page nodes