相对坐标系

相对坐标系

考虑以下:

假设我有一个点。我希望能够将此点放置在页面上的任何位置:角落、中间,任何地方。

到目前为止,尽管我仔细阅读了手册并进行了实验,但我还是无法弄清楚如何做到这一点。似乎有某种系统可以在页面上放置一个概念网格,然后允许在该网格内进行精确放置。

我确信它存在,但我似乎找不到它。

我可以制作点和各种其他形状,但我似乎无法控制这些形状在页面上出现的位置。

我确信这是一个显而易见的问题而我忽略了一些事情。

答案1

是的,它确实存在并且相当容易使用。

这其中有很多微妙之处,因为在多个软件包中使用起来可能很麻烦。原因是必须多次编译文档才能在屏幕上获得正确的位置。

例如,A4 纸的大小不同于 A3 纸的大小;其次,由于文档制作过程中有各种软件包,您无法知道确切的页面大小。

非常适合使用此功能的软件包之一是beamer包。如果您需要该包中的此方法,则需要将其添加fragile到框架中(确保编译不会因可疑的错误消息而失败)。

首先,您需要将 应用于remember picture环境tikzpicture。这样可以tikz保存图片大小和图片中的各个部分。其次,您需要指定将overlay图片置于文本段之外的选项,允许将其放置在文本顶部而不占用任何空间。如果您不指定,overlay它将是一个常规文本框,放置在前一个 TeX 框旁边。这通常是不是在页面上相对定位时是可取的。(尝试从下面的示例中移除overlay并查看超出范围的图片)

现在,为了访问页面,您需要引用current page占据整个页面的矩形的节点。因此,您可以通过它引用锚点和您需要的任何内容。

这里有一个例子可以给你一个想法……

\documentclass{article}
\usepackage{tikz}
\usepackage[paperheight=8cm,paperwidth=12cm]{geometry}
\begin{document}
\thispagestyle{empty}
\begin{tikzpicture}[remember picture,overlay]
  \foreach \bound in {north,south,west,east,45} {
      \node[anchor=\bound] at (current page.\bound) {I am \bound-bound...};
  }
  \node at (current page.center) {I am NOT MOOVING!};
  % You can see the border of the page node with this:
  \draw[thick] (current page.south west) rectangle (current page.north east);
\end{tikzpicture}
\end{document}

结果是: 在此处输入图片描述

相对坐标系

我希望详细说明这一点,并帮助那些想要实际相对的页面的坐标系。您也可以通过其他方式执行此操作,但是为了便于参考和清晰的代码,坐标系转换非常容易理解。

所以基本上我所做的是创建一个page cs转换,将页面转换为网格,如下面的代码所示(描述 cs (-1,-1) rectangle (1,1))。

为此,您需要\tikzdeclarecoordinatesystem重新定义 cs。如果不确定如何使用,您可以在手册中查看。

% Defining a new coordinate system for the page:
%
% --------------------------
% |(-1,1)    (0,1)    (1,1)|
% |                        |
% |(-1,0)    (0,0)    (1,0)|
% |                        |
% |(-1,-1)   (0,-1)  (1,-1)|
% --------------------------
\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

这将允许您执行以下操作:

\begin{tikzpicture}[remember picture,overlay,every node/.style={anchor=center}]
  \node at (page cs:0.5,0.3) {0.5,0.3};
  \node at (page cs:-0.25,0.3) {-0.25,0.3};
  \node at (page cs:0,0) {0,0};
  \draw(page cs:-0.25,0) -- (page cs:.75,-0.5);
  \draw[thick] (page cs:-1,-1) rectangle (page cs:1,1);
\end{tikzpicture}

结果是: 在此处输入图片描述

答案2

绝对坐标定位的另一种方法:位于(0,0)页面的左上角和(1,1)页面的右下角:

\documentclass{article}
\usepackage[margin=1in,showframe]{geometry}
\usepackage{tikz}
\usetikzlibrary{calc,arrows}
\begin{document}
\begin{tikzpicture}[remember picture,overlay,shift=(current page.north west)]
\begin{scope}[x={(current page.north east)},y={(current page.south west)}]
\draw[red,->,line width=2pt] (0,0) -- (1,1);
\end{scope}
\end{tikzpicture}
\end{document}

(0,0)页面左下角和(1,1)右上角也类似。例如,如果您想定位在文本区域内,请了解边距的宽度:

\begin{tikzpicture}[remember picture,overlay,shift=(current page.south west)]
  \begin{scope}[x={(current page.south east)},y={(current page.north west)}]
    \draw[red,->,line width=2pt] (0,0) -- (1,1); 
    \draw[blue,->,line width=2pt] ($(0,0)+(1in,1in)$) -- ($(1,1)+(-1in,-1in)$); 
  \end{scope}
\end{tikzpicture} 

在此处输入图片描述

相关内容