独立包:Convert Option + KOMA Script 类

独立包:Convert Option + KOMA Script 类

我正在尝试standalone使用设置 KOMA 脚本文章类的选项来编译文档class=scrartcl。此外,我还使用自动convert生成.emf文件的选项:

\def\CONVERTCOMMAND{pdf2svg\space \infile\space \inname .svg%
\space &&%
\space inkscape\space -z%
\space -f\space \inname .svg%
\space --export-emf=\outfile%
\space && \space del\space \inname .svg %
}

\documentclass[11pt,
 class=scrartcl,
 convert={
    command={\noexpand\CONVERTCOMMAND},
    outext=.emf %damit Output erkannt wird
    }
]{standalone}

\begin{document}
test
\end{document}

使用 PDFLaTeX 编译时,此代码会抛出几个Undefined control sequence. \FamilyProcessOptions{KOMA}错误。不会生成任何输出文件。

如您所见,我使用了更复杂的转换命令,但是省略该class=scrartcl选项时文件编译时没有错误。

也可以设置class=scrartclconvert=true正常工作,生成 PDF 和 PNG 文件。

根据这些观察,我假设所选类和自定义转换命令之间存在冲突。您可以重现此错误吗?还是它只针对我的系统?是否有可能使这两个选项协同工作?

答案1

的全局选项\documentclass不仅由standalone所有类和包解释,而且由所有类和包解释。因此它们也可以扩展多次。只要类和包不处理键值选项​​,这不是一个大问题。但是 KOMA-Script 类和这些类加载的几个包确实处理此类选项。因此在这种情况下,\CONVERTCOMMAND至少有一个包会扩展,而\infile未定义。

为了避免这种情况,您可以使用\standaloneconfig添加convert选项。但这必须在转换完成时standalone.cfg或至少在转换完成之前完成。通常已经standalone.cfg加载了。但也许您不想更改它。以下解决方案用于在读取此配置文件后立即scrlfile添加\standaloneconfig命令。对于没有任何命令的情况,standalone.cfg它会创建一个。

\def\CONVERTCOMMAND{pdf2svg \infile\space \inname .svg
&&
inkscape -z -f \inname .svg --export-emf=\outfile\space
&& del \inname .svg || rm \inname .svg%
}
\RequirePackage{scrlfile}
% If there is already a `standalone.cfg` we add one command.
\AfterFile{standalone.cfg}{%
  \standaloneconfig{%
    convert={
      command={\CONVERTCOMMAND},
      outext=.emf %damit Output erkannt wird
    }
  }
}
% If their isn't any `standalone.cfg` we make a dummy one.
\IfFileExists{standalone.cfg}{}{% works also with package filecontents
\begin{filecontents*}{standalone.cfg}
\relax
\end{filecontents*}
}

\documentclass[11pt,
 class=scrartcl,
]{standalone}
\begin{document}
test
\end{document}

顺便说一句:我减少了不需要的\space命令的使用,并添加了在失败rm时删除 SVG 文件的功能del。因此,此版本可以在我的 Linux 机器上运行。

以下是该文件的快照log

\sa@box=\box29
runsystem(pdflatex  -shell-escape  -jobname 'test' '\expandafter\def\csname sa@
internal@run\endcsname{1}\input{test}')...executed.

\sa@read=\read1
runsystem(pdf2svg test.pdf test.svg && inkscape -z -f test.svg --export-emf=tes
t.emf && del test.svg || rm test.svg)...executed.

相关内容