2

I have an issue with \themycounter being evaluated too late:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}

\newcounter{mycounter} \newcommand{\defineXX}[3]{% \refstepcounter{mycounter} \expandafter\def\csname#1@id\endcsname{FSR \themycounter} \expandafter\def\csname#1@definition\endcsname{#2} \expandafter\def\csname#1@misc\endcsname{#3} }

\newcommand{\printXX}[2]{% \hypertarget{#1}{% \subsection{\csname#1@id\endcsname}\label{#1}}

\csname#1@definition\endcsname

Test: \csname#1@misc\endcsname

#2 }

\begin{document}

\defineXX{test-1}{Definition 1}{Bla bla} \defineXX{test-2}{Definition 2}{Bla bla}

\printXX{test-1}{Additional remark 1} \printXX{test-2}{Additional remark 2}

\end{document}

yields

The counter is set to 2 in both items

but I want to see FSR 1 and FSR 2

Markus W.
  • 272

2 Answers2

0

You need to expand \themycounter before storing it. Here's one way, using the age-old \begingroup\edef\x{\endgroup...}\x expansion technique:

enter image description here

\documentclass{article}

\usepackage{hyperref}

\newcounter{mycounter} \makeatletter \newcommand{\defineXX}[3]{% \refstepcounter{mycounter}% \begingroup\edef\x{\endgroup\noexpand@namedef{#1@id}{FSR \themycounter}}\x @namedef{#1@definition}{#2} @namedef{#1@misc}{#3} } \makeatother

\newcommand{\printXX}[2]{% \hypertarget{#1}{% \subsection{\csname#1@id\endcsname}\label{#1}}

\csname#1@definition\endcsname

Test: \csname#1@misc\endcsname

#2 }

\begin{document}

\defineXX{test-1}{Definition 1}{Bla bla} \defineXX{test-2}{Definition 2}{Bla bla}

\printXX{test-1}{Additional remark 1} \printXX{test-2}{Additional remark 2}

\end{document}

\@namedef{<cmd name>}{<stuff>} (from the kernel) was just a convenience/shorter alternative to \expandafter\def\csname <cmd name>\endcsname{<stuff>}.

Werner
  • 603,163
0

Use \edef instead of \def. On the other hand, \refstepcounter does nothing more than \stepcounter, because it is performed at \defineXX and when you use \label it's too late.

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}

\newcounter{mycounter} \newcommand{\defineXX}[3]{% \stepcounter{mycounter}% \expandafter\edef\csname#1@id\endcsname{FSR \themycounter}% \expandafter\def\csname#1@definition\endcsname{#2}% \expandafter\def\csname#1@misc\endcsname{#3}% }

\newcommand{\printXX}[2]{% \hypertarget{#1}{% \subsection{\csname#1@id\endcsname}\label{#1}}% \csname#1@definition\endcsname

Test: \csname#1@misc\endcsname

#2 }

\begin{document}

\defineXX{test-1}{Definition 1}{Bla bla} \defineXX{test-2}{Definition 2}{Bla bla}

\printXX{test-1}{Additional remark 1} \printXX{test-2}{Additional remark 2}

\end{document}

enter image description here

egreg
  • 1,121,712