function laprint(figno,filename,varargin) %LAPRINT prints a figure for inclusion in LaTeX documents. % LaPrint creates an eps-file and a tex-file. The tex-file contains % the annotation of the figure such as titles, labels and texts. The % eps-file contains the non-text part of the figure as well as the % position of the text-objects. The packages 'graphicx' (or 'epsfig') % and 'psfrag' (and possibly ''color'') are required for the LaTeX % run. A postscript driver like 'dvips' is required for printing. % % Usage: >> laprint % % This opens a graphical user interface window, to control the % various settings. It includes a help facility. Just try it. % % As an alternative to the GUI you can call laprint from the command % line with various extra input arguments. These arguments are % explained in the help window of the GUI, which can be also be % opened using the command % >> laprint helpwindow % % There is an Users Guide available at % http://www.uni-kassel.de/fb16/rat/matlab/laprint/laprintdoc.ps % (c) Arno Linnemann. All rights reserved. % The author of this program assumes no responsibility for any errors % or omissions. In no event shall he be liable for damages arising out of % any use of the software. Redistribution of the unchanged file is allowed. % Distribution of changed versions is allowed provided the file is renamed % and the source and authorship of the original version is acknowledged in % the modified file. % Please report bugs, suggestions and comments to: % Arno Linnemann % Control and Automation % Department of Electrical and Computer Engineering % University of Kassel % 34109 Kassel % Germany % mailto:linnemann@uni-kassel.de %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% Initialize %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% laprintident = '3.16 (13.9.2004)'; vers = version; vers = eval(vers(1:3)); if vers < 6.1 error('Sorry. Matlab 6.1 or above is required.') end hf=131; hhf=132; % no output if nargout error('No output argument, please.') end inter=get(0,'defaulttextinterpreter'); if ~strcmp(inter,'none') warning('LaPrint:general',['It is recommended to switch off the '... 'text interpreter\nbefore creating a figure to be saved '... 'with LaPrint. Use the command\n',... ' >> set(0,''defaulttextinterpreter'',''none'').']) end if nargin==0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% GUI %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% try delete(hf) end try delete(hhf) end %--------------------------------- % open window %--------------------------------- hf = figure(hf); clf reset; set(hf,'NumberTitle','off',... 'Name','LaPrint (LaTeX Print)',... 'Units','points',... 'CloseRequestFcn','laprint(''quit'');',... 'menubar','none') h = uicontrol('Parent',hf,'Units','points'); fsize = get(h,'Fontsize'); delete(h) posf = get(hf,'Position'); figheight = 10*fsize; figwidth = 32*fsize; posf = [ posf(1) posf(2)+posf(4)-figheight figwidth figheight]; set(hf,'Position',posf) uicontrol('Parent',hf,'style','frame','Units','points',... 'Position',[0 0 figwidth figheight]) curh = figheight-0*fsize; LAPRINTHAN=struct('figno',{0},'filename',{0},... 'keepfontprops',{0},'asonscreen',{0},'keepticklabels',{0},... 'mathticklabels',{0},'head',{0},'extrapicture',{0},... 'verbose',{0},'figcopy',{0},'package_epsfig',{0},... 'package_graphicx',{0},'color',{0},'createview',{0},... 'processview',{0}); %--------------------------------- % figure no. %--------------------------------- loch = 1.7*fsize; curh = curh-loch-1.5*fsize; h = uicontrol('Parent',hf,... 'style','text',... 'Units','points',... 'Position',[1*fsize curh 18*fsize loch],... 'HorizontalAlignment','left',... 'string','Number of Figure to be saved:'); h = uicontrol('Parent',hf,... 'style','edit',... 'Units','points',... 'Position',[19*fsize curh 12*fsize loch],... 'HorizontalAlignment','left',... 'BackgroundColor',[1 1 1],... 'Callback','laprint(''figno'');'); LAPRINTHAN.figno = h; %--------------------------------- % filename %--------------------------------- loch = 1.7*fsize; curh = curh-loch-1*fsize; h = uicontrol('Parent',hf,... 'style','text',... 'Units','points',... 'Position',[1*fsize curh 18*fsize loch],... 'HorizontalAlignment','left',... 'string','Basename of Files to be Created:'); h = uicontrol('Parent',hf,... 'style','edit',... 'Units','points',... 'Position',[19*fsize curh 12*fsize loch],... 'HorizontalAlignment','left',... 'BackgroundColor',[1 1 1],... 'Callback','laprint(''filename'');'); LAPRINTHAN.filename = h; %--------------------------------- % save, quit %--------------------------------- loch = 2*fsize; curh = curh-loch-1*fsize; h = uicontrol('Parent',hf,... 'Style','pushbutton',... 'Units','Points',... 'Position',[19*fsize curh 5*fsize loch],... 'HorizontalAlignment','center',... 'String','Go !',... 'Callback','laprint(''save'');'); h = uicontrol('Parent',hf,... 'Style','pushbutton',... 'Units','Points',... 'Position',[26*fsize curh 5*fsize loch],... 'HorizontalAlignment','center',... 'String','Quit',... 'Callback','laprint(''quit'');'); %--------------------------------- % options uimenue %--------------------------------- hm1 = uimenu('label','Options'); uimenu(hm1,... 'label','Sizes and Scalings ...',... 'callback','laprint(''size'')'); LAPRINTHAN.keepfontprops = uimenu(hm1,... 'label','Translate Matlab Font Properties to LaTeX',... 'callback','laprint(''keepfontprops'')'); LAPRINTHAN.asonscreen = uimenu(hm1,... 'label','Print Limits and Ticks as on Screen',... 'separator','on',... 'callback','laprint(''asonscreen'')'); LAPRINTHAN.keepticklabels = uimenu(hm1,... 'label','Keep Tick Labels within eps File',... 'callback','laprint(''keepticklabels'')'); LAPRINTHAN.mathticklabels = uimenu(hm1,... 'label','Set Tick Labels in LaTeX Math Mode',... 'callback','laprint(''mathticklabels'')'); LAPRINTHAN.head = uimenu(hm1,... 'label','Equip the tex File with a Head',... 'separator','on',... 'callback','laprint(''head'')'); uimenu(hm1,... 'label','Comment in the Head of the tex File ...',... 'callback','laprint(''comment'')'); uimenu(hm1,... 'label','Place a LaTeX Caption in the tex File ...',... 'callback','laprint(''caption'')'); LAPRINTHAN.extrapicture = uimenu(hm1,... 'label','Place an Extra Picture in each Axes',... 'callback','laprint(''extrapicture'')'); uimenu(hm1,... 'label','Length of psfrag Replacement Strings ...',... 'callback','laprint(''nzeros'')'); LAPRINTHAN.verbose = uimenu(hm1,... 'label','Call LaPrint in Verbose Mode',... 'separator','on',... 'callback','laprint(''verbose'')'); LAPRINTHAN.figcopy = uimenu(hm1,... 'label','Copy Figure and Modify that Copy',... 'callback','laprint(''figcopy'')'); uimenu(hm1,... 'label','Matlab Print Command ...',... 'separator','on',... 'callback','laprint(''printcmd'')'); h=uimenu(hm1,... 'separator','on',... 'label','LaTeX Graphics Package'); LAPRINTHAN.package_graphicx = uimenu(h,... 'label','graphicx',... 'callback','laprint(''package_graphicx'')'); LAPRINTHAN.package_epsfig = uimenu(h,... 'label','epsfig',... 'callback','laprint(''package_epsfig'')'); LAPRINTHAN.color = uimenu(hm1,... 'label','Use LaTeX ''color'' Package',... 'callback','laprint(''color'')'); h = uimenu(hm1,... 'label','View File ...',... 'separator','on'); LAPRINTHAN.createview = uimenu(h,... 'label','Create a View File',... 'callback','laprint(''createview'')'); uimenu(h,... 'label','Name of the View File ...',... 'callback','laprint(''viewfilename'')'); LAPRINTHAN.processview = uimenu(h,... 'label','Process the View File',... 'separator','on',... 'callback','laprint(''processview'')'); uimenu(h,... 'label','Executables for Processing View File...',... 'callback','laprint(''cmdsview'')'); %--------------------------------- % Preferences uimenue %--------------------------------- hm3=uimenu('label','Preferences'); uimenu(hm3,... 'label','Get Preferences',... 'callback','laprint(''getpref'')') uimenu(hm3,... 'label','Set Preferences to Current Settings',... 'callback','laprint(''setpref'')') uimenu(hm3,... 'label','Remove Preferences',... 'callback','laprint(''rmpref'')') uimenu(hm3,... 'label','Save Current Settings to a File ...',... 'separator','on',... 'callback','laprint(''savepref'')') uimenu(hm3,... 'label','Load Settings from a File ...',... 'callback','laprint(''loadpref'')') uimenu(hm3,... 'label','Get Factory Defaults',... 'separator','on',... 'callback','laprint(''factory'')') %--------------------------------- % Help uimenue %--------------------------------- hm2=uimenu('label','Help'); uimenu(hm2,... 'label',['LaPrint Online Help ...'],... 'callback','laprint(''helpwindow'')'); uimenu(hm2,... 'label','Get the LaPrint Users Guide',... 'callback',['web www.uni-kassel.de/fb16/rat/matlab',... '/laprint/laprintdoc.ps -browser']) uimenu(hm2,... 'label',['Look for a newer version of LaPrint ' ... '(Matlab Central File Exchange)...'],... 'callback',['web http://www.mathworks.de/matlabcentral/',... 'fileexchange/loadFile.do?objectId=4638',... '&objectType=file -browser']) uimenu(hm2,... 'label','Version and Author ...',... 'callback','laprint(''whois'')') %--------------------------------- % make hf invisible %--------------------------------- set(hf,'HandleVisibility','callback') %--------------------------------- % get settings %--------------------------------- LAPRINTOPT = prefsettings; if isempty(LAPRINTOPT) LAPRINTOPT = factorysettings; end %--------------------------------- % get figure %--------------------------------- gcfig=gcf; if gcfig == hf allfigs = findobj('type','figure'); allfigs = allfigs(find(allfigs~=hf)); if length(allfigs) figno = allfigs(1); else figure(1) figno=1; end else figno=gcfig; end LAPRINTOPT.figno = figno; %--------------------------------- % update %--------------------------------- updategui(LAPRINTHAN,LAPRINTOPT) sethf(hf,LAPRINTHAN,LAPRINTOPT) figure(hf) %--------------------------------- % done %--------------------------------- return end % if nargin==0 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% callback calls ('factory' and 'getprefs' also %%%% used from command line) %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if isa(figno,'char') switch figno case 'figno' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); LAPRINTOPT.figno=eval(get(LAPRINTHAN.figno,'string')); figure(LAPRINTOPT.figno) figure(hf) sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'filename' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); LAPRINTOPT.filename=get(LAPRINTHAN.filename,'string'); [texfullnameext,texbasenameext,texbasename,texdirname] = ... getfilenames(LAPRINTOPT.filename,'tex',0); [epsfullnameext,epsbasenameext,epsbasename,epsdirname] = ... getfilenames(LAPRINTOPT.filename,'eps',0); sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'save' % lapcmd = [ 'laprint(' int2str(LAPRINTOPT.figno) ... % ', ''' LAPRINTOPT.filename ''''... % ', ''options'', LAPRINTOPT)']; lapcmd = 'laprint({})'; eval(lapcmd) case 'quit' delete(hf) try delete(hhf) end case 'size' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg({['Please enter the width (in centimeters) ',... 'of the graphics in the LaTeX document (The height ',... 'will be computed such that the aspect ratio of the ',... 'figure on screen is retained.) :'],... ['Please enter the factor by which the size of the '... 'graphics in the LaTeX document differs from the size of the '... 'Postscipt graphics ( Explaination: A factor <1 scales ',... 'the picture down. This means that lines become thinner ',... 'and fonts become smaller. ) :'],... ['Please specify if you want to scale the fonts along with ',... 'the graphics (enter ''on'' or ''off'') : '] },... 'LaPrint Settings',1,{num2str(LAPRINTOPT.width),... num2str(LAPRINTOPT.factor),... valueyn(LAPRINTOPT.scalefonts)},'on'); if length(answer) LAPRINTOPT.width=eval(answer{1}); LAPRINTOPT.factor = eval(answer{2}); LAPRINTOPT.scalefonts = value01(answer{3}); end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'keepfontprops' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.keepfontprops==1 LAPRINTOPT.keepfontprops=0; set(LAPRINTHAN.keepfontprops,'check','off') else LAPRINTOPT.keepfontprops=1; set(LAPRINTHAN.keepfontprops,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'asonscreen' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.asonscreen==1 LAPRINTOPT.asonscreen=0; set(LAPRINTHAN.asonscreen,'check','off') else LAPRINTOPT.asonscreen=1; set(LAPRINTHAN.asonscreen,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'keepticklabels' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.keepticklabels==1 LAPRINTOPT.keepticklabels=0; set(LAPRINTHAN.keepticklabels,'check','off') else LAPRINTOPT.keepticklabels=1; set(LAPRINTHAN.keepticklabels,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'mathticklabels' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.mathticklabels==1 LAPRINTOPT.mathticklabels=0; set(LAPRINTHAN.mathticklabels,'check','off') else LAPRINTOPT.mathticklabels=1; set(LAPRINTHAN.mathticklabels,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'head' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.head==1 LAPRINTOPT.head=0; set(LAPRINTHAN.head,'check','off') else LAPRINTOPT.head=1; set(LAPRINTHAN.head,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'comment' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg({['Please enter a describing comment to '... 'be placed into the head of the tex file:']},... 'LaPrint Settings',1,{LAPRINTOPT.comment},'on'); if length(answer) LAPRINTOPT.comment = answer{1}; end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'caption' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg(['If the following text is nonempty, ' ... 'then it will be placed as a \caption{} into the tex '... 'file along with \label{fig:' LAPRINTOPT.filename '}. '... 'Please enter the caption text:'],... 'LaPrint Settings',1,{LAPRINTOPT.caption},'on'); if length(answer) LAPRINTOPT.caption = answer{1}; end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'extrapicture' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.extrapicture==1 LAPRINTOPT.extrapicture=0; set(LAPRINTHAN.extrapicture,'check','off') else LAPRINTOPT.extrapicture=1; set(LAPRINTHAN.extrapicture,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'nzeros' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg({['Please enter length of the psfrag replacement '... 'strings (must be >= 3) :']},... 'LaPrint Settings',1,{num2str(LAPRINTOPT.nzeros)},'on'); if length(answer) LAPRINTOPT.nzeros = max(eval(answer{1}),3); end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'verbose' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.verbose==1 LAPRINTOPT.verbose=0; set(LAPRINTHAN.verbose,'check','off') else LAPRINTOPT.verbose=1; set(LAPRINTHAN.verbose,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'figcopy' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.figcopy==1 LAPRINTOPT.figcopy=0; set(LAPRINTHAN.figcopy,'check','off') else LAPRINTOPT.figcopy=1; set(LAPRINTHAN.figcopy,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'printcmd' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg({['Please enter the Matlab command '... 'to be used for printing the eps file '... '(LaPrint will internally replace by the '... 'number of the figure by the ' ... 'eps-filename and '... 'by the basename of the file, respectively). You can add options '... 'here (like ''-loose'') or use a different program '... 'for printing (like ''exportfig'') :']},... 'LaPrint Settings',1,{LAPRINTOPT.printcmd},'on'); if length(answer) LAPRINTOPT.printcmd = answer{1}; end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'package_epsfig' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); LAPRINTOPT.package='epsfig'; set(LAPRINTHAN.package_epsfig,'check','on') set(LAPRINTHAN.package_graphicx,'check','off') sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'package_graphicx' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); LAPRINTOPT.package='graphicx'; set(LAPRINTHAN.package_epsfig,'check','off') set(LAPRINTHAN.package_graphicx,'check','on') sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'color' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.color==1 LAPRINTOPT.color=0; set(LAPRINTHAN.color,'check','off') else LAPRINTOPT.color=1; set(LAPRINTHAN.color,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'createview' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.createview==1 LAPRINTOPT.createview=0; LAPRINTOPT.processview=0; set(LAPRINTHAN.createview,'check','off') set(LAPRINTHAN.processview,'check','off') else LAPRINTOPT.createview=1; set(LAPRINTHAN.createview,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'viewfilename' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); trydlg=1; txt=['Please enter the name of the '... 'viewfile (without extension .tex) : ']; txt2=''; while trydlg answer = inputdlg({[txt txt2]},... 'LaPrint Settings',1,{LAPRINTOPT.viewfilename},'on'); if length(answer) if strcmp(answer{1},LAPRINTOPT.filename) txt2=['The name must be different from the name of the '... 'graphics file):']; else trydlg=0; LAPRINTOPT.viewfilename = answer{1}; [viewfullnameext,viewbasenameext,viewbasename,viewdirname] = ... getfilenames(LAPRINTOPT.viewfilename,'tex',0); end else trydlg=0; end end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'processview' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); if LAPRINTOPT.processview==1 LAPRINTOPT.processview=0; set(LAPRINTHAN.processview,'check','off') else LAPRINTOPT.processview=1; set(LAPRINTHAN.processview,'check','on') LAPRINTOPT.createview=1; set(LAPRINTHAN.createview,'check','on') end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'cmdsview' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); answer = inputdlg({... ['Please enter up to 8 commands to process the view-file. ',... 'Leave any of the fields empty, if you have ',... 'less than 8 commands. ',... 'In any of the following commands, LaPrint internally '... 'replaces the tag by the name of the viewfile ',... 'and the tag by the basename specified in the ',... 'main LaPrint Window. ',... 'At minimum you should enter the commands for the LaTeX ',... 'compilation and for the dvi-to-postscript conversion ',... 'here. See the LaPrint Online-Help for futher ',... 'suggestions. ',... 'Please enter the 1st command:'],... 'Please enter the 2nd command:',... 'Please enter the 3rd command:',... 'Please enter the 4th command:',... 'Please enter the 5th command:',... 'Please enter the 6th command:',... 'Please enter the 7th command:',... 'Please enter the 8th command:'},... 'LaPrint Settings',1,{LAPRINTOPT.cmd1,... LAPRINTOPT.cmd2,LAPRINTOPT.cmd3,... LAPRINTOPT.cmd4,LAPRINTOPT.cmd5,LAPRINTOPT.cmd6,... LAPRINTOPT.cmd7,LAPRINTOPT.cmd8},'on'); if length(answer)==8 LAPRINTOPT.cmd1=answer{1}; LAPRINTOPT.cmd2=answer{2}; LAPRINTOPT.cmd3=answer{3}; LAPRINTOPT.cmd4=answer{4}; LAPRINTOPT.cmd5=answer{5}; LAPRINTOPT.cmd6=answer{6}; LAPRINTOPT.cmd7=answer{7}; LAPRINTOPT.cmd8=answer{8}; end sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'getpref' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); out = prefsettings; if ~isempty(out) oldfigno = LAPRINTOPT.figno; % keep this! LAPRINTOPT = out; LAPRINTOPT.figno = oldfigno; else errordlg('No LaPrint preferences available.') end updategui(LAPRINTHAN,LAPRINTOPT); sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'setpref' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); setpref('LaPrint','LAPRINTOPT',LAPRINTOPT); case 'rmpref' if ispref('LaPrint') rmpref('LaPrint'); else errordlg('Preference does not exist.') end case 'savepref' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); txt = 'Save preferences file '; [preffile,prefpath]=uiputfile('laprint.mat',txt); save([prefpath preffile],'LAPRINTOPT'); case 'loadpref' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); txt = ['Load preferences file '... '(must be previously created by LaPrint)']; [preffile,prefpath]=uigetfile('laprint.mat',txt); if ~isequal(preffile,0) & ~isequal(prefpath,0) oldfigno = LAPRINTOPT.figno; % keep this! load([prefpath preffile]); % hope file contains correct LAPRINTOPT.figno = oldfigno; % LAPRINTOPT updategui(LAPRINTHAN,LAPRINTOPT); sethf(hf,LAPRINTHAN,LAPRINTOPT); end case 'factory' [LAPRINTHAN,LAPRINTOPT]=gethf(hf); out = factorysettings; if ~isempty(out) oldfigno = LAPRINTOPT.figno; % keep this! LAPRINTOPT = out; LAPRINTOPT.figno = oldfigno; else errordlg('No LaPrint preferences available.') end updategui(LAPRINTHAN,LAPRINTOPT); sethf(hf,LAPRINTHAN,LAPRINTOPT); case 'helpwindow' hhf=figure(hhf); set(hhf,'Name','LaPrint Online Help',... 'Numbertitle','off',... 'menubar','none',... 'HandleVisibility','callback',... 'resize','on',... 'ResizeFcn','laprint(''helpwindow'');'); hht=uicontrol('Parent',hhf,... 'style','listbox',... 'units','normalized',... 'position',[0.005 0.005 0.9 0.99],... 'BackgroundColor','w',... 'Fontsize',12,... 'foregroundcolor','k',... 'FontName','FixedWidth',... 'HorizontalAlignment','left'); [txt,hhtpos]=textwrap(hht,helptext); set(hht,'string',txt) set(hht,'position',[0.005 0.005 0.99 0.99]) set(hht,'HandleVisibility','callback') case 'whois' msgbox({['This is LaPrint, Version ' laprintident],... '',... 'To blame for LaPrint:',... 'Arno Linnemann','Control and Automation',... 'Department of Electrical and Computer Engineering',... 'University of Kassel',... '34109 Kassel',... 'Germany',... 'mailto:linnemann@uni-kassel.de'},... 'LaPrint Info') otherwise error('unknown callback option') end return end % if isa(figno,'char') % nargin >=1 and ~isa(figno,'char') %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% PART 1 of advanced usage: %%%% Check inputs and initialize %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% if isa(figno,'cell') % called from GUI (all set) [LAPRINTHAN,LAPRINTOPT]=gethf(hf); figno=LAPRINTOPT.figno; filename=LAPRINTOPT.filename; else % advanced usage % get settings LAPRINTOPT = prefsettings; if isempty(LAPRINTOPT) LAPRINTOPT = factorysettings; end % modify prefs if ~isa(figno,'double') figno error('This is not a figure handle.') end if ~any(get(0,'children')==figno) figno error('This is not a figure handle.') end LAPRINTOPT.figno = figno; if nargin>1 if ~isa(filename,'char') filename error('This is not a file name.') end LAPRINTOPT.filename=filename; end end % read and check command line options try % try old usage (Version 2.03) if nargin <=2 error('lets take new usage') end % 2.03 defaults width = 12; factor = 0.8; scalefonts = 1; keepfontprops = 0; asonscreen = 0; keepticklabels = 0; mathticklabels = 0; head = 1; comment = ''; caption = ''; extrapicture = 1; nzeros = 5; verbose = 0; figcopy = 1; printcmd = ['print(''-f'',' ... '''-deps'','''')']; package = 'epsfig'; color = 0; createview = 0; viewfilename = [filename '_']; processview = 0; cmd1 = ''; cmd2 = ''; cmd3 = ''; cmd4 = ''; cmd5 = ''; cmd6 = ''; cmd7 = ''; cmd8 = ''; for i=1:nargin-2 if ~isa(varargin{i},'char') error('Options must be character arrays.') end oriopt=varargin{i}(:)'; opt=[ lower(strrep(oriopt,' ','')) ' ' ]; if strcmp(opt(1:7),'verbose') verbose=1; elseif strcmp(opt(1:10),'asonscreen') asonscreen=1; elseif strcmp(opt(1:14),'keepticklabels') keepticklabels=1; elseif strcmp(opt(1:14),'mathticklabels') mathticklabels=1; elseif strcmp(opt(1:13),'keepfontprops') keepfontprops=1; elseif strcmp(opt(1:14),'noextrapicture') extrapicture=0; elseif strcmp(opt(1:14),'noextrapicture') extrapicture=0; elseif strcmp(opt(1:5),'loose') printcmd = ['print(''-f'',' ... '''-deps'',''-loose'','''')']; elseif strcmp(opt(1:9),'nofigcopy') figcopy=0; elseif strcmp(opt(1:12),'noscalefonts') scalefonts=0; elseif strcmp(opt(1:6),'nohead') head=0; elseif strcmp(opt(1:7),'caption') eqpos=findstr(oriopt,'='); if isempty(eqpos) caption='Matlab Figure'; else caption=oriopt(eqpos+1:length(oriopt)); end elseif strcmp(opt(1:8),'comment=') eqpos=findstr(oriopt,'='); comment=oriopt(eqpos(1)+1:length(oriopt)); elseif strcmp(opt(1:9),'viewfile=') createview=1; eqpos=findstr(oriopt,'='); viewfilename=oriopt(eqpos(1)+1:length(oriopt)); elseif strcmp(opt(1:6),'width=') eval([ opt ';' ]); elseif strcmp(opt(1:7),'factor=') eval([ opt ';' ]); else error([ 'Option ' varargin{i} ' not recognized.']) end end warning('LaPrint:general',['You are using the old LaPrint '... 'syntax. This syntax might not be supported in '... 'future releases of LaPrint.']) catch % old usage doesn't work, take new one % restore preferences / factory defaults width = LAPRINTOPT.width; factor = LAPRINTOPT.factor; scalefonts = LAPRINTOPT.scalefonts; keepfontprops = LAPRINTOPT.keepfontprops; asonscreen = LAPRINTOPT.asonscreen; keepticklabels = LAPRINTOPT.keepticklabels; mathticklabels = LAPRINTOPT.mathticklabels; head = LAPRINTOPT.head; comment = LAPRINTOPT.comment; caption = LAPRINTOPT.caption; extrapicture = LAPRINTOPT.extrapicture; nzeros = LAPRINTOPT.nzeros; verbose = LAPRINTOPT.verbose; figcopy = LAPRINTOPT.figcopy; printcmd = LAPRINTOPT.printcmd; package = LAPRINTOPT.package; color = LAPRINTOPT.color; createview = LAPRINTOPT.createview; viewfilename = LAPRINTOPT.viewfilename; processview = LAPRINTOPT.processview; cmd1 = LAPRINTOPT.cmd1; cmd2 = LAPRINTOPT.cmd2; cmd3 = LAPRINTOPT.cmd3; cmd4 = LAPRINTOPT.cmd4; cmd5 = LAPRINTOPT.cmd5; cmd6 = LAPRINTOPT.cmd6; cmd7 = LAPRINTOPT.cmd7; cmd8 = LAPRINTOPT.cmd8; if nargin > 2 if rem(nargin,2) error('Option names/values must appear in pairs.') end for i=1:2:nargin-2 if ~isa(varargin{i},'char') error('Option name must be a character array.') end opt = lower(strrep(varargin{i}(:)',' ','')); val = varargin{i+1}(:)'; switch opt case 'options' if isa(val,'char') if strcmp(val,'factory') val = factorysettings; else load(val) val = LAPRINTOPT; end end if ~isa(val,'struct') error('Value of options must be a structure array.') end % no error checking here! width = val.width; factor = val.factor; scalefonts = val.scalefonts; keepfontprops = val.keepfontprops; asonscreen = val.asonscreen; keepticklabels = val.keepticklabels; mathticklabels = val.mathticklabels; head = val.head; comment = val.comment; caption = val.caption; extrapicture = val.extrapicture; nzeros = val.nzeros; verbose = val.verbose; figcopy = val.figcopy; printcmd = val.printcmd; package = val.package; color = val.color; createview = val.createview; viewfilename = val.viewfilename; processview = val.processview; cmd1 = val.cmd1; cmd2 = val.cmd2; cmd3 = val.cmd3; cmd4 = val.cmd4; cmd5 = val.cmd5; cmd6 = val.cmd6; cmd7 = val.cmd7; cmd8 = val.cmd8; case 'width' if ~isa(val,'double') error('Value of width must be a double.') end width = val; case 'factor' if ~isa(val,'double') error('Value of factor must be a double.') end factor=val; case 'scalefonts' scalefonts = value01(val,opt); case 'keepfontprops' keepfontprops = value01(val,opt); case 'asonscreen' asonscreen = value01(val,opt); case 'keepticklabels' keepticklabels = value01(val,opt); case 'mathticklabels' mathticklabels = value01(val,opt) ; case 'head' head = value01(val,opt); case 'comment' if ~isa(val,'char') error('Value of comment must be a character array.') end comment = val; case 'caption' if ~isa(val,'char') error('Value of caption must be a character array.') end caption = val; case 'extrapicture' extrapicture = value01(val,opt); case 'nzeros' if ~isa(val,'double') error('Value of nzeros must be a double.') end nzeros = val; case 'verbose' verbose = value01(val,opt); case 'figcopy' figcopy = value01(val,opt); case 'printcmd' if ~isa(val,'char') error('Value of printcmd must be a character array.') end printcmd = val; case 'package' if ~isa(val,'char') error('Value of package must be a character array.') end val = lower(strrep(val,' ','')); switch val case {'graphicx','epsfig'} % fine otherwise error('Value of package is unknown.') end package = val; case 'color' color = value01(val,opt); case 'createview' createview = value01(val,opt); case 'viewfilename' if ~isa(val,'char') error('Value of viewfilename must be a character array.') end viewfilename = val; case 'processview' processview = value01(val,opt); case 'cmd1' if ~isa(val,'char') error('Value of cmd1 must be a character array.') end cmd1 = val; case 'cmd2' if ~isa(val,'char') error('Value of cmd2 must be a character array.') end cmd2 = val; case 'cmd3' if ~isa(val,'char') error('Value of cmd3 must be a character array.') end cmd3 = val; case 'cmd4' if ~isa(val,'char') error('Value of cmd4 must be a character array.') end cmd4 = val; case 'cmd5' if ~isa(val,'char') error('Value of cmd5 must be a character array.') end cmd5 = val; case 'cmd6' if ~isa(val,'char') error('Value of cmd6 must be a character array.') end cmd6 = val; case 'cmd7' if ~isa(val,'char') error('Value of cmd7 must be a character array.') end cmd7 = val; case 'cmd8' if ~isa(val,'char') error('Value of cmd8 must be a character array.') end cmd8 = val; otherwise error(['Option ''' opt ''' unknown']) end % switch opt end % for i=3:2:nargin end % if nargin > 2 end % try / catch if verbose, disp([ 'This is LaPrint, version ' laprintident '.' ]); end comment = strrep(strrep(comment,'\','\\'),'%','%%'); caption = strrep(strrep(caption,'\','\\'),'%','%%'); iscaption = logical(length(caption)); if nzeros < 3 warning('LaPrint:general',... 'The value of nzero should be >=3. I will use nzeros=3.') nzeros=3; end if processview createview=1; end if mathticklabels Do='$'; else Do=''; end % eps- and tex- filenames [epsfullnameext,epsbasenameext,epsbasename,epsdirname] = ... getfilenames(filename,'eps',verbose); [texfullnameext,texbasenameext,texbasename,texdirname] = ... getfilenames(filename,'tex',verbose); if ~strcmp(texdirname,epsdirname) warning('LaPrint:files',['The eps-file and tex-file are '... 'placed in different directories.']); end if createview | processview [viewfullnameext,viewbasenameext,viewbasename,viewdirname] = ... getfilenames(viewfilename,'tex',verbose); if strcmp(texfullnameext,viewfullnameext) viewfilename=[ viewfilename '_']; warning('LaPrint:files',['The tex- and view-file coincide. '... 'I''ll use '' ' viewfilename ' ''. Hope that''s ok.' ]) end [viewfullnameext,viewbasenameext,viewbasename,viewdirname]= ... getfilenames(viewfilename,'tex',verbose); if ~strcmp(texdirname,viewdirname) warning('LaPrint:files',['The eps-file and view-file are '... 'placed in different directories.' ]) end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% PART 2 of advanced usage: %%%% Create new figure, insert tags, and bookkeep original text %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % show all shh = get(0,'ShowHiddenHandles'); set(0,'ShowHiddenHandles','on'); % preparing check for copyobj bug figno_ori = figno; number_children_ori = length(get(figno_ori,'children')); % open new figure (if required) and set properties if figcopy figno = copyobj(figno,0); set(figno,'visible','off') set(figno,'Numbertitle','off') set(figno,'MenuBar','none') pause(0.5) end if asonscreen xlimmodeauto = findobj(figno,'xlimmode','auto'); xtickmodeauto = findobj(figno,'xtickmode','auto'); xticklabelmodeauto = findobj(figno,'xticklabelmode','auto'); ylimmodeauto = findobj(figno,'ylimmode','auto'); ytickmodeauto = findobj(figno,'ytickmode','auto'); yticklabelmodeauto = findobj(figno,'yticklabelmode','auto'); zlimmodeauto = findobj(figno,'zlimmode','auto'); ztickmodeauto = findobj(figno,'ztickmode','auto'); zticklabelmodeauto = findobj(figno,'zticklabelmode','auto'); set(xlimmodeauto,'xlimmode','manual') set(xtickmodeauto,'xtickmode','manual') set(xticklabelmodeauto,'xticklabelmode','manual') set(ylimmodeauto,'ylimmode','manual') set(ytickmodeauto,'ytickmode','manual') set(yticklabelmodeauto,'yticklabelmode','manual') set(zlimmodeauto,'ylimmode','manual') set(ztickmodeauto,'ytickmode','manual') set(zticklabelmodeauto,'yticklabelmode','manual') end set(figno,'paperunits','centimeters'); set(figno,'units','centimeters'); orip = get(figno,'Position'); % determine width and height if factor <= 0 factor = width/orip(3); end latexwidth = width; epswidth = latexwidth/factor; epsheight = epswidth*orip(4)/orip(3); set(figno,'PaperPosition',[0 0 epswidth epsheight ]) set(figno,'papersize',[epswidth epsheight]) set(figno,'Position',[orip(1)+0.5 orip(2)-0.5 epswidth epsheight ]) set(figno,'Name',[ 'To be printed; size: ' num2str(factor,3) ... ' x (' num2str(epswidth,3) 'cm x ' num2str(epsheight,3) 'cm)' ]) % some warnings if verbose if (epswidth<13) | (epsheight<13*0.75) warning('LaPrint:size',['The size of the eps-figure is quite '... 'small. The text objects might not be properly set. '... 'Reducing ''factor'' might help.']) end if latexwidth/epswidth<0.5 warning('LaPrint:size',['The size of the eps-figure is large ' ... 'compared to the latex figure. '... 'The text size might be too small. '... 'Increasing ''factor'' might help.']) end if (orip(3)-epswidth)/orip(3) > 0.1 warning('LaPrint:size',['The size of the eps-figure is much '... 'smaller than the original '... 'figure on screen. Matlab might save different ticks '... 'and ticklabels than in the original figure. '... 'See option ''asonscreen''.']) end disp('Strike any key to continue.'); pause end % % TEXT OBJECTS: modify new figure % % find all text objects hxl = get(findobj(figno,'type','axes'),'xlabel'); hyl = get(findobj(figno,'type','axes'),'ylabel'); hzl = get(findobj(figno,'type','axes'),'zlabel'); hti = get(findobj(figno,'type','axes'),'title'); hte = findobj(figno,'type','text'); % array of all text handles htext = unique([ celltoarray(hxl) celltoarray(hyl) celltoarray(hzl) ... celltoarray(hti) celltoarray(hte)]); nt = length(htext); % set(celltoarray(hxl),'VerticalAlignment','top'); % get alignments hora = get(htext,'HorizontalAlignment'); vera = get(htext,'VerticalAlignment'); align = cell(nt,1); for i=1:nt align{i} = hora{i}(1); switch vera{i} case 'top' align{i} = [align{i} 't']; case 'cap' % if ~isempty(get(htext(i),'string')) % warning('LaPrint:text',['Using vertical ' ... % 'alignment ''top'' instead of ''cap''.']) % end align{i} = [align{i} 't']; case 'middle' align{i} = [align{i} 'c']; case 'baseline' align{i} = [align{i} 'B']; case 'bottom' align{i} = [align{i} 'b']; otherwise warning('LaPrint:text',['Vertical alignment ' vera{i} ... ' unknown. Using ''c''.']) align{i} = [align{i} 'c']; end end % generate new strings and store old ones oldstr = get(htext,'string'); newstr = cell(nt,1); basestr = ['s' char(48*ones(1,nzeros-1))]; extrastr = 0; for i=1:nt osi = oldstr{i}; oldstr{i} = ['\setlength{\tabcolsep}{0pt}\begin{tabular}{' ... align{i}(1) '}']; isnonempty_osi = 0; if strcmp(get(get(htext(i),'parent'),'tag'),'legend') newstr1 = []; if isa(osi,'cell') % Legend/cell : Don't use tabular, employ extra strings nlines = length(osi); if nlines > 1 newstr{nt+extrastr+nlines-1} = []; oldstr{nt+extrastr+nlines-1} = []; htext((nt+extrastr+1):(nt+extrastr+nlines-1))=htext(i); for line=1:nlines-1 oldstr{nt+extrastr+line} = ... strrep(strrep(osi{line},'\','\\'),'%','%%'); newstr{nt+extrastr+line} = ... overwritetail(basestr,nt+extrastr+line); newstr1 = [newstr1; overwritetail(basestr,nt+extrastr+line)]; end extrastr = extrastr+nlines-1; end if nlines > 0 oldstr{i} = strrep(strrep(osi{nlines},'\','\\'),'%','%%'); newstr{i} = overwritetail(basestr,i); newstr1 = [newstr1; overwritetail(basestr,i)]; end % replace strings in figure set(htext(i),'string',cellstr(newstr1)); else % Legend/matrix : Don't use tabular, employ extra strings nlines=size(osi,1); if nlines > 1 newstr{nt+extrastr+nlines-1} = []; oldstr{nt+extrastr+nlines-1} = []; htext((nt+extrastr+1):(nt+extrastr+nlines-1))=htext(i); for line=1:nlines-1 oldstr{nt+extrastr+line} = ... strrep(strrep(osi(line,:),'\','\\'),'%','%%'); newstr{nt+extrastr+line} = ... overwritetail(basestr,nt+extrastr+line); newstr1 = [newstr1; overwritetail(basestr,nt+extrastr+line)]; end extrastr = extrastr+nlines-1; end if nlines > 0 oldstr{i} = strrep(strrep(osi(nlines,:),'\','\\'),'%','%%'); newstr{i} = overwritetail(basestr,i); newstr1 = [newstr1; overwritetail(basestr,i)]; end % replace strings in figure set(htext(i),'string',newstr1); end else % text, not a legend if isa(osi,'cell') nlines = length(osi); if nlines > 1 for line=1:nlines-1 oldstr{i}=[oldstr{i} osi{line} '\\']; isnonempty_osi = isnonempty_osi+length(osi{line}); end if align{i}(2) == 'B' warning('LaPrint:text',['Vertical Alignment ''baseline'' '... 'in text with multiple rows might not match.']) align{i}(2) = 't'; end end if nlines > 0 oldstr{i} = [oldstr{i} osi{nlines} '\end{tabular}']; isnonempty_osi = isnonempty_osi+length(osi{nlines}); end oldstr{i} = strrep(strrep(oldstr{i},'\','\\'),'%','%%'); if isnonempty_osi newstr{i} = overwritetail(basestr,i); else newstr{i} = ''; end % replace strings in figure set(htext(i),'string',newstr{i}); else nlines=size(osi,1); if nlines > 1 for line=1:nlines-1 oldstr{i} = [oldstr{i} osi(line,:) '\\']; isnonempty_osi = isnonempty_osi+length(osi(line,:)); end if align{i}(2) == 'B' warning('LaPrint:text',['Vertical Alignment ''baseline'' '... 'in text with multiple rows might not match.']) align{i}(2) = 't'; end end if nlines > 0 oldstr{i} = [oldstr{i} osi(nlines,:) '\end{tabular}']; isnonempty_osi = isnonempty_osi+length(osi(nlines,:)); end oldstr{i} = strrep(strrep(oldstr{i},'\','\\'),'%','%%'); if isnonempty_osi newstr{i} = overwritetail(basestr,i); else newstr{i} = ''; end % replace string in figure set(htext(i),'string',newstr{i}); end % isa cell end % isa legend end % for ntp = nt+extrastr; % Alignment of Legends if extrastr > 0 align{ntp} = []; [align{nt+1:ntp}] = deal('lc'); end % get font properties and create commands if ntp > 0 [fontsizecmd{1:ntp}] = deal(''); [fontanglecmd{1:ntp}] = deal(''); [fontweightcmd{1:ntp}] = deal(''); [colorcmd{1:ntp}] = deal(''); [colorclose{1:ntp}] = deal(''); end selectfontcmd = ''; if keepfontprops % fontsize set(htext,'fontunits','points'); fontsize = get(htext,'fontsize'); for i=1:ntp fontsizecmd{i} = [ '\\fontsize{' num2str(fontsize{i}) '}{' ... num2str(fontsize{i}*1.5) '}' ]; end % fontweight fontweight = get(htext,'fontweight'); for i=1:ntp switch fontweight{i} case 'light' fontweightcmd{i} = [ '\\fontseries{l}\\mathversion{normal}' ]; case 'normal' fontweightcmd{i} = [ '\\fontseries{m}\\mathversion{normal}' ]; case 'demi' fontweightcmd{i} = [ '\\fontseries{sb}\\mathversion{bold}' ]; case 'bold' fontweightcmd{i} = [ '\\fontseries{bx}\\mathversion{bold}' ]; otherwise warning('LaPrint:text',['Unknown fontweight: ' fontweight{i} ]) fontweightcmd{i} = [ '\\fontseries{m}\\mathversion{normal}' ]; end end % fontangle fontangle = get(htext,'fontangle'); for i=1:ntp switch fontangle{i} case 'normal' fontanglecmd{i} = [ '\\fontshape{n}' ]; case 'italic' fontanglecmd{i} = [ '\\fontshape{it}' ]; case 'oblique' fontanglecmd{i} = [ '\\fontshape{it}' ]; otherwise warning('LaPrint:text',['unknown fontangle: ' fontangle{i} ]) fontanglecmd{i} = [ '\\fontshape{n}' ]; end end selectfontcmd = '\\selectfont '; end if color & ntp>0 col = get(htext,'color'); bgcol = get(htext,'BackgroundColor'); ecol = get(htext,'EdgeColor'); for i=1:ntp col0 = get(get(htext(i),'parent'),'color'); [coli,isc] = char2rgb(col{i},[0 0 0]); [bgcoli,isbgc] = char2rgb(bgcol{i},col0); [ecoli,isec] = char2rgb(ecol{i},col0); if isbgc | isec set(htext(i),'BackgroundColor','none') set(htext(i),'EdgeColor','none') colorcmd{i} = ['\\setlength{\\fboxsep}{2pt}\\fcolorbox[rgb]{' ... num2str(ecoli(1)) ',' num2str(ecoli(2)) ',' ... num2str(ecoli(3)) '}{' ... num2str(bgcoli(1)) ',' num2str(bgcoli(2)) ',' ... num2str(bgcoli(3)) '}{\\color[rgb]{' ... num2str(coli(1)) ',' num2str(coli(2)) ',' num2str(coli(3)) '}' ]; colorclose{i} = '}'; else colorcmd{i} = ['\\color[rgb]{' ... num2str(coli(1)) ',' num2str(coli(2)) ',' num2str(coli(3)) '}' ]; end end end % % LABELS: modify new figure % if ~keepticklabels % all axes hax = celltoarray(findobj(figno,'type','axes')); na = length(hax); % % try to figure out if we have 3D axes an warn % issuewarning = 0; % for i=1:na % issuewarning = max(issuewarning,is3d(hax(i))); % end % if issuewarning % warning('LaPrint:label',['This seems to be a 3D plot. '... % 'The LaTeX labels are possibly incorrect. '... % 'The option ''keepticklabels'' might help. '... % 'Setting ''figcopy'' to ''off'' might be wise, too.']) % end % try to figure out if we linear scale with extra factor % and determine powers of 10 powers = NaN*zeros(na,3); % matrix with powers of 10 for i=1:na % all axes allxyz = { 'x', 'y', 'z' }; for ixyz=1:3 % x,y,z xyz = allxyz{ixyz}; ticklabelmode = get(hax(i),[ xyz 'ticklabelmode']); if strcmp(ticklabelmode,'auto') tick = get(hax(i),[ xyz 'tick']); ticklabel = get(hax(i),[ xyz 'ticklabel']); nticklabels = size(ticklabel,1); nticks = length(tick); if nticks==0, powers(i,ixyz)=0; nticklabels=0; end if nticklabels==0, powers(i,ixyz)=0; end for k=1:nticklabels % all ticks label = str2num(ticklabel(k,:)); if length(label)==0, powers(i,ixyz) = 0; break; end if ( label==0 ) & ( abs(tick(k))>1e-10 ) powers(i,ixyz) = 0; break; end if label~=0 expon = log10(tick(k)/label); rexpon = round(expon); if abs(rexpon-expon)>1e-10 powers(i,ixyz) = 0; break; end if isnan(powers(i,ixyz)) powers(i,ixyz) = rexpon; else if powers(i,ixyz)~=rexpon powers(i,ixyz) = 0; break; end end end end % k else % if 'auto' powers(i,ixyz) = 0; end % if 'auto' end % ixyz end % i % place text to be replaced by powers on y-axis for i=1:na allxyz = { 'x', 'y', 'z' }; ixyz=2; % x,y,z xyz = allxyz{ixyz}; leftright=get(hax(i),'yaxislocation'); if powers(i,ixyz) & ~is3d(hax(i)) & isequal(leftright,'left') powertext = ['ypower' int2str(i)]; xlimit = get(hax(i),'xlim'); ylimit = get(hax(i),'ylim'); htext = text(xlimit(1),ylimit(2)+... 0.01*(ylimit(2)-ylimit(1)),... powertext); set(htext,'VerticalAlignment','Baseline'); end end % i % replace all ticklabels and bookkeep nxlabel = zeros(1,na); nylabel = zeros(1,na); nzlabel = zeros(1,na); allxyz={ 'x', 'y', 'z' }; for ixyz=1:3 xyz = allxyz{ixyz}; k=1; if strcmp(xyz,'y') basestr = [ 'v' char(48*ones(1,nzeros-1))]; else basestr = [ xyz char(48*ones(1,nzeros-1))]; end oldtl = cell(na,1); newtl = cell(na,1); nlabel = zeros(1,na); for i=1:na % set(hax(i),[ xyz 'tickmode' ],'manual') % set(hax(i),[ xyz 'ticklabelmode' ],'manual') oldtl{i} = chartocell(get(hax(i),[ xyz 'ticklabel' ])); nlabel(i) = length(oldtl{i}); newtl{i} = cell(1,nlabel(i)); for j=1:nlabel(i) newtl{i}{j} = overwritetail(basestr,k); k = k+1; oldtl{i}{j} = deblank(strrep(strrep(oldtl{i}{j},'\','\\'),... '%','%%')); end set(hax(i),[ xyz 'ticklabel' ],newtl{i}); end eval([ 'old' xyz 'tl=oldtl;' ]); eval([ 'new' xyz 'tl=newtl;' ]); eval([ 'n' xyz 'label=nlabel;' ]); end % determine latex commands for font properties if keepfontprops % ticklabel font size afsize = zeros(na,1); for i=1:na afsize(i) = get(hax(i),'fontsize'); end if (any(afsize ~= afsize(1) )) warning('LaPrint:text',['Different font sizes for axes not '... 'supported. All axes will have font size ' ... num2str(afsize(1)) '.' ] ) end afsizecmd = [ '\\fontsize{' num2str(afsize(1)) '}{' ... num2str(afsize(1)*1.5) '}' ]; % ticklabel font weight afweight = cell(na,1); for i=1:na afweight{i} = get(hax(i),'fontweight'); end switch afweight{1} case 'light' afweightcmd = [ '\\fontseries{l}\\mathversion{normal}' ]; case 'normal' afweightcmd = [ '\\fontseries{m}\\mathversion{normal}' ]; case 'demi' afweightcmd = [ '\\fontseries{sb}\\mathversion{bold}' ]; case 'bold' afweightcmd = [ '\\fontseries{bx}\\mathversion{bold}' ]; otherwise warning('LaPrint:text',['unknown fontweight: ' afweight{1} ]) afweightcmd = [ '\\fontseries{m}\\mathversion{normal}' ]; end for i=1:na if ~strcmp(afweight{i},afweight{1}) warning('LaPrint:text',['Different font weights for axes '... 'are not supported. All axes will have font weight ' ... afweightcmd '.']) end end % ticklabel font angle afangle = cell(na,1); for i=1:na afangle{i} = get(hax(i),'fontangle'); end switch afangle{1} case 'normal' afanglecmd = [ '\\fontshape{n}' ]; case 'italic' afanglecmd = [ '\\fontshape{it}' ]; case 'oblique' afanglecmd = [ '\\fontshape{it}' ]; otherwise warning('LaPrint:text',['unknown fontangle: ' afangle{1} ]) afanglecmd=[ '\\fontshape{n}' ]; end for i=1:na if ~strcmp(afangle{i},afangle{1}) warning('LaPrint:text',['Different font angles for axes not '... 'supported. All axes will have font angle ' ... afanglecmd '.'] ) end end end % ticklabel color acolcmd=''; if color acol=[]; allxyz={ 'x', 'y', 'z' }; acolwarn = 0; for i=1:na for ixyz=1:3 xyzcolor = [allxyz{ixyz} 'color']; if ~isempty(get(hax(i),[allxyz{ixyz} 'ticklabel'])) if isempty(acol) acol = char2rgb(get(hax(i),xyzcolor)); else if any(char2rgb(get(hax(i),xyzcolor))~=acol) acolwarn = 1; end end end end end if acolwarn warning('LaPrint:label',['Different colors for axes not ' ... 'supported. All ticklabels will have color [ ' ... num2str(acol) ' ].' ] ) end if ~isempty(acol) if any(acol~=[0 0 0]) acolcmd = [ '\\color[rgb]{' num2str(acol(1)) ',' ... num2str(acol(2)) ',' num2str(acol(3)) '}' ]; end end end % ticklabel alignment xyzalign = char([116*ones(na,1) 114*ones(na,1) 114*ones(na,1)]); for i=1:na switch get(hax(i),'XAxisLocation') case 'top' xyzalign(i,1)='B'; end switch get(hax(i),'YAxisLocation') case 'right' xyzalign(i,2)='l'; end end end % % extra picture environment % if extrapicture unitlength = zeros(na,1); ybound = zeros(na,1); for i=na:-1:1 % reverse order, to keep axes in original order if ~is3d(hax(i)) xlim = get(hax(i),'xlim'); ylim = get(hax(i),'ylim'); axes(hax(i)); hori = text(ylim(1),ylim(1),[ 'origin' int2str(i) ]); set(hori,'VerticalAlignment','bottom'); set(hori,'Fontsize',2); set(hax(i),'Units','normalized') pos = get(hax(i),'Position'); unitlength(i) = pos(3)*epswidth; ybound(i) = (pos(4)*epsheight)/(pos(3)*epswidth); else warning('LaPrint:extrapic',['Option ''extrapicture'' for 3D ' ... 'axes not supported.']) end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% PART 3 of advanced usage: %%%% save eps and tex files %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % prevent matlab print command to modify lims and ticks % (empty, if asonscreen=1) if ~keepticklabels xlimmodeauto = findobj(figno,'xlimmode','auto'); xtickmodeauto = findobj(figno,'xtickmode','auto'); xticklabelmodeauto = findobj(figno,'xticklabelmode','auto'); ylimmodeauto = findobj(figno,'ylimmode','auto'); ytickmodeauto = findobj(figno,'ytickmode','auto'); yticklabelmodeauto = findobj(figno,'yticklabelmode','auto'); zlimmodeauto = findobj(figno,'zlimmode','auto'); ztickmodeauto = findobj(figno,'ztickmode','auto'); zticklabelmodeauto = findobj(figno,'zticklabelmode','auto'); set(xlimmodeauto,'xlimmode','manual') set(xtickmodeauto,'xtickmode','manual') set(xticklabelmodeauto,'xticklabelmode','manual') set(ylimmodeauto,'ylimmode','manual') set(ytickmodeauto,'ytickmode','manual') set(yticklabelmodeauto,'yticklabelmode','manual') set(zlimmodeauto,'ylimmode','manual') set(ztickmodeauto,'ytickmode','manual') set(zticklabelmodeauto,'yticklabelmode','manual') end % create eps file cmd = strrep(printcmd,'',epsfullnameext); cmd = strrep(cmd,'',filename); cmd = strrep(cmd,'',int2str(figno)); if verbose disp([ 'executing: '' ' cmd ' ''' ]); end eval(cmd); % % create latex file % if verbose disp([ 'writing to: '' ' texfullnameext ' ''' ]) end fid = fopen(texfullnameext,'w'); % head if head fprintf(fid,[ '%% This file is generated by the MATLAB m-file' ... ' laprint.m. It can be included\n']); fprintf(fid,[ '%% into LaTeX documents using the packages ']); fprintf(fid,package); if color fprintf(fid,', color'); end fprintf(fid,[ ' and psfrag.\n' ]); fprintf(fid, ['%% It is accompanied by a postscript file. ',... 'A sample LaTeX file is:\n']); fprintf(fid, '%% \\documentclass{article}\\usepackage{'); fprintf(fid,package); if color fprintf(fid,',color'); end fprintf(fid, ',psfrag}\n'); fprintf(fid,[ '%% \\begin{document}\\input{' ... texbasename '}\\end{document}\n' ]); fprintf(fid, [ '%% See http://www.mathworks.de/matlabcentral'... '/fileexchange/loadFile.do?objectId=4638\n']); fprintf(fid, [ '%% for recent versions of laprint.m.\n' ]); fprintf(fid, '%%\n'); fprintf(fid,[ '%% created by: ' 'LaPrint version ' ... laprintident '\n' ]); fprintf(fid,[ '%% created on: ' datestr(now) '\n' ]); fprintf(fid,[ '%% eps bounding box: ' num2str(epswidth) ... ' cm x ' num2str(epsheight) ' cm\n' ]); fprintf(fid,[ '%% comment: ' comment '\n' ]); fprintf(fid,'%%\n'); else fprintf(fid,[ '%% generated by laprint.m\n' ]); fprintf(fid,'%%\n'); end % go on fprintf(fid,'\\begin{psfrags}%%\n'); %fprintf(fid,'\\fontsize{10}{12}\\selectfont%%\n'); fprintf(fid,'\\psfragscanon%%\n'); % text strings numbertext=0; for i=1:nt numbertext = numbertext+length(newstr{i}); end if numbertext>0, fprintf(fid,'%%\n'); fprintf(fid,'%% text strings:\n'); for i=1:ntp if length(newstr{i}) alig = strrep(align{i},'c',''); fprintf(fid,[ '\\psfrag{' newstr{i} '}[' alig '][' alig ']{' ... fontsizecmd{i} fontweightcmd{i} fontanglecmd{i} ... selectfontcmd colorcmd{i} oldstr{i} colorclose{i} '}%%\n' ]); end end end % labels if ~keepticklabels if ~isempty(acolcmd) fprintf(fid,'%%\n'); fprintf(fid,'%% axes ticklabel color:\n'); fprintf(fid,[ acolcmd '%%\n' ]); end if keepfontprops fprintf(fid,'%%\n'); fprintf(fid,'%% axes font properties:\n'); fprintf(fid,[ afsizecmd afweightcmd '%%\n' ]); fprintf(fid,[ afanglecmd '\\selectfont%%\n' ]); end nxlabel = zeros(1,na); nylabel = zeros(1,na); nzlabel = zeros(1,na); for i=1:na nxlabel(i) = length(newxtl{i}); nylabel(i) = length(newytl{i}); nzlabel(i) = length(newztl{i}); end allxyz = { 'x', 'y', 'z' }; for ixyz=1:3 xyz = allxyz{ixyz}; eval([ 'oldtl=old' xyz 'tl;' ]); eval([ 'newtl=new' xyz 'tl;' ]); eval([ 'nlabel=n' xyz 'label;' ]); if sum(nlabel) > 0 fprintf(fid,'%%\n'); fprintf(fid,[ '%% ' xyz 'ticklabels:\n']); for i=1:na poss = ['[' xyzalign(i,ixyz) '][' xyzalign(i,ixyz) ']']; if nlabel(i) if strcmp(get(hax(i),[ xyz 'scale']),'linear') % lin scale rexpon = powers(i,ixyz); if ~rexpon % no powers for j=1:nlabel(i) fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{' ... Do oldtl{i}{j} Do '}%%\n' ]); end else % powers if ixyz==2 leftright=get(hax(i),'yaxislocation'); if ~is3d(hax(i)) & isequal(leftright,'left') for j=1:nlabel(i) fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{' ... Do oldtl{i}{j} Do '}%%\n' ]); end fprintf(fid,[ '\\psfrag{ypower' int2str(i) ... '}[Bl][Bl]{$\\times 10^{' ... int2str(rexpon) '}$}%%\n' ]); else for j=1:nlabel(i)-1 fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{' ... Do oldtl{i}{j} Do '}%%\n' ]); end if ~is3d(hax(i)) fprintf(fid,[ '\\psfrag{' newtl{i}{nlabel(i)} ... '}' poss '{' ... Do oldtl{i}{nlabel(i)} Do '$\\times 10^{'... int2str(rexpon) '}$}%%\n' ]); else fprintf(fid,[ '\\psfrag{' newtl{i}{nlabel(i)} ... '}' poss '{\\shortstack{' ... Do oldtl{i}{nlabel(i)} Do '\\\\$\\times 10^{'... int2str(rexpon) '}\\ $}}%%\n' ]); end end elseif ixyz==1 for j=1:nlabel(i)-1 fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{' ... Do oldtl{i}{j} Do '}%%\n' ]); end leftright=get(hax(i),'xaxislocation'); if isequal(leftright,'bottom') fprintf(fid,[ '\\psfrag{' newtl{i}{nlabel(i)} ... '}' poss '{\\shortstack{' ... Do oldtl{i}{nlabel(i)} Do '\\\\$\\times 10^{'... int2str(rexpon) '}\\ $}}%%\n' ]); else fprintf(fid,[ '\\psfrag{' newtl{i}{nlabel(i)} ... '}' poss '{\\shortstack{$\\times 10^{' ... int2str(rexpon) '}\\ $\\\\' ... Do oldtl{i}{nlabel(i)} Do '}}%%\n' ]); end else for j=1:nlabel(i)-1 fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{' ... Do oldtl{i}{j} Do '}%%\n' ]); end fprintf(fid,[ '\\psfrag{' newtl{i}{nlabel(i)} ... '}' poss '{' Do oldtl{i}{nlabel(i)} Do ... '\\setlength{\\unitlength}{1ex}' ... '\\begin{picture}(0,0)\\put(0.5,1.5){$\\times 10^{' ... int2str(rexpon) '}$}\\end{picture}}%%\n' ]); end end % rexpon else % log scale for j=1:nlabel(i) fprintf(fid,[ '\\psfrag{' newtl{i}{j} '}' poss '{$10^{' ... oldtl{i}{j} '}$}%%\n' ]); end % for (log) end % if linear end % if nlabel(i) end end end end % extra picture if extrapicture fprintf(fid,'%%\n'); fprintf(fid,'%% extra picture(s):\n'); for i=1:na fprintf(fid,[ '\\psfrag{origin' int2str(i) '}[lb][lb]{' ... '\\setlength{\\unitlength}{' ... num2str(unitlength(i),'%5.5f') 'cm}%%\n' ]); fprintf(fid,[ '\\begin{picture}(1,' ... num2str(ybound(i),'%5.5f') ')%%\n' ]); %fprintf(fid,'\\put(0,0){}%% lower left corner\n'); %fprintf(fid,[ '\\put(1,' num2str(ybound(i),'%5.5f') ... % '){}%% upper right corner\n' ]); fprintf(fid,'\\end{picture}%%\n'); fprintf(fid,'}%%\n'); end end % figure fprintf(fid,'%%\n'); fprintf(fid,'%% Figure:\n'); if iscaption fprintf(fid,[ '\\parbox{' num2str(latexwidth) 'cm}{\\centering%%\n' ]); end if ~scalefonts switch package case 'epsfig' fprintf(fid,[ '\\epsfig{file=' epsbasenameext ',width=' ... num2str(latexwidth) 'cm}%%\n' ]); case 'graphicx' fprintf(fid,[ '\\includegraphics[width=' num2str(latexwidth) ... 'cm]{' epsbasenameext '}%%\n' ]); otherwise warning('LaPrint:general',['Package ''' package ''' not known. '... 'I hope you know what you are doing...']) end else switch package case 'epsfig' fprintf(fid,[ '\\resizebox{' num2str(latexwidth) 'cm}{!}' ... '{\\epsfig{file=' epsbasenameext '}}%%\n' ]); case 'graphicx' fprintf(fid,[ '\\resizebox{' num2str(latexwidth) 'cm}{!}' ... '{\\includegraphics{' epsbasenameext '}}%%\n' ]); otherwise warning('LaPrint:general',['Package ''' package ''' not known. '... 'I hope you know what you are doing...']) end end if iscaption fprintf(fid,[ '\\caption{' caption '}%%\n' ]); fprintf(fid,[ '\\label{fig:' texbasename '}%%\n' ]); fprintf(fid,[ '}%%\n' ]); end fprintf(fid,'\\end{psfrags}%%\n'); fprintf(fid,'%%\n'); fprintf(fid,[ '%% End ' texbasenameext '\n' ]); fclose(fid); set(figno,'Name','Printed by LaPrint') if figcopy if verbose disp('Strike any key to continue.'); pause end hlegend = findobj(figno,'Tag','legend'); set(hlegend,'DeleteFcn','') close(figno) end % check for copyobj-bug --> should be ok now! number_children_new = length(get(figno_ori,'children')); if number_children_new < number_children_ori if figcopy warning(['LaPrint:general','Objects in the figure have been '... 'deleted! This is due to a bug in matlabs '... '''copyopj''. You might want to try to set '... '''figcopy'' to ''off''.']) else warning('LaPrint:general',['Objects in the figure have been '... 'deleted!']) end end % % create view file % if createview | processview if verbose disp([ 'writing to: '' ' viewfullnameext ' ''' ]) end fid = fopen(viewfullnameext,'w'); if head fprintf(fid,[ '%% This file is generated by laprint.m.\n' ]); fprintf(fid,[ '%% It calls ' texbasenameext ... ', which in turn calls ' epsbasenameext '.\n' ]); fprintf(fid,[ '%% Process this file using, e.g.,\n' ]); fprintf(fid,[ '%% latex ' viewbasenameext '\n' ]); fprintf(fid,[ '%% dvips -o' viewbasename '.ps ' viewbasename ... '.dvi\n']); fprintf(fid,[ '%% ghostview ' viewbasename '.ps&\n' ]); else fprintf(fid,[ '%% generated by laprint.m\n' ]); end fprintf(fid,[ '\\documentclass{article}\n' ]); fprintf(fid,[ '\\usepackage{' ]); fprintf(fid,package); if color fprintf(fid,',color'); end fprintf(fid,[ ',psfrag,a4}\n' ]); fprintf(fid,[ '\\usepackage[latin1]{inputenc}\n' ]); if ~strcmp(epsdirname,viewdirname) fprintf(fid,[ '\\graphicspath{{' epsdirname '}}\n' ]); end fprintf(fid,[ '\\begin{document}\n' ]); fprintf(fid,[ '\\pagestyle{empty}\n' ]); if strcmp(texdirname,viewdirname) fprintf(fid,[ ' \\input{' texbasenameext '}\n' ]); else fprintf(fid,[ ' \\input{' texdirname texbasenameext '}\n' ]); end fprintf(fid,[ '\\end{document}\n' ]); fclose(fid); end % process view file if processview conti=1; for i=1:8 eval(['cmdi=cmd' int2str(i) ';']) if ~isempty(cmdi) & conti cmd = strrep(cmdi,'',viewbasename); cmd = strrep(cmd,'',filename); disp([ 'executing: '' ' cmd ' ''' ]); [stat,resu]=system(cmd); if stat %| isempty(strfind(resu,'Output written on')) disp(resu) conti=0; end end end if ~conti disp('An error occured in the latex/friends sequence.') end end set(0,'ShowHiddenHandles',shh); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%% %%%% functions used %%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [fullnameext,basenameext,basename,dirname] = getfilenames(... filename,extension,verbose); % appends an extension to a filename (as '/home/tom/tt') and determines % fullnameext: filename with extension and dirname, as '/home/tom/tt.tex' % basenameext: filename with extension without dirname, as 'tt.tex' % basename : filename without extension without dirname, as 'tt' % dirname : dirname without filename, as '/home/tom/' % In verbose mode, it asks if to overwrite or to modify. % [dirname, basename] = splitfilename(filename); fullnameext = [ dirname basename '.' extension ]; basenameext = [ basename '.' extension ]; if verbose quest = (exist(fullnameext)==2); while quest yn = input([ strrep(strrep(fullnameext,'\','\\'),'%','%%') ... ' exists. Overwrite? (y/n) '],'s'); if strcmp(yn,'y') quest = 0; else filename = input( ... [ 'Please enter new filename (without extension .' ... extension '): ' ],'s'); [dirname, basename] = splitfilename(filename); fullnameext = [ dirname basename '.' extension ]; basenameext = [ basename '.' extension ]; quest = (exist(fullnameext)==2); end end end if ( exist(dirname)~=7 & ~strcmp(dirname,[ '.' filesep ]) ... & ~strcmp(dirname,filesep) ) error([ 'Directory ' dirname ' does not exist.' ] ) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [dirname,basename] = splitfilename(filename); % splits filename into dir and base slashpos = findstr(filename,filesep); nslash = length(slashpos); nfilename = length(filename); if nslash dirname = filename(1:slashpos(nslash)); basename = filename(slashpos(nslash)+1:nfilename); else dirname = pwd; nn=length(dirname); if ~strcmp(dirname(nn),filesep) dirname = [ dirname filesep ]; end basename = filename; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function yesno = is3d(haxes); % tries to figure out if axes is 3D yesno = 0; CameraPosition = get(haxes,'CameraPosition'); CameraTarget = get(haxes,'CameraTarget'); CameraUpVector = get(haxes,'CameraUpVector'); if CameraPosition(1)~=CameraTarget(1) yesno = 1; end if CameraPosition(2)~=CameraTarget(2) yesno = 1; end if any(CameraUpVector~=[0 1 0]) yesno = 1; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function b = celltoarray(a); % converts a cell of doubles to an array if iscell(a), b = []; for i=1:length(a), b = [b a{i}]; end else, b = a(:)'; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function b = chartocell(a) % converts a character array into a cell array of characters % convert to cell if isa(a,'char') n = size(a,1); b = cell(1,n); for j=1:n b{j}=a(j,:); end else b = a; end % convert to char n=length(b); for j=1:n if isa(b{j},'double') b{j} = num2str(b{j}); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function b = overwritetail(a,k) % overwrites tail of a by k % a,b: strings % k: integer ks = int2str(k); b = [ a(1:(length(a)-length(ks))) ks ]; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [rgb,isc] = char2rgb(c,c0) % convert color definitions from character to rgb-vector isc = 1; if ~ischar(c) rgb = c; else switch c case {'y','yellow'} rgb = [1 1 0]; case {'m','magenta'} rgb = [1 0 1]; case {'c','cyan'} rgb = [0 1 1]; case {'r','red'} rgb = [1 0 0]; case {'g','green'} rgb = [0 1 0]; case {'b','blue'} rgb = [0 0 1]; case {'w','white'} rgb = [1 1 1]; case {'k','black'} rgb = [0 0 0]; case 'none' if nargin==2 rgb = char2rgb(c0); else rgb = [1 1 1]; end isc = 0; otherwise warning('LaPrint:general',['Unknown Color: ''' c ... '''. Taking black.']) rgb = [0 0 0]; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function v = value01(val,opt) % convert off/on to 0/1 if nargin==2 txt = ['Value of ' opt ' must be ''on'' or ''off''']; else txt = ['Value must be ''on'' or ''off''']; end if ~isa(val,'char') error(txt) end val = lower(strrep(val,' ','')); switch val case 'on' v = 1; case 'off' v = 0; otherwise error(txt) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function v = valueyn(val) % convert 0/1 to off/on if ~isa(val,'double') error([ 'Value must be ''0'' or ''1''']) end switch val case 0 v = 'off'; case 1 v = 'on'; otherwise error([ 'Value must be ''0'' or ''1''']) end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function sethf(hf,LAPRINTHAN,LAPRINTOPT) % store in UserData of gui set(hf,'UserData',{LAPRINTHAN,LAPRINTOPT}) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [LAPRINTHAN,LAPRINTOPT]=gethf(hf) % load from UserData of gui d=get(hf,'UserData'); LAPRINTHAN=d{1}; LAPRINTOPT=d{2}; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function opt = prefsettings if ispref('LaPrint','LAPRINTOPT') opt = getpref('LaPrint','LAPRINTOPT'); else opt = []; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function opt=factorysettings % try to find LaTeX and friends if ispc try latexpath = winqueryreg('HKEY_LOCAL_MACHINE',... 'SOFTWARE\MiK\MiKTeX\CurrentVersion\MiKTeX','Install Root'); latexcmd = [latexpath '\miktex\bin\latex.exe -halt-on-error '... '-interaction nonstopmode .tex']; dvipscmd = [latexpath '\miktex\bin\dvips.exe -D600 -E* '... '-o.eps .dvi']; catch % hoping the path variable is properly set latexcmd = ['latex.exe -halt-on-error '... '-interaction nonstopmode .tex']; dvipscmd = ['dvips.exe -D600 -E* '... '-o.eps .dvi']; end epstoolcmd = ['C:\Ghostgum\epstool\bin\epstool.exe '... '--bbox --copy --output '... '_final.eps .eps']; delcmd = ['del .eps .dvi ',... '.aux .log ',... '.pfg']; gsviewcmd = 'C:\Ghostgum\gsview\gsview32.exe _final.eps&'; else % hoping the path variable is properly set latexcmd = ['latex -halt-on-error '... '-interaction nonstopmode .tex']; dvipscmd = ['dvips -D600 -E* '... '-o.eps .dvi']; epstoolcmd = ['epstool --bbox --copy --output '... '_final.eps .eps']; delcmd = ['rm .eps .dvi ',... '.aux .log ',... '.pfg']; gsviewcmd = 'ghostview _final.eps&'; end vers = version; vers = eval(vers(1:3)); if vers < 6.5 colorvalue=0; else colorvalue=1; end opt = struct(... 'figno',{1},... 'filename','unnamed',... 'width',12,... 'factor',0.8,... 'scalefonts',1,... 'keepfontprops',0,... 'asonscreen',0,... 'keepticklabels',0,... 'mathticklabels',0,... 'head',1,... 'comment','',... 'caption','',... 'extrapicture',0,... 'nzeros',3,... 'verbose',0,... 'figcopy',1,... 'printcmd',['print(''-f'',' ... '''-depsc'',''-painters'','... ''''')'],... 'package','graphicx',... 'color',colorvalue,... 'createview',0,... 'viewfilename','unnamed_',... 'processview',0,... 'cmd1',latexcmd,... 'cmd2',dvipscmd,... 'cmd3',epstoolcmd,... 'cmd4',delcmd,... 'cmd5',gsviewcmd,... 'cmd6','',... 'cmd7','',... 'cmd8',''); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function updategui(LAPRINTHAN,LAPRINTOPT) % update gui set(LAPRINTHAN.figno,'string',num2str(LAPRINTOPT.figno)) set(LAPRINTHAN.filename,'string',LAPRINTOPT.filename) % width, factor, scalefonts if LAPRINTOPT.keepfontprops set(LAPRINTHAN.keepfontprops,'check','on') else set(LAPRINTHAN.keepfontprops,'check','off') end if LAPRINTOPT.asonscreen set(LAPRINTHAN.asonscreen,'check','on') else set(LAPRINTHAN.asonscreen,'check','off') end if LAPRINTOPT.keepticklabels set(LAPRINTHAN.keepticklabels,'check','on') else set(LAPRINTHAN.keepticklabels,'check','off') end if LAPRINTOPT.mathticklabels set(LAPRINTHAN.mathticklabels,'check','on') else set(LAPRINTHAN.mathticklabels,'check','off') end if LAPRINTOPT.head set(LAPRINTHAN.head,'check','on') else set(LAPRINTHAN.head,'check','off') end % comment, caption if LAPRINTOPT.extrapicture set(LAPRINTHAN.extrapicture,'check','on') else set(LAPRINTHAN.extrapicture,'check','off') end % nzeros if LAPRINTOPT.verbose set(LAPRINTHAN.verbose,'check','on') else set(LAPRINTHAN.verbose,'check','off') end if LAPRINTOPT.figcopy set(LAPRINTHAN.figcopy,'check','on') else set(LAPRINTHAN.figcopy,'check','off') end % printcmd switch LAPRINTOPT.package case 'epsfig' set(LAPRINTHAN.package_epsfig,'check','on') set(LAPRINTHAN.package_graphicx,'check','off') case 'graphicx' set(LAPRINTHAN.package_epsfig,'check','off') set(LAPRINTHAN.package_graphicx,'check','on') end if LAPRINTOPT.color set(LAPRINTHAN.color,'check','on') else set(LAPRINTHAN.color,'check','off') end if LAPRINTOPT.createview set(LAPRINTHAN.createview,'check','on') else set(LAPRINTHAN.createview,'check','off') end % viewfilename if LAPRINTOPT.processview set(LAPRINTHAN.processview,'check','on') else set(LAPRINTHAN.processview,'check','off') end % cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function txt = helptext() % help text txt={... '',... ['LAPRINT prints a figure for inclusion in LaTeX documents. ',... 'It creates an eps-file and a tex-file. The tex-file contains the ',... 'annotation of the figure such as titles, labels and texts. The ',... 'eps-file contains the non-text part of the figure and is called ',... 'by the tex-file. The main advantage of using LaPrint ',... 'is that the annotation can be neatly (e.g., including math ',... 'mode and fancy font constructs) set within LaTeX.'],... '',... 'Prerequisites:',... '~~~~~~~~~~~~~~',... ['Matlab 6.1 or above is required. To process the LaTeX file, a ',... 'LaTeX compiler (including the packages ''graphicx'' and ',... '''psfrag'') and a dvi-to-postscript converter (like dvips) '... 'is required. Optional tools are a postscript-viewer ',... '(like ghostview), a postscript bounding box converter ',... '(like epstool) and the LaTeX packages color ',... 'and epsfig.'],... '',... 'Installation:',... '~~~~~~~~~~~~~',... ['LaPrint comes as a single m-file, which has to be placed ',... 'somewhere in the Matlab search path. If you want LaPrint to ',... 'call LaTeX and friends, the (system dependent) executables have ',... 'to be defined using the GUI (see below).'],... '',... 'An example to get started:',... '~~~~~~~~~~~~~~~~~~~~~~~~~~',... ['It is recommended to switch off the Matlab TeX ',... 'interpreter before creating a graphics to be processed by ',... 'LaPrint:'],... ' >> set(0,''DefaultTextInterpreter'',''none'')',... 'Create an example graphics using',... ' >> figure(1), clf',... ' >> plot([1 2])',... ' >> xlabel(''$x$'')',... ' >> ylabel(''A straight line $f(x)=\alpha x + \beta$'')',... ' >> text(1.1,1.9,{''\textbf{This figure is not exiting.}'',...',... ' ''(but it shows some features of \texttt{laprint})''})',... ['Note that the text uses LaTeX constructs like ''$.$'', ',... '''\alpha'' and ''\textbf{}''. You can employ the full LaTeX ',... 'repertoire here.'],... ['Open the LaPrint graphical user interface (GUI) ',... '(if you haven''t already done so), by typing'],... ' >> laprint',... ['Check if the GUI points to Figure Number 1, ',... 'and save the graphics by pressing ''Go!''. ',... 'This creates the files ''unnamed.tex'' and ''unnamed.eps''. ',... 'These can be included in a LaTeX document as follows:'],... ' % This is the LaTeX document testdoc.tex',... ' \documentclass{article}',... ' \usepackage{graphicx,color,psfrag}',... ' \begin{document}',... ' Here comes a Matlab figure created with \texttt{laprint}:\\',... ' \input{unnamed}',... ' \end{document}',... ['This document can be compiled with LaTeX (to create ',... '''testdoc.dvi'') and converted to postscript (to create ',... '''testdoc.ps''). The document ''testdoc.ps'' will contain the ',... 'Matlab graphics with LaTeX annotation. Observe that the ',... 'figure is 12cm wide and that the fonts are scaled to 80% ',... 'of their original size. This is the default behaviour of ',... 'LaPrint, which can be adjusted using ''Options'' in the ',... 'GUI menu bar (as will explained below).'],... '',... ['Instead of using the GUI you can also call LaPrint ',... 'from the command line (or from an m-file) as follows:'],... ' >> laprint(1,''unnamed'')',... '',... 'This is what LaPrint does:',... '~~~~~~~~~~~~~~~~~~~~~~~~~~',... 'Basically, LaPrint performs the following tasks:',... ' - Take a preliminary copy of the figure. ',... ' - In the preliminary figure, replace all text objects by tags.',... [' - Save the preliminary figure (with tags) as an eps-file using ',... 'the Matlab ''print'' command.'],... [' - Create a tex-file which calls the eps-file (using the ',... '''graphicx'' package) and replaces ',... 'the tags by the original text (using the ''psfrag'' package).'],... '',... ['It is instructive to have a look into the tex-file ',... '(''unnamed.tex'' in the above example). ',... 'If your graphics contains huge amounts of LaTeX-code, then ',... 'you might also consider editing the tex-file with your ',... 'favourate LaTeX editor. You have however to be carefull, ',... 'because LaPrint (using default settings) doesn''t care ',... 'overwriting files.'],... '',... 'Using the LaPrint GUI: ',... '~~~~~~~~~~~~~~~~~~~~~~',... ['The behaviour of LaPrint can be controlled by various settings ',... 'and options. Using the GUI, these can be set using the ''Options'' ',... 'entry in the menu bar. Using LaPrint from the command line, ' ,... 'these can be set by extra input arguments in the form of ',... 'option/value pairs. In the following, the options are explained ',... 'in some detail based on the GUI. Later, a table with the ',... 'command line option/value pairs is given.'],... '',... 'In the main LaPrint window you can specify',... ['-- the number of the Matlab figure to be saved (this must be ',... 'the handle of an open Matlab window) and '],... ['-- the basename of the files to be saved (for instance, if ',... 'the basename is ''unnamed'', then ''unnamed.tex'' and ',... '''unnamed.eps'' are created;).'],... '',... 'Via the menu bar you can control the following settings:',... '',... 'Options --> Sizes and Scalings ...',... '',... 'This opens a window where you can specify ',... '-- the width (in cm) of the graphics in the LaTeX document;',... '-- a scaling factor and',... '-- whether you want fonts to be scaled.',... ['The width controls the size of the graphics. Its height ',... 'is computed such that the ratio of width to height of the ',... 'figure on screen is retained. The factor controls the ',... '''denseness'' of the graphics. For instance, if the width is ',... 'w=12 and the factor is f=0.8, then the graphics in the ',... 'eps-file will have width w/f=15 cm and the tex-file ',... 'scales it down to 12 cm. This means that lines become thinner ',... 'and fonts become smaller (as compared to w=12; f=1.0). ',... 'Good values for papers are f=0.8 to f=1.0, ',... 'and f=1.5 is a good value for presentations. ',... 'Switching font scaling off only scales the graphics. ',... 'You may want to experiment with some w/f/scalefont combinations ',... 'to find out your personal preference. '],... '',... 'Options --> Translate Matlab Font Properties to LaTeX ',... '',... ['This option can be switched on/off. When off, all text ',... 'will be set using the LaTeX font which is active while ',... 'entering the tex-file (Matlab font settings are ignored). When ',... 'on, Matlab font settings are translated to LaTeX font ',... 'settings.'],... '',... 'Options --> Print Limits and Ticks as on Screen',... '',... ['This option can be switched on/off. When on, the axes ',... 'limits and ticks are frozen. They appear in the LaTeX ',... 'document as on screen. When off, they are adapted by ',... 'Matlab.'],... '',... 'Options --> Keep Tick Labels within eps File',... '',... ['This option can be switched on/off. When on, the tick ',... 'labels aren''t replaced by their LaTeX equivalents. This is ',... 'useful for some 3D-plots.'],... '',... 'Options --> Set Tick Labels in LaTeX Math Mode',... '',... ['This option can be switched on/off. When on, the tick ',... 'labels are surrounded by a ''$''.'],... '',... 'Options --> Equip the tex File with a Head',... '',... ['This option can be switched on/off. When on, the tex-file ',... 'is equipped with a header with a bunch of comments (date, files, ',... 'example, comment text,...).'],... '',... 'Options --> Comment in the Head of the tex File ...',... '',... ['This opens a window where you can specify a comment to be ',... 'placed in the header of the tex file.'],... '',... 'Options --> Place a LaTeX caption in the tex File ...',... '',... ['This opens a window where you can enter a caption text. If this ',... 'caption text is nonempty, it is placed as a \caption{} ',... 'into the tex-file. Thus the text will appear in the LaTeX ',... 'document. In addition a \label{} is placed in the tex-file ',... 'which can be used to refer to the graphics. The label will ',... 'be fig: followed by the basename of the files, e.g., ',... '\label{fig:unnamed}.'],... '',... 'Options --> Place an Extra Picture in each Axes',... '',... ['This option can be switched on/off. When on, each axes in the ',... 'figure is equipped with an empty LaTeX ''picture'' environment. ',... 'It can be used to place some additional material into the ',... 'figure by editing the tex-file.'],... '',... 'Options --> Length of the psfrag Replacement Strings ...',... '',... ['This opens a window where you can enter the length of the ',... 'psfrag tags. If you have huge amounts of text, the default ',... 'length of 3 might not suffice.'],... '',... 'Options --> Call LaPrint in verbose mode',... '',... ['This option can be switched on/off. When on, LaPrint issues ',... 'some messages and warns before overwriting files.'],... '',... 'Options --> Copy Figure and Modify that Copy',... '',... ['This option can be switched on/off. When on, LaPrint takes ',... 'a copy of the figure to be printed and places its tags into ',... 'that copy. When done, the copy is deleted. When off, the ',... 'figure is messed up by tags. It gets unusable, but you can see ',... 'what LaPrint is doing. Besides, there are bugs in the Matlab ',... '''copyobj'' command. If these show up, this option is useful.'],... '',... 'Options --> Matlab Print Command ...',... '',... ['This opens a window where you can enter the Matlab command to ',... 'save the graphics in an eps-file. You can modify the standard ',... 'print command to include or remove options (like ''-loose'') ',... 'or employ a different command (like exportfig). '],... '',... 'Options --> Matlab Graphics Package',... '',... 'You can chose between ''graphicx'' and ''epsfig''.',... '',... 'Options --> Use LaTeX ''color'' package',... '',... ['This option can be switched on/off. When on, LaPrint places ',... 'color commands into the tex file to optain colored text.'],... '',... 'Options --> View File ... --> Create a View File',... '',... ['This option can be switched on/off. When on, LaPrint creates ',... 'a third file (the view-file), which is a complete LaTeX ',... 'document showing the graphics. You can process this file ',... 'with your favourate LaTeX- and dvi-to-postscript compiler. ',... 'This is useful to have a quick look at the result and to ',... 'create a futher eps-file containing everything (see below). ',... 'The process of compiling the view-file can be automated using ',... 'the options described below.'],... '',... 'Options --> View File ... --> Name of the View File',... '',... ['This opens a window where you can enter the name of the ',... 'view-file to be created.'],... '',... 'Options --> View File ... --> Process the View File',... '',... ['This option can be switched on/off. When on, LaPrint ',... 'calls the LaTeX compiler and its friends to process the ',... 'view file. The names of the executables to be used and ',... 'their syntax can be set using the following option. '],... '',... ['Options --> View File ... --> Executables for processing ',... 'View File'],... '',... ['This opens a window where you can enter the names of up to 8 ',... 'system commands to process the view-file. If you have less than 8 ',... 'programs, you can leave the some of the fields empty. In all ',... 'commands, LaPrint internally replaces the tag '''' ',... 'by the basename of the viewfile and the tag by ',... 'the basename specified in the main LaPrint window. ',... 'In following example you have to add the paths, if the ',... 'commands are not in the system search path.'],... '',... 'To create and view a ps document:',... ' cmd1: latex .tex',... ' cmd2: dvips -o.ps .dvi',... ' cmd3: gsview32 .ps (ghostview for Unix)',... '',... '',... 'Preferences:',... '~~~~~~~~~~~~',... ['All options and settings of LaPrint can be ',... '(internally and externally) stored ',... 'in ''Preferences''. Suppose that you have changed, via ',... 'the ''Options'' menu bar entry, the settings of LaPrint. ',... 'You can make these settings to your preferred (default) ',... 'settings by chosing'],... '',... 'Preferences --> Set Preferences to Current Settings',... '',... ['This means that future sessions of LaPrint load these ',... 'settings on startup. You can also manually reload these ',... 'settings by chosing'],... '',... 'Preferences --> Get Preferences',... '',... ['LaPrint has built-in (factory default) preferences, ',... 'which you see when using ',... 'LaPrint the first time. You can restore these defaults ',... 'by chosing'],... '',... 'Preferences --> Get Factory Defaults',... '',... ['If you want your personal preferences be completely removed ',... '(switching back to factory defaults on startup), you should ',... 'chose'],... '',... 'Preferences --> Remove Preferences',... '',... ['If you have multiple projects running and want to use different ',... 'settings simultaneously, you can save/load preferences ',... 'to/from mat-files by chosing'],... '',... 'Preferences --> Save Current Settings to a File ',... 'Preferences --> Load Settings from a File ',... '',... 'These open a new window asking for the name of a .mat file.',... '',... 'Using LaPrint from the command line:',... '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',... ['When using LaPrint from the command line (or from an m-file), ',... 'the following syntax is required:'],... '',... ' laprint(figno,filename)',... ' laprint(figno,filename,opta,vala,optb,valb,..)',... '',... 'where',... ' figno : integer, figure to be printed',... ' filename : string (character array), basename of files',... ' to be created',... ' opta,vala,.. : option and value pairs, where opta is one',... ' of the following options and vala is',... ' the corresponding value.',... '',... ['When calling LaPrint from the command line without ',... 'option/value pairs, it uses the same '],... ['settings/options as the GUI on startup. This means that ',... 'it uses'],... ['-- the factory default settings (if you havn''t ',... 'stored your personal preferences using the GUI) or '],... '-- your personal preferences. ',... 'The factory default settings can be enforced by typing ',... ' laprint(figno,filename,''options'',''factory'')',... ['These settings can be overwritten by option/value pairs ',... 'as explained in the following table.'],... '',... 'option |class/val.| remark',... '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~',... '''width'' | | width of the figure in the LaTeX',... ' | | document (in cm).',... '''factor'' | | factor by which the figure in ',... ' | | the LaTeX document is smaller than ',... ' | | the figure in the postscript file.',... '''scalefonts'' |''on''/''off''| scales the fonts with the ',... ' | | figure (see option ''factor'').',... '''keepfontprops'' |''on''/''off''| translates MATLAB font',... ' | | properties (size, width, angle) into',... ' | | corresponding LaTeX font properties.',... '''asonscreen'' |''on''/''off''| prints ticks and lims ',... ' | | ''as on screen''.',... '''keepticklabels''|''on''/''off''| keeps the tick labels within',... ' | | the eps-file (not using LaTeX).',... '''mathticklabels''|''on''/''off''| tick labels are set in LaTeX',... ' | | math mode',... '''head'' |''on''/''off''| places a commenting header in ',... ' | | the tex-file.',... '''comment'' | | places the comment into',... ' | | the header of the tex-file.',... '''caption'' | | adds \caption{} and',... ' | | \label{fig:} to the',... ' | | tex-file.',... '''extrapicture'' |''on''/''off''| adds empty picture environments',... ' | | to the axes.',... '''nzeros'' | | uses replacement strings of',... ' | | length in the eps-file.',... '''verbose'' |''on''/''off''| verbose mode; asks before',... ' | | overwriting files and issues some ',... ' | | more messages.',... '''figcopy'' |''on''/''off''| directly modifies the original',... ' | | figure.',... '''printcmd'' | | uses '''' as Matlab print',... ' | | command.',... '''package'' | | uses the LaTeX graphics package',... ' | | ''''. Possible values are',... ' | | ''graphicx'' and ''epsfig''.',... '''color'' |''on''/''off''| uses colored fonts (using the',... ' | | LaTeX ''color'' package).',... '''createview'' |''on''/''off''| creates a view-file, which ',... ' | | calls the tex-file.',... '''viewfilename'' | | Basename of the view-file.',... '''processview'' |''on''/''off''| processes the view-file ',... ' | | by LaTeX and friends.',... '''cmd1'' | | 1st Command in the sequence of',... ' | | LaTeX and friends (enter an empty',... ' | | string to skip this command).',... '''cmd2'' | | 2nd LaTeX/friend Command ',... '''cmd3'' | | 3rd LaTeX/friend Command ',... '''cmd4'' | | 4th LaTeX/friend Command ',... '''cmd5'' | | 5th LaTeX/friend Command ',... '''cmd6'' | | 6th LaTeX/friend Command ',... '''cmd7'' | | 7th LaTeX/friend Command ',... '''cmd8'' | | 8th LaTeX/friend Command ',... '''options'' | | This option can be used to ',... ' | | employ project-dependent ',... ' | | preferences as follows:',... ' | | 1) Save your preferences to a file ',... ' | | using the GUI:',... ' | | Preferences --> ',... ' | | Save Current Settings to a file',... ' | | 2) Reload these preferences',... ' | | with laprint:',... ' | | >> laprint(1,''unnamed'',..',... ' | | ''options'',)',... ' | | where is the name of ',... ' | | the mat-file with preferences.',... '',... '',... ' ...................... ENJOY ! .......................',... '',... };