给定一个 Simulink 框图(模型),我想生成一个“屏幕截图”,以便稍后在 LaTeX 文档中使用。我希望这个屏幕截图是带有紧密边框的 PDF(矢量图形,-> pdflatex),我的意思是图表周围没有不必要的空白。
我搜索了网络,搜索了 stackexchange,搜索了 matlab 文档。但到目前为止还没有成功。一些注意事项:
- 对于数字,这个问题是有答案的。我有一个 Simulink 框图,它是不同的(见下文)。
- 我知道使用其他软件的解决方案,例如
pdfcrop
.
- PDF似乎是唯一真正能生成矢量图形的驱动程序(此处为Win7上的R2013b)。 EPS 和 PS 输出似乎内部有位图。你放大,你就看到了。
我尝试过的:
1.
默认行为print
modelName = 'vdp'; % example system
load_system(modelName); % load in background
% print to file as pdf and as jpeg
print(['-s',modelName],'-dpdf','pdfOutput1')
print(['-s',modelName],'-djpeg','jpegOutput1')
JPEG 看起来不错,边界框很紧凑。 PDF 位于看起来像 A4 或 usletter 的页面的中心。不是我想要的。
2.
打印框图有几个参数。请参阅 Simulink 参考页http://www.mathworks.com/help/simulink/slref/model-parameters.html http://www.mathworks.com/help/simulink/slref/model-parameters.html。让我们摘录一些:
modelName = 'vdp'; % example system
load_system(modelName); % load in background
PaperPositionMode = get_param(modelName,'PaperPositionMode');
PaperUnits = get_param(modelName,'PaperUnits');
PaperPosition = get_param(modelName,'PaperPosition');
PaperSize = get_param(modelName,'PaperSize');
根据文档,PaperPosition
包含一个四元素向量[left, bottom, width, height]
。最后两个元素指定边界框,前两个元素指定边界框左下角与纸张左下角的距离。
现在,当我打印 PDF 输出并使用尺子测量时,我发现边界框的值及其左下角的位置完全错误(是的,我已经测量过PaperUnits
)。这真是太糟糕了。我可以计算出剪掉纸张的边距,以便稍后使用\includegraphics[clip=true,trim=...]{pdfpage}
.
3.
当然,我最初想要的是已经裁剪过的 PDF。对于图形有一个解决方案,它是这样的:将边界框移动到纸张的左下角,然后将纸张大小更改为边界框的大小。
oldPaperPosition = get_param(modelName,'PaperPosition');
set_param(modelName,'PaperPositionMode','manual');
set_param(modelName,'PaperPosition',[0 0 oldPaperPosition(3:4)]);
set_param(modelName,'PaperSize',oldPaperPosition(3:4));
对于 simulink 模型,存在两个问题。PaperSize
是模型的只读参数。并改变PaperPosition
对输出完全没有影响。
我真的没有主意了。
编辑 - - - - - - - - - - - - - - - - -
好吧,为了让您及时了解最新情况:我与 Matlab 支持人员讨论了此事。
- 在 R2013b 中,存在导致 PaperPositionMode 错误行为和 PaperPostion 边界框错误的错误。
- 没有已知的方法可以从打印中提取比例因子。
- 他们建议采用这种方式:Simulink --(print)--> SVG --(Inkscape)--> PDF。这种方式确实效果很好。 (正确的)边界框是 svg 节点的属性,导出到 SVG 时的比例因子始终相同。此外,Inkscape 还会生成已裁剪的 PDF。所以这个方法解决了我所有的问题,只是你需要Inkscape。