为了将 beamer 演示文稿中的注释对齐(使用 PGFPages 将注释页直接放在演示文稿幻灯片旁边),使其与输出文本的垂直位置相同,我使用 pdfsavepos。除非我需要将演示文稿文本放在 中,否则这种方法非常有效\scalebox
。注释不遵循缩放比例 - 至少不是按照应有的方式。
\documentclass{article}
\usepackage{zref-user, zref-savepos, calc, xcolor, graphicx, lipsum}
\usepackage[absolute]{textpos}
\usepackage[left=1in, top=1in, right=1in, bottom=1in]{geometry}
\begin{document}
\scalebox{1}{%
\begin{minipage}{1\textwidth}%
\lipsum[1]\hrule%
\zsaveposy{pos}%
\zrefused{pos}%
\lipsum[2-6]%
\end{minipage}%
}%
\makeatletter%
\zref@ifrefundefined{pos}{}{%
\begin{textblock*}{10cm}(0cm, \dimexpr\paperheight - \zposy{pos}sp)
\color{red} This should be aligned at the line.%
\end{textblock*}
}%
\end{document}
使用 PDFLaTeX 运行 MWE 两次,红色文本应该位于该线的正下方。现在将缩放因子更改为,.5
并将小页面宽度更改为2\textwidth
。红色文本的位置似乎遵循缩放比例,但幅度太大,没有在行后对齐。请注意,参考点越长,效果越差\lipsum
。我该如何补偿这种转变?
(在实际演示中,我使用了不同于的技术textpos
,但行为完全相同。)
答案1
从 pdftex 的角度来看,缩放实际上不会改变内容的大小。LaTeX 操纵框的外部尺寸(高度、深度和宽度),以便它不会占用页面上的太多空间,但内部线宽、字体大小等不会改变。这意味着内容“溢出”框,并且 zref 标记反映框的自然尺寸(通常)略微向上移动(因为框的高度较小)。“真正的”缩放是通过 pdf 文字完成的,pdf 查看器会完成所有工作以显示较小的框和较小的字体。
因此对于 LaTeX(和 zref)来说,页面看起来像这样(因为小页面的基线位于中间):
\documentclass{article}
\usepackage[left=1in, top=1in, right=1in, bottom=1in]{geometry}
\usepackage{lipsum,xcolor}
\fboxrule=1pt
\begin{document}
\vspace*{5cm}%to show the full box:
\parindent0pt
\fcolorbox{black}{green!10!white}{\makebox[0.5\width][l]{%
\raisebox{0pt}[0.5\height][0.5\depth]
{
\begin{minipage}{1\textwidth}%
\lipsum[1]\hrule%
\lipsum[1]%
\end{minipage}%
}}}%
\end{document}
这是 zref 放置标记的位置:
\documentclass{article}
\usepackage{zref-user, zref-savepos, calc, xcolor, graphicx, lipsum}
\usepackage[absolute]{textpos}
\usepackage[left=1in, top=1in, right=1in, bottom=1in]{geometry}
\begin{document}
\vspace*{5cm} %to show the full box:
\parindent=0pt%
\scalebox{0.5}{%
\begin{minipage}{1\textwidth}%
\zsavepos{postop}x\hfill y\zsavepos{postopright}\par
\lipsum[1]\hrule%
\zsavepos{posmid}%
\lipsum[1]%
\zsavepos{posbot}
\end{minipage}%
}%
\begin{textblock*}{10cm}(\zposx{postopright}sp, \dimexpr\paperheight - \zposy{postopright}sp)
\color{red}top right%
\end{textblock*}
\begin{textblock*}{10cm}(\zposx{postop}sp, \dimexpr\paperheight - \zposy{postop}sp)
\color{red}top%
\end{textblock*}
\begin{textblock*}{10cm}(\zposx{posmid}sp, \dimexpr\paperheight - \zposy{posmid}sp)
\color{blue}middle%
\end{textblock*}
\begin{textblock*}{10cm}(\zposx{posbot}sp, \dimexpr\paperheight - \zposy{posbot}sp)
\color{green}bottom%
\end{textblock*}
\end{document}
这意味着如果您真的想将 zrefpos 与缩放(或其他此类操作)一起使用,则必须计算正确的值。
答案2
好的,我已经设法以一种非常通用的方式进行了计算。欢迎提出意见,因为当前的解决方案有效,但可以做得更漂亮。我基本上重新定义了 -macros,以便它们在内部进行计算。但为此,我不得不使用另一个标签(即现在需要两次运行),因为即使我将宏放在环境中,我也\zsavepos
无法获得的值。\pdflast(x|y)pos
\AtBeginShipout
\documentclass{article}
\usepackage{zref-user, zref-savepos, calc, xcolor, adjustbox, lipsum}
\usepackage[absolute]{textpos}
\usepackage[left=1in, top=1in, right=1in, bottom=1in]{geometry}
\makeatletter
\newcounter{@scaleposes}
\newlength\@scaleposiny%
\newlength\@scaleposinx%
\def\@patchposes#1#2{%
\renewcommand{\zsavepos}[1]{%
\pdfsavepos%
\protected@write\@auxout{}{%
\string\zref@newlabel{##1@orig}{%
\ltx@backslashchar posx{\noexpand\the\pdflastxpos}%
\ltx@backslashchar posy{\noexpand\the\pdflastypos}%
}%
}
\zifrefundefined{##1@orig}{}{%
\edef\@posxBox{\zref@extract{#1}{posx}}%
\edef\@posxCnt{\zref@extract{##1@orig}{posx}}%
\setlength\@scaleposinx{\@posxBox sp - \@posxCnt sp}%
\setlength\@scaleposinx{#2\@scaleposinx}%
\setlength\@scaleposinx{\@posxBox sp - \@scaleposinx}%
\edef\@posyBox{\zref@extract{#1}{posy}}%
\edef\@posyCnt{\zref@extract{##1@orig}{posy}}%
\setlength\@scaleposiny{\@posyBox sp - \@posyCnt sp}%
\setlength\@scaleposiny{#2\@scaleposiny}%
\setlength\@scaleposiny{\@posyBox sp - \@scaleposiny}%
\protected@write\@auxout{}{\string\zref@newlabel{##1}%
{\ltx@backslashchar posx\expandafter{\number\@scaleposinx}%
\ltx@backslashchar posy\expandafter{\number\@scaleposiny}}}%
}%
}%
\renewcommand{\zsaveposx}[1]{%
\pdfsavepos%
\protected@write\@auxout{}{%
\string\zref@newlabel{##1@orig}{\ltx@backslashchar posx{\noexpand\the\pdflastxpos}}%
}
\zifrefundefined{##1@orig}{}{%
\edef\@posxBox{\zref@extract{#1}{posx}}%
\edef\@posxCnt{\zref@extract{##1@orig}{posx}}%
\setlength\@scaleposinx{\@posxBox sp - \@posxCnt sp}%
\setlength\@scaleposinx{#2\@scaleposinx}%
\setlength\@scaleposinx{\@posxBox sp - \@scaleposinx}%
\protected@write\@auxout{}{\string\zref@newlabel{##1}%
{\ltx@backslashchar posx\expandafter{\number\@scaleposinx}}}%
}%
}%
\renewcommand{\zsaveposy}[1]{%
\pdfsavepos%
\protected@write\@auxout{}{%
\string\zref@newlabel{##1@orig}{\ltx@backslashchar posy{\noexpand\the\pdflastypos}}%
}
\zifrefundefined{##1@orig}{}{%
\edef\@posyBox{\zref@extract{#1}{posy}}%
\edef\@posyCnt{\zref@extract{##1@orig}{posy}}%
\setlength\@scaleposiny{\@posyBox sp - \@posyCnt sp}%
\setlength\@scaleposiny{#2\@scaleposiny}%
\setlength\@scaleposiny{\@posyBox sp - \@scaleposiny}%
\protected@write\@auxout{}{\string\zref@newlabel{##1}%
{\ltx@backslashchar posy\expandafter{\number\@scaleposiny}}}%
}%
}%
}
\newenvironment{scalepos}[1]{%
\begingroup%
\stepcounter{@scaleposes}%
\edef\@spn{scaleposes-\the\value{@scaleposes}}%
\zsavepos{\@spn}%
\zrefused{\@spn}%
\expandafter\@patchposes\expandafter{\@spn}{#1}
\begin{adjustbox}{scale=#1}%
}{
\end{adjustbox}%
\endgroup%
}
\begin{document}
\begin{scalepos}{.7}%
\begin{minipage}[t]{1.43\textwidth}
\zsavepos{postA}\zrefused{postA}%
\lipsum[1-6]
\hfill Right end
\zsavepos{posbA}\zrefused{posbA}%
\end{minipage}
\end{scalepos}%
\zref@ifrefundefined{postA}{}{%
\begin{textblock*}{10cm}(\zposx{postA}sp, \dimexpr\paperheight - \zposy{postA}sp)
\noindent\color{red} Top%
\end{textblock*}
\begin{textblock*}{10cm}(\zposx{posbA}sp, \dimexpr\paperheight - \zposy{posbA}sp)
\noindent\color{red} Bottom
\end{textblock*}
}%
\end{document}