I use MATLAB to build XRD analyzes where Miller indices are used to determine the directions of the crystallographic plane. These indices contain 3 or 4 numbers, and a negative value is displayed with a bar above this number.
In LaTeX it can be written with the command \([1\bar{1}1]\) or \([1\overline{1}1]\) .
To label the spectral lines of XRD standards, I use this command: Note that negative values ββare not taken into account.
std_text_hkl(j)=text(theta{i}(j)-r,0.1,['[' hkl{j} ']'],... % position and label of j-th line of i-th standard; hkl{j} holds Miller index in string format 'parent',ax_std(i),... % association with axes of i-th standard 'rotation',90,... 'fontsize',12,... 'fontname',Font); % Font holds global font setup
How can I automate the creation of a bar over a negative number without using the 'Interpreter','latex' property, since I would also like to change the 'FontName' property. In leat, I would like to avoid different fonts in labels and ticks.
EDIT:
Thanks to Muggle's comment, I got this idea:
- Save indexes as 3 columns of matrix
- separate label in 5 text fields
- if the Miller index negatively draws a line above it (top line of the text frame)
Actual code snippet:
rr=get(ax_std(i),'xlim'); % read x-axis limits of i-th standard r=(rr(2)-rr(1))/150; % x-offset of Miller indexes for j=1:size(dhkl,1) theta{i}(j)=asin(lambda/(2*dhkl(j,1)))*360/pi(); %calculating of lines %positions (Bragg law) line('parent',ax_std(i),... 'xdata',[theta{i}(j) theta{i}(j)],... 'ydata',[0 dhkl(j,2)],... % j-th line reflection intensity 'color',[colors(1+mod(i-1,size(colors,1)),1:3)],... 'linewidth',3) % Miller indexes if theta{i}(j)>rr(1)&&theta{i}(j)<rr(2) % test if line is inside axes std_text_lbrace(j)=text(theta{i}(j)-r,0.1,'[',... 'parent',ax_std(i),... 'verticalalignment','bottom',... 'horizontalalignment','left',... 'rotation',90,... 'fontsize',12,... 'fontname',Font); pos=get(std_text_lbrace(j),'position'); ext=get(std_text_lbrace(j),'extent'); std_text_h(j)=text(pos(1),pos(2)+ext(4)/1.5,int2str(abs(hkl(j,1))),... 'parent',ax_std(i),... 'verticalalignment','bottom',... 'horizontalalignment','left',... 'rotation',90,... 'fontsize',12,... 'fontname',Font); % write 1st Miller index pos=get(std_text_h(j),'position'); ext=get(std_text_h(j),'extent') if hkl(j,1)<0 % if negative, draw line over it wdth=get(ax0,'xlim'); wdth=wdth(2)-wdth(1); set(std_text_h(j),'color','b','edgecolor','g') line('parent',ax_std(i),... 'xdata',[pos(1)-wdth/280*ext(3),pos(1)-wdth/280*ext(3)],... 'ydata',[pos(2),pos(2)+ext(4)/wdth*100],... 'color','r') end end
I can not match the length of the string. For one digit, it is too long, for two digits it is suitable and for a larger (theoretically) it is too short. What am I doing wrong? How does MATLAB measure the 'extent' property of a rotated text property?