4

I want to define my own numeration and its display.

For example,

Today I have met David (P1) in the parking. David was friendly. Suddenly I remember he was a friend of mine, Susan (P2). ...

If I edit the text by adding

Today I have met David (P1) in the parking. David was friendly. David is father of John (P2). Suddenly I remember he was a friend of mine, Susan (P3). ...

I expect that the numbers change automatically.

Werner
  • 603,163
AlexTP
  • 143
  • Will you ever have to re-use old references to persons? Or, once they're used/defined, you'll never use/refer to them again? – Werner Apr 24 '17 at 17:08
  • @Werner I don't need to refer them. But it would be nice if I am able to. The anwsers are very good and cover both cases. – AlexTP Apr 27 '17 at 18:29

3 Answers3

3

Maybe something like this?

\documentclass{article}
\newcounter{numerations}
\newcommand\nlabel[1]{%
  \refstepcounter{numerations}%
  \expandafter\xdef\csname REF#1\endcsname{\thenumerations}%
  \expandafter\xdef\csname NUMERATIONS\thenumerations\endcsname{#1}%
  #1 (P\thenumerations)%
}
\newcommand\nref[1]{#1 (P\csname REF#1\endcsname)}
\newcommand\numeration[1]{\csname NUMERATIONS#1\endcsname{} (P#1)}
\begin{document}
Today I have met \nlabel{David} in the parking.  David was friendly.
\textit{David is the father of \nlabel{John}.} Suddenly I remember he was
a friend of mine \nlabel{Susan}...

I can recall the label for \nref{John}, \nref{David}, and or \nref{Susan}.

Or I can invoke them by number: \numeration{2}, \numeration{1}, and or 
\numeration{3}.

\end{document}

enter image description here

3

Here is a version with \nameref - working (if needed) and automatic labeling by using the optional argument, which refers to the name of the person, whereas an additional \label command after the \newpersons macro will refer to the person's number (i.e. P1 etc.)

\documentclass{article}


\usepackage{xparse}

\newcounter{person}
\renewcommand{\theperson}{P\arabic{person}}
\makeatletter
\NewDocumentCommand{\newperson}{O{#2}m}{%
  \protected@edef\@currentlabel{#1}%
  % If hyperref is not loaded, \protected@edef\currentlabelname does no harm here
  \protected@edef\@currentlabelname{#1}% for nameref. 
  \label{#2}%
  \refstepcounter{person}%
  #1~(\theperson)%
}
\makeatother

\usepackage{hyperref}

\begin{document}
Today I have met \newperson{David} in the parking.  David was friendly.
\textit{\ref{David} is the father of \ref{John}.} Suddenly I remember he was
a friend of mine \newperson{Susan}\label{susansnumber}...

I can recall the label for \newperson{John}, \ref{David}, and or \nameref{Susan} or call them by a reference to the number with \ref{susansnumber}. 

\end{document}

enter image description here

2

The following example provides \newperson{<name>} which sets the name followed by an incremented counter in the form (P<num>):

enter image description here

\documentclass{article}

\newcounter{person}
\newcommand{\newperson}[1]{%
  \refstepcounter{person}%
  #1~(P\theperson)}

\begin{document}

Today I have met David~(P1) in the parking. David was friendly. 
David is the father of John~(P2). Suddenly I remember he was a friend of mine, Susan~(P3).

Today I have met \newperson{David} in the parking. David was friendly. 
David is the father of \newperson{John}. Suddenly I remember he was a friend of mine, \newperson{Susan}.

\end{document}

This could be expanded to use a \label-\ref system, allowing one to reference people already named (not new), for consistency. Here is such an implementation that provides \newperson[<tag>]{<name>} which can be referred to using \refperson{<tag>}. If no <tag> is supplied, <name> is used:

enter image description here

\documentclass{article}

\newcounter{person}
\makeatletter
\newcommand{\newperson}[2][]{%
  \refstepcounter{person}% New person added
  \def\@currentlabel{#2}% Update label
  \@currentlabel~(P\theperson)% Set person
  % https://tex.stackexchange.com/a/53091/5764
  \if\relax\detokenize{#1}\relax
    \label{#2}%
  \else
    \label{#1}%
  \fi
  }
\makeatother
\newcommand{\refperson}[1]{\ref{#1}}%

\begin{document}

Today I have met Davidofilofsky~(P1) in the parking. Davidofilofsky was friendly. 
Davidofilofsky is the father of John~(P2). Suddenly I remember he was a friend of mine, Susan~(P3).

Today I have met \newperson[david]{Davidofilofsky} in the parking. \refperson{david} was friendly. 
\refperson{david} is the father of \newperson{John}. Suddenly I remember he was a friend of mine, \newperson{Susan}.

\end{document}
Werner
  • 603,163