TransWikia.com

Predetermine the number of nested levels before assigning label types (Followup #2)

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}

One Answer

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

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP