![使用宏将图像路径传递给 \includegraphics](https://linux22.com/image/270943/%E4%BD%BF%E7%94%A8%E5%AE%8F%E5%B0%86%E5%9B%BE%E5%83%8F%E8%B7%AF%E5%BE%84%E4%BC%A0%E9%80%92%E7%BB%99%20%5Cincludegraphics.png)
我尝试使用单一环境来处理多种不同情况。对于每种情况,我需要环境具有与之关联的不同图像。
当我尝试这个时,我得到了
! 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}