summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/mattex/writevars.m
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/mattex/writevars.m')
-rw-r--r--macros/latex/contrib/mattex/writevars.m187
1 files changed, 187 insertions, 0 deletions
diff --git a/macros/latex/contrib/mattex/writevars.m b/macros/latex/contrib/mattex/writevars.m
new file mode 100644
index 0000000000..a9d7fc45c1
--- /dev/null
+++ b/macros/latex/contrib/mattex/writevars.m
@@ -0,0 +1,187 @@
+function writevars(file, varargin)
+ % WRITEVARS(file,options,a,b,c,...) writes the variables a, b, c, etc. to the
+ % file specified in file for later use in a LaTeX document.
+ % The variable names will be given by their names
+ % when passed on to writevars. eg. matlab variable 'a' will be passed as '\a' in the tex file
+ %
+ % You can also use WRITEVARS to format variables with their corresponding error to the
+ % correct notation for use in physical reports eg.
+ %
+ % A = (101.3 +- 2.4)e4
+ %
+ % that is: give the error two significant digits and round the variable so that it's
+ % last two digits are of the same order of the error.
+ %
+ % To make use of this put the variable and it's error in a vector with the variables name:
+ %
+ % a = [101.299e10,2.423e10];
+ % writevars('file.txt',a);
+ %
+ % results in the 'file.txt' containing
+ %
+ % \Mset{a}{101.3}{2.4}{10}
+ %
+ % Use \input{file} in your tex file to gain acces to the variables, eg.
+ %
+ % \input{file.txt}
+ % value of a is \Mnum{a}.
+ %
+ % You cannot use temporary variables when using WRITEVARS. This would result in nameless
+ % variables in the tex file. So don't do:
+ %
+ % writevars('file.txt', [101.299, 2.423])
+ %
+ % You can use writevars to append variables to the file using the 'a' (append) option, which
+ % is also implied when no option is given. So both
+ %
+ % writevars('file.txt', 'a', a, b, c, ... );
+ %
+ % and
+ %
+ % writevars('file.txt', a, b, c, ...);
+ %
+ % will append the the variable definitions to the file. This is the smart thing to do since
+ % LaTeX will only use the last of the defined values, and this way you will have a history
+ % of all the values you have written. This behaviour can be turned off by using
+ % the 'w' option ('w' for write):
+ %
+ % writevars('file.txt','w', a, b, c,...);
+ %
+ % will empty the file before writing to it. This can be a good thing if the file is
+ % becoming overly long, thus slowing tex compilation.
+ %
+ % The other options that can be given are:
+ % a: append (this is default). Latex will use only the last values that were written.
+ % w: write instead of append. This clears the file before writing.
+ % s: silent, don't write information to console and refrain from writing a datestring
+ % to the file.
+ % e: passes the 'e' option to formatvars.
+ % #: replace by any number greater than 0. This tells formatvars which number
+ % of significant digits to use.
+ %
+ % you can give these options in random order in the optional options string. eg
+ %
+ % writevars(file,'wse4',a,b,c,...);
+ %
+ % silently writes the variables to the file with the 'e' option using 4 significant digits.
+ %
+ % See also WRITEALLVARS, WRITEMAT, FORMATVARS
+
+ appendstr = [ '%%-- ' datestr(now) ' --%%\n'];
+
+ % check if any variables were passed at all
+ if length(varargin) == 0
+ error('no variables were given');
+ end
+
+ % check if options string was given and if so, parse it using parsemopts.
+ switch class(varargin{1})
+ case 'char'
+ opts=varargin{1};
+ [append, write, silent, n, e_given] = parsemopts(opts);
+ s = 2;
+ case 'double'
+ [append, write, silent, n, e_given] = parsemopts('');
+ s = 1;
+ otherwise
+ error('Unexpected class in argument 2')
+ end;
+
+ if append
+ [FID] = fopen(file,'a');
+ if ~silent
+ fprintf(FID,appendstr);
+ disp(['appending variables to ' file])
+ end
+ elseif write
+ [FID] = fopen(file,'w');
+ if ~silent
+ fprintf(FID,appendstr);
+ disp(['writing variables to ' file])
+ end
+ end
+
+ if e_given
+ e = 'e';
+ else
+ e = '';
+ end
+
+ % loop variables in varargin
+ for i = s : length(varargin)
+
+ % get name of variable
+ str = inputname(i+1);
+
+ % check if this name is good or empty (temporary variable)
+ if length(str) == 0
+ error([ 'you cannot use temporary variables for they will ' ...
+ 'have no name on output. \nerror in input argument ' ...
+ num2str(i+1)]);
+ end
+
+ if ~strcmp(class(varargin{i}),'double')
+ error(['argument ' num2str(i+1) ' is not of class double']);
+ end
+
+ % check if variables is vector or single variables
+ if max(size(varargin{i})) == 2
+ % vector
+
+ vec = varargin{i}; % get the inputed vector
+ a = vec(1); % get first value
+ s_a = vec(2); % get second value
+
+ [A,s_A] = formatvars(a,s_a,[num2str(n) e]); % format the variables using formatvar
+ eA = strfind(A,'e');
+ Aexp = '';
+ if size(eA) > 0
+ Aexp = A(eA+1:end);
+ A = A(1:eA-1);
+ end
+
+ es_A = strfind(s_A,'e');
+ if size(es_A) > 0
+ s_Aexp = s_A(es_A:end);
+ s_A = s_A(1:es_A-1);
+ end
+ % defstr_s_a = [ '\\Mset{s_' str '}{' s_A '}\n' ];
+ defstr = [ '\\Mset{' str '}{' A '}{' s_A '}{' Aexp '}\n' ];
+
+ elseif size(varargin{i}) == [1 1]
+ % normal
+
+ if e_given
+ f=e;
+ else
+ f = 'g';
+ end
+ A = num2str(varargin{i},['%100.' num2str(n) f]); % get value as string
+
+ A(strfind(A,'+'))='';
+ eA = strfind(A,'e');
+ if size(eA) > 0
+ Aval = A(1:eA-1);
+ Aexp = A(eA+1:end);
+
+ % remove 0 in front of exponential
+ if Aexp(1) == '0'
+ Aexp(1) = '';
+ end
+ defstr = [ '\\Mset{' str '}{' Aval '}{}{' Aexp '}\n' ];
+ else
+ defstr = [ '\\Mset{' str '}{' A '}\n' ];
+ end
+ else
+ % unknown
+ error('variable must be of size [1 1] or [1 2]');
+
+ end
+ % print the string
+ fprintf(FID, defstr);
+ end
+
+ % close the file
+ fclose(FID);
+
+end