![将参数扩展更改为 \includegraphics (\includegraphics{xyz.svg} → \includegraphics{xyz.pdf](https://linux22.com/image/423596/%E5%B0%86%E5%8F%82%E6%95%B0%E6%89%A9%E5%B1%95%E6%9B%B4%E6%94%B9%E4%B8%BA%20%5Cincludegraphics%20(%5Cincludegraphics%7Bxyz.svg%7D%20%E2%86%92%20%5Cincludegraphics%7Bxyz.pdf.png)
我正在尝试编写一个宏,它将文件名作为输入,更改其扩展名,并将其传递给\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}
结果: