我正在使用 MATLAB 中的图形生成 TikZ 文件(使用来自堆栈交换的 MATLAB 函数)。然后我使用 TikzEdt 打开这些文件,并生成 PDF 文件。有没有办法让它自动生成 PDF 文件,也就是说,使用一些命令?
答案1
更新答案——独立
(注意:我还没有测试过这个更新部分的答案,以及这个standalone
选项。测试完之后我会删除这条消息。)
matlab2tikz
有一个选项standalone
可以使用 documentclass 生成完整的可编译文件standalone
。因此,通过执行
matlab2tikz('test.tikz','standalone',true)
生成的文件可以直接编译,因此可以在命令行上执行
pdflatex test.tikz
如果您想对.tikz
文件夹中的所有文件执行此操作,您可以循环遍历所有文件。这可以直接在 Matlab 中完成,也可以通过命令行完成。下面是 bash 的示例。但是,按图执行此操作可能更方便,因此您可以定义一个简单的 Matlab 函数来为您执行此操作。
通过 Matlab
功能
将以下内容保存为plotviatikztopdf.m
:
function plotviatikztopdf(filename,varargin)
% Generate a LaTeX file using matlab2tikz and compile
% this directly to PDF with pdflatex, cleaning up temporary
% files after compilation.
%
% PLOTVIATIKZTOPDF(FILENAME,VARARGIN)
% FILENAME is the name of the generated LaTeX file, with file ending,
% e.g. THING.TEX. VARARGIN is (optional) arguments to matlab2tikz,
% such as definitions of width and height.
% strip file ending
ind = find(filename=='.',1,'last');
basename = filename(1:ind-1);
% run matlab2tikz
matlab2tikz(filename,'standalone',true,varargin{:})
% run pdflatex on generated file
command = sprintf('pdflatex %s', filename);
system(command);
% remove .aux and .log files
if ispc
system(sprintf('del "%s.aux"',basename));
system(sprintf('del "%s.log"',basename));
elseif isunix
system(sprintf('rm %s.aux %s.log',basename,basename));
end
创建情节后,执行
plotviatikztopdf('mylovelyplot.tikz')
保存生成的文件.tikz
并将其转换为 PDF。您还可以指定宽度和高度(作为特定长度,而不是命令),例如
plotviatikztopdf('mylovelyplot.tikz','width','10cm','height','10cm')
文件夹中的所有文件
实际上,您可以在 Matlab 内部执行此操作,至少它对我的简单测试用例有效。我在 Linux 环境中对此进行了测试,如果 Matlab 在其他操作系统中处理方式不同,则可能无法正常工作。(这不是很好。)
cd /path/to/tikz/files
files = dir('*.tikz');
for k = 1:length(files)
ind = find(files(k).name=='.',1,'last');
basename = files(k).name(1:ind-1);
if ispc
command = sprintf('pdflatex %s', filename);
elseif isunix
command = sprintf('pdflatex %s', filename);
end
system(command);
end
终端
如果你使用的是 Linux(可能在 OS X 上也可以使用),你可以尝试以下 shell 脚本。它使用与上面相同的想法(假设你在正确的文件夹中):
for f in *.tikz
do
jn=$(basename $f .tikz)
pdflatex $f
rm $jn.aux $jn.log
done
将其另存为例如runtikz.sh
,使用使其可执行,然后在终端中chmod u+x runtikz.sh
运行它。./runtikz.sh
旧答案
我假设您使用matlab2tikz
来生成.tikz
文件。这将生成一个tikzpicture
环境axis
来自pgfplots
,因此编译它所需的最少 LaTeX 代码通常是
\documentclass{standalone}
\usepackage{pgfplots,amsmath}
\begin{document}
\input{file.tikz}
\end{document}
假设不需要任何库,并且您没有指定宽度/高度作为命令,如所建议的matlab2tikz
。amsmath
是需要的,因为matlab2tikz
使用\text
from amsmath
(或amstext
)作为轴标签。
pdflatex
现在,你可以直接在命令行上将代码作为参数写入,因此你可以执行
pdflatex -jobname test "\documentclass{standalone}\usepackage{pgfplots,amsmath}\begin{document}\input{test.tikz}\end{document}"
如果您想对.tikz
文件夹中的所有文件执行此操作,您可以循环遍历所有文件。这可以直接在 Matlab 中完成,也可以通过命令行完成。下面是 bash 的示例。但是,按图执行此操作可能更方便,因此您可以定义一个简单的 Matlab 函数来为您执行此操作。
通过 Matlab
功能
将以下内容保存为plotviatikztopdf.m
:
function plotviatikztopdf(filename,varargin)
matlab2tikz(filename,varargin{:})
ind = find(filename=='.',1,'last');
basename = filename(1:ind-1);
if ispc
command = sprintf('pdflatex -jobname %s "\\documentclass{standalone}\\usepackage{pgfplots,amsmath}\\begin{document}\\input{%s}\\end{document}"',basename,filename);
elseif isunix
command = sprintf('pdflatex -jobname %s "\\\\documentclass{standalone}\\\\usepackage{pgfplots,amsmath}\\\\begin{document}\\\\input{%s}\\\\end{document}"',basename,filename);
end
system(command);
if ispc
system(sprintf('del "%s.aux"',basename));
system(sprintf('del "%s.log"',basename));
elseif isunix
system(sprintf('rm %s.aux %s.log',basename,basename));
end
Windows 和 Linux 在命令行中处理反斜杠的方式有所不同,我猜是因为 Windows 使用反斜杠来分隔目录。当我在 Linux 中执行此操作时,我需要\\documentclass{standalone}...
通过 将字符串发送到终端system
,并且要在格式字符串中打印反斜杠,sprintf
您必须使用第二个反斜杠对其进行转义(sprintf('\ab')
将只打印b
,sprintf('\\ab')
将打印\ab
)。这就是上面看到的四个反斜杠的原因。然而,在 Windows 中,不需要以任何特殊方式处理命令中的反斜杠,因此字符串command
可以是\documentclass...
,所以您只需要两个反斜杠。
在上面的函数中,我添加了对操作系统的检查,并且它在我在 Windows 机器上进行的小测试中运行良好。
创建情节后,执行
plotviatikztopdf('mylovelyplot.tikz')
保存生成的文件.tikz
并将其转换为 PDF。您还可以指定宽度和高度(作为特定长度,而不是命令),例如
plotviatikztopdf('mylovelyplot.tikz','width','10cm','height','10cm')
文件夹中的所有文件
实际上,您可以在 Matlab 内部执行此操作,至少它对我的简单测试用例有效。我在 Linux 环境中对此进行了测试,如果 Matlab 在其他操作系统中处理方式不同,则可能无法正常工作。(这不是很好。)
cd /path/to/tikz/files
files = dir('*.tikz');
for k = 1:length(files)
ind = find(files(k).name=='.',1,'last');
basename = files(k).name(1:ind-1);
if ispc
command = sprintf('pdflatex -jobname %s "\\documentclass{standalone}\\usepackage{pgfplots,amsmath}\\begin{document}\\input{%s}\\end{document}"',basename,filename);
elseif isunix
command = sprintf('pdflatex -jobname %s \\\\documentclass{standalone}\\\\usepackage{pgfplots,amsmath}\\\\begin{document}\\\\input{%s}\\\\end{document}',basename,filename);
end
system(command);
end
终端
如果你使用的是 Linux(可能在 OS X 上也可以使用),你可以尝试以下 shell 脚本。它使用与上面相同的想法(假设你在正确的文件夹中):
for f in *.tikz
do
jn=$(basename $f .tikz)
pdflatex -jobname $jn "\documentclass{standalone}\usepackage{pgfplots,amsmath}\begin{document}\input{$f}\end{document}"
rm $jn.aux $jn.log
done
将其另存为例如runtikz.sh
,使用使其可执行,然后在终端中chmod u+x runtikz.sh
运行它。./runtikz.sh