pdfsavepos 和 scalebox

pdfsavepos 和 scalebox

为了将 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}

相关内容