
Pergunta
Como posso fazer com que minhas linhas de grade se alinhem perfeitamente de modo que correspondam aos milímetros físicos da página?
Situação
Tenho uma folha de papel A4. Quero desenhar linhas de grade com cada milímetro rotulado (obviamente o tamanho da numeração é para uso digital, realisticamente os centímetros seriam rotulados para a impressão física).
Critério
- Funciona para qualquer tamanho de papel (desde que o
\step
máximo seja ajustado) - As linhas se alinham com as dimensões físicas
- A sobreposição cobrirá quaisquer outras imagens tikz (ou qualquer outra coisa), independentemente de onde o comando for chamado no documento (posso chamar o comando em qualquer página onde desejar a grade)
Problema
- As linhas não começam na origem
- A grade não está acima da
tikzpicture
chamada dentro do documento, independentemente de onde\showgrid
é chamada.
Código de exemplo
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{anyfontsize}
\newcommand{\showgrid}{%
\begin{tikzpicture}[overlay,remember picture,every node/.style={inner sep=0pt,outer sep=0pt}]%
\draw[help lines,xstep=1mm,ystep=1mm,gray!25] (current page.north west) grid (current page.south east);
\draw[help lines,xstep=10mm,ystep=10mm,color=gray] (current page.south west) grid (current page.north east);
\foreach \step in {0,1,...,297} {
\node [anchor=north] at ($ (current page.north west) + (\step mm,0cm) $) {\fontsize{1}{2}\selectfont \step};
\node [anchor=west] at ($ (current page.north west) + (0cm,-\step mm) $) {\fontsize{1}{2}\selectfont \step};
}
\end{tikzpicture}
}%
\begin{document}
\thispagestyle{empty}
\showgrid{}
\begin{tikzpicture}[overlay,remember picture,every node/.style={fill=red,inner sep=0pt,outer sep=0pt}]%
\node [minimum width=2cm,minimum height=2cm] at (current page.center) {};
\end{tikzpicture}%
\end{document}
Saída
ATUALIZAÇÃO: Minha solução
Esta é uma solução híbrida que utiliza a abordagem do CFR combinada com a detecção automática do tamanho da página da resposta do Esdd.
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{tikzpagenodes}
\usetikzlibrary{calc}
\usetikzlibrary{backgrounds}
\usepackage{anyfontsize}
\usepackage{atbegshi}
\newcommand{\showgrid}{%
\AtBeginShipoutNext{\AtBeginShipoutAddToBoxForeground{%
\begin{tikzpicture}
[
overlay,
remember picture,
inner sep=0pt,
outer sep=0pt,
minor line/.style={help lines, draw=black!50, on background layer},
major line/.style={help lines, draw=black},
major number/.style={font=\fontsize{3}{5}\selectfont\bfseries},
minor number/.style={font=\fontsize{1}{2}\selectfont},
]
\pgfmathtruncatemacro\xmaxstep{\paperwidth/1mm}% calculate needed steps in x direction
\pgfmathtruncatemacro\ymaxstep{\paperheight/1mm}% calculate needed steps in y direction
\foreach \step in {0,1,...,\xmaxstep} {
\pgfmathsetmacro\gridlineconfig{ifthenelse(equal(int(mod(\step,10)),0),"major line","minor line")}%
\draw [\gridlineconfig] ($(current page.north west) + (\step mm,0)$) -- ($(current page.south west) + (\step mm,0)$);
}
\foreach \step in {0,1,...,\ymaxstep} {
\pgfmathsetmacro\gridlineconfig{ifthenelse(equal(int(mod(\step,10)),0),"major line","minor line")}%
\pgfmathsetmacro\numberconfig{ifthenelse(equal(int(mod(\step,10)),0),"major number","minor number")}%
\draw [\gridlineconfig] ($(current page.north west) - (0,\step mm)$) -- ($(current page.north east) - (0,\step mm)$);
\node [anchor=north,\numberconfig] at ($ (current page.north west) + (\step mm,0) $) {\step};
\node [anchor=west,\numberconfig] at ($ (current page.north west) - (0,\step mm) $) {\step};
}
\end{tikzpicture}
}%
}%
}
\tikzset{%
myseg/.style={%
red,very thick
}
}
\begin{document}
\null
\showgrid
\begin{tikzpicture}[overlay,remember picture]
\draw [myseg] (current page text area.north west) -- (current page text area.north east) -- (current page text area.south east) -- (current page text area.south west) -- (current page text area.north west);
\draw [myseg] (current page header area.north west) -- (current page header area.north east) -- (current page header area.south east) -- (current page header area.south west) -- (current page header area.north west);
\draw [myseg] (current page footer area.north west) -- (current page footer area.north east) -- (current page footer area.south east) -- (current page footer area.south west) -- (current page footer area.north west);
\draw [myseg] (current page marginpar area.north west) -- (current page marginpar area.north east) -- (current page marginpar area.south east) -- (current page marginpar area.south west) -- (current page marginpar area.north west);
\end{tikzpicture}
\end{document}
Saída
Observação:Ao fazer engenharia reversa de layouts, esta grade pode ser impressa sobre outro PDF usando a opção dimensionar para margens da impressora na maioria dos menus de impressão, porque tanto o PDF quanto a grade serão dimensionados na mesma proporção, o que significa que um milímetro reduzido será será o equivalente a um milímetro no PDF subjacente. Um exemplo de desenho em imagens usando este código pode ser encontrado aqui:https://tex.stackexchange.com/a/269156/13552
Responder1
Observe que as larguras das linhas podem não parecer uniformes no PNGS postado. Este é um artefato de uma combinação de tela pequena/visualizador de PDF e não tem nada a ver com o PDF real. Isso afeta apenas meus recortes PNG.
Acho que esta solução satisfaz os vários desejos:
- Pode ser adaptado a outros tamanhos de papel ajustando as definições do
\step
s. - O canto noroeste do papel está na origem e as linhas da grade se alinham com as dimensões físicas da página, no sentido de que os cantos noroeste de um quadrado pequeno e de um quadrado grande da grade estão alinhados com o norte -canto oeste da página.
- A grade se sobrepõe a outros conteúdos da página, incluindo
tikzpicture
vídeos, mesmo que estes sejam usadosoverlay, remember picture
por si mesmos. \showgrid
pode ser especificado em qualquer lugar da página onde a grade é necessária, inclusive antes de qualquertikzpicture
s, mesmo que eles próprios usemoverlay, remember picture
.- A grade é mostrada apenas na(s) página(s) solicitada(s). Nenhuma grade será usada para a página seguinte. (Mas seria fácil adaptar isso para que fosse mostrado em todas as páginas ou em qualquer outra coisa. Consulte a documentação de
atbegshi
.)
Desenhei a grade à mão, desenhando as linhas horizontais e verticais separadamente. Eu uso a backgrounds
biblioteca para garantir que as linhas mais claras não sejam desenhadas sobre as linhas mais escuras (o que parece um tanto estranho).
Eu uso atbegshi
para garantir que a grade seja colocada acima de todo e qualquer conteúdo da página.
\documentclass[a4paper]{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{backgrounds}
\usepackage{anyfontsize}
\newcommand{\showgrid}{%
\AtBeginShipoutNext{\AtBeginShipoutAddToBoxForeground{%
\begin{tikzpicture}
[
overlay,
remember picture,
inner sep=0pt,
outer sep=0pt,
minor line/.style={help lines, draw=gray!25, on background layer},
major line/.style={help lines, draw=gray},
]
\foreach \step in {0,...,210} {
\pgfmathsetmacro\gridlineconfig{ifthenelse(equal(int(mod(\step,10)),0),"major line","minor line")}%
\draw [\gridlineconfig] ($(current page.north west) + (\step mm,0)$) -- ($(current page.south west) + (\step mm,0)$);
}
\foreach \step in {0,...,297} {
\pgfmathsetmacro\gridlineconfig{ifthenelse(equal(int(mod(\step,10)),0),"major line","minor line")}%
\draw [\gridlineconfig] ($(current page.north west) - (0,\step mm)$) -- ($(current page.north east) - (0,\step mm)$);
\node [anchor=north] at ($ (current page.north west) + (\step mm,0) $) {\fontsize{1}{2}\selectfont \step};
\node [anchor=west] at ($ (current page.north west) - (0,\step mm) $) {\fontsize{1}{2}\selectfont \step};
}
\end{tikzpicture}
}%
}%
}
\usepackage{atbegshi}
\begin{document}
\thispagestyle{empty}
\showgrid
\begin{tikzpicture}[overlay,remember picture,every node/.style={fill=red,inner sep=0pt,outer sep=0pt}]%
\node [minimum width=2cm,minimum height=2cm] at (current page.center) {};
\end{tikzpicture}
\end{document}
Responder2
O comando \AddToShipoutPictureFG*
definido pelo pacote eso-pic
coloca seu conteúdo no topo da página atual. Além disso, é possível calcular o número necessário de etiquetas nas direções x e y dependendo do tamanho do papel.
\documentclass[a5paper]{article}
%\usepackage{fontspec} % commented to speed up compilation
\usepackage{blindtext}% dummy text
\usepackage{tikz}
\usepackage{anyfontsize}
\usepackage{eso-pic}
\newcommand{\showgrid}{%
\AddToShipoutPictureFG*{%
\begin{tikzpicture}[overlay,remember picture,
thin,nodes={font=\fontsize{1}{2}\selectfont},
yshift=\paperheight% origin is in the upper left corner
]
\draw[gray!25,step=1mm](current page.south west)grid(current page.north east);
\draw[blue!30!gray,step=10mm](current page.south west) grid(current page.north east);
\pgfmathtruncatemacro\xmaxstep{\paperwidth/1mm}% calculate needed steps in x direction
\pgfmathtruncatemacro\ymaxstep{\paperheight/1mm}% calculate needed steps in y direction
\foreach \step in {0,1,...,\xmaxstep}
\node [anchor=north] at ([xshift=\step mm]current page.north west) {\step};
\foreach \step in {0,1,...,\ymaxstep}
\node [anchor=west] at ([yshift=-\step mm]current page.north west) {\step};
% \node[fill=red]at(0,0){};% to show the origin
\end{tikzpicture}%
}%
}
\begin{document}
\blindtext[2]
\showgrid
\tikz[overlay,remember picture]\node[minimum size=2cm,fill=red] at (current page.center) {};
\blinddocument
\showgrid
\blinddocument
\end{document}
Com o pacote scrlayer
você pode definir a grade como um novo estilo de página.
\documentclass[a5paper]{article}
%\usepackage{fontspec} % commented to speed up compilation
\usepackage{blindtext}% dummy text
\usepackage{tikz}
\usepackage{anyfontsize}
\usepackage{scrlayer}
\DeclareNewLayer[foreground,page,
contents={%
\begin{tikzpicture}[thin,nodes={font=\fontsize{1}{2}\selectfont}]
\useasboundingbox(0,0)rectangle(\layerwidth,-\layerheight);
\draw[gray!25,step=1mm](0,0)grid(\layerwidth,-\layerheight);
\draw[orange!30!gray,step=10mm](0,0)grid(\layerwidth,-\layerheight);
\pgfmathtruncatemacro\xmaxstep{\layerwidth/1mm}% calculate needed steps in x direction
\pgfmathtruncatemacro\ymaxstep{\layerheight/1mm}% calculate needed steps in y direction
\foreach \step in {0,1,...,\xmaxstep}
\node [anchor=north] at (\step mm,0) {\step};
\foreach \step in {0,1,...,\ymaxstep}
\node [anchor=west] at (0,-\step mm){\step};
\end{tikzpicture}%
}
]{grid.fg}
\DeclareNewPageStyleByLayers{grid}{grid.fg}
\pagestyle{headings}
\begin{document}
\blindtext[2]
\thispagestyle{grid}
\tikz[overlay,remember picture]\node[minimum size=2cm,fill=red] at (current page.center) {};
\blinddocument
\thispagestyle{grid}
\blinddocument
\end{document}
Responder3
Solução parcial
O código abaixo tem alguns pequenos problemas.
a origem da grade está no canto inferior esquerdo da página (o OP quer o canto superior esquerdo)
o uso de
\AddToShipoutPicture
torna a origem 1. mas também cria a grade sob o conteúdo da página. Removendo-o, a grade afunda, mas a origem fica maluca.
Com\AddToShipoutPicture
Sem\AddToShipoutPicture
PM(?)E
\documentclass[a5paper]{article} % a5 just to example
%\usepackage{fontspec} % commented to speed up compilation
\usepackage{tikz}
\usetikzlibrary{shapes.misc}
\usetikzlibrary{calc}
\usepackage{anyfontsize}
\usepackage{eso-pic}
\newcommand{\showgrid}{%
% \AddToShipoutPicture{%
\begin{tikzpicture}[overlay,remember picture]
\draw[blue!30!white]
(current page.south west) grid[step=1mm]
(current page.north east);
\draw[blue!80!white]
(current page.south west) grid[step=10mm]
(current page.north east);
\foreach \step in {0,1,...,297} {
\node [anchor=north] at ($ (current page.north west) + (\step mm,0cm) $) {\fontsize{1}{2}\selectfont \step};
\node [anchor=west] at ($ (current page.north west) + (0cm,-\step mm) $) {\fontsize{1}{2}\selectfont \step};
}
\end{tikzpicture}
% }%
}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[overlay,remember picture,every node/.style={fill=red,inner sep=0pt,outer sep=0pt}]%
\node [minimum width=2cm,minimum height=2cm] at (current page.center) {};
\end{tikzpicture}%
\showgrid
\end{document}
Responder4
Aqui está uma solução que usa o pacote afterpage e redefine o comando \@outputpage. Pode ser que alguém possa corrigir este comando usando o etoolbox. Não usa a página atual.
\documentclass{article}
\usepackage{tikz}
\usepackage{afterpage}
\usetikzlibrary{calc}
\usepackage{anyfontsize}
\makeatletter
\newcommand{\showgrid}{%
\let\grid@outputpage\@outputpage
\def\@outputpage{%
\begingroup % the \endgroup is put in by \aftergroup
\let \protect \noexpand
\@resetactivechars
\global\let\@@if@newlist\if@newlist
\global\@newlistfalse
\@parboxrestore
\shipout \vbox{%
\set@typeset@protect
\aftergroup \endgroup
\aftergroup \set@typeset@protect
% correct? or just restore by ending
% the group?
\if@specialpage
\global\@specialpagefalse\@nameuse{ps@\@specialstyle}%
\fi
\if@twoside
\ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
\let\@themargin\oddsidemargin
\else \let\@thehead\@evenhead
\let\@thefoot\@evenfoot \let\@themargin\evensidemargin
\fi
\fi
\reset@font
\normalsize
\normalsfcodes
\let\label\@gobble
\let\index\@gobble
\let\glossary\@gobble
\baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
\@begindvi
\vskip \topmargin
\moveright\@themargin \vbox {%
\setbox\@tempboxa \vbox to\headheight{%
\vfil
\color@hbox
\normalcolor
\hb@xt@\textwidth{\@thehead}%
\color@endbox
}% %% 22 Feb 87
\dp\@tempboxa \z@
\box\@tempboxa
\vskip \headsep
\box\@outputbox
\baselineskip \footskip
\color@hbox
\normalcolor
\hb@xt@\textwidth{\@thefoot}%
\color@endbox
}%
\vskip-\dimexpr\textheight+\topmargin+\headheight+\headsep+\footskip+1in\relax%
\hspace*{-1in}%
\begin{tikzpicture}[every node/.style={inner sep=0pt,outer sep=0pt}]%
\draw[help lines,gray!25] (0,0) grid[step=1mm] (\paperwidth,-\paperheight);
\draw[help lines,gray] (0,0) grid[step=10mm] (\paperwidth,-\paperheight);
\foreach \step in {0,1,...,297} {
\node [anchor=north] at ($ (0,0) + (\step mm,0cm) $) {\fontsize{1}{2}\selectfont \step};
\node [anchor=west] at ($ (0,0) + (0cm,-\step mm) $) {\fontsize{1}{2}\selectfont \step};
}
\end{tikzpicture}
}%
\global\let\if@newlist\@@if@newlist
\global \@colht \textheight
\stepcounter{page}%
\let\firstmark\botmark
}\afterpage{\global\let\@outputpage\grid@outputpage}}
\makeatother
\begin{document}
\thispagestyle{empty}
test
\showgrid
and test
\begin{tikzpicture}[overlay,remember picture,every node/.style={fill=red,inner sep=0pt,outer sep=0pt}]%
\node [minimum width=2cm,minimum height=2cm] at (current page.center) {};
\end{tikzpicture}%
\newpage
test
\newpage
test
\showgrid
and test
\end{document}