我目前正在编写一个在 Linux 和 Windows 下编译的文档。由于我使用的图像之一是 tif 图像,因此我想让 lualatex 在运行时将其转换为它能理解的格式。
因此,我设法在 Linux 下使用
\DeclareGraphicsRule{.tif}{png}{.png}%
{%
`convert #1 `dirname #1`/`basename #1 .tif`-tif-converted-to.png %
}
\AppendGraphicsExtensions{.tif}
然而,由于dirname
和basename
命令(安装 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,则会自动加载它,并且
- LaTeX 正在运行(普通 TeX 用户请自行操作),
- 并且 shell 转义 (\write18) 已启用(可能受到限制),
- 并且 \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}
这样扩展就会被吞噬(以可扩展的方式)。