我知道有tikz
,但也eso-pic
有和textpos
。我希望看到一个可能的方法列表(不一定是包),用于在页面上绝对定位事物(我认为相当于“盒子”),以及它们的优点和缺点(例如:tikz
的current page
节点非常容易使用,但通常需要两次 LaTeX 运行,并且如果您不需要它用于任何其他事情,则加载的开销tikz
相当大)。
欢迎使用 LaTeX 和 ConTeXt 解决方案
答案1
自 2018 年 12 月起,LaTeX 内核发生变更,导致\smash
,从而影响了这个答案。 感谢 Ulrike 帮我诊断问题并提供最佳解决方案每一个页面包的行为都发生了变化(自 2007 年以来没有修改过)
此方法允许您定位在页面上的任何 (x,y) 位置(相对于纸张的左上角),并且无论当前位置在哪里都可以发出。唯一的要求是,您知道顶部和左边距是多少,它们包含在 中\atxy
。它使用everypage
包。
如果您更喜欢将原点放在不同的位置,例如相对于边缘,那么这是一个微不足道的改变。
\documentclass{article}
\usepackage{everypage}
\usepackage{xcolor}
\usepackage{lipsum}
% THESE ARE LaTeX DEFAULTS; CAN CHANGE IF NEEDED.
\def\PageTopMargin{1in}
\def\PageLeftMargin{1in}
% ORIGINAL DEFINITION
\newcommand\atxy[3]{%
\AddThispageHook{\hbox{\smash{\hspace*{\dimexpr-\PageLeftMargin-\hoffset+#1\relax}%
\raisebox{\dimexpr\PageTopMargin+\voffset-#2\relax}{\textcolor{red}{#3}}}}}}
% VERIFIED THAT SETTING \hoffset AND \voffset DO NOT BREAK SOLUTION.
%\hoffset=0.4in
%\voffset=0.2in
\begin{document}
\atxy{6in}{4in}{(6,4)}
\lipsum[1]
\atxy{0in}{1in}{(0,1)}
\atxy{5in}{6in}{\textbullet(5,6)}
\atxy{5in}{6.2in}{\makebox[0pt]{centered at (5,6.2)}}
\end{document}
答案2
以下是tikz
使用current page.south west
锚点定位文本的方法:
将给定的文本放置\AbsolutePosition
在相对于左下边距指定的偏移量处(其坐标通过\layout
输出第一页的输出确定)。
笔记:
- 这
showframe
仅用于显示页边距。实际使用时不需要。 - 这
layout
用于确定相对于页面实际左下角的左下角边距的坐标所要应用的各种偏移量。 - 这
lipsum
仅用于提供虚拟文本。
代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{lipsum,showframe,layout}
%% Following obtained from \layout. May need adjustment based on class and
%% page settings. Alternatively, can set these to 0pt and then position will
%% be relative to bottom left of page.
\newcommand*{\BottomLeftX}{1.0in+\hoffset+\oddsidemargin}%
\newcommand*{\BottomLeftY}{\paperheight-1.0in-\voffset-\topmargin-\headheight-\headsep-\textheight}%
\newcommand*{\AbsolutePosition}[4][]{%
% #1 = tikz options
% #2 = x (from south west corner of page
% #3 = y
% #4 = text
\begin{tikzpicture}[remember picture,overlay, ultra thick]
%\draw [shift={(#2,#3)},#1] (current page.south west) circle (2pt)
\draw [#1] ($(current page.south west) + (\BottomLeftX,\BottomLeftY) + (#2,#3)$) circle (2pt)
node[above right] {#4};
\end{tikzpicture}%
}
\begin{document}\layout
\lipsum[1-3]
\AbsolutePosition[fill=red,draw=red]{5.0cm}{6.0cm}{$(5,6)$}
\AbsolutePosition[fill=green,draw=green]{2.0cm}{2.0cm}{$(2,2)$}
\AbsolutePosition[fill=blue,draw=blue]{1.0cm}{0.0cm}{$(1,0)$}
\end{document}
答案3
eso-pic
提供指向特定页面位置的挂钩:
\documentclass{article}
\usepackage{geometry,lipsum,xcolor}
\geometry{showframe,margin=1in}% Just for this example
\usepackage{eso-pic}
\begin{document}
\AddToShipoutPictureBG*{%
\AtPageUpperLeft{\raisebox{-\height}{\color{red}Page upper left}}%
\AtPageLowerLeft{\color{blue}Page lower left}%
}%
\AddToShipoutPictureFG*{%
\AtPageCenter{\makebox[0pt]{\color{green}\Huge DRAFT}}%
\AtTextUpperLeft{\raisebox{-\height}{\color{brown}Text upper left}}%
\AtTextLowerLeft{\color{purple}Text lower left}%
\AtTextLowerLeft{\hspace*{-.5in}\raisebox{3\baselineskip}{$\bullet$}}
}%
\lipsum
\end{document}
优点):
- 单独编译;
- 前景和/或背景放置;
- 每页或多页
缺点:
- 绝对定位需要其中一个钩子作为起点(非常小的缺点)
使用位置挂钩作为起点,可以在页面上定位内容。
加星标的 [未加星标的] 版本仅向当前页面添加内容 [此后的每个页面]。
答案4
一些软件包将其包装在更简单的界面中(特别是 eso-pic 内部接近这个),但基本上如果你有一个固定点,你可以构建一个已知大小的 TeX 盒/胶水组合来到达任何其他点。
默认情况下,latex 中已知的固定点是页眉和页脚,因此这将页眉的左边缘作为原点。取页面左上角可能更方便,但(理论上)您知道页面左边距和上边距是固定量,因此只需根据这些固定长度调整坐标即可。
此处的示例在每一页的文本块中间添加了一条对角线:
\documentclass{article}
\def\z{\stepcounter{enumi}\Roman{enumi}, one two three four five six seven eight nine ten. }
\def\zz{\z\z\z\z\z\z\z\par Red yellow blue. \z Red yellow blue. \z\z Red yellow blue. \z\z\z\z}
\makeatletter
\def\@oddhead{%
\begin{picture}(0,0)
\put(0,0){\circle*{4}}
\put(0,0){\line(1,-1){\strip@pt\dimexpr.5\textwidth\relax}}
\put(\strip@pt\dimexpr.5\textwidth\relax,-\strip@pt\dimexpr.5\textwidth\relax){\circle*{4}}
\end{picture}\hfill
}
\makeatother
\begin{document}
\zz\zz\zz\zz\zz\zz\zz\zz
\end{document}