为什么@David Carlisle 的答案不起作用

为什么@David Carlisle 的答案不起作用

我正在尝试将元素绝对定位在页面上。这些定位元素使用put{}命令本身。坐标原点应该总是位于每个页面的左上角,在更改页面布局时也是如此(通过使用\newgeometry{})。


为了实现这一点,我想使用picture环境的第二个参数集。这应该将我的坐标系平移到纸张的左上角。

环境的位置picture由页眉和/或页面布局的位置定义。因此,第二组参数应取决于页边距的任意一个或多个。当页面更改时,页边距将更改,而我的原点将保持不变。

换句话说:我正在尝试计算回页眉/picture环境的位置。当我知道如何计算此位置相对于左上角的位置时,我就可以计算回从页眉内部到纸张左上角的位置。

为了设置元素,我尝试将包与环境一起使用。fancyhdr但我无法弄清楚如何计算的位置。类似这样(完整代码和结果如下所示):geometrypicturepicture

\fancyhead[L]{
    \begin{minipage}{\textwidth}
        \headertext \\
        \begin{picture}(0,0)(\geometryleft,-\geometrytop)
            \put(0, 0){\fbox{fancyhdr}}
        \end{picture}
    \end{minipage}
}

\newgeometry但是当我使用元素更改页面布局时,它的位置会发生变化。\geometryleft有效。阅读完geometry文档我修改了\geometrytop,但找不到正确的计算。根据文档,我预计正确的术语是

\top - \headsep - \layoutvoffset.

但这并不正确。(为了更清楚起见,我只写\geometrytop在这里。)

我也尝试使用该everypage包,因为无论如何我都必须包含它。看起来该everypage版本独立于包定位元素geometry,但我仍然无法弄清楚如何计算正确的0/0-point 以将其设置在左上角。简短的代码看起来像这样(整个代码和结果如下所示):

\AddEverypageHook{
    \begin{picture}(0,0)(\hoffset+1in,-\voffset-1in)
        \put(0, 0){fbox{everypage}}
    \end{picture}
}

因为包的布局更改geometry完全被忽略,所以我期望版本everypage使用 (La-?)TeX 默认值。我发现它们用于\hoffset + 1 in左边距和\voffset + 1 in顶部偏移。与fancyhdr版本中左偏移有效一样,右偏移是错误的。

现在我的问题是:如何获取从纸张顶部和左部到picture环境位置的正确距离?我使用哪个版本并不重要。如果您知道另一种可能性(如果可能的话不包括附加包),我也会很感激。

请注意,我想避免使用tikz。另外,我不是放置简单的框,而是“调用”已定义的命令。这些命令包含命令put{}本身。对于它们来说,坐标原点始终相同非常重要。

图片下方有一个可运行的最小示例。下图显示了两个版本的结果。有方框(左上角)。它们都应该恰好位于每一页的角落,无论布局如何改变。

在此处输入图片描述

完整代码如下:

\documentclass[a4paper]{article}

\newlength{\geometryleft}
\setlength{\geometryleft}{2cm}
\newlength{\geometryright}
\setlength{\geometryright}{2cm}
\newlength{\geometrytop}
\setlength{\geometrytop}{5.5cm}
\newlength{\geometrybottom}
\setlength{\geometrybottom}{1cm}
\newlength{\geometryheadheight}
\setlength{\geometryheadheight}{5.5cm}

\usepackage[
    showframe,
    left=\geometryleft, 
    right=\geometryright, 
    top=\geometrytop, 
    bottom=\geometrybottom, 
    headheight=\geometryheadheight
]{geometry}
\usepackage{fancyhdr}
\usepackage{picture}
\usepackage{calc}
\usepackage{color}
\usepackage{everypage}

\newcommand{\headertext}{Text of the first header}

\fancypagestyle{fancyhdr}{
    \renewcommand{\headrule}{%
        \hbox to\textwidth{%
            \color{black}\leaders\hrule height .4pt\hfill%
        }%
    }
    \renewcommand{\footrule}{%
        \hbox to\textwidth{%
            \color{black}\leaders\hrule height .4pt\hfill%
        }%
    }

    \fancyhead[L]{%
        \begin{minipage}{\textwidth}
            \headertext \\
            \begin{picture}(0,0)(\geometryleft,-\geometrytop+3cm)
                \fbox{fancyhdr}
            \end{picture}
        \end{minipage}
    }
}

\pagestyle{fancyhdr}

\AddEverypageHook{
    \begin{picture}(0,0)(\hoffset+1in,-\voffset-1in)
    \fbox{everypage}
    \end{picture}
}

\begin{document}
    Text 
    
    \clearpage
    \renewcommand{\headertext}{
        A lot longer header text \\
        with \\
        multiple \\
        lines \\
        so \\
        it \\ 
        is \\ 
        higher
    }
    Text
    
    \clearpage
    \setlength{\geometryheadheight}{2cm}
    \newgeometry{
        headheight=\geometryheadheight,
        top=\geometrytop,
        left=\geometryleft,
        right=\geometryright
    }
    Text
    
    \clearpage
    \setlength{\geometryleft}{5cm}
    \setlength{\geometryright}{.5cm}
    \setlength{\geometrytop}{.5cm}
    \newgeometry{
        headheight=\geometryheadheight,
        top=\geometrytop,
        left=\geometryleft
        ,right=\geometryright
    }
    Text
\end{document}

为什么@David Carlisle 的答案不起作用

下面的代码显示了为什么@David Carlisle 的代码不起作用。我的问题是,文档中的页面尺寸正在发生变化,但我的命令 ( \fancycommand) 不知道它们是如何变化的。以下代码在我的最小示例中显示了他的代码:

\documentclass[a4paper]{article}

\newlength{\geometryleft}
\setlength{\geometryleft}{2cm}
\newlength{\geometryright}
\setlength{\geometryright}{2cm}
\newlength{\geometrytop}
\setlength{\geometrytop}{5.5cm}
\newlength{\geometrybottom}
\setlength{\geometrybottom}{1cm}
\newlength{\geometryheadheight}
\setlength{\geometryheadheight}{5.5cm}

\usepackage[
    showframe,
    left=\geometryleft, 
    right=\geometryright, 
    top=\geometrytop, 
    bottom=\geometrybottom, 
    headheight=\geometryheadheight
]{geometry}
\usepackage{fancyhdr}
\usepackage{picture}
\usepackage{calc}
\usepackage{color}
\usepackage{everypage}

\newcommand{\headertext}{Text of the first header}

\fancypagestyle{fancyhdr}{
    \fancyhead[L]{%
        \begin{picture}(0,0)
            \put(-57,117){\fancycommand}

            % this is only included to show that the fancytext is
            % still displayed and that the position changes
            \put(0,0){\fancycommand}
        \end{picture}%
        \headertext
    }
}

\newcommand{\fancycommand}{\put(10, -10){\color{red}Fancy text}}

\pagestyle{fancyhdr}

\begin{document}
    Text 
    
    \clearpage
    \renewcommand{\headertext}{
        A lot longer header text \\
        with \\
        multiple \\
        lines \\
        so \\
        it \\ 
        is \\ 
        higher
    }
    Text
    
    \clearpage
    \setlength{\geometryheadheight}{2cm}
    \newgeometry{
        headheight=\geometryheadheight,
        top=\geometrytop,
        left=\geometryleft,
        right=\geometryright
    }
    Text
    
    \clearpage
    \setlength{\geometryleft}{5cm}
    \setlength{\geometryright}{.5cm}
    \setlength{\geometrytop}{.5cm}
    \newgeometry{
        headheight=\geometryheadheight,
        top=\geometrytop,
        left=\geometryleft
        ,right=\geometryright
    }
    Text
\end{document}

在此处输入图片描述

在结果中,您可以看到在第一页(左侧),红色的“花式文本”完美地显示在页面的左上角。在第二页上,情况不再如此。这是因为布局发生了变化。问题是,此处的位置fancyhdr put{}是硬编码的。这必须取决于页面布局。这正是我的问题:位置(无论是第一个put还是环境的原点picture)如何取决于页边距。

应该\fancycommand只设置相对于整个页面的坐标。不需要检查页面尺寸。因此\fancycommand使用整个页面作为坐标系。希望这有助于澄清我的问题。

答案1

使用起来更容易eso-pic\AtPageUpperLeft内容放置在页面的左上角:

\usepackage{eso-pic}
\AddToShipoutPictureFG{
  \AtPageUpperLeft{%
    \raisebox{-\height}{%
      \fbox{everypage}%
    }%
  }%
}

由于内容通常放置在基线上,\raisebox{-\height}{<stuff>}因此确保的顶部<stuff>位于页面内部的顶部\AtPageUpperLeft

在此处输入图片描述

答案2

注意添加空格,并且picture模式内容应始终\put如此

\fancyhead[L]{%
        \begin{picture}(0,0)
            \put(10,-200){\fbox{fancyhdr}}
        \end{picture}%
    \headertext
}

会将其放置\fbox{fanchdr}在相对于页眉左边缘的 10,-2​​00 处,您可以调整坐标以将其放置在页面上的任何位置。

相关内容