
Estoy intentando escribir una macro que toma un nombre de archivo como entrada, cambia su extensión y lo pasa a \includegraphics
.
He visto\includegraphics, prueba con otra extensión, que ofrece una solución alternativa, pero tengo curiosidad por entender por qué recibonombre finalynúmero de parámetroerrores en mi código actual (además, creo que esa solución no funciona en 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}
El primer enfoque fue el ingenuo, y yopensarLa razón por la que no funciona es que internamente Graphicx construye un comando que incluye parte del argumento del nombre del archivo (la extensión del archivo) para usar una macro diferente para cada tipo de archivo, y parece que no expande su argumento. antes de hacer eso.
El segundo enfoque probablemente falle por el mismo motivo (
\pdfname
no está ampliado), pero no estoy seguro de por qué aparece un error diferente.Tenía esperanzas sobre el tercero y no estoy seguro de por qué no funciona.
Creo que el último se habrá
expandafter
consumidoincludegraphics
antes de que pueda hacer su magia.
¿Cuál es la forma correcta?
Respuesta1
Las xstring
macros tienen un argumento opcional al final que sirve para almacenar el resultado de la operación en una macro, que se puede utilizar en este caso.
Además, \StrSubstitute
no tiene versión destacada. Además, se supone que debe proporcionar tres argumentos: la cadena completa, la cadena de búsqueda y la cadena de reemplazo, mientras que su MWE solo tiene la cadena completa y la cadena de búsqueda. Si lo desea, puede dejar la cadena de reemplazo vacía ( \StrSubstitute{#1}{.svg}{}[\tmpname]
) para probar todas las extensiones disponibles.
MWE en funcionamiento:
\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}
Resultado: