% Author: Nelson Lago
% This file is distributed under the MIT Licence

\ProvidesPackage{appendixlabel}[2019/10/18 Puts strings "Appendix" and "Annex" in TOC]

% No sumário, normalmente colocamos
% 1 Introdução
% 2 Contexto
% etc.
%
% Isso inclui os apêndices/anexos, que aparecem como
% A Dados Coletados
% B Modelo de questionário
% etc.
%
% Se há só apêndices ou só anexos, isso funciona bem; quando há
% ambos, no entanto, o sumário não fica claro (pode haver dois
% itens "A"). Há duas soluções possíveis:
%
% 1. Colocar, em cada item, "Apêndice X" ou "Anexo X" no sumário.
%
% 2. Colocar as linhas adicionais "Apêndices" e "Anexos" antes
%    das seções correspondentes do sumário
%
% No primeiro caso, modificamos os comandos \appendix e \annex
% para redefinir o formato dos capítulos no sumário (com titletoc).
% No segundo caso, modificamos os comandos \apppendix e \annex
% para que eles acrescentem a linha correspondente.
%
% Observe que, em ambos os casos, a modificação vale para tudo o
% que se segue aos comandos \appendix e \annex, ou seja, os itens
% do sumário que se seguem a eles (referências e índice remissivo)
% são formatados por esta definição, não pelo formato default.

\newif\if@inlineappendix\@inlineappendixfalse

\DeclareOption{inline}{
  \@inlineappendixtrue
}

\ProcessOptions

\RequirePackage{etoolbox}

\if@inlineappendix
  % A primeira opção (como \annex só é definida mais à frente, pela
  % package annex, adiamos a execução com \AtEndPreamble).
  \RequirePackage{titletoc}

  % Como comandos separados, é possível modificar a formatação
  % com "renewcommand"
  \ltx@IfUndefined{chapter}
  {
      \newcommand\setAppendixFormat{
        \titlecontents{section}[45pt]
          {\addvspace{12pt}\bfseries\contentsmargin{-30pt}}
          {\makebox[0pt][r]{\appendixname{} \thecontentslabel{}\hspace{1.1em}}}
          {\hspace{-45pt}}
          {\hfill\thecontentspage}
      }

      \newcommand\setAnnexFormat{
        \titlecontents{section}[45pt]
          {\addvspace{12pt}\bfseries\contentsmargin{-30pt}}
          {\makebox[0pt][r]{\annexname{} \thecontentslabel{}\hspace{1.1em}}}
          {\hspace{-45pt}}
          {\hfill\thecontentspage}
      }
  }{
      \newcommand\setAppendixFormat{
        \titlecontents{chapter}[45pt]
          {\addvspace{12pt}\bfseries\contentsmargin{-30pt}}
          {\makebox[0pt][r]{\appendixname{} \thecontentslabel{}\hspace{1.1em}}}
          {\hspace{-45pt}}
          {\hfill\thecontentspage}
      }

      \newcommand\setAnnexFormat{
        \titlecontents{chapter}[45pt]
          {\addvspace{12pt}\bfseries\contentsmargin{-30pt}}
          {\makebox[0pt][r]{\annexname{} \thecontentslabel{}\hspace{1.1em}}}
          {\hspace{-45pt}}
          {\hfill\thecontentspage}
      }
  }

  \AtEndPreamble{
    \appto\appendix{\setAppendixFormat}
    \appto\annex{\setAnnexFormat}
  }

\else

  % A segunda opção; primeiro, definimos as traduções:
  \providecommand\annexnameplural{Annexes}
  \providecommand\appendixnameplural{Appendices}

  \addto\captionsbrazil{%
    \renewcommand\annexnameplural{Anexos}%
    \renewcommand\appendixnameplural{Apêndices}%
  }

  \addto\captionsbrazilian{%
    \renewcommand\annexnameplural{Anexos}%
    \renewcommand\appendixnameplural{Apêndices}%
  }

  \addto\captionsenglish{%
    \renewcommand\annexnameplural{Annexes}%
    \renewcommand\appendixnameplural{Appendices}%
  }

  \newcommand\appendixTOCLine{
    % Não queremos esta linha como a última da página; para isso:
    %
    % 1. Acrescentamos um pouco de espaço elástico logo antes dela
    %
    % 2. Colocamos uma sugestão de quebra de página
    %
    % 3. Usamos \@afterheading
    %
    % 1 e 2 incentivam (mas não forçam) LaTeX a realizar a quebra antes
    % dela e 3 força LaTeX a mantê-la na mesma página que a próxima linha.

    {\large\vspace{0pt plus 2\baselineskip minus 0pt}}
    \protect\pagebreak[2]
    \vspace{.8\baselineskip}
    {\large\bfseries\hspace{-1.3em}\appendixnameplural\par}
    \@afterheading
  }

  \newcommand\annexTOCLine{
    {\large\vspace{0pt plus 2\baselineskip minus 0pt}}
    \protect\pagebreak[2]
    \vspace{.8\baselineskip}
    {\large\bfseries\hspace{-1.3em}\annexnameplural\par}
    \@afterheading
  }
  % Depois, modificamos os comandos \appendix e \annex para modificar
  % o sumário (como \annex só é definida mais à frente, pela package
  % annex, adiamos a execução com \AtEndPreamble):
  \AtEndPreamble{
    \appto\appendix{\immediateaddtocontents{toc}{\protect\appendixTOCLine}}
    \appto\annex{\immediateaddtocontents{toc}{\protect\annexTOCLine}}
  }

  % \addtocontents pode pregar peças se usamos \include; contornamos
  % com \immediate: https://tex.stackexchange.com/a/13926/183146
  \newcommand{\immediateaddtocontents}[2]{
      \begingroup
        \let\origwrite\write
        \def\write{\immediate\origwrite}
        \addtocontents{#1}{#2}
      \endgroup
  }

\fi

\endinput
