使用 shell 命令在 \DeclareGraphicsRule 语句中使用宏

使用 shell 命令在 \DeclareGraphicsRule 语句中使用宏

我目前正在编写一个在 Linux 和 Windows 下编译的文档。由于我使用的图像之一是 tif 图像,因此我想让 lualatex 在运行时将其转换为它能理解的格式。

因此,我设法在 Linux 下使用

\DeclareGraphicsRule{.tif}{png}{.png}%
{%
  `convert #1 `dirname #1`/`basename #1 .tif`-tif-converted-to.png %
}
\AppendGraphicsExtensions{.tif}

然而,由于dirnamebasename命令(安装 ImageMagick 后可用convert),这无法移植到 Windows。

因此,我想使用 latex 的文件解析来执行此操作,但我找不到解决方法。我目前尝试使用的代码是:

\makeatletter
\newrobustcmd*\dirname[1]{\filename@parse{#1}\filename@area}%
\newrobustcmd*\basename[1]{\filename@parse{#1}\filename@base}%
\DeclareGraphicsRule{.tif}{png}{.png}%
{%
  `convert #1 \dirname{#1}/\basename{#1}-tif-converted-to.png %
}%
\makeatother
\AppendGraphicsExtensions{.tif}

然而,\DeclareGraphicsRule似乎只是忽略了我在命令中使用的宏。

我的问题是:

  • 我究竟做错了什么 ?
  • 有办法解决这个问题吗?

编辑 :稍微改变工作命令

答案1

通过 shell escape 进行的转换由包添加epstopdf。在 TeX Live 中,如果在 PDF 模式下检测到 pdfTeX/LuaTeX,则会自动加载它,并且

  1. LaTeX 正在运行(普通 TeX 用户请自行操作),
  2. 并且 shell 转义 (\write18) 已启用(可能受到限制),
  3. 并且 \DoNotLoadEpstopdf 不存在或者不是 \relax。

为了方便起见,该包epstopdf提供了一个宏来定义带有转换程序的图形规则(1.5.3 转换程序):

\epstopdfDeclareGraphicsRule{.tif}{png}{.png}{%
  convert #1 \OutputFile         
}

\DeclareGraphicsRule也可以使用反引号表示法:

\DeclareGraphicsRule{.tif}{png}{.png}{%
  \noexpand\epstopdfcall{convert #1 \noexpand\OutputFile}%
}
  • \noexpand是需要的,因为\DeclareGraphicsRule扩展了论点。
  • \epstopdfcall处理类似的包pst2pdf

输出文件的名称\OutputFile由选项控制。自 2009/07/12 v2.0 版本起,选项的默认suffix值为

suffix=-\SourceExt-converted-to

后缀插入在基本名称和新文件扩展名之后。 foo.tif变为foo-tif-converted-to.png

答案2

\newrobustcmd用(from )定义的宏etoolbox不是在操作中扩展\write。但是\filename@parse依赖于未在这些操作中执行的分配。

我建议定义

\def\eattif#1.tif{#1}
\DeclareGraphicsRule{.tif}{png}{.png}{`convert #1 \eattif#1-tif-converted-to.png }
\AppendGraphicsExtensions{.tif}

这样扩展就会被吞噬(以可扩展的方式)。

相关内容