将参数扩展更改为 \includegraphics (\includegraphics{xyz.svg} → \includegraphics{xyz.pdf

将参数扩展更改为 \includegraphics (\includegraphics{xyz.svg} → \includegraphics{xyz.pdf

我正在尝试编写一个宏,它将文件名作为输入,更改其扩展名,并将其传递给\includegraphics

我见过\includegraphics,尝试另一个扩展,这给出了另一种解决方案,但我很好奇,想知道为什么我会得到结束符串名称参数编号我当前代码中的错误(另外,我认为该解决方案在 xelatex 中不起作用):

\documentclass{article}

\usepackage{graphicx}
\usepackage{xstring}

\usepackage{letltxmacro}
\LetLtxMacro{\IncludeGraphics}{\includegraphics}

\newcommand{\svgtopdf}[1]
  {\IfSubStr{#1}{.svg}{\StrSubstitute*{#1}{.svg}}{#1}}

\newcommand{\includegraphicsNaive}[2][]
  {\IncludeGraphics[#1]{\svgtopdf{#2}}}

\newcommand{\includegraphicsEdef}[2][]
  {\edef\pdfname{\svgtopdf{#2}}
   \IncludeGraphics[#1]{\pdfname}}

\newcommand{\includegraphicsNoExpand}[2][]
  {\edef\x{\noexpand\IncludeGraphics[#1]{\svgtopdf{#2}}}%
   \x{}}

\newcommand{\includegraphicsExpandafter}[2][]
  {\IncludeGraphics[#1]\expandafter{\svgtopdf{#2}}}

\begin{document}
\includegraphicsNaive{img.svg} % ERROR: Missing endcsname inserted.
\includegraphicsEdef{img.svg} % ERROR: Illegal parameter number in definition of \pdfname.
\includegraphicsNoExpand{img.svg} % ERROR: Illegal parameter number in definition of \x.
\includegraphicsExpandafter{img.svg} % ERROR: LaTeX Error: File `' not found.
\end{document}
  • 第一种方法比较幼稚,我思考它不起作用的原因是,graphicx 在内部构造了一个包含部分文件名参数(文件的扩展名)的命令,以便对每种文件类型使用不同的宏,并且似乎在执行此操作之前它不会扩展其参数。

  • 第二种方法可能由于相同的原因而失败(\pdfname未扩展),但我不确定为什么会出现不同的错误。

  • 我对第三个充满希望,但我不知道为什么它不起作用。

  • 我认为最后一个在它发挥魔力之前就会被expandafter消耗掉。includegraphics

什么才是正确的方法?

答案1

xstring在末尾有一个可选参数,用于将操作的结果存储在宏中,可在这种情况下使用。

此外,\StrSubstitute没有带星号的版本。此外,您应该提供三个参数:完整字符串、搜索字符串和替换字符串,而您的 MWE 只有完整字符串和搜索字符串。如果您愿意,可以将替换字符串留空(\StrSubstitute{#1}{.svg}{}[\tmpname])以尝试所有可用的扩展。

工作MWE:

\documentclass{article}

\usepackage{graphicx}
\usepackage{xstring}

\usepackage{letltxmacro}
\LetLtxMacro{\IncludeGraphics}{\includegraphics}

\newcommand{\svgtopdf}[1]
  {\IfSubStr{#1}{.svg}{\StrSubstitute{#1}{.svg}{.pdf}[\tmpname]}{\def\tmpname{#1}}}

\newcommand{\includegraphicsNaive}[2][]
  {\svgtopdf{#2}%
  \IncludeGraphics[#1]{\tmpname}}

\begin{document}
\includegraphicsNaive[width=3cm]{example-image.svg}
\includegraphicsNaive[width=3cm]{example-image-a.pdf}
\includegraphicsNaive[width=3cm]{example-image-b}
\end{document}

结果:

在此处输入图片描述

相关内容