我正在尝试将元素绝对定位在页面上。这些定位元素使用put{}
命令本身。坐标原点应该总是位于每个页面的左上角,在更改页面布局时也是如此(通过使用\newgeometry{}
)。
为了实现这一点,我想使用picture
环境的第二个参数集。这应该将我的坐标系平移到纸张的左上角。
环境的位置picture
由页眉和/或页面布局的位置定义。因此,第二组参数应取决于页边距的任意一个或多个。当页面更改时,页边距将更改,而我的原点将保持不变。
换句话说:我正在尝试计算回页眉/picture
环境的位置。当我知道如何计算此位置相对于左上角的位置时,我就可以计算回从页眉内部到纸张左上角的位置。
为了设置元素,我尝试将包与环境一起使用。fancyhdr
但我无法弄清楚如何计算的位置。类似这样(完整代码和结果如下所示):geometry
picture
picture
\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,-200 处,您可以调整坐标以将其放置在页面上的任何位置。