Skip to content

Come si fa a fare riferimento a un contatore personalizzato che mostra il numero di sezione?

Questa recensione è stata analizzata dai nostri esperti in modo da poter garantire la veridicità di questa affermazione.

Soluzione:

È possibile impostare manualmente il valore dell'etichetta definendo @currentlabel all'inizio dell'ambiente di prova.

L'aggiunta di qualcosa all'inizio di un comando può essere fatta usando l'opzione xpatch che fornisce il pacchetto xpretocmd (xpatch pre to command). Questo funziona allo stesso modo per gli ambienti, un ambiente come proof definisce due comandi, uno che viene eseguito con begin{proof} che è chiamato internamente proofe uno che viene eseguito con end{proof} che è internamente chiamato endproof.

La patch dell'ambiente consente di utilizzare il normale metodo label invece di un nuovo comando di etichettatura.

Perché @currentlabel ha un comando @ nel nome, la ridefinizione dovrebbe essere racchiusa in makeatletter e makeatother.

MWE:

documentclass[12pt,letterpaper]{article}

usepackage{amsthm}
usepackage{xpatch}
usepackage{hyperref}
makeatletter
xpretocmd{proof}{def@currentlabel{theproof}}{}{}
makeatother

newcounter{proof}[section] % adds a new counter for the proof environment included in the amsthm package that restarts for every new section
renewcommand{theproof}{thesection.arabic{proof}} % adds the section number before your proof counters
renewcommand{proofname}{refstepcounter{proof}Proof theproof} % the proofname was embedded in your proof environment to output the italicized 'Proof', which is displayed at the beginning of every proof. This changes the proofname to print 'Proof' and theproof, which we defined as the section-proof counter above. This adds a counter to your proofs so you can hyperref them. 

newtheorem{definition}{Definition}[section]

begin{document}
section{One}
begin{proof}
label{p1}
this is proof one.
end{proof}

This should reference proof ref{p1}, which should display as proof 1.1.
begin{definition}
label{d1}
this is definition one.
end{definition}
As we can see, this is not a problem when I reference definition ref{d1}.

section{Two}
begin{proof}
label{p2}
this is proof two.
end{proof}
This should reference proof ref{p2}, which should display as proof 2.1.

begin{definition}
label{d2}
this is definition two.
end{definition}
As we can see, this is not a problem when I reference definition ref{d2}.

end{document}

Risultato:

enter image description here

Ecco un approccio che funziona, ma non sono sicuro di cosa stia succedendo dietro le quinte. Ho adattato la risposta accettata da questa domanda, anche se copiarla alla lettera ha aumentato il contatore proof una volta quando l'ambiente è iniziato e una volta quando l'etichetta è stata definita, con conseguente numerazione di offset, quindi ho semplicemente diminuito il contatore ogni volta che l'etichetta viene chiamata.

Dopo aver definito il contatore proof, aggiungere la riga seguente:

newcommand{prooflabel}[1]{addtocounter{proof}{-1}refstepcounter{proof}label{#1}}

Poi, ogni volta che si ha una prova, invece di label, utilizzare prooflabel come di seguito.

section{One}
begin{proof}
prooflabel{p1}
this is proof one.
end{proof}

This should reference proof ref{p1}, which should display as proof 1.1.

Questo è il risultato:

enter image description here

Forse qualcuno più esperto di me può regolare il parametro prooflabel e le altre definizioni in modo che non vi sia questo couting avanti e indietro, ma sembra funzionare come si vorrebbe.

Il tuo refstepcounter è emesso all'interno dell'argomento opzionale di item e il valore corrispondente di @currentlabel viene dimenticato non appena item viene elaborato, per cui si ottiene un riferimento al numero di sezione. È possibile verificarlo facendo clic sul riferimento.

Una possibile soluzione è quella di applicare una patch a proof (il comando eseguito dopo aver inserito il comando proof ) per emettere il comando refstepcounter dopo trivlist e prima di item.

documentclass[12pt,letterpaper]{article}

usepackage{amsthm}
usepackage{xpatch}
usepackage{hyperref}

newcounter{proof}[section]
renewcommand{theproof}{thesection.arabic{proof}}
renewcommand{proofname}{Proof theproof}

xpatchcmd{proof}{trivlist}{trivlistrefstepcounter{proof}}{}{}

newtheorem{definition}{Definition}[section]

begin{document}
section{One}
begin{proof}
label{p1}
this is proof one.
end{proof}

This should reference proof ref{p1}, which should display as proof 1.1.
begin{definition}
label{d1}
this is definition one.
end{definition}
As we can see, this is not a problem when I reference definition ref{d1}.

section{Two}
begin{proof}
label{p2}
this is proof two.
end{proof}
This should reference proof ref{p2}, which should display as proof 2.1.

begin{definition}
label{d2}
this is definition two.
end{definition}
As we can see, this is not a problem when I reference definition ref{d2}.

end{document}

enter image description here

Si può anche definire un elemento proof* per le prove non numerate salvando una copia di proof prima di applicare la patch.

documentclass[12pt,letterpaper]{article}

usepackage{amsthm}
usepackage{xpatch}
usepackage{hyperref}

% save proof
letunnumberedproofproof
newenvironment{proof*}
 {renewcommandproofname{Proof}unnumberedproof}
 {endproof}

newcounter{proof}[section]
renewcommand{theproof}{thesection.arabic{proof}}
renewcommand{proofname}{Proof theproof}

xpatchcmd{proof}{trivlist}{trivlistrefstepcounter{proof}}{}{}

newtheorem{definition}{Definition}[section]

begin{document}
section{One}
begin{proof}
label{p1}
this is proof one.
end{proof}

This should reference proof ref{p1}, which should display as proof 1.1.
begin{definition}
label{d1}
this is definition one.
end{definition}
As we can see, this is not a problem when I reference definition ref{d1}.

section{Two}
begin{proof}
label{p2}
this is proof two.
end{proof}
This should reference proof ref{p2}, which should display as proof 2.1.

begin{definition}
label{d2}
this is definition two.
end{definition}
As we can see, this is not a problem when I reference definition ref{d2}.

begin{proof*}
An unnumbered proof.
end{proof*}

end{document}



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.