von KOMA » So 4. Jul 2010, 10:00
Wenn ich richtig verstehe, was Du willst, dann geht das mit Hilfe des Pakets zref:
\documentclass{article}
\usepackage[abspage,user]{zref}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\newcounter{samepage}
\makeatletter
% Note: Alle hier verwendeten zref-Befehle und Module sind in der
% zref-Anleitung dokumentiert! Es werden die Module abspage
% und user benötigt, die oben per Option geladen werden.
\newcommand*{\ifsamepage}[1]{%
\stepcounter{samepage}\zlabel{samepage.\arabic{samepage}}%
\zref@refused{#1}% zref mitteilen, dass das Label benutzt wurde
\zref@refused{samepage.\arabic{samepage}}% dito
\edef\samepageA{\zref@extract{#1}{abspage}}%
\edef\samepageB{\zref@extract{samepage.\arabic{samepage}}{abspage}}%
\ifnum \zref@extract{#1}{abspage}
= \zref@extract{samepage.\arabic{samepage}}{abspage}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\newcommand*{\xpageref}[2][\ignorespaces]{%
\ifsamepage{#2}{#1}{Seite~\zpageref{#2}}%
}
\begin{document}
Hier ein Label\zlabel{LabelA}.
Siehe auch \xpageref[auf dieser Seite]{LabelA} und \xpageref{LabelB}.
Labels auf anderen Seiten: \xpageref{LabelA} \xpageref{LabelB}.
\blinddocument\zlabel{LabelB}.
\end{document}
Es sei darauf hingewiesen, dass bei dieser Lösung für jeden Aufruf von \xpageref ein Label angelegt wird. Außerdem werden ggf. mehrere LaTeX-Läufe benötigt, bis sich das ganze stabilisiert, weil ja jeder Aufruf von \xpageref den Text und damit den Umbruch und damit ggf. das Ergebnis anderer \xpageref-Anweisungen verändern kann. Das kann im Extremfall auch zu einer nie terminierenden Suche werden.
Wenn ich richtig verstehe, was Du willst, dann geht das mit Hilfe des Pakets zref: [code]\documentclass{article}
\usepackage[abspage,user]{zref}
\usepackage[ngerman]{babel}
\usepackage{blindtext}
\newcounter{samepage}
\makeatletter
% Note: Alle hier verwendeten zref-Befehle und Module sind in der
% zref-Anleitung dokumentiert! Es werden die Module abspage
% und user benötigt, die oben per Option geladen werden.
\newcommand*{\ifsamepage}[1]{%
\stepcounter{samepage}\zlabel{samepage.\arabic{samepage}}%
\zref@refused{#1}% zref mitteilen, dass das Label benutzt wurde
\zref@refused{samepage.\arabic{samepage}}% dito
\edef\samepageA{\zref@extract{#1}{abspage}}%
\edef\samepageB{\zref@extract{samepage.\arabic{samepage}}{abspage}}%
\ifnum \zref@extract{#1}{abspage}
= \zref@extract{samepage.\arabic{samepage}}{abspage}
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother
\newcommand*{\xpageref}[2][\ignorespaces]{%
\ifsamepage{#2}{#1}{Seite~\zpageref{#2}}%
}
\begin{document}
Hier ein Label\zlabel{LabelA}.
Siehe auch \xpageref[auf dieser Seite]{LabelA} und \xpageref{LabelB}.
Labels auf anderen Seiten: \xpageref{LabelA} \xpageref{LabelB}.
\blinddocument\zlabel{LabelB}.
\end{document}[/code]
Es sei darauf hingewiesen, dass bei dieser Lösung für jeden Aufruf von \xpageref ein Label angelegt wird. Außerdem werden ggf. mehrere LaTeX-Läufe benötigt, bis sich das ganze stabilisiert, weil ja jeder Aufruf von \xpageref den Text und damit den Umbruch und damit ggf. das Ergebnis anderer \xpageref-Anweisungen verändern kann. Das kann im Extremfall auch zu einer nie terminierenden Suche werden.