%%%==============================================================================
%% Copyright 2025-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 {1.0b} {2025/11/15}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/afperpack
%%
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2022/06/01]

\ProvidesExplPackage
    {afperpack}
    {2025/11/15}
    {1.0b}
    {afperpack personal package/preferences.}

%%%%%%%
%%%
%%% Just an attempt of having my packages info in a regular way
%%% \Pkginfograb_set:nn {<pkg-name>} { props} for each and all.
%%%
%%%%%%%
\RequirePackage{pkginfograb}
\pkginfograb_set:nn { afperpack }
  {
     name        = {afperpack} ,
     prefix      = {afperpack} ,
     date        = {2025/11/15},
     version     = {1.0b} ,
     description = {afperpack~ personal~ package/preferences.}
  }
%%%%%%%
%%% End of cut-n-paste
%%%%%%%

\RequirePackage{etoolbox}
\RequirePackage[T1]{fontenc}
\RequirePackage[utf8]{inputenc}


\keys_define:nn {afperpack }
  {
    showframe .usage:n = load ,
    showframe .bool_set:N = \l__afperpack_showframe_bool ,

    showlabels .usage:n = load ,
    showlabels .bool_set:N = \l__afperpack_showlabels_bool ,

    english .usage:n = load ,
    english .bool_set:N = \l__afperpack_english_bool ,

    beamer .usage:n = load ,
    beamer  .bool_set:N = \l__afperpack_beamer_bool ,
    
    xpacks .usage:n = load ,
    xpacks  .bool_set:N = \l__afperpack_xpacks_bool ,
    
    times .usage:n = load ,
    times  .bool_set:N = \l__afperpack_times_bool ,
    
    noquests .usage:n = load ,
    noquests .bool_set:N = \l__afperpack_noquests_bool ,
    
    quests .usage:n = general ,
    quests .tl_set:N = \l__afperpack_quests_tl ,
    
    fxgraph .usage:n = general ,
    fxgraph .tl_set:N = \l__afperpack_fxgraph_tl ,
    
    dotncross .usage:n = general ,
    dotncross .tl_set:N = \l__afperpack_dotncross_tl ,
    
    tikz .usage:n = load ,
    tikz  .bool_set:N = \l__afperpack_tikz_bool ,
    
    graphicx .usage:n = load ,
    graphicx  .bool_set:N = \l__afperpack_graphicx_bool ,
    
    math .usage:n = load ,
    math  .bool_set:N = \l__afperpack_math_bool ,
    
    listings .usage:n = load ,
    listings  .bool_set:N = \l__afperpack_listings_bool ,

    landscape .usage:n = load ,
    landscape  .bool_set:N = \l__afperpack_landscape_bool ,
  }
\ProcessKeyOptions [ afperpack ]

%
% to be used "outside" expl3
%
\newif\ifafperpack@@tikz
\afperpack@@tikzfalse
\bool_if:nT {\l__afperpack_tikz_bool}
  { \afperpack@@tikztrue }
  
\RequirePackage{xcolor}

\bool_if:nTF {\l__afperpack_beamer_bool}
  {}
  { 
    %beamer doesn't work with these
    \bool_if:NTF \l__afperpack_landscape_bool
      {
        \@ifpackageloaded{geometry}{}{\RequirePackage[a4paper,landscape,margin=20mm,right=20mm,marginparwidth=0cm,asymmetric,top=15mm,bottom=15mm]{geometry}}
      }
      {
        \@ifpackageloaded{geometry}{}{\RequirePackage[a4paper,margin=15mm,right=15mm,marginparwidth=0cm,asymmetric,top=25mm,bottom=15mm]{geometry}}
      }
     
    \RequirePackage[calcwidth]{titlesec}
    \bool_if:nT {\l__afperpack_listings_bool}
      {
        \RequirePackage{listings}
        \definecolor{lstgray}{rgb}{0.965,0.965,0.965}%
        \lstset{
          basicstyle=\ttfamily\small,
          columns=fullflexible,
          keepspaces=true,
          frame=tb,
          inputencoding=latin1,
          %  inputencoding=utf8,
          extendedchars=true,
          backgroundcolor=\color{lstgray},
        	breaklines=true,
          %	xleftmargin=7pt,
          %	xrightmargin=7pt
        }%
        %%%
        %%% from https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings#Encoding_issue
        \lstset{
          literate=
          {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
          {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
          {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
          {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
          {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
          {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
          {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
          {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
        	{ã}{{\~{a}}}1 {õ}{{\~{o}}}1
        	{Ã}{{\~{A}}}1 {Õ}{{\~{O}}}1
          {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
          {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
          {€}{{\EUR}}1 {£}{{\pounds}}1
        }
      }
  }


\bool_if:nT {\l__afperpack_showframe_bool}
  { \RequirePackage{showframe} }

\bool_if:nT {\l__afperpack_showlabels_bool}
  { \RequirePackage{showlabels} }

\bool_if:nTF \l__afperpack_english_bool
  { \RequirePackage[english]{babel} }
  { \RequirePackage[brazilian]{babel} }


\bool_if:nT {\l__afperpack_xpacks_bool}
  {
    \RequirePackage{longtable}%
    \RequirePackage{fancyhdr}
    \RequirePackage{csquotes}
    \RequirePackage[position=above,font=small,labelfont=bf,textfont=md,textfont+=sl,width=.80\textwidth]{caption}
    \RequirePackage{subcaption}
    \RequirePackage{url}
    \RequirePackage{multirow,bigdelim}
  }
  
\bool_if:nTF {\l__afperpack_times_bool}
  { \RequirePackage{mathptmx} } %for those times...
  { \RequirePackage{lmodern} }  %default font

    \RequirePackage[inline]{enumitem}
    \SetEnumitemKey{midsep}{topsep=3pt, partopsep=0pt}

%
% Sometimes needed
%
\bool_if:nT {\l__afperpack_graphicx_bool}
  { \RequirePackage{ graphicx } }

%
% Most of the time, if not always needed
%
\bool_if:nT {\l__afperpack_math_bool}
  {
    \RequirePackage{ amsmath , amsfonts , amssymb }
    \RequirePackage{ amsthm }
    \RequirePackage{ mathrsfs }  %for \mathscr letters
    \RequirePackage{ mathtools,empheq }
    \RequirePackage{ extarrows, steinmetz, mathfixs }
    \RequirePackage{ siunitx }
    \RequirePackage{ cases }
  }
%
% pgf/tikz packages can't be loaded in an Expl3 code regim 
%
\ExplSyntaxOff

%
% My standard circuitikz setup
%
\ifafperpack@@tikz
  \RequirePackage[american,siunitx,cuteinductors,smartlabels,arrowmos,EFvoltages,betterproportions]{circuitikz}
  \usetikzlibrary{fit,math,calc}
  \usetikzlibrary{fpu}
  \usetikzlibrary{arrows,shapes}
  \usetikzlibrary{shapes.geometric} %needed for the triangle
  \usetikzlibrary{shapes.misc} %needed for the triangle
	\usetikzlibrary{shapes.multipart}  
  \usetikzlibrary{graphs,3d}
  \usetikzlibrary{datavisualization,datavisualization.formats.functions}
  \usetikzlibrary[commutative-diagrams]  %% oriented graphs.
  \usetikzlibrary{positioning}%
  \usetikzlibrary{shadows}%

  %
  % For the brave and unaware...
  %
  \NewDocumentCommand{\pgfmathparseFPU}{+m}
    {
      \begingroup
        \pgfkeys{
          /pgf/fpu,
          /pgf/fpu/output format=fixed
        }
        \pgfmathparse{#1}
        \pgfmathsmuggle\pgfmathresult
      \endgroup
    }
  
  %
  % To draw graphs... together with tikzfxgraph (below)
  %
  \usetikzlibrary{matrix}
  \RequirePackage{pgfplots}
  \pgfplotsset{compat=1.18}
  \usetikzlibrary{pgfplots.units}
  
\fi

\ExplSyntaxOn

\bool_if:nT {\l__afperpack_tikz_bool}
  {
    %
    % My standard circuitikz setup
    %
    \tl_if_empty:NF \l__afperpack_dotncross_tl
      { \PassOptionsToPackage{\l__afperpack_dotncross_tl}{tikzdotncross} }
    \RequirePackage{tikzdotncross}
    \RequirePackage{tikzquads}
    
    \bool_if:nF {\l__afperpack_noquests_bool}
      {
        \tl_if_empty:NF \l__afperpack_quests_tl
          { \PassOptionsToPackage{\l__afperpack_quests_tl}{tikzquests} }
        \RequirePackage{tikzquests}
      }

    %
    % To draw graphs...
    %
    \tl_if_empty:NF \l__afperpack_fxgraph_tl
      { \PassOptionsToPackage{\l__afperpack_fxgraph_tl}{tikzfxgraph} }
    \RequirePackage[no~ domain~ warning]{tikzfxgraph}   
  }


\keys_define:nn {afperpack / cab}
  {
    uni .usage:n = general ,
    uni .tl_set:N = \l__afperpack_uni_tl ,
    uni .default:n         = {Universidade ~\ Federal\ ~ do\ ~ Rio\ ~ Grande\ ~ do\ ~ Sul} ,

    dept .usage:n = general ,
    dept .tl_set:N = \l__afperpack_dept_tl ,
    dept .default:n         = {Escola\ ~ de\ ~ Engenharia\ ~ /\ ~ DELAE} ,
  
    class .usage:n = general ,
    class .tl_set:N = \l__afperpack_class_tl ,
    class .default:n         = {disciplina} ,

    classcode .usage:n = general ,
    classcode .tl_set:N = \l__afperpack_code_tl ,
    classcode .default:n         = {ENGcode} ,
    
    exam .usage:n = general ,
    exam .tl_set:N = \l__afperpack_exam_tl ,
    exam .default:n         = {Verificação de Aproveitamento} ,
    
    sem .usage:n = general ,
    sem .tl_set:N = \l__afperpack_sem_tl ,
    sem .default:n         = {202x / y} ,
    
    semester .usage:n = general ,
    semester .tl_set:N = \l__afperpack_sem_tl ,
    semester .default:n         = {202x / y} ,

    name~ label .usage:n = general ,
    name~ label .tl_set:N = \l__afperpack_name_label_tl ,
    name~ label .default:n         = {Nome} ,

    id~ label .usage:n = general ,
    id~ label .tl_set:N = \l__afperpack_id_label_tl ,
    id~ label .default:n         = {Cartão} ,

    duo~ label .usage:n = general ,
    duo~ label .tl_set:N = \l__afperpack_duo_label_tl ,
    duo~ label .default:n         = {Dupla} ,

    simplegrad .usage:n = general ,
    simplegrad .bool_set:N = \l__afperpack_simplegrad_bool ,
    
    simplegrad~ text .usage:n = general ,
    simplegrad~ text .tl_set:N = \l__afperpack_simplegrad_tl ,
    simplegrad~ text .default:n = 
      {
        Assinalar~ um~ “\textbf{X}”,~ no~ tipo~ de~ correção~ a~ ser~ realizada.
  			  \begin{description}
   	        \item[(~\ )~ Simplificada]~	Será~ atribuída~ uma~ nota~ igual~ a~ $3$~ –--~ independente~ do~ que~ estiver~ escrito~ na~ prova.
   	        \item[(~\ )~ Completa]~	Todas~ as~ questões~ serão~ corrigidas~ e~ a~ nota~ será~ dada~ pela~ soma~ dos~ pontos~ obtidos~ em~ cada~ questão.~ Neste~ caso,~ a~ nota~ estará~ no~ intervalo~ $[0;10]$.
          \end{description}
      } ,

    duo .usage:n = general ,
    duo .bool_set:N = \l__afperpack_duo_bool ,

    nonames .usage:n = general ,
    nonames .bool_set:N = \l__afperpack_nonames_bool ,
    
    default .usage:n = general ,
    default .meta:n = 
      {
        uni , dept , class , classcode , exam , sem , 
        duo~ label, id~ label , name~ label , 
        simplegrad~ text ,
        simplegrad = false , duo = false , nonames = false ,
      } ,
    default .value_forbidden:n = true ,
  }


\cs_new_protected:Npn \__afperpack_fbox:n #1
  {
    \fbox{
      \footnotesize
  	  \begin{minipage}{.6\textwidth}
        #1
      \end{minipage}
  	}\\[3ex]
  }


\cs_new_protected:Npn \__afperpack_simplecab:
  {
    \__afperpack_fbox:n
      { \l__afperpack_simplegrad_tl }
  }


\NewDocumentCommand{\cab}{mO{}}
  {
    \keys_set:nn{afperpack / cab}{default , #1}
    \bool_lazy_or:nnTF {\tl_if_blank_p:V \l__afperpack_code_tl}{\tl_if_empty_p:V \l__afperpack_class_tl}
      { \tl_set:Nn \l_tmpa_tl {} }
      { \tl_set:Nn \l_tmpa_tl {\ ~-\ ~} }
    \bool_lazy_or:nnTF {\tl_if_blank_p:V \l__afperpack_exam_tl}{\tl_if_blank_p:V \l__afperpack_sem_tl}
      { \tl_set:Nn \l_tmpb_tl {} }
      { \tl_set:Nn \l_tmpb_tl {\ ~-\ ~} }

%    \newpage
    \begin{center}
      { 
        \sc\large  \l__afperpack_uni_tl\\
        \l__afperpack_dept_tl\\        
        \l__afperpack_code_tl \l_tmpa_tl \l__afperpack_class_tl\\ 
        \l__afperpack_exam_tl \l_tmpb_tl \l__afperpack_sem_tl\\[2ex]
      }
      
    \bool_if:nT {\l__afperpack_simplegrad_bool}
      {
        \__afperpack_simplecab:
      }
    
    \bool_if:nF {\l__afperpack_nonames_bool}
      {
        \l__afperpack_name_label_tl :\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\vspace{10mm}
        \l__afperpack_id_label_tl :\ldots\ldots\ldots\ldots\ldots\ldots
      }
    
    \bool_if:nT {\l__afperpack_duo_bool}
      {
        \\[-3ex]
        \l__afperpack_duo_label_tl :\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\ldots\vspace{10mm}
        \l__afperpack_id_label_tl :\ldots\ldots\ldots\ldots\ldots\ldots
      }
    \tl_if_blank:nF {#2}
      {
        \\[-3ex]
        \__afperpack_fbox:n {#2}
      } 
    \end{center}
  }
  
