3

I have put together my question as an MWE:

\documentclass[twocolumn]{article}
\usepackage{lipsum}
\newcommand{\topbottom}[1]{top}
\newcommand{\leftright}[1]{right}
\begin{document}
    \lipsum[1-4]
    Look for this! \label{mylabel}
    \lipsum[5-7]

    What you are looking for would be so much easier to find if you knew 
    not only that it's on page \pageref{mylabel}, but also, that it's at 
    the \topbottom{mylabel} of the \leftright{mylabel} column. 

    How to do this?
\end{document}

I have since found \pageref, but for columns, which answers the second part of my question, effectively suggesting an implementation for \leftright through \columnref. But for the first one and \topbottom, I really don't find anything helpful.

2

1 Answer 1

3

This works surprisingly well, with and without hyperref/cleveref:

\documentclass[twocolumn]{article}
% optional package for testing
\usepackage{hyperref}

% Solution: put *after* \usepackage{hyperref}, but *before* \usepackage{cleveref}
% ===============================================================================
\RequirePackage[savepos]{zref}
\RequirePackage{ifthen}
\makeatletter
\newlength{\ref@loc}%
\newcommand{\refloc}[4]{%
    \zref@ifrefundefined{#1}{\PackageWarning{\string\refloc}{Location of `#1' on page \thepage \space  undefined}\textbf{???}}{%
        \setlength{\ref@loc}{#2}%
        \ifthenelse{\lengthtest{\ref@loc < 0pt}}{#3}{#4}%
    }%
}
\makeatother

\RequirePackage{calc}
\newcommand{\topbottom}[1]{\refloc{#1}{\zposy{loc:ref}sp-\zposy{#1}sp-\textheight/2}{top}{bottom}}
\newcommand{\leftright}[1]{\refloc{#1}{\zposx{#1}sp-\zposx{loc:ref}sp-\textwidth/2}{left}{right}}

% http://tex.stackexchange.com/a/351172/30810
\RequirePackage{regexpatch}
\AtBeginDocument{%
    \zsavepos{loc:ref}%
    \makeatletter%
    \regexpatchcmd{\label}{\A}{\c{zsavepos}\cB\{\cP\#1\cE\}}{}{\err}%
    \makeatother%
}
% ===============================================================================

% optional package for testing
\usepackage{cleveref}
\providecommand{\cref}[1]{\ref{#1}}

% for example output only
\usepackage{lipsum}
\usepackage[columnwise,switch]{lineno}
\linenumbers
\begin{document}
    \section{Section}

    \label{mylabel1} 1 \lipsum[1]
    \label{mylabel2} 2 \lipsum[2]
    \label{mylabel3} 3 \lipsum[3]
    \label{mylabel4} 4 \lipsum[2]
    \label{mylabel5} 5 \lipsum[2]

    \label{mylabel6} 6 (line 23/46 =  top)

    \label{mylabel7} 7 (line 24/46 = bottom)

    \label{mylabel8} 8 \lipsum[2]
    \label{mylabel9} 9 \lipsum[2]

    What you are looking for is so much easier to find
    when you know that it's 
    \begin{enumerate}
        \item at the \topbottom{mylabel1} of the \leftright{mylabel1} column on page \pageref{mylabel1},
        \item at the \topbottom{mylabel2} of the \leftright{mylabel2} column on page \pageref{mylabel2},
        \item at the \topbottom{mylabel3} of the \leftright{mylabel3} column on page \pageref{mylabel3},
        \item at the \topbottom{mylabel4} of the \leftright{mylabel4} column on page \pageref{mylabel4},
        \item at the \topbottom{mylabel5} of the \leftright{mylabel5} column on page \pageref{mylabel5},
        \item at the \topbottom{mylabel6} of the \leftright{mylabel6} column on page \pageref{mylabel6},
        \item at the \topbottom{mylabel7} of the \leftright{mylabel7} column on page \pageref{mylabel7},
        \item at the \topbottom{mylabel8} of the \leftright{mylabel8} column on page \pageref{mylabel8},
        \item at the \topbottom{mylabel9} of the \leftright{mylabel9} column on page \pageref{mylabel9},
        \item at the \topbottom{mylabelX} of the \leftright{mylabelX} column on page \pageref{mylabelX}.
    \end{enumerate}

    A test clevereference: \cref{mylabel1}
\end{document}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .