
Classe ABNT - funcionamento das partes principais
=================================================

Escrito por Miguel Frasson (frasson@math.leidenuniv.nl)

Obs.: o resumo das normas pertinentes ao desenvolvimento da classe est
junto com o manual da classe.


ndice
------
  
  1. Alterao dos ambientes figure e table
  2. Esquemas de paginao

  (aguarde mais)



1. Alterao dos ambientes figure e table
-----------------------------------------

De acordo com a norma, as figuras e tabelas tem numeracao separada do resto
das coisas. Em geral, pode-se alterar tudo no LaTeX por (re)definies. No
entanto, contadores so um caso a parte. No report.cls, que  lido pela
classe, l-se 

\newcounter{figure}[chapter]
\newcounter{table}[chapter]

Isso significa que o contador das figuras e tabelas ser resetado para 1
quando o contador do chapter for incrementado com \stepcounter ou
\refstepcounter. Esses comandos so chamados pelo comando \chapter e
\chapter* (no exatamente, como veremos a seguir)

Uma vez adicionado um contador  lista de "reset" de outro, nada mais pode
ser feito.

A minha primeira tentativa de fazer os ambientes figure e table funcionarem
foi copiando e adaptando uma parte do codigo do eport, alterando os
contadores para ABNTfigure e ABNTtable. Segue o codigo antigo:

--------------------------- inicio do codigo -----------------------------
%%%%%% Figures and Tables not as subcounters of chapter

\newcounter{ABNTfigure}
\renewcommand\theABNTfigure{\arabic{ABNTfigure}}
\def\fps@ABNTfigure{tbp}
\def\ftype@ABNTfigure{1}
\def\ext@ABNTfigure{lof}
\def\fnum@ABNTfigure{\figurename~\theABNTfigure}
\renewenvironment{figure}
               {\@float{ABNTfigure}}
               {\end@float}
\renewenvironment{figure*}
               {\@dblfloat{ABNTfigure}}
               {\end@dblfloat}
\newenvironment{figura}
               {\@float{ABNTfigure}}
               {\end@float}
\newenvironment{figura*}
               {\@dblfloat{ABNTfigure}}
               {\end@dblfloat}
\newcounter{ABNTtable}
\renewcommand\thetable{\arabic{ABNTtable}}
\def\fps@ABNTtable{tbp}
\def\ftype@ABNTtable{2}
\def\ext@ABNTtable{lot}
\def\fnum@ABNTtable{\tablename~\theABNTtable}
\renewenvironment{table}
               {\@float{ABNTtable}}
               {\end@float}
\renewenvironment{table*}
               {\@dblfloat{ABNTtable}}
               {\end@dblfloat}
\newenvironment{tabela}
               {\@float{ABNTtable}}
               {\end@float}
\newenvironment{tabela*}
               {\@dblfloat{ABNTtable}}
               {\end@dblfloat}

\newcommand*\l@ABNTfigure{\@dottedtocline{1}{1.5em}{2.3em}}
\let\l@ABNTtable\l@ABNTfigure\relax
--------------------------- fim do codigo -----------------------------

No entanto, fica algo de estranho no ar. Suponha que um usurio queira
mexer (onde no deveria :-) nos contadores.  claro que iria tentar
redefinir o \thefigure e alteraria o contador figure. 

Dilema: como redeclarar o contador figure para que ele nao fosse incluido
na lista de reset do chapter?

Soluo: Ja que nao da para alterar o report, vamos alterar o \newcounter
ANTES de ler o report, para que o comportamento seja controlado pela classe
ABNT, e depois desfazemos a definicao do \newcounter.  assim: 

- salvamos o comando \newcounter original em um comando.

  \let\ABNToldnewcounter\newcounter\relax

  Obs.: o comando \let\(comando_novo)\(comando_velho) define
  \(comando_novo) com a mesma definicao do \(comando_velho).

- a ideia agora  redefinir o \newcounter para definir diferente os
  contadores figure e table, e comportar-se normalmente com outros
  contadores.

\renewcommand{\newcounter}[1]%
  {\ifthenelse{\equal{#1}{figure}\or\equal{#1}{table}}%
     {\ABNToldnewcounter{#1}\@ifnextchar[{\eatbrackets}{}}%
     {\ABNToldnewcounter{#1}}%
  }%

  Isso no significa que esse comando no tem outros parmetros. Isso se
  aprende vendo como o LaTeX faz as coisas (de uma olhada em como as coisas
  so feitas no arquivo /texmf/tex/latex/base/latex.ltx e no report.cls)

  Vamos ver o que o novo \newcounter faz:

  Primeiro: ele tem um parametro. Isso significa, na verdade, que esse
  comando "come" um parametro de qualquer maneira. Esse parametro  o nome
  do novo contador.
  
  * Se o novo contador  igual a figure ou table, entao (veja o codigo acima)

      \ABNToldnewcounter{#1}\@ifnextchar[{\eatbrackets}{}%

      define o novo contador (que so pode ser figure ou table) sem
      adicionar o [chapter] (o novo contador nao eh mais resetado com o
      chapter). Sobrou no codigo do report um "[chapter]", no  verdade?
      Use o comado \eatbrackets para comer isso e no fazer nada com a
      informacao. Olha a definicao do \eatbrackets:

      \def\eatbrackets[#1]{\relax}

       interessante aprender a definir comandos com o \def puro do TeX. 
      muitssimo mais geral que o \newcommand, mas quando d para fazer com
      o \newcommand,  prefervel.

      O \@ifnextchar[{ ...  }{}  so para ter certeza absoluta que a seguir
      vem os colchetes. Isso garante que o codigo da classe ateh poderia
      ser portado para outra classe...

      Obs.: \@ifnextchar(caracter){comandos do "se"}{comandos do "senao"}
       um comado interno do LaTeX muito til.

   * Seno (se o novo contador no  figure ou table)

      \ABNToldnewcounter{#1}%

     Lembremos que o parametro com o nome do novo contador j foi
     comido. Temos entao que "devolve-lo". Se na sequencia tem colchetes ou
     no, o \ABNToldnewcounter (velho \newcounter) vai testar. 

- Depois de lido o report (com o \LoadClass{report}), desfaz-se o a
  redefinio do \newcommand

  \let\newcounter\ABNToldnewcounter\relax

  E se redefine os \the(figure e table), alterados pelo report.

  \renewcommand{\thefigure}{\arabic{figure}}
  \renewcommand{\thetable}{\arabic{table}}


2. Esquemas de paginao
------------------------

A norma diz que as paginas sao contadas desde a folha de rosto, mas s so
numeradas a partir da *parte textual*. Muita gente pede aquele esquema de
numerao em romanos minusculos antes da parte textual, e na parte textual
a numeraao recomea e agora  em arabicos.

Por sua ez, o Sumrio deve conter as principais divises do texto. Mas h
paginas que no sao numeradas! Decidi (alguem pode contestar) que s 
relevante ao trabalho aquilo que est *depois* do Sumario. O ue est antes
 so identificao ou apresentao do trabalho.

Entao temos dois momentos crticos: 
  - depois do sumario (comeco da inclusao de topicos no sumario)
  - inicio da parte textual (mudanca do comportamento da paginacao)

Em minhas divagaes, conclui que tudo  feito na base de "capitulos". Isso
inclui apendices, anexos, sumario, resumos, referencias... talvez umas
poucas excessoes a essa regra aparecam ANTES do sumario: dedicatoria, folha
de aprovacao.. no me vem  mente outra excesso  regra acima, num texto
"normal".

Entao pensei: o \chapter e seus "sub-comandos" \@chapter e \@schapter
("s" de "star") poderiam checar esses dois eventos e determinarem o
comportamento de tudo. Isso  o que foi implementado.

Foram criados dois "booleans": ABNTinpretext e ABNTaftertoc.

ABNTinpretext s  "true" na parte pre-textual. A parte pre-textual  por
definicao:

  "Desde o comeco do docmento at o primeiro capitulo depois do
   sumario que no  capitulo pre-textual". 

O sumario esta sempre na parte pre-textual. Depois dele, de acordo com a
norma, so a lista de figura, lista de tabelas e lista de smbolos. Entao
esses "capitulos" nao podem executar os comandos do comeco da parte
textual.

Veja parte do codigo do novo \chapter (isso vale para \chapter e \chapter*;
voce ja conhece o comando \secdef?):

   \ifthenelse{\boolean{ABNTinpretext}}%
     {%
      \ifthenelse{\boolean{ABNTaftertoc}}%
        {% change to textual part
         \setboolean{ABNTinpretext}{false}%
         \ABNTBeginOfTextualPart%
        }%
        {}%
     }% 
     {}%

Entao o comando \chapter(*) procura a fronteira da parte textual. Se esta
na parte pre-textual e depois do toc, entao esta na parte textual!!
Achando a fronteira, altera o ABNTinpretext para "false" (para nao procurar
mais a fronteira) e executa o \ABNTBeginOfTextualPart, definido para fazer
as alteracoes de paginacao de acordo com o esquema de paginacao dado.

Mas e as listas de figuras, tabelas e simbolos? -- voce deve estar se
perguntando... 

para isso fiz um comando IGUAL o \chapter, que no busca a fronteira. (Veja
a definicao do comando \pretextualchapter no codigo da classe.) Entao eles
no alteram o ABNTinpretext.

E sobre a inclusao dos capitulo s depois do sumrio? Veja o codigo do
\@chapter e \@schapter para ver que os  capitulos so sao incluidos de
ABNTaftertoc  verdade, e o \@schapter so inclui se ABNTaftertoc e
ABNTincludeintoc (boolean regulao pela opcao "sumariocompleto").

Agora os tres esquemas de paginacao: 

pnumplain: no seta nada. para ter o comportamento anterior do LaTeX, o
           ABNTinpretext  falso e o ABNTaftertoc  true. Assim nao ha
           restricoes para inclusao no sumario, e a "fronteira da parte
           textual" nao  procurada nunca. Se supoe tudo na parte textual.

pnumabnt:  Seta-se o pagestyle da parte pretextual para empty.
           Seta o \ABNTAtBeginOfTextualPart de acordo com tipo de cabecalho
	   selecionado pelo usuario. 

pnumromarab: Seta o pagestyle de acordo com o cabecalho de pagina escolhido
           pelo usuario, mas comeca definindo o \thepage para numeros
	   romanos minusculos e no \ABNTAtBeginOfTextualPart o \thepage 
	   mudado para arabicos e o contador page  resetado.

Obs.: Note que o pagestyle tem que ser setado para o texto comum e para as
paginas que cotem titulos de capitulos (na classe ABNT, dado pelo
\chaptertitlepagestyle). 
