ref with the counter value
Is there some package providing a simple user interface to return the counter value (numeric, not the formatted cross-reference, as ref
does) of a label? It seems neither zref
, not refcount
, nor cleveref
, among others, provide it. cleveref
saves the counter value to the aux
file, but I couldn't find in the docs a macro to retrieve it (something like, say, numbercref
), even if internally there is a cref@getcounter
for that.
Please, note I'm not asking how to do it, just if there is a package with a simple user interface.
cross-referencing
add a comment |
Is there some package providing a simple user interface to return the counter value (numeric, not the formatted cross-reference, as ref
does) of a label? It seems neither zref
, not refcount
, nor cleveref
, among others, provide it. cleveref
saves the counter value to the aux
file, but I couldn't find in the docs a macro to retrieve it (something like, say, numbercref
), even if internally there is a cref@getcounter
for that.
Please, note I'm not asking how to do it, just if there is a package with a simple user interface.
cross-referencing
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
One 'disadvantage' withzref
is that it is necessary to usezlabel
-- i.e.zref
does not hook intolabel
ascleveref
does -- thezlabel
must be specified in addition tolabel
– Christian Hupfer
Dec 29 '18 at 11:50
I don't understand why you sayrefcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?
– Werner
Dec 31 '18 at 19:21
1
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20
add a comment |
Is there some package providing a simple user interface to return the counter value (numeric, not the formatted cross-reference, as ref
does) of a label? It seems neither zref
, not refcount
, nor cleveref
, among others, provide it. cleveref
saves the counter value to the aux
file, but I couldn't find in the docs a macro to retrieve it (something like, say, numbercref
), even if internally there is a cref@getcounter
for that.
Please, note I'm not asking how to do it, just if there is a package with a simple user interface.
cross-referencing
Is there some package providing a simple user interface to return the counter value (numeric, not the formatted cross-reference, as ref
does) of a label? It seems neither zref
, not refcount
, nor cleveref
, among others, provide it. cleveref
saves the counter value to the aux
file, but I couldn't find in the docs a macro to retrieve it (something like, say, numbercref
), even if internally there is a cref@getcounter
for that.
Please, note I'm not asking how to do it, just if there is a package with a simple user interface.
cross-referencing
cross-referencing
edited Jan 2 at 17:46
Javier Bezos
asked Dec 29 '18 at 10:33
Javier BezosJavier Bezos
3,8481215
3,8481215
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
One 'disadvantage' withzref
is that it is necessary to usezlabel
-- i.e.zref
does not hook intolabel
ascleveref
does -- thezlabel
must be specified in addition tolabel
– Christian Hupfer
Dec 29 '18 at 11:50
I don't understand why you sayrefcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?
– Werner
Dec 31 '18 at 19:21
1
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20
add a comment |
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
One 'disadvantage' withzref
is that it is necessary to usezlabel
-- i.e.zref
does not hook intolabel
ascleveref
does -- thezlabel
must be specified in addition tolabel
– Christian Hupfer
Dec 29 '18 at 11:50
I don't understand why you sayrefcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?
– Werner
Dec 31 '18 at 19:21
1
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
One 'disadvantage' with
zref
is that it is necessary to use zlabel
-- i.e. zref
does not hook into label
as cleveref
does -- the zlabel
must be specified in addition to label
– Christian Hupfer
Dec 29 '18 at 11:50
One 'disadvantage' with
zref
is that it is necessary to use zlabel
-- i.e. zref
does not hook into label
as cleveref
does -- the zlabel
must be specified in addition to label
– Christian Hupfer
Dec 29 '18 at 11:50
I don't understand why you say
refcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?– Werner
Dec 31 '18 at 19:21
I don't understand why you say
refcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?– Werner
Dec 31 '18 at 19:21
1
1
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20
add a comment |
1 Answer
1
active
oldest
votes
I have written crossreftools
about one year ago, this package extracts information from cleveref
labels with crtcrefnumber
, this holds the number of the counter, using the special way how cleveref
stores the information in its labels.
Traditional labels do not support this, since those labels apply thefoo
, meaning that something like renewcommand{thefoo}{arabic{chapter}.Roman{section}.Alph{foo}}
will store 4.II.C
, for example. This way crtrefnumber
will report the usual reference value but not the counter value of foo
, 3
in the above example.
Most crt...
macros are expandable.
The zref
package is very sophisticated, but it does not provide means to store the counter value -- the counter name is quite easy to catch, by loading the counter
module of zref, see a possible solution with zref
at the end, however.
In order to achieve this a new property must be defined, with zref@newprop
and later added to the main property list with zref@addprop
.
In total, crossreftools
is not invasive as it just reevaluates the already stored label macros, whereas the second solution changes refstepcounter
(marginally, however). If more information is to be stored with within labels, zref
is most likely the better way to pursue.
documentclass{book}
usepackage{cleveref}
usepackage{crossreftools}
begin{document}
See crtrefnumber{foosec} or crtcrefnumber{foosec}
chapter{Foo}
setcounter{section}{99}
section{A foo section} label{foosec}
end{document}
Update
Here is version with zref
, that stores the name of the last counter being used in refstepcounter
and extracts the value with zlabels
then.
documentclass{book}
usepackage[user,counter]{zref}
setcounter{secnumdepth}{4}
makeatletter
AtBeginDocument{%
letoriginalrefstepcounterrefstepcounter%
renewcommand{refstepcounter}[1]{%
xdef@@lastrefsteppedcounter{#1}%
originalrefstepcounter{#1}%
}
}
zref@newprop{value}[-100000]{numbervalue{@@lastrefsteppedcounter}}
zref@addprop{main}{value}
newcommand{counterref}[1]{%
zref@extract{#1}{value}%
}
makeatother
usepackage{cleveref}
usepackage{crossreftools}
counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
newcommand{foosectionnumber}{100}
newcommand{foosubsectionnumber}{20}
newcommand{foosubsubsectionnumber}{44}
newcommand{einsteinnumber}{1905}
newcommand{foofigurenumber}{2018}
begin{document}
newcommand{tableentryline}[2]{%
tabularnewline
#1 & #2 & crtrefnumber{#1} & crtcrefnumber{#1} & counterref{#1} tabularnewline
tabularnewline
hline
}
begin{tabular}{lllll}
label & Expected value & verb!crtrefnumber! & verb!crtcrefnumber! & verb!counterref! tabularnewline
hline
tableentryline{foosec}{foosectionnumber}
tableentryline{foosubsec}{foosubsectionnumber}
tableentryline{foosubsubsec}{foosubsubsectionnumber}
tableentryline{einstein}{einsteinnumber}
tableentryline{foofigure}{foofigurenumber}
end{tabular}
chapter{Foo}
setcounter{equation}{numexpreinsteinnumber-1}
setcounter{section}{numexprfoosectionnumber-1}
setcounter{figure}{numexprfoofigurenumber-1}
section{A foo section} label{foosec}zlabel{foosec}
setcounter{subsection}{numexprfoosubsectionnumber-1}
subsection{A foo subsection} label{foosubsec} zlabel{foosubsec}
setcounter{subsubsection}{numexprfoosubsubsectionnumber-1}
subsubsection{A foo subsubsection} label{foosubsubsec} zlabel{foosubsubsec}
begin{equation}
E= mc^{2} label{einstein} zlabel{einstein}
end{equation}
begin{figure}
caption{foofigure} label{foofigure} zlabel{foofigure}
end{figure}
end{document}
Update again
Something like (see Javier Bezos' comment below)
setcounter{foo}{crtcrefnumber{foostuff}}
will fail since crtcrefnumber
reports [UNDEFINED]
in the beginning, i.e. the first run. This breaks setcounter
of course
Therefore I have added a new macro that is designed for a 'safe' counter value, i.e.
crtcrefcountervalue
that reports the content of crtcrefundefinedcountervalue
, being 1977 (the year TeX was invented ;-)).
I added this code to the package (without the makeatletter...makeatother
pair of course) and will uploaded a new version of crossreftools
to CTAN.
makeatletter
newcommand{crt@crefundefinedcountervalue}{1977}
newcommand{crtrefundefinedcountervalue}[1]{renewcommand{crt@refundefinedcountervalue}{#1}}
newcommand{crtcrefcountervalue}[1]{%
crtcrefifundefinedlabel{#1}{%
crt@crefundefinedcountervalue%
}{%
crtcrefnumber{#1}%
}%
}
makeatother
Update 2019/01/06 21:04 (CET)
crossreftools v0.9
is available on TeXLive (and most likely on MikTeX as well...)
See alsoxassoccnt
andRegisterPreLabelHook{zlabel}
such thatlabel
produces both the orginal label and does callzlabel
as well
– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something likesetcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, withcrtrefundefinedtext{0}
everything is fine.
– Javier Bezos
Dec 29 '18 at 13:10
2
@JavierBezos: Ah yes, I remember there was an issue withsetcounter
andcrt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed
– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down tocrtcrefextract
that reports[UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I addedcrtcrefcountervalue
that yields1977
in case of undefined references... That value can be change, of course. I will uploadcrossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer
– Christian Hupfer
Dec 29 '18 at 15:04
1
Thank you. Actually,crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.
– Javier Bezos
Dec 29 '18 at 18:03
|
show 2 more comments
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "85"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f467759%2fref-with-the-counter-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
I have written crossreftools
about one year ago, this package extracts information from cleveref
labels with crtcrefnumber
, this holds the number of the counter, using the special way how cleveref
stores the information in its labels.
Traditional labels do not support this, since those labels apply thefoo
, meaning that something like renewcommand{thefoo}{arabic{chapter}.Roman{section}.Alph{foo}}
will store 4.II.C
, for example. This way crtrefnumber
will report the usual reference value but not the counter value of foo
, 3
in the above example.
Most crt...
macros are expandable.
The zref
package is very sophisticated, but it does not provide means to store the counter value -- the counter name is quite easy to catch, by loading the counter
module of zref, see a possible solution with zref
at the end, however.
In order to achieve this a new property must be defined, with zref@newprop
and later added to the main property list with zref@addprop
.
In total, crossreftools
is not invasive as it just reevaluates the already stored label macros, whereas the second solution changes refstepcounter
(marginally, however). If more information is to be stored with within labels, zref
is most likely the better way to pursue.
documentclass{book}
usepackage{cleveref}
usepackage{crossreftools}
begin{document}
See crtrefnumber{foosec} or crtcrefnumber{foosec}
chapter{Foo}
setcounter{section}{99}
section{A foo section} label{foosec}
end{document}
Update
Here is version with zref
, that stores the name of the last counter being used in refstepcounter
and extracts the value with zlabels
then.
documentclass{book}
usepackage[user,counter]{zref}
setcounter{secnumdepth}{4}
makeatletter
AtBeginDocument{%
letoriginalrefstepcounterrefstepcounter%
renewcommand{refstepcounter}[1]{%
xdef@@lastrefsteppedcounter{#1}%
originalrefstepcounter{#1}%
}
}
zref@newprop{value}[-100000]{numbervalue{@@lastrefsteppedcounter}}
zref@addprop{main}{value}
newcommand{counterref}[1]{%
zref@extract{#1}{value}%
}
makeatother
usepackage{cleveref}
usepackage{crossreftools}
counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
newcommand{foosectionnumber}{100}
newcommand{foosubsectionnumber}{20}
newcommand{foosubsubsectionnumber}{44}
newcommand{einsteinnumber}{1905}
newcommand{foofigurenumber}{2018}
begin{document}
newcommand{tableentryline}[2]{%
tabularnewline
#1 & #2 & crtrefnumber{#1} & crtcrefnumber{#1} & counterref{#1} tabularnewline
tabularnewline
hline
}
begin{tabular}{lllll}
label & Expected value & verb!crtrefnumber! & verb!crtcrefnumber! & verb!counterref! tabularnewline
hline
tableentryline{foosec}{foosectionnumber}
tableentryline{foosubsec}{foosubsectionnumber}
tableentryline{foosubsubsec}{foosubsubsectionnumber}
tableentryline{einstein}{einsteinnumber}
tableentryline{foofigure}{foofigurenumber}
end{tabular}
chapter{Foo}
setcounter{equation}{numexpreinsteinnumber-1}
setcounter{section}{numexprfoosectionnumber-1}
setcounter{figure}{numexprfoofigurenumber-1}
section{A foo section} label{foosec}zlabel{foosec}
setcounter{subsection}{numexprfoosubsectionnumber-1}
subsection{A foo subsection} label{foosubsec} zlabel{foosubsec}
setcounter{subsubsection}{numexprfoosubsubsectionnumber-1}
subsubsection{A foo subsubsection} label{foosubsubsec} zlabel{foosubsubsec}
begin{equation}
E= mc^{2} label{einstein} zlabel{einstein}
end{equation}
begin{figure}
caption{foofigure} label{foofigure} zlabel{foofigure}
end{figure}
end{document}
Update again
Something like (see Javier Bezos' comment below)
setcounter{foo}{crtcrefnumber{foostuff}}
will fail since crtcrefnumber
reports [UNDEFINED]
in the beginning, i.e. the first run. This breaks setcounter
of course
Therefore I have added a new macro that is designed for a 'safe' counter value, i.e.
crtcrefcountervalue
that reports the content of crtcrefundefinedcountervalue
, being 1977 (the year TeX was invented ;-)).
I added this code to the package (without the makeatletter...makeatother
pair of course) and will uploaded a new version of crossreftools
to CTAN.
makeatletter
newcommand{crt@crefundefinedcountervalue}{1977}
newcommand{crtrefundefinedcountervalue}[1]{renewcommand{crt@refundefinedcountervalue}{#1}}
newcommand{crtcrefcountervalue}[1]{%
crtcrefifundefinedlabel{#1}{%
crt@crefundefinedcountervalue%
}{%
crtcrefnumber{#1}%
}%
}
makeatother
Update 2019/01/06 21:04 (CET)
crossreftools v0.9
is available on TeXLive (and most likely on MikTeX as well...)
See alsoxassoccnt
andRegisterPreLabelHook{zlabel}
such thatlabel
produces both the orginal label and does callzlabel
as well
– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something likesetcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, withcrtrefundefinedtext{0}
everything is fine.
– Javier Bezos
Dec 29 '18 at 13:10
2
@JavierBezos: Ah yes, I remember there was an issue withsetcounter
andcrt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed
– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down tocrtcrefextract
that reports[UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I addedcrtcrefcountervalue
that yields1977
in case of undefined references... That value can be change, of course. I will uploadcrossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer
– Christian Hupfer
Dec 29 '18 at 15:04
1
Thank you. Actually,crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.
– Javier Bezos
Dec 29 '18 at 18:03
|
show 2 more comments
I have written crossreftools
about one year ago, this package extracts information from cleveref
labels with crtcrefnumber
, this holds the number of the counter, using the special way how cleveref
stores the information in its labels.
Traditional labels do not support this, since those labels apply thefoo
, meaning that something like renewcommand{thefoo}{arabic{chapter}.Roman{section}.Alph{foo}}
will store 4.II.C
, for example. This way crtrefnumber
will report the usual reference value but not the counter value of foo
, 3
in the above example.
Most crt...
macros are expandable.
The zref
package is very sophisticated, but it does not provide means to store the counter value -- the counter name is quite easy to catch, by loading the counter
module of zref, see a possible solution with zref
at the end, however.
In order to achieve this a new property must be defined, with zref@newprop
and later added to the main property list with zref@addprop
.
In total, crossreftools
is not invasive as it just reevaluates the already stored label macros, whereas the second solution changes refstepcounter
(marginally, however). If more information is to be stored with within labels, zref
is most likely the better way to pursue.
documentclass{book}
usepackage{cleveref}
usepackage{crossreftools}
begin{document}
See crtrefnumber{foosec} or crtcrefnumber{foosec}
chapter{Foo}
setcounter{section}{99}
section{A foo section} label{foosec}
end{document}
Update
Here is version with zref
, that stores the name of the last counter being used in refstepcounter
and extracts the value with zlabels
then.
documentclass{book}
usepackage[user,counter]{zref}
setcounter{secnumdepth}{4}
makeatletter
AtBeginDocument{%
letoriginalrefstepcounterrefstepcounter%
renewcommand{refstepcounter}[1]{%
xdef@@lastrefsteppedcounter{#1}%
originalrefstepcounter{#1}%
}
}
zref@newprop{value}[-100000]{numbervalue{@@lastrefsteppedcounter}}
zref@addprop{main}{value}
newcommand{counterref}[1]{%
zref@extract{#1}{value}%
}
makeatother
usepackage{cleveref}
usepackage{crossreftools}
counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
newcommand{foosectionnumber}{100}
newcommand{foosubsectionnumber}{20}
newcommand{foosubsubsectionnumber}{44}
newcommand{einsteinnumber}{1905}
newcommand{foofigurenumber}{2018}
begin{document}
newcommand{tableentryline}[2]{%
tabularnewline
#1 & #2 & crtrefnumber{#1} & crtcrefnumber{#1} & counterref{#1} tabularnewline
tabularnewline
hline
}
begin{tabular}{lllll}
label & Expected value & verb!crtrefnumber! & verb!crtcrefnumber! & verb!counterref! tabularnewline
hline
tableentryline{foosec}{foosectionnumber}
tableentryline{foosubsec}{foosubsectionnumber}
tableentryline{foosubsubsec}{foosubsubsectionnumber}
tableentryline{einstein}{einsteinnumber}
tableentryline{foofigure}{foofigurenumber}
end{tabular}
chapter{Foo}
setcounter{equation}{numexpreinsteinnumber-1}
setcounter{section}{numexprfoosectionnumber-1}
setcounter{figure}{numexprfoofigurenumber-1}
section{A foo section} label{foosec}zlabel{foosec}
setcounter{subsection}{numexprfoosubsectionnumber-1}
subsection{A foo subsection} label{foosubsec} zlabel{foosubsec}
setcounter{subsubsection}{numexprfoosubsubsectionnumber-1}
subsubsection{A foo subsubsection} label{foosubsubsec} zlabel{foosubsubsec}
begin{equation}
E= mc^{2} label{einstein} zlabel{einstein}
end{equation}
begin{figure}
caption{foofigure} label{foofigure} zlabel{foofigure}
end{figure}
end{document}
Update again
Something like (see Javier Bezos' comment below)
setcounter{foo}{crtcrefnumber{foostuff}}
will fail since crtcrefnumber
reports [UNDEFINED]
in the beginning, i.e. the first run. This breaks setcounter
of course
Therefore I have added a new macro that is designed for a 'safe' counter value, i.e.
crtcrefcountervalue
that reports the content of crtcrefundefinedcountervalue
, being 1977 (the year TeX was invented ;-)).
I added this code to the package (without the makeatletter...makeatother
pair of course) and will uploaded a new version of crossreftools
to CTAN.
makeatletter
newcommand{crt@crefundefinedcountervalue}{1977}
newcommand{crtrefundefinedcountervalue}[1]{renewcommand{crt@refundefinedcountervalue}{#1}}
newcommand{crtcrefcountervalue}[1]{%
crtcrefifundefinedlabel{#1}{%
crt@crefundefinedcountervalue%
}{%
crtcrefnumber{#1}%
}%
}
makeatother
Update 2019/01/06 21:04 (CET)
crossreftools v0.9
is available on TeXLive (and most likely on MikTeX as well...)
See alsoxassoccnt
andRegisterPreLabelHook{zlabel}
such thatlabel
produces both the orginal label and does callzlabel
as well
– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something likesetcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, withcrtrefundefinedtext{0}
everything is fine.
– Javier Bezos
Dec 29 '18 at 13:10
2
@JavierBezos: Ah yes, I remember there was an issue withsetcounter
andcrt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed
– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down tocrtcrefextract
that reports[UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I addedcrtcrefcountervalue
that yields1977
in case of undefined references... That value can be change, of course. I will uploadcrossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer
– Christian Hupfer
Dec 29 '18 at 15:04
1
Thank you. Actually,crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.
– Javier Bezos
Dec 29 '18 at 18:03
|
show 2 more comments
I have written crossreftools
about one year ago, this package extracts information from cleveref
labels with crtcrefnumber
, this holds the number of the counter, using the special way how cleveref
stores the information in its labels.
Traditional labels do not support this, since those labels apply thefoo
, meaning that something like renewcommand{thefoo}{arabic{chapter}.Roman{section}.Alph{foo}}
will store 4.II.C
, for example. This way crtrefnumber
will report the usual reference value but not the counter value of foo
, 3
in the above example.
Most crt...
macros are expandable.
The zref
package is very sophisticated, but it does not provide means to store the counter value -- the counter name is quite easy to catch, by loading the counter
module of zref, see a possible solution with zref
at the end, however.
In order to achieve this a new property must be defined, with zref@newprop
and later added to the main property list with zref@addprop
.
In total, crossreftools
is not invasive as it just reevaluates the already stored label macros, whereas the second solution changes refstepcounter
(marginally, however). If more information is to be stored with within labels, zref
is most likely the better way to pursue.
documentclass{book}
usepackage{cleveref}
usepackage{crossreftools}
begin{document}
See crtrefnumber{foosec} or crtcrefnumber{foosec}
chapter{Foo}
setcounter{section}{99}
section{A foo section} label{foosec}
end{document}
Update
Here is version with zref
, that stores the name of the last counter being used in refstepcounter
and extracts the value with zlabels
then.
documentclass{book}
usepackage[user,counter]{zref}
setcounter{secnumdepth}{4}
makeatletter
AtBeginDocument{%
letoriginalrefstepcounterrefstepcounter%
renewcommand{refstepcounter}[1]{%
xdef@@lastrefsteppedcounter{#1}%
originalrefstepcounter{#1}%
}
}
zref@newprop{value}[-100000]{numbervalue{@@lastrefsteppedcounter}}
zref@addprop{main}{value}
newcommand{counterref}[1]{%
zref@extract{#1}{value}%
}
makeatother
usepackage{cleveref}
usepackage{crossreftools}
counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
newcommand{foosectionnumber}{100}
newcommand{foosubsectionnumber}{20}
newcommand{foosubsubsectionnumber}{44}
newcommand{einsteinnumber}{1905}
newcommand{foofigurenumber}{2018}
begin{document}
newcommand{tableentryline}[2]{%
tabularnewline
#1 & #2 & crtrefnumber{#1} & crtcrefnumber{#1} & counterref{#1} tabularnewline
tabularnewline
hline
}
begin{tabular}{lllll}
label & Expected value & verb!crtrefnumber! & verb!crtcrefnumber! & verb!counterref! tabularnewline
hline
tableentryline{foosec}{foosectionnumber}
tableentryline{foosubsec}{foosubsectionnumber}
tableentryline{foosubsubsec}{foosubsubsectionnumber}
tableentryline{einstein}{einsteinnumber}
tableentryline{foofigure}{foofigurenumber}
end{tabular}
chapter{Foo}
setcounter{equation}{numexpreinsteinnumber-1}
setcounter{section}{numexprfoosectionnumber-1}
setcounter{figure}{numexprfoofigurenumber-1}
section{A foo section} label{foosec}zlabel{foosec}
setcounter{subsection}{numexprfoosubsectionnumber-1}
subsection{A foo subsection} label{foosubsec} zlabel{foosubsec}
setcounter{subsubsection}{numexprfoosubsubsectionnumber-1}
subsubsection{A foo subsubsection} label{foosubsubsec} zlabel{foosubsubsec}
begin{equation}
E= mc^{2} label{einstein} zlabel{einstein}
end{equation}
begin{figure}
caption{foofigure} label{foofigure} zlabel{foofigure}
end{figure}
end{document}
Update again
Something like (see Javier Bezos' comment below)
setcounter{foo}{crtcrefnumber{foostuff}}
will fail since crtcrefnumber
reports [UNDEFINED]
in the beginning, i.e. the first run. This breaks setcounter
of course
Therefore I have added a new macro that is designed for a 'safe' counter value, i.e.
crtcrefcountervalue
that reports the content of crtcrefundefinedcountervalue
, being 1977 (the year TeX was invented ;-)).
I added this code to the package (without the makeatletter...makeatother
pair of course) and will uploaded a new version of crossreftools
to CTAN.
makeatletter
newcommand{crt@crefundefinedcountervalue}{1977}
newcommand{crtrefundefinedcountervalue}[1]{renewcommand{crt@refundefinedcountervalue}{#1}}
newcommand{crtcrefcountervalue}[1]{%
crtcrefifundefinedlabel{#1}{%
crt@crefundefinedcountervalue%
}{%
crtcrefnumber{#1}%
}%
}
makeatother
Update 2019/01/06 21:04 (CET)
crossreftools v0.9
is available on TeXLive (and most likely on MikTeX as well...)
I have written crossreftools
about one year ago, this package extracts information from cleveref
labels with crtcrefnumber
, this holds the number of the counter, using the special way how cleveref
stores the information in its labels.
Traditional labels do not support this, since those labels apply thefoo
, meaning that something like renewcommand{thefoo}{arabic{chapter}.Roman{section}.Alph{foo}}
will store 4.II.C
, for example. This way crtrefnumber
will report the usual reference value but not the counter value of foo
, 3
in the above example.
Most crt...
macros are expandable.
The zref
package is very sophisticated, but it does not provide means to store the counter value -- the counter name is quite easy to catch, by loading the counter
module of zref, see a possible solution with zref
at the end, however.
In order to achieve this a new property must be defined, with zref@newprop
and later added to the main property list with zref@addprop
.
In total, crossreftools
is not invasive as it just reevaluates the already stored label macros, whereas the second solution changes refstepcounter
(marginally, however). If more information is to be stored with within labels, zref
is most likely the better way to pursue.
documentclass{book}
usepackage{cleveref}
usepackage{crossreftools}
begin{document}
See crtrefnumber{foosec} or crtcrefnumber{foosec}
chapter{Foo}
setcounter{section}{99}
section{A foo section} label{foosec}
end{document}
Update
Here is version with zref
, that stores the name of the last counter being used in refstepcounter
and extracts the value with zlabels
then.
documentclass{book}
usepackage[user,counter]{zref}
setcounter{secnumdepth}{4}
makeatletter
AtBeginDocument{%
letoriginalrefstepcounterrefstepcounter%
renewcommand{refstepcounter}[1]{%
xdef@@lastrefsteppedcounter{#1}%
originalrefstepcounter{#1}%
}
}
zref@newprop{value}[-100000]{numbervalue{@@lastrefsteppedcounter}}
zref@addprop{main}{value}
newcommand{counterref}[1]{%
zref@extract{#1}{value}%
}
makeatother
usepackage{cleveref}
usepackage{crossreftools}
counterwithin{equation}{chapter}
% some helper macros in order to simplify demonstration of counter values
newcommand{foosectionnumber}{100}
newcommand{foosubsectionnumber}{20}
newcommand{foosubsubsectionnumber}{44}
newcommand{einsteinnumber}{1905}
newcommand{foofigurenumber}{2018}
begin{document}
newcommand{tableentryline}[2]{%
tabularnewline
#1 & #2 & crtrefnumber{#1} & crtcrefnumber{#1} & counterref{#1} tabularnewline
tabularnewline
hline
}
begin{tabular}{lllll}
label & Expected value & verb!crtrefnumber! & verb!crtcrefnumber! & verb!counterref! tabularnewline
hline
tableentryline{foosec}{foosectionnumber}
tableentryline{foosubsec}{foosubsectionnumber}
tableentryline{foosubsubsec}{foosubsubsectionnumber}
tableentryline{einstein}{einsteinnumber}
tableentryline{foofigure}{foofigurenumber}
end{tabular}
chapter{Foo}
setcounter{equation}{numexpreinsteinnumber-1}
setcounter{section}{numexprfoosectionnumber-1}
setcounter{figure}{numexprfoofigurenumber-1}
section{A foo section} label{foosec}zlabel{foosec}
setcounter{subsection}{numexprfoosubsectionnumber-1}
subsection{A foo subsection} label{foosubsec} zlabel{foosubsec}
setcounter{subsubsection}{numexprfoosubsubsectionnumber-1}
subsubsection{A foo subsubsection} label{foosubsubsec} zlabel{foosubsubsec}
begin{equation}
E= mc^{2} label{einstein} zlabel{einstein}
end{equation}
begin{figure}
caption{foofigure} label{foofigure} zlabel{foofigure}
end{figure}
end{document}
Update again
Something like (see Javier Bezos' comment below)
setcounter{foo}{crtcrefnumber{foostuff}}
will fail since crtcrefnumber
reports [UNDEFINED]
in the beginning, i.e. the first run. This breaks setcounter
of course
Therefore I have added a new macro that is designed for a 'safe' counter value, i.e.
crtcrefcountervalue
that reports the content of crtcrefundefinedcountervalue
, being 1977 (the year TeX was invented ;-)).
I added this code to the package (without the makeatletter...makeatother
pair of course) and will uploaded a new version of crossreftools
to CTAN.
makeatletter
newcommand{crt@crefundefinedcountervalue}{1977}
newcommand{crtrefundefinedcountervalue}[1]{renewcommand{crt@refundefinedcountervalue}{#1}}
newcommand{crtcrefcountervalue}[1]{%
crtcrefifundefinedlabel{#1}{%
crt@crefundefinedcountervalue%
}{%
crtcrefnumber{#1}%
}%
}
makeatother
Update 2019/01/06 21:04 (CET)
crossreftools v0.9
is available on TeXLive (and most likely on MikTeX as well...)
edited Jan 6 at 20:04
answered Dec 29 '18 at 10:36
Christian HupferChristian Hupfer
149k14193390
149k14193390
See alsoxassoccnt
andRegisterPreLabelHook{zlabel}
such thatlabel
produces both the orginal label and does callzlabel
as well
– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something likesetcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, withcrtrefundefinedtext{0}
everything is fine.
– Javier Bezos
Dec 29 '18 at 13:10
2
@JavierBezos: Ah yes, I remember there was an issue withsetcounter
andcrt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed
– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down tocrtcrefextract
that reports[UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I addedcrtcrefcountervalue
that yields1977
in case of undefined references... That value can be change, of course. I will uploadcrossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer
– Christian Hupfer
Dec 29 '18 at 15:04
1
Thank you. Actually,crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.
– Javier Bezos
Dec 29 '18 at 18:03
|
show 2 more comments
See alsoxassoccnt
andRegisterPreLabelHook{zlabel}
such thatlabel
produces both the orginal label and does callzlabel
as well
– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something likesetcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, withcrtrefundefinedtext{0}
everything is fine.
– Javier Bezos
Dec 29 '18 at 13:10
2
@JavierBezos: Ah yes, I remember there was an issue withsetcounter
andcrt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed
– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down tocrtcrefextract
that reports[UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I addedcrtcrefcountervalue
that yields1977
in case of undefined references... That value can be change, of course. I will uploadcrossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer
– Christian Hupfer
Dec 29 '18 at 15:04
1
Thank you. Actually,crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.
– Javier Bezos
Dec 29 '18 at 18:03
See also
xassoccnt
and RegisterPreLabelHook{zlabel}
such that label
produces both the orginal label and does call zlabel
as well– Christian Hupfer
Dec 29 '18 at 11:54
See also
xassoccnt
and RegisterPreLabelHook{zlabel}
such that label
produces both the orginal label and does call zlabel
as well– Christian Hupfer
Dec 29 '18 at 11:54
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something like setcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, with crtrefundefinedtext{0}
everything is fine.– Javier Bezos
Dec 29 '18 at 13:10
crtcrefnumber
is (almost) what I was looking for (no @'s at all), but it fails with something like setcounter{subsection}{crtcrefnumber{foosec}}
(the first run). Fortunately, with crtrefundefinedtext{0}
everything is fine.– Javier Bezos
Dec 29 '18 at 13:10
2
2
@JavierBezos: Ah yes, I remember there was an issue with
setcounter
and crt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: Ah yes, I remember there was an issue with
setcounter
and crt...
macros. I forgot to pursue. I will investigate and upload a new version. Thanks for keeping me informed– Christian Hupfer
Dec 29 '18 at 14:11
@JavierBezos: I tracked the issue down to
crtcrefextract
that reports [UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I added crtcrefcountervalue
that yields 1977
in case of undefined references... That value can be change, of course. I will upload crossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer– Christian Hupfer
Dec 29 '18 at 15:04
@JavierBezos: I tracked the issue down to
crtcrefextract
that reports [UNDEFINED]
during the first run of LaTeX etc. This is not really a bug, but by design. Therefore, in order to provide a calculable return value for counters, I added crtcrefcountervalue
that yields 1977
in case of undefined references... That value can be change, of course. I will upload crossreftools
v.0.8 in a few minutes. In the mean time, you can grab the few lines at the end of my answer– Christian Hupfer
Dec 29 '18 at 15:04
1
1
Thank you. Actually,
crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.– Javier Bezos
Dec 29 '18 at 18:03
Thank you. Actually,
crtrefundefinedtext{0}
worked for me, but an out-of-the-box solution (so that it "just works") is better.– Javier Bezos
Dec 29 '18 at 18:03
|
show 2 more comments
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f467759%2fref-with-the-counter-value%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
For more complex problems, zref is the better way to go, I think
– Christian Hupfer
Dec 29 '18 at 10:56
One 'disadvantage' with
zref
is that it is necessary to usezlabel
-- i.e.zref
does not hook intolabel
ascleveref
does -- thezlabel
must be specified in addition tolabel
– Christian Hupfer
Dec 29 '18 at 11:50
I don't understand why you say
refcount
doesn't provide this. Can you explain and/or provide an example as to why you say this?– Werner
Dec 31 '18 at 19:21
1
Because its manual states "If the reference does not contain a number, assignments to a counter will fail of course" :-). And references can be anything, like "(m)", "V.b.6" or "Second".
– Javier Bezos
Jan 2 at 8:20