我使用matlab2tikz
导出我的 Matlab 图形,以便能够将它们包含在我的 LaTeX 文档中。我认为刻度标签、轴标签、标题和图例的字体太大。如何定义/更改\small
通过 导出的字体大小matlab2tikz
。我不想在 LaTeX 中的每个导出文件中手动更改它。
答案1
matlab2tikz
由于某种原因,似乎没有直接轴字体设置......
我发现了两种实现此目的的方法(同时也有一个错误matlab2tikz
):
优点
自动方式
这个似乎为字体支持提供了一个开始matlab2tikz
,但我可能错过了很多边缘情况,所以它远非稳定,但它确实有效:)
我将使用此代码进行测试:
x = 0:pi/100:2*pi;
y1 = sin(x);
y2 = sin(x-0.25);
y3 = sin(x-0.5);
figure
ax = axes;
plot(x,y1,x,y2,'--',x,y3,':')
ax.FontSize = 6;
ax.FontWeight = 'b';
xlabel('x')
ylabel('y')
matlab2tikz('test.tex','standalone',true)
左边的图片是matlab2tikz
可以的版本从 FileExchange 下载(修复位于本答案底部)。右边的图片是相同的代码,在我在此处建议的补丁之后:
显然字体是远的太小,但这是为了演示。
原始代码对轴标签应用了字体格式(请注意,两个版本中的x
和y
是相同的),但省略了轴刻度标签。
要使用此补丁:
将以下函数放在Matlab 可以找到的文件夹中的末尾matlab2Tikz
或单独文件中:getAxisFontProps.m
function [m2t, fopts] = getAxisFontProps(m2t, handle)
fopts = {'font' ''};
if strcmp(handle.FontWeight,'bold')
fopts{2} = [fopts{2} '\bfseries'];
end
if strcmp(handle.FontAngle,'italic')
fopts{2} = [fopts{2} '\itshape'];
end
switch handle.FontUnits
case {'points'}
mul = 1;
case {'inches'}
mul = 72.27;
case {'centimeters'}
mul = 28.45275590551181;
otherwise
error('matlab2tikz:getAxisFontProps','Unsupported axis units.')
end
fsize_str = sprintf('\\fontsize{%f}{%f}\\selectfont',...
get(gca,'FontSize')*[1 1.2]*mul);
fopts{2} = [fopts{2} fsize_str];
end
现在,转到第 ~ 行890
,matlab2tikz.m
您将在其中找到以下几行:
[m2t, xopts] = getAxisOptions(m2t, handle, 'x');
[m2t, yopts] = getAxisOptions(m2t, handle, 'y');
m2t.axes{end}.options = opts_merge(m2t.axes{end}.options, xopts, yopts);
将其更改为
[m2t, xopts] = getAxisOptions(m2t, handle, 'x');
[m2t, yopts] = getAxisOptions(m2t, handle, 'y');
[m2t, fopts] = getAxisFontProps(m2t, handle); % Call the getAxisFontProps to parse the properties
m2t.axes{end}.options = opts_merge(m2t.axes{end}.options, xopts, yopts, fopts);% Add these properties to the main option list
现在示例的代码应该生成右侧的图片(不要忘记应用此答案底部提出的修复方法)。
缺点
手动方式
一个更简单的版本,不需要弄乱代码,matlab2tikz
就是使用extraAxisOptions
密钥。
您将执行的操作与上面的补丁基本相同,但手动执行。您将传递键值对到matlab2tikz
:'extraAxisOptions','font=\\fontsize{%f}{%f}\\selectfont'
。您可以手动替换字体大小和基线跳过的值%f
。无需手动更改字体大小即可执行此操作的代码将从轴句柄中获取字体:
x = 0:pi/100:2*pi;
y1 = sin(x);
y2 = sin(x-0.25);
y3 = sin(x-0.5);
figure
ax = axes;
plot(x,y1,x,y2,'--',x,y3,':')
ax.FontSize = 6;
ax.FontWeight = 'b';
xlabel('x')
ylabel('y')
fsize_str = sprintf('font=\\fontsize{%f}{%f}\\selectfont',...
get(gca,'FontSize')*[1 1.2]);
matlab2tikz('test.tex','standalone',true, ...
'extraAxisOptions',fsize_str)
这两种方法都将传递font = \fontsize{<some amount>}{<another amount>}
到环境中。此外,您还可以使用密钥axis
传递任何其他选项。axis
'extraAxisOptions'
丑陋
显然是 Bug
看来,相当不幸的因素组合破坏了matlab2tikz
。代码:
x = 0:pi/100:2*pi;
y = sin(x);
figure
plot(x,y)
set(gca,'FontSize',12)
xlabel('x')
matlab2tikz('test.tex','standalone',true,'strictFontSize',true)
将生成一个.tex
包含以下行的文件:
xlabel style={font=\fontsize{1.320000e+01pt}{1em}\bfseries\color{white!15!black}\selectfont},
其中包含无效\fontsize{1.320000e+01pt}{1em}
指令,在 TeX 引擎中运行代码时将会中断。
解决此问题的一种方法是将函数第 164653
行从matlab2tikz
getFontStyle
fontStyle = sprintf('\\fontsize{%d%s}{1em}%s\\selectfont',fontSize,fontUnits,fontStyle);
到
fontStyle = sprintf('\\fontsize{%f%s}{1em}%s\\selectfont',fontSize,fontUnits,fontStyle);
(将格式描述符从 更改%d
为)。如果给定的数字不是整数,则%f
Matlab 会出于某些不为人知的原因将%d
描述符(对于整数)转换为(指数表示法)。%e
另一种选择是在 周围搭建一个 LaTeX FP 解析器%d
,但这可能有点过度,而且比 更容易崩溃%f
。