更新答案——独立

更新答案——独立

我正在使用 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}

假设不需要任何库,并且您没有指定宽度/高度作为命令,如所建议的matlab2tikzamsmath是需要的,因为matlab2tikz使用\textfrom 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')将只打印bsprintf('\\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

相关内容