精确文本定位

精确文本定位

我需要在页面上的精确位置插入文本(当我打印并用尺子测量时,我希望它与编辑器中写的完全一致)。我尝试了,textpos但没有按我想要的方式工作。

我来举一个例子:坐标系

我想指定我给出的哪个红点作为参数x,y,然后写入一些文本。例如,我选择左上红点,写入 (0mm,0mm){Xyz},字符串“Xyz”将恰好位于纸张的左上角(无边距),等等。

我是 TeX 的初学者,所以请尽可能简单地提供帮助。

答案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}

相关内容