File: dyn_latex_table.m

package info (click to toggle)
dynare 6.4-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 67,648 kB
  • sloc: cpp: 79,109; ansic: 28,917; objc: 12,430; yacc: 4,528; pascal: 1,993; lex: 1,441; sh: 1,129; python: 634; makefile: 626; lisp: 163; xml: 18
file content (132 lines) | stat: -rw-r--r-- 4,799 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
function dyn_latex_table(M_, options_, title, LaTeXtitle, headers, labels, values, label_width, val_width, val_precis, optional_header)
%function dyn_latex_table(M_, options_, title, LaTeXtitle, headers, labels, values, label_width, val_width, val_precis, optional_header)

% Copyright © 2015-2020 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare.  If not, see <https://www.gnu.org/licenses/>.

if options_.noprint
    return
end

if length(headers) < 2
    error('headers length must be >= 2')
end

OutputDirectoryName = CheckPath('latex',M_.dname);

%delete dollars in label as they will be added automatically below
begin_dollar = cellfun (@(x)startsWith(x,'$'),labels,'UniformOutput',1);
end_dollar = cellfun (@(x)endsWith(x,'$'),labels,'UniformOutput',1);

if all(begin_dollar) && all(end_dollar)
    labels = cellfun(@(x)delete_dollar(x,'begin'),labels,'UniformOutput',0);
    labels = cellfun(@(x)delete_dollar(x,'end'),labels,'UniformOutput',0);
end


%delete dollars in headers as they will be added automatically below
begin_dollar = cellfun (@(x)startsWith(x,'$'),headers,'UniformOutput',1);
end_dollar = cellfun (@(x)endsWith(x,'$'),headers,'UniformOutput',1);

if all(begin_dollar) && all(end_dollar)
    headers = cellfun(@(x)delete_dollar(x,'begin'),headers,'UniformOutput',0);
    headers = cellfun(@(x)delete_dollar(x,'end'),headers,'UniformOutput',0);
end

% Set width of label column
if isempty(label_width)
    label_width = cellofchararraymaxlength(vertcat(headers{1}, labels))+2;
else
    label_width = max(cellofchararraymaxlength(vertcat(headers{1}, labels))+2, label_width);
end
label_format_leftbound = sprintf('$%%-%ds$', label_width);

% Set width of other columns
if all(~isfinite(values))
    values_length = 4;
else
    values_length = max(ceil(max(max(log10(abs(values(isfinite(values))))))),1)+val_precis+1;
end
if any(values < 0) %add one character for minus sign
    values_length = values_length+1;
end
headers_length = cellofchararraymaxlength(headers(2:end));
if isempty(val_width)
    val_width = max(headers_length, values_length)+4;
else
    val_width = max(max(headers_length, values_length)+4, val_width);
end
value_format = sprintf('%%%d.%df', val_width, val_precis);
header_string_format = sprintf('$%%%ds$', val_width);

% Create and print header string
header_string = sprintf(label_format_leftbound, strrep(headers{1}, '\', '\\'));
header_code_string = ['l' repmat('c', 1, length(headers)-1)];
for i=2:length(headers)
    header_string = [header_string '\t & \t ' sprintf(header_string_format, strrep(headers{i},'\','\\'))];
end
header_string = [header_string '\\\\\n'];

filename = [OutputDirectoryName '/' M_.fname '_' LaTeXtitle '.tex'];
fidTeX = fopen(filename,'w');

stack = dbstack;
fprintf(fidTeX, ['%% ' datestr(now,0) ', created by ' stack(2).file]);
fprintf(fidTeX, ' \n');
fprintf(fidTeX, ' \n');
fprintf(fidTeX, '\\begin{center}\n');
fprintf(fidTeX, '\\begin{longtable}{%s} \n', header_code_string);
fprintf(fidTeX, ['\\caption{',title,'}\\\\\n ']);

fprintf(fidTeX, ['\\label{Table:',LaTeXtitle,'}\\\\\n']);
fprintf(fidTeX, '\\toprule \n');
if nargin==11
    for ii = 1:length(optional_header)
        fprintf(fidTeX,'%s\n',optional_header{ii});
    end
end
fprintf(fidTeX, header_string);
fprintf(fidTeX, '\\midrule \\endfirsthead \n');
fprintf(fidTeX, '\\caption{(continued)}\\\\\n ');
fprintf(fidTeX, '\\toprule \\\\ \n');
if nargin==11
    for ii = 1:length(optional_header)
        fprintf(fidTeX, '%s\n', optional_header{ii});
    end
end
fprintf(fidTeX, header_string);
fprintf(fidTeX, '\\midrule \\endhead \n');
fprintf(fidTeX, ['\\midrule \\multicolumn{',num2str(size(headers,1)),'}{r}{(Continued on next page)} \\\\ \\bottomrule \\endfoot \n']);
fprintf(fidTeX, '\\bottomrule \\endlastfoot \n');
for i = 1:size(values,1)
    fprintf(fidTeX, label_format_leftbound, labels{i});
    fprintf(fidTeX, ['\t & \t' value_format], values(i,:));
    fprintf(fidTeX, ' \\\\ \n');
end

fprintf(fidTeX, '\\end{longtable}\n ');
fprintf(fidTeX, '\\end{center}\n');
fprintf(fidTeX, '%% End of TeX file.\n');
fclose(fidTeX);

function x=delete_dollar(x,position_string)
if strcmp(position_string,'begin')
    x(1)=[];
elseif strcmp(position_string,'end')
    x(end)=[];
end