Cambie la extensión del argumento a \includegraphics (\includegraphics{xyz.svg} → \includegraphics{xyz.pdf

Cambie la extensión del argumento a \includegraphics (\includegraphics{xyz.svg} → \includegraphics{xyz.pdf

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 ( \pdfnameno 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á expandafterconsumido includegraphicsantes de que pueda hacer su magia.

¿Cuál es la forma correcta?

Respuesta1

Las xstringmacros 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, \StrSubstituteno 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:

ingrese la descripción de la imagen aquí

información relacionada