%% ---------------------------------------------------------------
%% The typoaid package --- 
%% Maintained by Daniele Ratti
%% E-mail: ilfuria+tya@gmail.com
%% Released under the LaTeX Project Public License v1.3c or later
%% See http://www.latex-project.org/lppl.txt
%% Changelog:
%% 0.0.7 first release
%% 0.1.0 completed the simple-command interface
%% 0.1.5 tested and fine tuned the simple command interface
%% 0.2.0 through 0.2.7 introduced the font table and tuned it
%% 0.3.0 through 0.3.7 introduced the width table and tuned it
%% 0.3.8 special code refactoring for luatex
%% 0.4.0 massive code refactoring, presetting tables 
%% 0.4.1 tables and variables fine tuning
%% 0.4.2 using the kernel provided tmpa and tmpb; starting on vertical data
%% 0.4.3 finishing vertical table
%% 0.4.5 updated vertical table and starred commands
%% 0.4.7 finished vertical tst
%% ---------------------------------------------------------------

\RequirePackage{expl3}
\ProvidesExplPackage{typoaid}{2017/05/07}{0.4.7} {Typographic Aid}
\RequirePackage{array}
\RequirePackage{booktabs}
\RequirePackage{siunitx}

%% CONSTANTS AND VARIABLES

\dim_new:N \g__typoAid_Alphabet_dim

\dim_new:N\g__typoAid_ExHeight_dim

\dim_new:N\g__typoAid_EmWidth_dim

\dim_new:N\g__typoAid_MeanChar_dim

\box_new:N\g__typoAid_Alphabet_box

\int_new:N\g__typoAid_CharPerRow_int

\dim_new:N\g__typoAid_SwitchedFontSize_dim

\dim_new:N\l__typoAid_local_dim

\tl_const:Nn \c__typoAid_lc_alphabet_tl {abcdefghijklmnopqrstuvwxyz}

\tl_const:Nn \c__typoAid_uc_alphabet_tl {ABCDEFGHIJKLMNOPQRSTUVWXYZ}

\str_const:Nn\c__typoAid_name_string{TypoAid}

\str_const:Nx\c__typoAid_typeout_string{TypoAid\iow_newline:*~ Font~switch~given:~}

%% END CONSTANTS AND VARIABLES


%% CALCULATIONS
% A helper function to avoid global assignments.
% The second argument should consist of protected
% function and expandable ones
\cs_new_protected:Npn \__typoAid_smuggle:nn #1 #2
 {
  \group_begin:
  #1
  \use:x { \group_end: #2 }
 }
 
\cs_new_protected:Npn\__typoAid_typoAlphabet:n #1
{
  \box_gclear:N \g__typoAid_Alphabet_box
  \hbox_gset:Nn \g__typoAid_Alphabet_box
   {
    #1
    % LuaTeX ignores {} as far as kerning is concerned so
    % we need to box each character
    \tl_map_inline:Nn \c__typoAid_lc_alphabet_tl { \hbox:n { ##1 } }
   }
 }
 
 % A function to calculate the alphabet length and
 % mean char width
\cs_new_protected:Npn\__typoAid_calcAlph:n #1 
{
	% Typesets the alphabet
	\__typoAid_typoAlphabet:n{#1}
	
	% Globally sets the alphabet dimension as the width of the alphabet box
	\dim_gset:Nn\g__typoAid_Alphabet_dim{\box_wd:N\g__typoAid_Alphabet_box}
	
	% sets the local coefficient that determines the 
	% mean char width as 26.5+ 1% alph length
	\fp_set:Nn\l_tmpa_fp
	{
		26.5+1/100*\dim_to_decimal:n{\g__typoAid_Alphabet_dim}
	}			
	
	% globally sets the mean char width as alphabet/coefficient
	\dim_gset:Nn\g__typoAid_MeanChar_dim
	{
		\fp_to_dim:n
		{
			\dim_to_decimal:n
			{
				\g__typoAid_Alphabet_dim
			}/\fp_use:N\l_tmpa_fp
		}
	}
}

%% A function to calculate the ex width for a given font switch
\cs_new_protected:Npn\__typoAid_calcEx:n #1
{
	 \__typoAid_smuggle:nn { #1 }
   {
    \dim_gset:Nn \g__typoAid_ExHeight_dim { \dim_eval:n { 1ex } }
   }
}

%% A function that calculates the current em width for the font switch
\cs_new_protected:Npn\__typoAid_calcEm:n#1
{
	\__typoAid_smuggle:nn { #1 }
   {
    \dim_gset:Nn \g__typoAid_EmWidth_dim { \dim_eval:n { 1em } }
   }
}

%% A function to store the font size for a specific switch
\cs_new_protected:Npn\__typoAid_calcFsize:n#1
{
	\__typoAid_smuggle:nn{ #1 }
	{
		\dim_gset:Nn\g__typoAid_SwitchedFontSize_dim{\fp_to_dim:n{\f@size}}
	}
}

%% Calculates the numer of characters that can be set in
%% a column of a given width (parameter)
\cs_new_protected:Npn\__typoAid_calcCharPW:n#1
{
	% the char per row are a global variable, thus globally set
	\int_gset:Nn\g__typoAid_CharPerRow_int
	{
		\int_eval:n
		{
			\fp_to_int:n
			{
				\dim_ratio:nn	{\dim_eval:n{#1}} {\g__typoAid_MeanChar_dim}
			}
		}
	}

}

%% Calculates all the basic things, including char per width
\cs_new_protected:Npn\__typoAid_calcAll:nn#1#2
{
	\__typoAid_calcAll:n{#1}
	\__typoAid_calcCharPW:n{#2}
}

%% Calculates the alphabet, the ex height and em width
\cs_new_protected:Npn\__typoAid_calcAll:n#1
{
	\__typoAid_calcAlph:n{#1}
	\__typoAid_calcEx:n{#1}
	\__typoAid_calcEm:n{#1}
	\__typoAid_calcFsize:n{#1}
}

%% Calculates the number of rows in a selected height
%% Params
%% 1-> font switch (for body size purposes)
%% 2-> baseline skip
%% 3-> height
\cs_new_protected:Npn\__typoAid_nrRows:nnn#1#2#3
{
	% calculates the font size
	\__typoAid_calcFsize:n{#1}
	
	% sets the local variables
	\dim_set:Nn\l_tmpa_dim{\dim_eval:n{#2}}
	\dim_set:Nn\l_tmpb_dim{\dim_eval:n{#3}}
	\msg_term:n{\dim_eval:n{#2}~\dim_eval:n{#3}}
	% subtracts the curent font size from the height
	\dim_sub:Nn\l_tmpb_dim{\dim_use:N\g__typoAid_SwitchedFontSize_dim}

	%performs the calculations
	\fp_gset:Nn\g_tmpa_fp
	{
		1+\dim_ratio:nn
		{\l_tmpb_dim}
		{\l_tmpa_dim}
	}
	

}

%% Calculates the height for a given number of rows
%% Params
%% 1-> font switch for size
%% 2-> number of desired rows (int!!)
%% 3-> baselineskip
\cs_new_protected:Npn\__typoAid_HeightForRows:nnn#1#2#3
{
	% calculates the font size
	\__typoAid_calcFsize:n{#1}
	
	% sets the local variables
	\dim_set:Nn\l_tmpa_dim{\dim_eval:n{#3}*(\int_eval:n{#2}-1)}
	
	\dim_add:Nn\l_tmpa_dim{\g__typoAid_SwitchedFontSize_dim}

	\dim_gset:Nn\g_tmpa_dim{\dim_use:N\l_tmpa_dim}
	
}

%% END CALCULATIONS

%% LOGS AND STRINGS

%% A function that logs a specific string, with "Typoaid as a header"
\cs_new:Npn\__typoAid_log:nn #1#2
{
	\msg_log:n{\c__typoAid_typeout_string~#2 \\ #1}
}

%% New function that typesets the  char per width
%% using the current column width to fit them in
%% it also typesets the switch given
\cs_new:Npn\__typoAid_column_string:n#1
{
	\__typoAid_calcCharPW:n{ \dim_eval:n{ \columnwidth } }
%		
	Current~column~width:~\dim_use:N\columnwidth.~ 
	
	Yields~\int_eval:n{\g__typoAid_CharPerRow_int}~characters~per~line,~
	
	with~the~selected~switch:~\tl_to_str:n{#1} 
}

%% Typesets the  alphabet length
\cs_new:Nn\__typoAid_Alphabet_string:
{
	Alphabet~length:~\dim_use:N\g__typoAid_Alphabet_dim
}

%% Typesets the ex height
\cs_new:Nn\__typoAid_ExHeight_string:
{
	Ex~height:~\dim_use:N\g__typoAid_ExHeight_dim
}

%% typesets the em width
\cs_new:Nn\__typoAid_EmWidth_string:
{
	Em~width:~\dim_use:N\g__typoAid_EmWidth_dim
}

%% Logs a column width and char per row
\cs_new:Npn\__typoAid_logWidthData:nn#1#2
{
	\c__typoAid_name_string;~data~with~font~mod:~\tl_to_str:n{#2}\\ 
	column:~\dim_to_decimal_in_unit:nn{#1}{1pt}~pt~or~\dim_to_decimal_in_unit:nn{#1}{1pc}~pc\\
	\int_use:N\g__typoAid_CharPerRow_int~char~per~row
}

%% Logs the data regarding a specific fontshape
\cs_new:Npn\__typoAid_logFontshapeData:nn#1#2
{
	\c__typoAid_name_string.~Font~modifier: \tl_to_str:n{#1}\\
	~Switch:~#2\\
	~Alphabet:~\dim_use:N\g__typoAid_Alphabet_dim\\
	~Ex~height:~\dim_use:N\g__typoAid_ExHeight_dim\\
	~Em~width:~\dim_use:N\g__typoAid_EmWidth_dim
}

%%Saves the tokenlist for the font table
\cs_new:Npn\__typoAid_PrepareFontshapeRow:nn #1#2
{
	%resets the tokenlist
	\tl_gclear:N\g_tmpa_tl
	
	% % calculates the font metrics
	\__typoAid_calcAll:n{#1#2}
	
	%log
	\msg_log:n{\__typoAid_logFontshapeData:nn{#1}{#2}}
	
	%saves the row
	\tl_gset:Nn\g_tmpa_tl
		{
			\texttt{\tl_to_str:n{#2}}&
			\dim_use:N\g__typoAid_Alphabet_dim&
			\dim_use:N\g__typoAid_ExHeight_dim&
			\dim_use:N\g__typoAid_EmWidth_dim
		}
}

%% Calculates the data for the typeseting of the width table
%% Parameters
%% 1-> multiplier
%% 2-> dimension
\cs_new:Npn\__typoAid_CalculateWidthTableData:nn#1#2
{
	
	% Saves the local value of the desired dimension
	\dim_gset:Nn\g_tmpa_dim
		{
			\fp_to_dim:n
			{
				\fp_eval:n{#1}*\dim_eval:n{#2}
			}
		}
	% Calculates the char fitting in the dimension
	\__typoAid_calcCharPW:n{\g_tmpa_dim}
}

%% Saves a row for the width table 
%% Params
%% 1 -> multiplier
%% 2 -> dimension
%% 3 -> font switch
%% 4 -> first row text
\cs_new:Npn\__typoAid_prepareWidthTableRow:nnnn#1#2#3#4
{
	
	\__typoAid_CalculateWidthTableData:nn{#1}{#2}
	
	% logs
	\msg_log:n{\__typoAid_logWidthData:nn{\g_tmpa_dim}{#3}}
	%clears and sets the token list
	\tl_gclear:N\g_tmpa_tl

	\tl_gset:Nn\g_tmpa_tl
	{	
		\tl_to_str:n{#4}&
		\dim_to_decimal_in_unit:nn{\g_tmpa_dim}{1pt}&
		\dim_to_decimal_in_unit:nn{\g_tmpa_dim}{1pc}&
		\int_use:N\g__typoAid_CharPerRow_int
	}
}

%% Saves a row for the widthTable
%% Params
%% 1->form factor
%% 2-> number of lines
%% 3-> string
%% 4-> height
\cs_new:Nn\__typoAid_PrepareHeightTableRow_tl:nnnn
{
	\tl_gclear:N\g_tmpa_tl
	\tl_gset:Nn\g_tmpa_tl
	{
		#3&
		\dim_to_decimal_in_unit:nn{#4}{1pt}&
		\dim_to_decimal_in_unit:nn{#4}{1pc}&
		\fp_eval:n{#2}&
		\fp_eval:n{#1}
	}
}

%% Prepares the log and terminal for starred table version
%% PArams
%% 1-> multiplier
%% 2-> dimension
%% 3 -> switch
\cs_new:Npn\__typoAid_WidthTableLog:nnn#1#2#3
{
	% Performs the calculation
	\__typoAid_CalculateWidthTableData:nn{#1}{#2}
	
	\msg_term:n{\__typoAid_logWidthData:nn{\g_tmpa_dim}{#3}}
	\msg_log:n{\__typoAid_logWidthData:nn{\g_tmpa_dim}{#3}}
}

%% Logs the data for the form factor table
%% Params
%% 1->width
%% 2->switch
%% 3->form factor
%% 4 ->rows p height
\cs_new:Nn\__typoAid_formfactor_log:nnnn
{
	\msg_log:n
	{
		\c__typoAid_name_string\iow_newline:.~
		Form~factor: \fp_eval:n{#3}~for~switch:\tl_to_str:n{#2}\iow_newline:.~
		Width:~\dim_to_decimal_in_unit:nn{#1}{1pt}~pt~(\dim_to_decimal_in_unit:nn{#1}{1pc}~pc)\iow_newline:~.
		Rows~per~height:~\fp_eval:n{#4}
	}

}

%% END LOGS AND STRINGS

%% PUBLIC INTERFACE

%% Public command to print the alphabet in log term and page
\NewDocumentCommand{\typrintalph}{ s m }
{
	% First perform the calculation
	\__typoAid_calcAlph:n{#2}
	
	% Determines whether it has to output to the term or page
	\IfBooleanTF{#1}
	{
		\msg_term:n
		{
			\c__typoAid_typeout_string \tl_to_str:n{#2}\\ 
			\__typoAid_Alphabet_string:
		}
	}{
		 \__typoAid_Alphabet_string:
	}
	
	% Always types out in the log
	\__typoAid_log:nn{\__typoAid_Alphabet_string:}{#2}
}

%% Public command to printout the ex height
\NewDocumentCommand{\typrintex}{ s m }
{
	% Calculates the height
	\__typoAid_calcEx:n{#2}
	
	% decides term vs page
	\IfBooleanTF{#1}
	{
		\msg_term:n
		{
			\c__typoAid_typeout_string \tl_to_str:n{#2}\\ 
			\__typoAid_ExHeight_string:
		}
	}{
		 \__typoAid_ExHeight_string:
	}
	
	% log
	\__typoAid_log:nn{\__typoAid_ExHeight_string:}{#2}
}

%% Public command to printout the em width
\NewDocumentCommand{\typrintem}{s m}
{
	%Performs the calculation
	\__typoAid_calcEm:n{#2}
	
	% Selects the main output
	\IfBooleanTF{#1}
	{
		\msg_term:n
		{
			\c__typoAid_typeout_string\tl_to_str:n{#2}\\
			\__typoAid_EmWidth_string:
		}
	}{
		\__typoAid_EmWidth_string:
	}
	
	%log
	\__typoAid_log:nn{\__typoAid_EmWidth_string:}{ #2}
}

%% Typesets all the simple commands
\NewDocumentCommand{\tyallsimple}{ s m}
{
	% Just propagates the arguments
  	\IfBooleanTF{#1}
 	 {
		\typrintalph*{#2}\\
		\typrintex*{#2}\\
		\typrintem*{#2}\\
 	 }{
		\typrintalph{#2}\\
		\typrintex{#2}\\
		\typrintem{#2}\\
	}
}

%%  Public command to typeset the font shapes table
\NewDocumentCommand{\tyfonttable}{ s m }
{
	
	% Determine the main output
	\IfBooleanTF{#1}
	{
		% Calculate everything
		\__typoAid_calcAll:n{#2}
	
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{upshape}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{upshape}}

		% redo the calculation for bfseries
		\__typoAid_calcAll:n{\bfseries#2}
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{bfseries}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{bfseries}}
	
		% redo the calculation for itshape
		\__typoAid_calcAll:n{\itshape#2}
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{itshape}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{itshape}}
	
		% redo the calculation for small caps
		\__typoAid_calcAll:n{\scshape#2}
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{scshape}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{scshape}}

		% redo the calculation for slanted
		\__typoAid_calcAll:n{\slshape#2}
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{slshape}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{slshape}}
		
		% redo the calculation for sans serif
		\__typoAid_calcAll:n{\sffamily#2}
		%output
		\msg_log:n{\__typoAid_logFontshapeData:nn{#2}{sffamily}}
		\msg_term:n{\__typoAid_logFontshapeData:nn{#2}{sffamily}}
	}{
	% creates a table, centered
	\begin{table}\centering
		% the strut is for separating a bit the caption from the table
		\caption{\strut Font~metrics~for~switch:~\tl_to_str:n{#2}}
		
		% the siuntix columns are useful for the points, but need to be reconsidered, possibly
		\begin{tabular}{lSSS}
			\toprule
			% Header row; note that multicolumn is used due to the siunitx columns
			Font~switch & 
			\multicolumn{1}{r}{Alphabet~length} & 
			\multicolumn{1}{r}{Ex~height} & 
			\multicolumn{1}{r}{Em~width}\\
		
			\midrule
			
			% Calculates and typesets for each row type
			\__typoAid_PrepareFontshapeRow:nn{#2}{\upshape}
			\tl_use:N\g_tmpa_tl\\
			
			\__typoAid_PrepareFontshapeRow:nn{#2}{\bfseries}
			\tl_use:N\g_tmpa_tl\\
			
			\__typoAid_PrepareFontshapeRow:nn{#2}{\itshape}
			\tl_use:N\g_tmpa_tl\\
			
			\__typoAid_PrepareFontshapeRow:nn{#2}{\scshape}
			\tl_use:N\g_tmpa_tl\\
			
			\__typoAid_PrepareFontshapeRow:nn{#2}{\slshape}
			\tl_use:N\g_tmpa_tl\\
	
			\__typoAid_PrepareFontshapeRow:nn{#2}{\sffamily}	
			\tl_use:N\g_tmpa_tl\\
			
			\bottomrule
		\end{tabular}
	\end{table}
	}
}

%% Calculates and typesets the width data
\NewDocumentCommand{\tywidthtable}{ s m }
{
	\__typoAid_calcAll:nn{#2}{\columnwidth}
	\IfBooleanTF{#1}
	{

		\msg_term:n{\__typoAid_logWidthData:nn{\columnwidth}{#2}}
		\msg_log:n{\__typoAid_logWidthData:nn{\columnwidth}{#2}}
		

		\__typoAid_WidthTableLog:nnn{1.5}{\g__typoAid_Alphabet_dim}{#2}
		\__typoAid_WidthTableLog:nnn{2}{\g__typoAid_Alphabet_dim}{#2}
		\__typoAid_WidthTableLog:nnn{2.5}{\g__typoAid_Alphabet_dim}{#2}
		\__typoAid_WidthTableLog:nnn{24}{\g__typoAid_EmWidth_dim}{#2}
		\__typoAid_WidthTableLog:nnn{30}{\g__typoAid_EmWidth_dim}{#2}
		\__typoAid_WidthTableLog:nnn{66}{\g__typoAid_MeanChar_dim}{#2}
		\__typoAid_WidthTableLog:nnn{30}{\g__typoAid_MeanChar_dim}{#2}
		\__typoAid_WidthTableLog:nnn{44}{\g__typoAid_MeanChar_dim}{#2}
		\__typoAid_WidthTableLog:nnn{50}{\g__typoAid_MeanChar_dim}{#2}
	}{
		\begin{table}\centering
			\caption{\strut Width~data~for~font~modificator~\tl_to_str:n{#2} }
			\begin{tabular}{lSSS}
				\toprule
				Description&
				\multicolumn{1}{c}{Value(pt)}&
				\multicolumn{1}{c}{Value(pc)}&
				\multicolumn{1}{c}{Char~per~row}\\
				\midrule
				\msg_log:n{\__typoAid_logWidthData:nn{\columnwidth}{#2}}
				
				Current~column&
				\dim_to_decimal_in_unit:nn{\columnwidth}{1pt} &
				\dim_to_decimal_in_unit:nn{\columnwidth}{1pc}&
				\int_use:N\g__typoAid_CharPerRow_int\\

				% Prepares the row
				\__typoAid_prepareWidthTableRow:nnnn
				{1.5}
				{\g__typoAid_Alphabet_dim}
				{#2}
				{1.5~alphabet~times~(Felici)}
				% typesets it
				\tl_use:N\g_tmpa_tl \\
				
				\__typoAid_prepareWidthTableRow:nnnn
				{2}
				{\g__typoAid_Alphabet_dim}
				{#2}
				{2~alphabet~times~(Felici)}
				\tl_use:N\g_tmpa_tl\\
				
				\__typoAid_prepareWidthTableRow:nnnn
				{2.5}
				{\g__typoAid_Alphabet_dim}
				{#2}
				{2.5~alphabet~times}
				\tl_use:N\g_tmpa_tl\\
						
				\__typoAid_prepareWidthTableRow:nnnn
				{24}
				{\g__typoAid_EmWidth_dim}
				{#2}
				{2~em~in~pica~(Felici)}
				\tl_use:N\g_tmpa_tl\\
				
				\__typoAid_prepareWidthTableRow:nnnn
				{30}
				{\g__typoAid_EmWidth_dim}
				{#2}
				{2.5~em~in~pica~(Felici)}
				\tl_use:N\g_tmpa_tl\\
			
				\__typoAid_prepareWidthTableRow:nnnn
				{66}
				{\g__typoAid_MeanChar_dim}
				{#2}
				{66~char~per~row~(Bringhurst)}
				\tl_use:N\g_tmpa_tl\\
				
				\__typoAid_prepareWidthTableRow:nnnn
				{30}
				{\g__typoAid_MeanChar_dim}
				{#2}
				{30~char~per~row~multicol~(Bringhurst)}
				\tl_use:N\g_tmpa_tl\\

				\__typoAid_prepareWidthTableRow:nnnn
				{44}
				{\g__typoAid_MeanChar_dim}
				{#2}
				{44~char~per~row~multicol~(Bringhurst)}
				\tl_use:N\g_tmpa_tl\\			

				\__typoAid_prepareWidthTableRow:nnnn
				{50}
				{\g__typoAid_MeanChar_dim}
				{#2}
				{50~char~per~row~multicol~(Bringhurst)}
				\tl_use:N\g_tmpa_tl\\			

				\bottomrule
			\end{tabular}
		\end{table}
	}
}

%% Calculates the number of character fitting in a row of given width
%% Parameters
%% 1-> star
%% 2-> (optional) width
%% 3 -> switch
\NewDocumentCommand{\tychperwidth}{s o m}
{
	% Performs the calculations of the given switch
	\__typoAid_calcAll:n{#3}
	
	% If no optional parameter is given, sets the width to the column
	\IfNoValueTF{#2}
	{
		\dim_set:Nn\l_tmpa_dim{\columnwidth}
	}
	{
		\dim_set:Nn\l_tmpa_dim{#2}
	}
	
	% Calculates the carh per width
	\__typoAid_calcCharPW:n{\l_tmpa_dim}
	
	%% determines the output
	\IfBooleanTF{#1}
	{
		\msg_term:n
		{
			\c__typoAid_name_string;~Calculated:~\int_eval:n{\g__typoAid_CharPerRow_int}~chars~in~width:~
			\dim_use:N\l_tmpa_dim~~ and~switch~\tl_to_str:n{#3}
		}
	}{
		Calculated:~\int_eval:n{\g__typoAid_CharPerRow_int}~chars~in~width:~
		\dim_eval:n{\l_tmpa_dim}~and~switch~\tl_to_str:n{#3}
	}
	
	\msg_log:n
	{
		\c__typoAid_name_string;~Calculated:~\int_eval:n{\g__typoAid_CharPerRow_int}~chars~in~width:~
		\dim_eval:n{\l_tmpa_dim}~and~switch~\tl_to_str:n{#3}
	}
}

%% Gives the width to obtain the given char number
%% Parameters
%% 1-> star
%% 2-> (optional) switch
%% 3-> char number
\NewDocumentCommand{\tywidthgivchar}{sO{}m}
{
	% Performs the calculations
	\__typoAid_calcAll:n{#2}
	\dim_set:Nn\l_tmpa_dim
	{
		\fp_to_dim:n
		{
			\dim_to_fp:n{\g__typoAid_MeanChar_dim}*\int_eval:n{#3}
		}
	}
	
	%Determines the output
	\IfBooleanTF{#1}
	{
		\msg_term:n{\c__typoAid_name_string;~for:\tl_to_str:n{#2}
		\iow_newline:*~for~\int_eval:n{#3}~char,\iow_newline:*~ %
		colwidth:~\dim_eval:n{\l_tmpa_dim}~(\dim_to_decimal_in_unit:nn{\l_tmpa_dim}{1pc}~pc)}
	}{
		In~order~to~obtain~the~required~\int_eval:n{#3}~characters~per~column,~
		the~column~should~have~a~width~of~
		\dim_eval:n{\l_tmpa_dim}~(\dim_to_decimal_in_unit:nn{\l_tmpa_dim}{1pc}~pc)
	}
	%log
	\msg_log:n{\c__typoAid_name_string;~for:\tl_to_str:n{#2}\ 
	\iow_newline:.~for \int_eval:n{#3}~char,\iow_newline:.~
	colwidth:~\dim_eval:n{\l_tmpa_dim}~(\dim_to_decimal_in_unit:nn{\l_tmpa_dim}{1pc}~pc)}
}

%% Command to evaluate the number of rows in a specific height
%% Parameters
%% 1-> star
%% 2-> optional font family switch
%% 3-> height
%% 4-> baseline skip
%% 5-> optional font height
\NewDocumentCommand{\tyheight}{sO{}mmo}
{
 	\tl_if_blank:nTF{#3}
 	{
 		
 		\dim_set:Nn\l_tmpa_dim{\dim_use:N\textheight}
 	}{

		\dim_set:Nn\l_tmpa_dim{\dim_eval:n{#3}} 	
 	}
 	
 	\tl_if_blank:nTF{#4}
 	{
 		\dim_set:Nn\l_tmpb_dim{\dim_use:N\baselineskip}
 	}{
		\dim_set:Nn\l_tmpb_dim{\dim_eval:n{#4}} 	
 	}
 	
 	\__typoAid_calcFsize:n{#2}
 	
 	\IfNoValueTF{#5}
	{
		\dim_gsub:Nn\l_tmpa_dim{\dim_use:N\g__typoAid_SwitchedFontSize_dim}
	}{
		\dim_gsub:Nn\l_tmpa_dim{\dim_eval:n{#5}}
	}

 	\fp_set:Nn\l_tmpa_fp
 	{
 		\dim_ratio:nn{\l_tmpa_dim}{\l_tmpb_dim}+1		
	}
 	
 	\IfBooleanTF{#1}
 	{
		\msg_term:n{\c__typoAid_name_string;\iow_newline:*~The~height~of~\dim_eval:n{
 			\tl_if_blank:nTF{#3}{\dim_use:N\textheight}{\dim_eval:n{#3}}}
 		~could~contain~\fp_eval:n{\l_tmpa_fp}~lines~of~text~with~switch~\tl_to_str:n{#2}}
 	}{
 		The~height~of~\dim_eval:n
 		{
 			\tl_if_blank:nTF{#3}{\dim_use:N\textheight}{\dim_eval:n{#3}}
 		}~could~contain~\fp_eval:n{\l_tmpa_fp}~lines~of~text~with~switch~\tl_to_str:n{#2}
 	}
 	
 	\msg_log:n{\c__typoAid_name_string;\iow_newline:*~The~height~of~\dim_eval:n
 		{
 			\tl_if_blank:nTF{#3}{\dim_use:N\textheight}{\dim_eval:n{#3}}
 		}~could~contain~\fp_eval:n{\l_tmpa_fp}~lines~of~text~with~switch~\tl_to_str:n{#2}}
}

%% Command to evaluate the number of rows in a specific height
%% Parameters
%% 1-> star
%% 2-> optional font family switch
%% 3-> width
%% 4-> form factor
%% 5-> optional baselineskip
\NewDocumentCommand{\tyformfactorheight}{ s O{} m m O{\baselineskip}}
{
 	\__typoAid_calcFsize:n{#2}
 	
 	\dim_set:Nn\l__typoAid_local_dim{\dim_eval:n{#5}}
 	
 	\tl_if_blank:nTF{#3}
 	{
 		\dim_set:Nn\l_tmpa_dim{\dim_use:N\columnwidth}
 	}{
 		\dim_set:Nn\l_tmpa_dim{#3}
 	}	
 	
	\IfBooleanTF{#1}
	{
		% FIRST ROW
		\dim_gset:Nn\g_tmpb_dim
		{
			\fp_to_dim:n
			{
				\fp_eval:n{#4}*\dim_eval:n{\l_tmpa_dim}
			}
		}
				
		\__typoAid_nrRows:nnn{#2}{\l__typoAid_local_dim}{\g_tmpb_dim}
				
		\msg_term:n
		{
			\c__typoAid_name_string\iow_newline:*~
			Form~factor: \fp_eval:n{#4}~for~switch:\tl_to_str:n{#2}\iow_newline:*~
			Width:~ \dim_to_decimal_in_unit:nn
			{\g_tmpb_dim}{1pt}~pt~
			(\dim_to_decimal_in_unit:nn
			{\g_tmpb_dim}{1pc}~pc)\iow_newline:*~
			Rows~per~height:~\fp_eval:n{round(\g_tmpa_fp,3)}
			
		}
		\__typoAid_formfactor_log:nnnn{\g_tmpb_dim}{#2}{\fp_eval:n{round(\g_tmpa_fp,3)}}{#4}
				
			%% SECOND ROW
		\fp_set:Nn\l_tmpa_fp{\fp_eval:n{\g_tmpa_fp}}
				
		\int_gset:Nn\g_tmpa_int{\fp_eval:n{trunc (\g_tmpa_fp)}}
				
		\__typoAid_HeightForRows:nnn{#1}{\g_tmpa_int}{\l__typoAid_local_dim}
		
		\msg_term:n
		{
			\c__typoAid_name_string\iow_newline:*~
			Form~factor: \fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }~
			~for~switch:\tl_to_str:n{#2}\iow_newline:*~
			Width:~ \dim_to_decimal_in_unit:nn
			{\g_tmpa_dim}{1pt}~pt~
			(\dim_to_decimal_in_unit:nn
			{\g_tmpa_dim}{1pc}~pc)\iow_newline:*~
			Rows~per~height:~\int_eval:n{\g_tmpa_int}
		}
		\__typoAid_formfactor_log:nnnn
				{\g_tmpa_dim}
				{#2}
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }}
				{\g_tmpa_int}
		%third row
		\fp_set:Nn\l_tmpa_fp{\fp_eval:n{\g_tmpa_fp}}
				
		\int_gset:Nn\g_tmpa_int{\fp_eval:n{trunc \g_tmpa_fp}+1}
				
		\__typoAid_HeightForRows:nnn{#1}{\g_tmpa_int}{\l__typoAid_local_dim}
		
		\msg_term:n
		{
			\c__typoAid_name_string\iow_newline:*~
			Form~factor: \fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }~
			~for~switch:\tl_to_str:n{#2}\iow_newline:*~
			Width:~ \dim_to_decimal_in_unit:nn
			{\g_tmpa_dim}{1pt}~pt~
			(\dim_to_decimal_in_unit:nn
			{\g_tmpa_dim}{1pc}~pc)\iow_newline:*~
			Rows~per~height:~\int_eval:n{\g_tmpa_int}
		}
		\__typoAid_formfactor_log:nnnn
				{\g_tmpa_dim}
				{#2}
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }}
				{\g_tmpa_int}
	}{
		\begin{table}
			\centering
			\caption{Height~data~for~switch~\tl_to_str:n{#2};~width:~\tl_to_str:n{#3},~skip:~\dim_eval:n{#5}}
			\begin{tabular}{lSSSS}
				\toprule
				\multicolumn{1}{l}{Description}&
				\multicolumn{1}{r}{Height~(pt)}&
				\multicolumn{1}{r}{Height~(pc)}&
				\multicolumn{1}{r}{Lines~per~height}&
				\multicolumn{1}{r}{Form~factor}\\
				\midrule
%%%%%%%%%%FIRST ROW: DATA AS BEEN REQUESTED
				\dim_gset:Nn\g_tmpb_dim
				{
					\fp_to_dim:n
					{
						\fp_eval:n{#4}*\dim_eval:n{\l_tmpa_dim}
					}
				}
				
				\__typoAid_nrRows:nnn{#2}{\l__typoAid_local_dim}{\g_tmpb_dim}
				\fp_gset:Nn\g_tmpb_fp{\fp_eval:n{round(\g_tmpa_fp,3)}}
				\__typoAid_PrepareHeightTableRow_tl:nnnn
				{#4}
				{\fp_eval:n{round(\g_tmpa_fp,3)}}
				{Requested}
				{\g_tmpb_dim}
				\__typoAid_formfactor_log:nnnn{\g_tmpb_dim}{#2}{#4}{\g_tmpb_fp}
				\tl_use:N\g_tmpa_tl\\
				
%%%%%%%%%%SECOND ROW: TRUNC				
				\fp_set:Nn\l_tmpa_fp{\fp_eval:n{\g_tmpa_fp}}
				
				\int_gset:Nn\g_tmpa_int{\fp_eval:n{trunc (\g_tmpa_fp)}}
				
				\__typoAid_HeightForRows:nnn{#1}{\g_tmpa_int}{\l__typoAid_local_dim}
				
				\__typoAid_PrepareHeightTableRow_tl:nnnn
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }}
				{\g_tmpa_int}
				{Floor~rounding}
				{\g_tmpa_dim}
				\__typoAid_formfactor_log:nnnn
				{\g_tmpa_dim}
				{#2}
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3) }}
				{\g_tmpa_int}
				\tl_use:N\g_tmpa_tl\\
				
%%%%%%%%%THIRD ROW: +1			
				\fp_set:Nn\l_tmpa_fp{\fp_eval:n{\g_tmpa_fp}}
				
				\int_gset:Nn\g_tmpa_int{\fp_eval:n{trunc \g_tmpa_fp}+1}
				
				\__typoAid_HeightForRows:nnn{#1}{\g_tmpa_int}{\l__typoAid_local_dim}
				
				\__typoAid_PrepareHeightTableRow_tl:nnnn
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3)}}
				{\g_tmpa_int}
				{\relax Ceil~rounding}
				{\g_tmpa_dim}
				\__typoAid_formfactor_log:nnnn
				{\g_tmpa_dim}
				{#2}
				{\fp_eval:n{round(\dim_ratio:nn{\g_tmpa_dim}{\l_tmpa_dim},3)}}
				{\g_tmpa_int}
				\tl_use:N\g_tmpa_tl\\
				
				\bottomrule			
			\end{tabular}
		\end{table}
	
	}
}