TeX - LaTeX Asked on June 18, 2021
In a couple of threads, the second of which wasthis one,, @schtandard taught me how to condition on the number of enumerate levels that I had. The MWE below illustrates an extremely weird issue with the structure. The code as written works fine, recognizing that the number of levels I’m using is 3 and behaving accordingly. But if you comment out the last line, i.e., word
, it thinks there are only two levels. Then if you comment out the penultimate line, i.e., newpage
, it again works fine. So there’s something about a newpage
, which is not followed immediately by some text, that messes things up. (Obviously, the real-world context in which this problem arose was more complex, but this example seems to isolate the problem). Could somebody please explain what’s going on, and how to insulate myself from this problem?
thanks very much for your help!
documentclass[11pt,reqno,fleqn]{amsart}%
usepackage{enumitem}
%This came from this thread
% https://tex.stackexchange.com/questions/508327/predetermine-the-number-of-nested-levels-before-assigning-label-types-followup?noredirect=1#comment1289746_508327
makeatletter
newcounter{enumerate@max@level}
defregister@enumerate@level#1{%
ifnumvalue{enumerate@max@level}<#1relax
setcounter{enumerate@max@level}{#1}%
fi
}
AtBeginDocument{%
ifcasenumexprvalue{enumerate@max@level}-3relax
% 3 levels
setlist[enumerate,1]{label={arabic*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={XX}, before*={register@enumerate@level{4}}}
or
% 4 levels
setlist[enumerate,1]{label={arabic*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={Roman*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{4}}}
else
% default
setlist[enumerate,1]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={XX}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={XX}, before*={register@enumerate@level{4}}}
fi
edefenumeratemaxlevel{theenumerate@max@level}
setcounter{enumerate@max@level}{0}%
}
AtEndDocument{%
protected@write@auxout{}{%
protectsetcounter{enumerate@max@level}{theenumerate@max@level}%
}%
}
makeatother
begin{document}
begin{enumerate}
item Enumerate 1)
begin{enumerate}
item Enumerate i)
begin{enumerate}
item Enumerate a)
end{enumerate}
end{enumerate}
end{enumerate}
newpage
word
end{document}
Write the value of theenumerate@max@level
to the .aux
immediately, not using protected@write
:
documentclass{amsart}
usepackage{enumitem}
%This came from this thread
% https://tex.stackexchange.com/questions/508327/predetermine-the-number-of-nested-levels-before-assigning-label-types-followup?noredirect=1#comment1289746_508327
makeatletter
newcounter{enumerate@max@level}
defregister@enumerate@level#1{%
ifnumvalue{enumerate@max@level}<#1relax
setcounter{enumerate@max@level}{#1}%
fi
}
AtBeginDocument{%
ifcasenumexprvalue{enumerate@max@level}-3relax
% 3 levels
setlist[enumerate,1]{label={arabic*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={XX}, before*={register@enumerate@level{4}}}
or
% 4 levels
setlist[enumerate,1]{label={arabic*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={Roman*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{4}}}
else
% default
setlist[enumerate,1]{label={roman*)hspace{1ex}}, before*={register@enumerate@level{1}}}
setlist[enumerate,2]{label={alph*)hspace{1ex}}, before*={register@enumerate@level{2}}}
setlist[enumerate,3]{label={XX}, before*={register@enumerate@level{3}}}
setlist[enumerate,4]{label={XX}, before*={register@enumerate@level{4}}}
fi
edefenumeratemaxlevel{theenumerate@max@level}
setcounter{enumerate@max@level}{0}%
}
AtEndDocument{%
immediatewrite@auxout{%
noexpandsetcounter{enumerate@max@level}{theenumerate@max@level}%
}%
}
makeatother
begin{document}
begin{enumerate}
item Enumerate 1)
begin{enumerate}
item Enumerate i)
begin{enumerate}
item Enumerate a)
end{enumerate}
end{enumerate}
end{enumerate}
newpage
%word
end{document}
This leaves the following in your .aux
:
relax
newlabel{tocindent-1}{0pt}
newlabel{tocindent0}{0pt}
newlabel{tocindent1}{0pt}
newlabel{tocindent2}{0pt}
newlabel{tocindent3}{0pt}
global c@enumerate@max@level 3relax
gdef @abspage@last{1}
Correct answer by Werner on June 18, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP