Legal reports in Germany often use a somewhat strange way of structuring. Instead of the usual numbers, we have
A.
(B., C. D. ...) for the first level,
I.
-- Roman numbers for the second level
1.
arabic numbers for the third level
a)
b), c), d) ... for the fourth level and
aa)
bb), cc), dd) for the fifth level.
I've implemented this in the following nearly minimal example. I'd like to have abbreviated references. If you are reading in section »B.« and there is a reference to subsection »B.II.«, it is enough to print »II.«. But if you are reading in section A., you need »B.II.«. If you are refering from B.II.3.a)cc) to something in B.II.3.a)bb), the output of \ref
obviously should not be B.II.3.a)bb), but simply bb). If you are in B.II.4., the reference has to say 3.a)bb).
But if you are refering from somewhere in C.I.1., the full reference is needed to B.II.3.a)bb).
Special request: solution should word with the varioref package as well.
The jura documentclass provides this kind of reference. But I depend on KOMA-script for many reasons. So I tried to take the code from jura.dtx and adapt it, but I get a error message I don't understand, see below.
So: Can I have references which depend on the place where the \ref
is in the text? Every solution welcome.
Edit to Ulrike's answer:
This code produces always a "II." at levels lower than subsection:
\documentclass[english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel, blindtext}
\setcounter{secnumdepth}{5} % fünf Ebenen
\renewcommand*{\thesection}{\Alph{section}.}
\renewcommand*{\thesubsection}{\Roman{subsection}.}
\renewcommand*{\thesubsubsection}{\arabic{subsubsection}.}
\renewcommand*{\theparagraph}{\alph{paragraph})}%)
\renewcommand*{\thesubparagraph}{\alph{subparagraph}\alph{subparagraph})}
\usepackage{zref-user,zref-counter}
\usepackage{expl3}
\makeatletter
\zref@newprop{section}[1]{\the\c@section}
\zref@newprop{subsection}[1]{\the\c@subsection}
\zref@addprop{main}{section}
\zref@addprop{main}{subsection}
\ExplSyntaxOn
\newcommand\myref[1]{%
\hyperref[#1]{
\int_compare:nTF
{
\zref@extractdefault {#1} {section} {0} = \the\c@section
}
{
%ref is from current section
\int_compare:nTF
{\zref@extractdefault {#1} {subsection} {0} = 0 }
{Was~nun?}
{\int_to_Roman:n{\zref@extractdefault {#1} {subsection} {0}}.}
}
{
%ref is from other section
\int_to_Alph:n {\zref@extractdefault {#1} {section} {0}}.
\int_to_Roman:n {\zref@extractdefault {#1} {subsection} {0}}
}}}
\ExplSyntaxOff
\makeatother
%\usepackage{xcolor}
\usepackage[]{hyperref}
\newcommand\Label[1]{\zlabel{#1}\label{#1}}
\begin{document}
\section{First}
\Label{sec:first}
I'm refering to the second section and I'd like to have a full
reference like this: \myref{sec:secondofsecond}.
\section{Second}
\Label{sec:second}
\myref{sec:secondofsecond}, \myref{sec:first}, \myref{sec:second} And lets test the
new references, see \myref{CLA:first-paragraph} or \myref{CLA:first-second.second}
\subsection{Firstofsecond}
\Label{sec:firstofsecond}
Text.
\subsection{Secondofsecond}
\Label{sec:secondofsecond}
Now down the tree:
\subsubsection{first of second.second}
\Label{CLA:first-second.second}
Just some letters.
\paragraph{first-paragraph}
\Label{CLA:first-paragraph}
And more text.
\end{document}
This is my earlier MWE, now kind of obsolete:
\documentclass[english, parskip=half, numbers=noendperiod]{scrartcl}
\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}
\usepackage{babel, blindtext}
\setcounter{secnumdepth}{5} % five levels
\renewcommand*{\thesection}{\Alph{section}.}
\renewcommand*{\thesubsection}{\Roman{subsection}.}
\renewcommand*{\thesubsubsection}{\arabic{subsubsection}.}
\renewcommand*{\theparagraph}{\alph{paragraph})}%)
\renewcommand*{\thesubparagraph}{\alph{subparagraph}\alph{subparagraph})}
\renewcommand*{\paragraphformat}{\theparagraph{}\enskip}
\renewcommand*{\subparagraphformat}{%
\thesubparagraph{}\enskip}
\makeatletter
\renewcommand{\p@subsection}{\thesection}
\renewcommand{\p@subsubsection}{\thesection\thesubsection}
\renewcommand{\p@paragraph}{\thesection\thesubsection\thesubsubsection}
\renewcommand{\p@subparagraph}{\thesection\thesubsection\thesubsubsection\theparagraph\,}
\makeatother{}
\begin{document}
\section{First}
\label{sec:first}
I'm refering to the second section and I'd like to have a full
reference like this: \ref{sec:secondofsecond}.
\section{Second}
\label{sec:second}
\subsection{Firstofsecond}
\label{sec:firstofsecond}
Text.
\subsection{Secondofsecond}
\label{sec:secondofsecond}
But now I'm refering to »Firstofsecond« and my readers do not need the
full reference (\ref{sec:firstofsecond}), simply »I.« would be sufficient.
From here a reference to »first of second / second« should look like
this: »1.« and not \ref{sec:first-second-second}
\subsubsection{First of second / second}
\label{sec:first-second-second}
text.
\end{document}
OK, and now to the idea to recycle the code of the deprecated jura.dtx
Following the advice of jknappen, I tried to use the code of jura.dtx for exactly the behaviour I'd like to have. I changed the code to:
%\documentclass[english, parskip=half, numbers=noendperiod]{scrartcl}
\documentclass[english]{article}
\usepackage[T1]{fontenc}\usepackage[utf8]{inputenc}
\usepackage{babel, blindtext}
\setcounter{secnumdepth}{5} % fünf Ebenen
\renewcommand*{\thesection}{\Alph{section}.}
\renewcommand*{\thesubsection}{\Roman{subsection}.}
\renewcommand*{\thesubsubsection}{\arabic{subsubsection}.}
\renewcommand*{\theparagraph}{\alph{paragraph})}%)
\renewcommand*{\thesubparagraph}{\alph{subparagraph}\alph{subparagraph})}
%% Code stolen from jura.dtx
\makeatletter{}
\newcommand*{\@greek}[1]{\ifcase#1\relax\or$\alpha$\or$\beta$\or
$\gamma$\or$\delta$\or$\varepsilon$\or$\zeta$\or$\eta$\or$\vartheta$\or
$\iota$\or$\kappa$\or$\lambda$\or$\mu$\or$\nu$\or$\xi$\or$o$\or$\pi$\or
$\rho$\or$\sigma$\or$\tau$\or$\upsilon$\or$\varphi$\or$\chi$\or$\psi$\or
$\omega$\else\@ctrerr\fi}
\newcounter{lvla}
\newcounter{lvlb}
\newcounter{lvlc}
\newcounter{lvld}
\newcounter{lvle}
\newcounter{lvlf}
\newcounter{lvlg}
\newcounter{lvlh}
\newcounter{lvli}
\newcounter{lvlj}
\newcounter{lvlk}
\newcounter{lvll}
\renewcommand*{\thelvla}{\J@Number}
\renewcommand*{\thelvlb}{\J@Number}
\renewcommand*{\thelvlc}{\J@Number}
\renewcommand*{\thelvld}{\J@Number}
\renewcommand*{\thelvle}{\J@Number}
\renewcommand*{\thelvlf}{\J@Number}
\renewcommand*{\thelvlg}{\J@Number}
\renewcommand*{\thelvlh}{\J@Number}
\renewcommand*{\thelvli}{\J@Number}
\renewcommand*{\thelvlj}{\J@Number}
\renewcommand*{\thelvlk}{\J@Number}
\renewcommand*{\thelvll}{\J@Number}
\newcounter{tiefe}\setcounter{tiefe}{1}
%\setcounter{tocdepth}{12}
%\setcounter{secnumdepth}{12}
\newcommand*{\J@Number}{\J@NumberRoot{\value{tiefe}}%
\J@NumberEnd{\value{tiefe}}}
\newcommand*{\J@NumberRoot}[1]{\J@INumberRoot{#1}%
{\csname c@lvl\@alph{#1}\endcsname}}
\newcommand*{\J@INumberRoot}[2]{%
\ifcase#1\or
\@Alph{#2}\or
\@Roman{#2}\or
\@arabic{#2}\or
\@alph{#2}\or
\@alph{#2}\@alph{#2}\or
\@greek{#2}\or
\@greek{#2}\@greek{#2}\or
(\@arabic{#2})\or
(\@alph{#2})\or
(\@alph{#2}\@alph{#2})\or
(\@greek{#2})\or
(\@greek{#2}\@greek{#2})\fi}
\newcommand*{\J@NumberEnd}[1]{\ifnum#1<8\ifnum#1<4.\else)\fi\fi}
\newcommand*{\J@SetCurrent}{\xdef\@currentlabel{{\arabic{lvla}}%
{\arabic{lvlb}}{\arabic{lvlc}}{\arabic{lvld}}{\arabic{lvle}}%
{\arabic{lvlf}}{\arabic{lvlg}}{\arabic{lvlh}}{\arabic{lvli}}%
{\arabic{lvlj}}{\arabic{lvlk}}{\arabic{lvll}}}}
\ifnum\value{lvl\alph{tiefe}}=1%
\PackageWarning{alphanum}{only one subitem in level "\J@Number" ending}%
\fi
\setcounter{lvl\alph{tiefe}}{0}
\addtocounter{tiefe}{-1}
\renewcommand*{\ref}{%
\@ifstar{\@tempswatrue\J@ref}{\@tempswafalse\J@ref}}
\newcommand*{\J@ref}[1]{%
\expandafter\ifx\csname r@#1\endcsname\relax
\protect\G@refundefinedtrue
\nfss@text{\reset@font\bfseries ??}
\@latex@warning{Reference '#1' on page \thepage \space undefined}%
\else
\expandafter\J@refX\csname r@#1\endcsname
\fi
}
\newcommand*{\J@refX}[1]{\expandafter\J@refXX#1}
\newcommand*{\J@refXX}[2]{%
\ifcat_\ifnum9<1#1_\else X\fi
#1%
\else
\expandafter\J@refA#1%
\fi}
\newcommand*{\J@refA}[6]{\@tempcnta\@ne%
\J@refP1{#1}0\J@refP2{#2}{#1}\J@refP3{#3}{#2}\J@refP4{#4}{#3}%
\J@refP5{#5}{#4}\J@refP6{#6}{#5}\J@refB#6}
\newcommand*{\J@refB}[7]{\J@refP7{#2}{#1}\J@refP8{#3}{#2}%
\J@refP9{#4}{#3}\J@refP{10}{#5}{#4}\J@refP{11}{#6}{#5}%
\J@refP{12}{#7}{#6}\J@NumberEnd\@tempcnta}
\newcommand*{\J@refP}[3]{%
\if@tempswa%
\ifnum#2>0\@tempcnta#1\,\J@INumberRoot{#1}{#2}\fi
\else%
\ifnum#2=\value{lvl\@alph{#1}}%
\ifnum#1=12\PackageError{alphanum}{Self-reference detected!}{You used
a \protect\ref\space in the same section as the referenced
\protect\label\MessageBreak That makes no sense!}\fi
\else
\ifnum#2>0\@tempcnta#1\@tempswatrue\J@INumberRoot{#1}{#2}\else
\ifnum#3>0%
\@tempcnta#1\advance\@tempcnta-1\relax\J@INumberRoot{\@tempcnta}{#3}%
\fi
\fi
\fi
\fi}
\makeatother{}
\begin{document}
\section{First}
\label{sec:first}
I'm refering to the second section and I'd like to have a full
reference like this: \ref{sec:secondofsecond}.
\section{Second}
\label{sec:second}
\subsection{Firstofsecond}
\label{sec:firstofsecond}
Text.
\subsection{Secondofsecond}
\label{sec:secondofsecond}
But now I'm refering to »Firstofsecond« and my readers do not need the
full reference (\ref{sec:firstofsecond}), simply »I.« would be sufficient.
From here a reference to »first of second / second« should look like
this: »1.« and not \ref{sec:first-second-second}
\subsubsection{First of second / second}
\label{sec:first-second-second}
text.
\end{document}
Unfortunately, there is an error (file name: kurze-verweise-mwe.tex):
./kurze-verweise-mwe.tex:134: Missing number, treated as zero.
<to be read again>
I
l.134 ...ence like this: \ref{sec:secondofsecond}.
./kurze-verweise-mwe.tex:134: Missing = inserted for \ifnum.
<to be read again>
Anybody here who has time and fun to find a solution for one of the two examples?
scrjura
? Please see my answer to question tex.stackexchange.com/questions/137378/… ...\ref
-- ?\ref
?