我很难理解我应该如何处理我用以下方法计算的一些值FP将它们用作长度。显然,我必须为数字添加一个单位才能使用它,但尝试这样做时,我收到以下错误之一:
Missing number, treated as zero
或者
Illegal unit of measure (pt inserted)
以下是我想做的事情:
\makeatletter
\newcommand\stripPT[1]{\strip@pt#1}
\makeatother
\newcommand\addPT[1]{{#1}pt}
\newcommand{\setImageToGrid}[2]{%
\FPmul\xyz{12}{20}%
\FPdiv\xyz{\xyz{}}{\stripPT{\onelineskip}}%
\FPclip\xyz{\xyz}%
\begin{figure}[ht]
\noindent\includegraphics[width=\textwidth, trim={0 \addPT{\xyz} 0 \addPT{\xyz}},%
clip, height=\xyz]{#1}
\legend{#2}
\end{figure}
}
(计算没有意义,仅用于测试。)到目前为止,我发现的唯一解决方法是执行类似这样的操作\xyz\onelineskip
,当然我必须先除以\xyz
才能\onelineskip
获得正确的值。但一定有更干净的方法。我还尝试在使用该值之前将其保存为自定义长度,但随后我遇到了同样的问题。由于 LaTeX 中没有类型,我陷入了困境。
这是一个有效的例子:
\documentclass[a4paper,10pt,twoside]{memoir}
\usepackage{graphicx}
\usepackage{fp}
\usepackage{lipsum}
\makeatletter
\newcommand\stripPT[1]{\strip@pt#1}
\makeatother
\newcommand\addPT[1]{{#1}pt}
% Create and save the box.
\newsavebox{\Image}
\newlength{\imageh}
\newcommand{\setImageToGrid}[2]{
\FPmul\xyz{12}{20}
\FPdiv\xyz{\xyz{}}{\stripPT{\onelineskip}}
\FPclip\xyz{\xyz}
\begin{figure}[ht]
\noindent\includegraphics[width=\textwidth, trim={0 \addPT{\xyz} 0 \addPT{\xyz}},%
clip, height=\xyz]{#1}
\legend{#2}
\end{figure}
}
\begin{document}
\lipsum[2-6]
\newpage
\setImageToGrid{some.png}{Something}
\lipsum[2-4]
\end{document}
更新:我%
根据一些评论的建议在示例中添加了一些内容。
答案1
这是使用 expl3 的另一种方法(代码不是那么地道,但它能完成工作,而且您不必关心空格)。它只计算一次(因为您没有传递任何参数)。
\documentclass[a4paper,10pt,twoside]{memoir}
\usepackage{graphicx}
\usepackage{expl3}
\usepackage{lipsum}
\ExplSyntaxOn
\makeatletter
\edef\mycalcres{ \dim_eval:n { \fp_eval:n { floor((12*20)/\strip@pt\onelineskip) } pt } }
\makeatother
\ExplSyntaxOff
\newcommand{\setImageToGrid}[2]{
\begin{figure}[ht]
\includegraphics[width=\textwidth, trim={0 \mycalcres{} 0 \mycalcres},%
clip, height=\mycalcres]{#1}
\legend{#2}
\end{figure}
}
\begin{document}
\lipsum[2-6]
\newpage
\setImageToGrid{example-image-duck.pdf}{Something}
\lipsum[2-4]
\end{document}