答案1
根据我的回答有哪些方法可以将内容绝对定位在页面上?。
已编辑,以处理x
不同字体大小的对齐。
这种方法可以与以下形式的比对结合在宏中
\aligntext[<font-size>]{<x>}{<y>}{<l/c/r>}{<t/b/B/x>}{<content>}
其中<l/c/r>
表示左/中/右对齐,<t/b/B/x>
表示上/下/BASELINE/ex 对齐,相对于指定的 (x,y) 坐标。“ex”对齐是指对齐到基线上方 1ex 的垂直位置。这四个垂直对齐对应于 OP 图中红点的位置。
为了最好地展示它,我还提供了一个\aligntextref
具有相同参数流的宏,该宏将一个红点放置在给定的(x,y)位置的中心,以便可以检查对齐。
EDIT 是必要的,因为当更改参数内容中的字体大小时,移位的大小1ex
(用于x
对齐)直到为时已晚才修改为新的字体大小。如更新的 MWE 所示,<fontsize>
可选参数中的 可以指定为\Huge
、\tiny
等。但是,也可以指定为\fontsize{16pt}{16pt}\selectfont
,例如。
这是 MWE。
\documentclass{article}
\usepackage{everypage,xcolor}
\usepackage{stackengine}
% THESE ARE LaTeX DEFAULTS; CAN CHANGE IF NEEDED.
\def\PageTopMargin{1in}
\def\PageLeftMargin{1in}
\newcommand\atxy[3]{%
\AddThispageHook{\smash{\hspace*{\dimexpr-\PageLeftMargin-\hoffset+#1\relax}%
\raisebox{\dimexpr\PageTopMargin+\voffset-#2\relax}{#3}}}}
\newcommand\aligntext[6][\normalsize]{%
\if B#5\atxy{#2}{#3}{#1\makebox[0pt][#4]{#6}}\else%
\if x#5\atxy{#2}{#3}{#1\raisebox{-1ex}{\makebox[0pt][#4]{#6}}}\else%
\if b#5\atxy{#2}{#3}{#1\abovebaseline[0pt]{\makebox[0pt][#4]{#6}}}\else%
\if t#5\atxy{#2}{#3}{#1\belowbaseline[0pt]{\makebox[0pt][#4]{#6}}}\fi\fi\fi\fi%
}
\newcommand\aligntextref[6][\normalsize]{%
\aligntext[#1]{#2}{#3}{#4}{#5}{#6}%
\aligntext[#1]{#2}{#3}{c}{B}{\color{red}\makebox[0pt]{\rule[-.4pt]{.8pt}{.8pt}}}%
}
\begin{document}
\aligntext{0\paperwidth}{0\paperheight}{l}{t}{Top left alignment}
\aligntext{.5\paperwidth}{0\paperheight}{c}{x}{Top x alignment}
\aligntext{1\paperwidth}{0\paperheight}{r}{t}{Top right alignment}
\aligntext{0\paperwidth}{1\paperheight}{l}{b}{Bottom left alignment}
\aligntext{.5\paperwidth}{1\paperheight}{c}{B}{BASELINE center alignment}
\aligntext{1\paperwidth}{1\paperheight}{r}{b}{Bottom right alignment}
\mbox{}
\aligntextref{100pt}{100pt}{r}{t}{X}
\aligntextref{120pt}{100pt}{l}{t}{fg}
\aligntextref{110pt}{100pt}{c}{t}{x}
\aligntextref{100pt}{115pt}{r}{x}{X}
\aligntextref{120pt}{115pt}{l}{x}{fg}
\aligntextref{110pt}{115pt}{c}{x}{x}
\aligntextref{100pt}{130pt}{r}{B}{X}
\aligntextref{120pt}{130pt}{l}{B}{fg}
\aligntextref{110pt}{130pt}{c}{B}{x}
\aligntextref{100pt}{145pt}{r}{b}{X}
\aligntextref{120pt}{145pt}{l}{b}{fg}
\aligntextref{110pt}{145pt}{c}{b}{x}
\aligntextref[\Huge]{110pt}{185pt}{l}{x}{x alignment Huge}
\aligntextref[\tiny]{110pt}{185pt}{r}{x}{x alignment tiny}
\aligntext{140pt}{100pt}{l}{t}{Top alignment}
\aligntext{140pt}{115pt}{l}{x}{Ex alignment}
\aligntext{140pt}{130pt}{l}{B}{Baseline alignment}
\aligntext{140pt}{145pt}{l}{b}{bottom alignment}
\end{document}
EDIT 为下一张图片提供了修复。
注意:完全由调用组成的页面\aligntext
不会产生任何输出,除非将某些内容作为普通文本添加到页面中。这就是为什么 MWE 有一个\mbox{}
混合,以触发正常的页面生成。
答案2
我以前从未使用过texpos
,但手册最后一页的示例表明
\documentclass{article}
\usepackage[absolute]{textpos}
\setlength{\TPHorizModule}{30mm}
\setlength{\TPVertModule}{\TPHorizModule}
\textblockorigin{0mm}{0mm} % start everything near the top-left corner
\setlength{\parindent}{0pt}
\begin{document}
\begin{textblock}{1}(0,0)
Xyz
\end{textblock}
\end{document}
将放置Xyz
在页面的左上角。
答案3
我认为您可以使用节点锚点来固定其位置,但也许使用更多代码您可以使用“圆圈”来定位它。
输出
代码
\documentclass[a4paper]{article}
\usepackage{tikz}
\usepackage{calc}
\usetikzlibrary{calc, intersections}
\tikzset{
linex/.style={green!50!black, shorten <=-3mm, shorten >=-3mm}
}
\newlength\txtht
\setlength\txtht{\heightof{a}}
\newcommand\addtext[3][]{%
\tikz[overlay, remember picture, shift={(current page.south west)}, line width=.2pt]{%
\node[inner sep=0, outer sep=0, #1] (text) at (#2) {#3};
\draw[linex, name path global=ray1] (text.south west) -- (text.south east);
\draw[linex, name path global=ray2] (text.south west) -- (text.north west);
\draw[linex, name path global=ray3] (text.north west) -- (text.north east);
\draw[linex, name path global=ray4] (text.south east) -- (text.north east);
\draw[linex, name path global=ray5] (text.south west) -- (text.north west);
\draw[linex, name path global=ray6] (text.south) -- (text.north);
\draw[linex, name path global=ray7] (text.base west) -- (text.base east);
\draw[linex, name path global=ray8] ($(text.base west)+(0,\txtht)$) -- ($(text.base east)+(0,\txtht)$);
\foreach \x in {1,...,8}{%
\foreach \y in {2,...,8}{%
\fill[red, name intersections={of={ray\x} and {ray\y}}] (intersection-1) circle (.4pt);
}}
}
}
\pagestyle{empty}
\begin{document}
\addtext{4,5}{Xyz}
\end{document}