我试图根据两个变量\IApaperheight
和包含正确大小的背景图像\IApaperwidth
。
为此,我将长度转换为四舍五入的文本值,并将它们与另一个变量中的前缀连接起来。
我可以正确地呈现完整路径,但是当我尝试将它传递给\includegraphics
它时,它会抱怨,因为(据我所知)路径不是一个字符串,而是一堆宏。
有什么方法可以“字符串化”路径名,以便我可以将其用作文字?
我使用它将长度转换为四舍五入的整数:
% \IArndmm{\length} returns the length in mm rounded to an integer
\makeatletter%
\def\l@nunitperpt{0.351459}\def\l@nunits{mm}%
\def\@round#1.#2\@empty{#1}%
\newcommand{\IArndmm}[1]{%
\setlength{\@tempdimc}{\l@nunitperpt #1}%
\addtolength{\@tempdimc}{0.5pt}%
\edef\@@round{\strip@pt\@tempdimc}%
\expandafter\@round\@@round.\@empty%
}%
\makeatother%
%
然后包含图像:
\newcommand{\IABGImageName}[3]{#1/#2x#3.jpg}%
%
\includegraphics[
width=\IApaperwidth,height=\IApaperheight,keepaspectratio]{%
\IABGImageName{\IABGImage}%
{\IArndmm{\IApaperwidth}}%
{\IArndmm{\IApaperheight}}%
}}%
答案1
如果您使用此类宏,那么它们必须完全可扩展,即,它们本身只能扩展为字符串。但是,作业是不可扩展的。e-TeX 在此提供帮助,\dimexpr
它可用于构建可以包含加法的维度表达式。此原语读取以下文本,直到出现无效维度(如算术符号等)。您也可以使用终止它,然后会自动删除它。如果在前面\relax
放置一个,您将像往常一样获得维度字符串。您也可以在内部使用参数,这样它就不必是长度寄存器。请注意,还有整数表达式。有关详细信息,请参阅手册。\the
\dimexpr
\dimexpr
\numexpr
etex
\documentclass{article}
\usepackage{graphicx}
% \IArndmm{\length} returns the length in mm rounded to an integer
\makeatletter%
\def\l@nunitperpt{0.351459}\def\l@nunits{mm}%
\def\@round#1.#2\@empty{#1}%
\newcommand{\IArndmm}[1]{%
\expandafter\@round
\the\dimexpr\l@nunitperpt\dimexpr#1\relax + 0.5pt\relax\@empty
}%
\makeatother%
\begin{document}
\newcommand{\IABGImageName}[3]{#1/#2x#3.jpg}%
% Dummy values
\newcommand{\IABGImage}{someimage}
\let\IApaperheight\paperheight
\let\IApaperwidth\paperwidth
\includegraphics[
width=\IApaperwidth,height=\IApaperheight,keepaspectratio]{%
\IABGImageName{\IABGImage}%
{\IArndmm{\IApaperwidth}}%
{\IArndmm{\IApaperheight}}%
}%
\end{document}
另一种方法是先处理输入,然后将其写入可扩展的宏,如下所示:
\ProcessIAImageName{...}% saves name in \IAimage
\includegraphics[
width=\IApaperwidth,height=\IApaperheight,keepaspectratio]{%
\IAimage
}%