考虑以下:
假设我有一个点。我希望能够将此点放置在页面上的任何位置:角落、中间,任何地方。
到目前为止,尽管我仔细阅读了手册并进行了实验,但我还是无法弄清楚如何做到这一点。似乎有某种系统可以在页面上放置一个概念网格,然后允许在该网格内进行精确放置。
我确信它存在,但我似乎找不到它。
我可以制作点和各种其他形状,但我似乎无法控制这些形状在页面上出现的位置。
我确信这是一个显而易见的问题而我忽略了一些事情。
答案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}