Short version:
I call texmex.mexw64 on a tex file, like this:
[dvi,loginfo,err] = texmex(tstr, texpath, 1, logical(0));
The string tstr is essentially the entire tex file. In it, I specify what packages to use and the path to them ('\usepackage{…}'). If that path is too deep, matlab crashes. Why, and is there a workaround (other than moving my files around, creating junctions, etc.)? [Actually, the problem appears to be the length of the pathname/filename, not the path depth; see update at bottom.]
Long version:
Matlab provides a mex file called texmex.mexw64 (in matlabroot/toolbox/matlab/graphics/private) for generating LaTeX (for plot titles, etc.); in particular, it generates dvi output from tex inputs. Normally, it's invoked by tex.m (one directory up), but I'd like to use packages that aren't included in tex.m. (In fact, I first generated this error when running a modified version of tex.m, but I can regenerate it more simply by invoking texmex directly from the command line.) The original c code that generated texmex.mexw64 isn't available, so I can't hunt down the bug any further.
Here's a minimal working/non-working example:
clear; clc; close all;% get access to private texmex files
%%%This is *not* the problem!
privateDir = [matlabroot,'\toolbox\matlab\graphics\private'];texmexPrvt = get_private_fcn(privateDir,'texmex');mlinitexPrvt = get_private_fcn(privateDir,'mlinitex');% set tex path
%%%This is also not the problem, just part of the MWE.
texpath{1} = fullfile(matlabroot,'sys','fonts','type1','cm',filesep);texpath{end+1} = fullfile(matlabroot,'sys','tex',filesep);texpath{end+1} = fullfile(matlabroot,'sys','tex','latex','base',filesep);texpath{end+1} = fullfile(matlabroot,'sys','tex','tfm',filesep);[c,maxsize,endian] = computer;if strncmp(endian,'B',1) texpath{end+1} =... fullfile(matlabroot,'sys','tex','format','bigendian',filesep);else texpath{end+1} =... fullfile(matlabroot,'sys','tex','format','smallendian',filesep);endsetappdata(0,'TeXPath',texpath);% test
%%%this version works
strint = '%&latex \nofiles \documentclass{mwarticle} ';strpkge = '\usepackage{C:/stys/two/three/four/five/six/foo} ';strbgn = '\begin{document}\setbox0=\hbox{$\foofoo$}';strend = '\copy0\special{bounds: \the\wd0 \the\ht0 \the\dp0} \end{document}';sstr = [strint,strpkge,strbgn,strend];[dvi,loginfo,err]=texmexPrvt(sstr, texpath, 1, logical(0));pause();%%%this version does not work
strpkge = '\usepackage{C:/stys/two/three/four/five/six/seven/foo} ';sstr = [strint,strpkge,strbgn,strend];[dvi,loginfo,err]=texmexPrvt(sstr, texpath, 1, logical(0));
The sty file foo.sty lives in both directories, C:/stys/two/three/four/five/six/ and C:/stys/two/three/four/five/six/seven, but somehow the latter is one too deep (apparently) for matlab to find it. (The style file itself is not the problem; it consists of a single macro, \newcommand{\foofoo}{\bf s}.) Running the last three lines above yields a segmentation violation. I doubt the register values at crash time or etc. will help. I also suspect that this directory issue is one of several in texmex. What I'd really like is to get the original c file, but short of that I'd like to know why this is happening and how to work around it. I don't want to move my style files around to different directories.
Thanks.
[UPDATE] In fact, it appears that the problem isn't the path depth, but the length of the pathname/filename. I don't want to keep crashing matlab to find out, but it looks like the limit is 32 characters.
Best Answer