%%%==============================================================================
%% Copyright 2022-present by Alceu Frigeri
%%
%% This work may be distributed and/or modified under the conditions of
%%
%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
%%   version 1.3c (or later), and/or
%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
%%   version 3 (or later)
%%
%% This work has the LPPL maintenance status *maintained*.
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
%% This is version {2.13a} {2026/07/04}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/ufrgscca
%%
%%%==============================================================================
%% UFRGS stands for "Federal University of Rio Grande do Sul" in south Brazil
%% EE    stands for "Engineering School"
%% CCA   stands for "Control and Automation Engineering Course" (Portuguese acronym)
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2026/06/01]

%%%%%%%
%%%
%%% Just an attempt at having my package's info in a regular way
%%%   \pkginfograb_set:nn { <pkg-name>} { props } sets package info
%%%
%%%   \pkginfograbProvidesExplPackage { <pkg-name>} { props } sets package info
%%%     and calls \ProvidesExplPackage
%%%
%%%%%%%
\RequirePackage{pkginfograb}
\pkginfograbProvidesExplClass {ufrgscca}
  { 
     name        = {ufrgscca} ,
     prefix      = {ufrgscca} ,
     date        = {2026/07/04} ,
     version     = {2.13a} ,
     description = {A report based class bundle}
  }
%%%%%%%
%%% End of cut-n-paste
%%%%%%%





%\RequirePackage{ etex }
\RequirePackage{ etoolbox }
\RequirePackage{ starray }
\RequirePackage[T1]{ fontenc }
\RequirePackage[utf8]{ inputenc }


\tl_new:N     \l__ufrgscca_tt_tmpa_tl
\tl_new:N     \l__ufrgscca_tt_tmpb_tl
\int_new:N    \l__ufrgscca_tt_tmpa_int
\int_new:N    \l__ufrgscca_tt_tmpb_int
\str_new:N    \l__ufrgscca_tt_tmpa_str
\clist_new:N  \l__ufrgscca_tt_tmpa_clist
\seq_new:N    \l__ufrgscca_tt_tmpa_seq


%%%%%%%%%%%%%%%%%%%%%%
%%%
%%% TODO: to be decided, where to leave that !! 
%%%       general purpose _properties !!
%%% 
%%%%%%%%%%%%%%%%%%%%%%

\prop_new_linked:N \l__ufrgscca_terms_prop
  
\NewDocumentCommand{ \SetHeadings }{ m }
  { 
    \prop_put_from_keyval:Nn \l__ufrgscca_terms_prop { #1 }
  }

  %%
  %% No protection, so it can be used in a fully expandable context (like \MakeUppercase)
\cs_new:Npn \UseHeading #1 
  { \prop_item:Nn \l__ufrgscca_terms_prop { #1 } }


%\prop_new:N \l__ufrgscca_terms_prop

\NewDocumentCommand{ \SetTerms }{ +m }
  { 
    \prop_put_from_keyval:Nn \l__ufrgscca_terms_prop { #1 } 
  } 
  
  %%
  %% No protection, so it can be used in a fully expandable context (like \MakeUppercase)
\cs_new:Npn \UseTerm #1 
  { \prop_item:Nn \l__ufrgscca_terms_prop { #1 } }

\cs_new_protected:Npn \TermCase #1#2#3
  { 
    \prop_if_in:NnTF \l__ufrgscca_terms_prop { #1 } { #2 } { #3 }
  } 

\NewDocumentCommand{ \GetTerm }{ mm }
  { 
    \prop_get:NnNTF \l__ufrgscca_terms_prop { #1 } \l__ufrgscca_tt_tmpa_tl
      { \tl_gset:Ne #2 \l__ufrgscca_tt_tmpa_tl }
      { \tl_gset:Nn #2 { }}
  }

\NewDocumentCommand{ \pdfTermBookMark }{ m }  
  { 
    \prop_get:NnNTF \l__ufrgscca_terms_prop { #1 } \l__ufrgscca_tt_tmpa_tl
      { 
        \pdfbookmark{ \l__ufrgscca_tt_tmpa_tl }{ \l__ufrgscca_tt_tmpa_tl }
      }
      { }
  }

%\prop_new:N \l__ufrgscca_labels_prop



\NewDocumentCommand{ \SetLabels }{ m }
  { 
    \prop_put_from_keyval:Nn \l__ufrgscca_terms_prop { #1 } 
  }

  %%
  %% No protection, so it can be used in a fully expandable context (like \MakeUppercase)
\cs_new:Npn \UseLabel #1 
  { \prop_item:Nn \l__ufrgscca_terms_prop { #1 } }


\prop_new_linked:N \l__ufrgscca_const_prop

\NewDocumentCommand{ \SetConsts }{ m }
  { 
    \prop_put_from_keyval:Nn \l__ufrgscca_const_prop { #1 }
  }

\cs_generate_variant:Nn \prop_put:Nnn { Nee }
\NewDocumentCommand{ \eSetConst }{ mm }
  { 
    \prop_put:Nee \l__ufrgscca_const_prop { #1 }{ #2 }
  }



\cs_generate_variant:Nn \prop_item:Nn { Ne }

  %%
  %% No protection, so it can be used in a fully expandable context (like \MakeUppercase)
\cs_new:Npn \UseConst #1 
  { \prop_item:Ne \l__ufrgscca_const_prop { #1 } }

\NewDocumentCommand{ \GetConst }{ mm }
  { 
    \prop_get:NnNTF \l__ufrgscca_const_prop { #1 } \l__ufrgscca_tt_tmpa_tl
      { \tl_gset:Ne #2 \l__ufrgscca_tt_tmpa_tl }
      { \tl_gset:Nn #2 { }}
  }

\bool_new:N \l__ufrgscca_repeatfields_bool
\bool_new:N \l__ufrgscca_timesroman_bool
\bool_new:N \l__ufrgscca_nolocal_bool

%==============================================================================
% Declaração de opções
%==============================================================================
\keys_define:nn { ufrgscca }
  { 
    tocdepth        .usage:n    = load,
	tocdepth        .code:n     = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},
    secdepth        .usage:n    = load,
	secdepth        .code:n     = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},

%    english        .usage:n     = load,
%    english        .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }\OptionNotUsed },

		english       .usage:n          = load ,
		english       .bool_set:N       = \l__ufrgscca_english_bool ,
    
    relnum         .usage:n     = load,
    relnum         .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }\PassOptionsToPackage{ \CurrentOption }{ ufrgscca-lists }\OptionNotUsed },

    pretextontoc   .usage:n     = load,
    pretextontoc   .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},
	timesroman     .usage:n     = load,
    timesroman     .bool_set:N  = \l__ufrgscca_timesroman_bool,
    yearsonly      .usage:n     = load,
    yearsonly      .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},

    oneside        .usage:n     = load,
    oneside        .code:n      = { \AtEndOfClass{ \@twosidefalse } }, %\OptionNotUsed },
    strict-abnt    .usage:n     = load,
    strict-abnt    .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},
    repeatfields   .usage:n     = load,
    repeatfields   .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},
	chapternopagenum .usage:n   = load,
	chapternopagenum .code:n    = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},

    nomicrotype    .usage:n     = load,
    nomicrotype    .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},

    showframes     .usage:n     = load,
    showframes     .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},
    showlabes      .usage:n     = load,
    showlabes      .code:n      = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-abnt }},

	xlists         .usage:n     = load,
    xlists         .bool_set:N  = \l__ufrgscca_xlists_bool,
	xpacks         .usage:n     = load,
	xpacks         .bool_set:N  = \l__ufrgscca_xpacks_bool,

	nolocal        .usage:n     = load,
	nolocal        .bool_set:N  = \l__ufrgscca_nolocal_bool,

    nofontwarning  .usage:n     = load,
    nofontwarning  .bool_set:N  = \l__ufrgscca_nofontwarning_bool,

    report        .usage:n      = load,
    report        .code:n       = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-cover }},
    internship    .usage:n      = load,
	internship    .code:n       = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-cover }},
    nonrequired   .usage:n      = load,
    nonrequired   .code:n       = { \PassOptionsToPackage{ \CurrentOption }{ ufrgscca-cover }},

	texlive       .usage:n      = load,
	texlive       .bool_set:N   = \l__ufrgscca_texlive_bool,
	overleaf      .usage:n      = load,
	overleaf      .bool_set:N   = \l__ufrgscca_overleaf_bool,
	miktex        .usage:n      = load,
	miktex        .bool_set:N   = \l__ufrgscca_miktex_bool,

	article       .usage:n      = load,
	article       .bool_set:N   = \l__ufrgscca_article_bool,

	nogeometry    .usage:n      = load,
	nogeometry    .bool_set:N   = \l__ufrgscca_nogeometry_bool,

    oldrenews     .usage:n      = load,
	oldrenews     .bool_set:N   = \l__ufrgscca_oldrenews_bool,

    unknown       .code:n       = 
      { 
        \PassOptionsToClass{ \CurrentOption }{ report } 
      },
  }
\ProcessKeyOptions[ufrgscca]\relax



\bool_if:NTF \l__ufrgscca_timesroman_bool
  { 
    \bool_if:NTF \l__ufrgscca_english_bool
      { 
        \RequirePackage[brazilian,english]{ babel }% babel has to be loaded BEFORE newtx*
      }
      { 
        \RequirePackage[english,brazilian]{ babel }% babel has to be loaded BEFORE newtx*
      }
    \RequirePackage{ mathptmx }
    \PackageWarning{ ufrgscca }{ (obsolete) ~ package ~ mathptmx ~ loaded. ~ It ~ loads ~ a ~ free ~ 'implementantion/interpletation' ~ of ~ the ~ proprietary ~ Times ~ Roman ~ (by ~ Adobe) ~ and ~ Times ~ New ~ Roman ~ (by ~ Microsoft)}
    \PackageWarning{ ufrgscca }{ package ~ microtype ~ is ~ suppressed, ~ resulting ~ in ~ a ~ subpar ~ layout. ~ Again, ~ the ~ “Roman” ~ font ~ used ~ isn't ~ a ~ true ~ Times ~ Roman ~ nor ~ Times ~ New ~ Roman }
  }
  { 
    \RequirePackage{ lmodern }%
  }
\bool_if:NTF \l__ufrgscca_article_bool
  { 
    \LoadClass[12pt]{ article }
  }
  { 
    \LoadClass[12pt,twoside,openright]{ report }
  }

\bool_if:NT \l__ufrgscca_miktex_bool
  { 
    \ifcsdef{ miktexHack }{ \miktexHack }{ }
  }
\bool_if:NT \l__ufrgscca_overleaf_bool
  { 
    \ifcsdef{ overleafHack }{ \overleafHack }{ }
  }
\bool_if:NT \l__ufrgscca_texlive_bool
  { 
    \ifcsdef{ texliveHack }{ \texliveHack }{ }
  }


%%%%%%%%%%%%%%%%%%%%%
%%% Packages Loading
%%%%%%%%%%%%%%%%%%%%%
\RequirePackage{ silence }%

\bool_if:NT \l__ufrgscca_nofontwarning_bool
  { 
  \WarningFilter{ latexfont }{ Font ~ shape }%
  \WarningFilter{ latexfont }{ Size ~ substitutions ~ with ~ differences }%
  \WarningFilter{ latexfont }{ Some ~ font ~ shapes ~ were ~ not ~ available }%
  \WarningFilter{ microtype }{ I ~ cannot ~ find ~ a ~ spacing }%
  \WarningFilter{ hyperref }{ Token ~ not ~ allowed ~ in ~ a ~ PDF }
  }


\RequirePackage{ ufrgscca-abnt }

\bool_if:NT \l__ufrgscca_xlists_bool
  { 
    \RequirePackage{ ufrgscca-lists }
  }


\RequirePackage{ ufrgscca-cover }
\RequirePackage{ ufrgscca-core }


\bool_if:NT \l__ufrgscca_xpacks_bool
  { 
  \ExplSyntaxOff
    \RequirePackage{ relsize }
    \RequirePackage{ keyval,graphicx }
    \RequirePackage{ mathtools }
    \RequirePackage{ empheq }
    \RequirePackage{ mathrsfs, amsfonts,amssymb }%
    \RequirePackage{ amsthm }%
    \RequirePackage{ extarrows }%
    \RequirePackage{ mathfixs }%
    \RequirePackage{ bigdelim }%
	\RequirePackage[american,siunitx,cuteinductors,smartlabels,arrowmos,EFvoltages,betterproportions]{ circuitikz }%
	\usetikzlibrary{ fit }%
	\usetikzlibrary{ math }%
	\usetikzlibrary{ calc }%
	\usetikzlibrary{ shapes.geometric } %needed for the triangle%
	\usetikzlibrary{ shapes.misc } %needed for the triangle%
	\usetikzlibrary{ shapes.multipart }
	\usetikzlibrary{ graphs }%
	\usetikzlibrary{ 3d }%
	\usetikzlibrary{ positioning }%
	\usetikzlibrary{ shadows }%
	\usetikzlibrary{ babel }
    \RequirePackage{ steinmetz }%
    \ExplSyntaxOn
  }





\WarningFilter{ hyperref }{ Option `pdftex' has already }

\RequirePackage[hidelinks,hypertexnames=false]{ hyperref }

%%
%% A few (hyperref related) commands
%%
\NewDocumentCommand{ \autonameref }{ O{ ,\space }mO{ }}{ \autoref{ #2 }#1\nameref{ #2 }#3 }
\gdef\annexref#1{ \hyperref[#1]{ \defannexname\   \ref*{ #1 }}}
\NewDocumentCommand{ \autoannexref }{ O{ ,~ }mO{ }}{ \annexref{ #2 }#1\nameref{ #2 }#3 }


\NewActivity{ course } % yeah, CCA as an activity...
\NewActivity{ tccI }
\NewActivity{ tccII }
\NewActivity{ internship }
\NewActivity{ internship-opt }



\ExplSyntaxOff
    \input{ ufrgscca-terms-ptBR.tex }
    \input{ ufrgscca-cover-ptBR.tex }
\ExplSyntaxOn


\bool_if:NT \l__ufrgscca_english_bool
  { 
    \AtBeginDocument{ \input{ ufrgscca-terms-en.tex }}
  }


\bool_if:NF \l__ufrgscca_nolocal_bool
  { 
    \ExplSyntaxOff
      \IfFileExists{ local.tex }
        { \AtBeginDocument{ \input{ local.tex } } }
        { }%
    \ExplSyntaxOn
  }




