
Ich versuche, ein Makro zu schreiben, das einen Dateinamen als Eingabe verwendet, seine Erweiterung ändert und diese an übergibt \includegraphics
.
Ich habe gesehen\includegraphics, versuche eine andere Erweiterung, was eine alternative Lösung bietet, aber ich bin neugierig zu verstehen, warum ich bekommeEndcsnameUndParameternummerFehler in meinem aktuellen Code (außerdem funktioniert diese Lösung, glaube ich, nicht in 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}
Der erste Ansatz war naiv, und ichdenkender Grund, warum es nicht funktioniert, liegt darin, dass graphicx intern einen Befehl erstellt, der einen Teil des Dateinamenarguments (die Dateierweiterung) enthält, um für jeden Dateityp ein anderes Makro zu verwenden, und es scheint, dass es sein Argument nicht erweitert, bevor es das tut.
Der zweite Ansatz schlägt wahrscheinlich aus demselben Grund fehl (
\pdfname
wird nicht erweitert), aber ich bin nicht sicher, warum ich einen anderen Fehler erhalte.Beim dritten hatte ich große Hoffnungen, aber ich bin nicht sicher, warum es nicht funktioniert.
Ich glaube, das Letzte wird
expandafter
bereits verbraucht seinincludegraphics
, bevor es seine Magie entfalten kann.
Was ist der richtige Weg?
Antwort1
Die xstring
Makros haben am Ende ein optionales Argument, das dazu dient, das Ergebnis der Operation in einem Makro zu speichern, das in diesem Fall verwendet werden kann.
Außerdem \StrSubstitute
gibt es keine Version mit Sternchen. Außerdem müssen Sie drei Argumente angeben: die vollständige Zeichenfolge, die Suchzeichenfolge und die Ersetzungszeichenfolge, während Ihr MWE nur die vollständige Zeichenfolge und die Suchzeichenfolge hat. Wenn Sie möchten, können Sie die Ersetzungszeichenfolge leer lassen ( \StrSubstitute{#1}{.svg}{}[\tmpname]
), um alle verfügbaren Erweiterungen auszuprobieren.
Arbeiten 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}
Ergebnis: