%% The MatTeX package
%% 
%% Copyright 2012 by Romeo Van Snick
%%
%% This file may be distributed and/or modified under the 
%% conditions of the LaTeX Project Publishing License, either
%% version 1.2 of this license ot any later version.
%% The latest version of this license is in:
%%
%%    http://www.latex-project.org/lppl.txt
%% 
%% and version 1.2 or later is part of all distributions of 
%% LaTeX version 1999/12/01 or later.
%% 
%% Matlab (c) is the property of its rightful owner.
%% 
%% package version: v0.1 2012/01/12
%%
%% email: romeovs@gmail.com
%%
%% note: this package is still in devolopment and I'm not a TeX guru, so errors will
%%       exist. Feel free to email me if a bug turns up.
%%

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mattex}[2012/01/12 v1.0 a set of macros to import matlab values]

% These are the required packages that need to be loaded
\RequirePackage{pgfkeys}
\RequirePackage{xstring}
\RequirePackage{siunitx}
\RequirePackage{xparse}
\RequirePackage{array}
\RequirePackage{collcell}
\ProcessOptions\relax


% PACKAGE OPTIONS

% Define the name for the pgfkeys directory where the matlab variable will be stored in
\newcommand{\mtdirectory}[0]{mtmatlab}

% PACKAGE CODE

% This command allows you to set a variable
\DeclareDocumentCommand{\Mset}{m m g g}
{
	% set the value (mandatory)
	\pgfkeyssetvalue{/\mtdirectory/#1/val}{#2}

	% set error if it is given
	\IfNoValueTF{#3}{
		% if nothing was given, literally set nothing, so variables can be properly overwritten
		\pgfkeyssetvalue{/\mtdirectory/#1/err}{}
		\pgfkeyssetvalue{/\mtdirectory/#1/pmstr}{}
	}{
		% if an argument was given, check if it was empty or not
		\IfEq{#3}{}{
			% empty: set empty values
			\pgfkeyssetvalue{/\mtdirectory/#1/err}{}
			\pgfkeyssetvalue{/\mtdirectory/#1/pmstr}{}
		}{
			% not empty: set values
			\pgfkeyssetvalue{/\mtdirectory/#1/err}{#3}
			\pgfkeyssetvalue{/\mtdirectory/#1/pmstr}{+-}
			}
	}

	% set exponent if it is given
	\IfNoValueTF{#4}{
		% if nothing was given, literally set nothing, so variables can be properly overwritten
		\pgfkeyssetvalue{/\mtdirectory/#1/exp}{}
		\pgfkeyssetvalue{/\mtdirectory/#1/estr}{}
	}{
		% if an argument was given, check if it was empty or not
		\IfEq{#4}{}{
			% empty: set all to empty
			\pgfkeyssetvalue{/\mtdirectory/#1/exp}{}
			\pgfkeyssetvalue{/\mtdirectory/#1/estr}{}
		}{
			% not empty: set values
			\pgfkeyssetvalue{/\mtdirectory/#1/exp}{#4}
			\pgfkeyssetvalue{/\mtdirectory/#1/estr}{e}
		}
	}

}

%% get string value
% this allows you the see which exact string is stored in the variable
\newcommand{\M}[1]
{%
	\pgfkeysvalueof{/\mtdirectory/#1/val}%
	\pgfkeysvalueof{/\mtdirectory/#1/pmstr}%
	\pgfkeysvalueof{/\mtdirectory/#1/err}%
	\pgfkeysvalueof{/\mtdirectory/#1/estr}%
	\pgfkeysvalueof{/\mtdirectory/#1/exp}%
}

%% get \SI
% allows you to use the variable as you would use \SI from siunitx
\newcommand{\MSI}[2]
{
	\SI{\M{#1}}{#2}
}

%% get error literal
\newcommand{\Merrlit}[1]{%
	\pgfkeysvalueof{/\mtdirectory/#1/err}%
	\pgfkeysvalueof{/\mtdirectory/#1/estr}%
	\pgfkeysvalueof{/\mtdirectory/#1/exp}%
}

%% get value literal
\newcommand{\Mvallit}[1]{%
	\pgfkeysvalueof{/\mtdirectory/#1/val}%
	\pgfkeysvalueof{/\mtdirectory/#1/estr}%
	\pgfkeysvalueof{/\mtdirectory/#1/exp}%
}

%% get value as \num
\newcommand{\Mval}[1]{
	\num{\Mvallit{#1}}
}

%% get error as \num
\newcommand{\Merr}[1]{
	% check if anything is in the err string and only try \num if there is
	\IfEq{\pgfkeysvalueof{/\mtdirectory/#1/err}}{}{}{
		\num{\Merrlit{#1}}
	}
}

%% get error and value (no units)
\newcommand{\Mnum}[1]{
	\num{\M{#1}}
}

%% Make and use matrices

\ExplSyntaxOn
\tl_new:N \l_romeo_cells_tl
\int_new:N \l_romeo_row_int
\int_new:N \l_romeo_col_int
\NewDocumentCommand { \preparematrix } { O{} m m m }
{
	\tl_set:Nn \l_romeo_cells_tl { }
	\int_set:Nn \l_romeo_row_int { #3 }
	\int_set:Nn \l_romeo_col_int { #4 }
	\prg_stepwise_inline:nnnn { 1 } { 1 } { \l_romeo_row_int }
	{
		\prg_stepwise_inline:nnnn { 1 } { 1 } { \l_romeo_col_int }
		{
			\int_compare:nF { ####1 = 1 } { \tl_put_right:Nn \l_romeo_cells_tl { & } }
			\tl_put_right:Nn \l_romeo_cells_tl
			{ #2 ( ##1 , ####1 ) }
		}
		\tl_put_right:Nn \l_romeo_cells_tl { \\ #1 }
	}
}
\DeclareExpandableDocumentCommand{ \usematrix } { }
{ \tl_use:N \l_romeo_cells_tl }
% written by egreg at stackexchange:
% http://tex.stackexchange.com/questions/40245/pgffor-and-the-alignment-character


%% tabular commands
% allows one to switch on/off header behaviour 
% if the header is on, M and N header types are ignored (just "c" columm type  applies)
\newtoggle{inTableHeader}	% Track if still in header of table
\toggletrue{inTableHeader}	% Set initial value
\newcommand*{\header}{\global\toggletrue{inTableHeader}}	% set header to true
\newcommand*{\noheader}{\global\togglefalse{inTableHeader}}	% set header to false

% define the table colums
% first define a new command that is sensitive to the inTableHeader toggle
\newcommand*{\tabMval}[1]{\iftoggle{inTableHeader}{#1}{\Mval{#1}}} 
\newcolumntype{v}{>{\collectcell\tabMval}c<{\endcollectcell}}

\newcommand*{\tabMnum}[1]{\iftoggle{inTableHeader}{#1}{\Mnum{#1}}}
\newcolumntype{n}{>{\collectcell\tabMnum}c<{\endcollectcell}}

\newcommand*{\tabMerr}[1]{\iftoggle{inTableHeader}{#1}{\Merr{#1}}}
\newcolumntype{e}{>{\collectcell\tabMerr}c<{\endcollectcell}}

%% end of file
