使用宏将图像路径传递给 \includegraphics

使用宏将图像路径传递给 \includegraphics

我尝试使用单一环境来处理多种不同情况。对于每种情况,我需要环境具有与之关联的不同图像。

当我尝试这个时,我得到了

! LaTeX Error: File `image1.png' not found.

一个例子说明了我正在尝试做的事情:

\documentclass{memoir}

\usepackage{graphicx}

\newcommand{\ImageOne}{image1.png}
\newcommand{\ImageTwo}{image2.png}
\newcommand{\currentimage}{}

\newcommand{\MyFigure}{%
\begin{figure}
\centering
\includegraphics[width=0.5\linewidth]{\currentimage}
\end{figure}}

\begin{document}

\renewcommand{\currentimage}{\ImageOne}
\MyFigure

\renewcommand{\currentimage}{\ImageTwo}
\MyFigure

\end{document}

答案1

显然,\includegraphics它的参数只进行了一步扩展,因此最终得到的\includegraphics[width=0.5\linewidth]{\ImageOne}并不是 TeX 所期望的。

使用\let而不是\renewcommand

\documentclass{memoir}

\usepackage{graphicx}

\newcommand{\ImageOne}{image1.png}
\newcommand{\ImageTwo}{image2.png}

\newcommand{\MyFigure}{%
  \begin{figure}
  \centering
  \includegraphics[width=0.5\linewidth]{\currentimage}
  \end{figure}}

\begin{document}

\let\currentimage\ImageOne
\MyFigure

\let\currentimage\ImageTwo
\MyFigure

\end{document}

然而,我不认为这是一个好办法。

答案2

在 LaTeX 中使用参数像在其他答案中那样自然得多,但是如果您想保留现有的界面,那么您需要在将其传递给之前扩展宏\includegraphics

\newcommand{\MyFigure}{%
\begin{figure}
\centering
\edef\tmp{\noexpand\includegraphics[width=0.5\linewidth]{\currentimage}}\tmp
\end{figure}}

答案3

简化版本并且可以运行。

\documentclass{memoir}

\usepackage{graphicx}

\newcommand{\ImageOne}{example-image-a}
\newcommand{\ImageTwo}{example-image-b}
\newcommand{\MyFigure}[1]{%
\begin{figure}
\centering
\includegraphics[width=0.5\linewidth]{#1}
\end{figure}}


\begin{document}

\MyFigure{\ImageOne}

\MyFigure{\ImageTwo}

\end{document}

相关内容