【发布时间】:2014-01-20 16:01:34
【问题描述】:
给定一个 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。让我们提取一些:
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]。最后两个元素指定bounding box,前两个指定bounding box左下角到纸张左下角的距离。
现在,当我打印 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。
【问题讨论】:
-
之后裁剪 pdf 有什么问题?有一些工具 - pdfcrop 或 Briss。
-
有两个问题。 print 按照它的想法缩放模型,我找不到从中获取比例因子的方法。所以通过裁剪它没有完成。假设我希望 Simulink 模型中的 10pt 字体在我的文档后面的许多模型中看起来相同。我该怎么做呢?我正在编写一个工具供其他人使用。他们不想手工做东西,也不喜欢安装额外的软件,这是第二个问题。
标签: matlab pdf printing simulink