Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.
\documentclass[a4paper,10pt,twoside]{book}
\usepackage[demo]{graphicx}

\begin{document}

\newcommand{\scalefactor}{scale = 0.25}

\begin{figure}[!ht]
  \centering
  %Next line does not work
  \includegraphics[\scalefactor]{image}
  % The following line works
  %\includegraphics[scale = 0.25]{image}
\end{figure}

\end{document}

Output:

! Package keyval Error: scale = 0.25 undefined.

I need to scale a number of images by the same factor, hence the command.

  1. How to solve this and more importantly
  2. Why is this only specific to \includegraphics
share|improve this question
1  
You can see why it's a problem if you use \expandafter\includegraphics\expandafter[\scalefactor]{image} which is longer than the intented shortcut. –  percusse Feb 8 '13 at 12:31
2  
It's not specific only of \includegraphics but of most (if not all) arguments that consist of key=value options. –  egreg Feb 8 '13 at 12:35
    
@percuße I don't use this directly, it is nested in another macro, will using \expandafter hurt the general case? If not clear please let me know I will edit the question –  aiao Feb 8 '13 at 12:47
    
The problem here is that the key=value algorithm has to see the = to split both parts. If it is included in a macro it can see it and therefore the whole macro is incorrectly taken as one value-less key, which is of course not defined. –  Martin Scharrer Jun 25 '13 at 10:30

3 Answers 3

up vote 6 down vote accepted

Try this way:

\newcommand{\scalefactor}{.25}
\includegraphics[scale=\scalefactor]{image}
share|improve this answer
    
ooh I was just saying that your posted 10 seconds before my edit went on so + 1 :-) –  David Carlisle Feb 8 '13 at 12:52

If you use

\setkeys{Gin}{scale=0.25}

that key value will be in force by default until you change it, so there is no need to use a LaTeX command macro syntax here.

If your issue is that you want to set the value somewhere else you can go

\newcommand{\scalefactor}{0.25}
...
\includegraphics[scale = \scalefactor]{image}
share|improve this answer
    
As far as I understand this is global scaling factor. If this is the case, then this wont work for me because I scale only specific images –  aiao Feb 8 '13 at 12:40
    
well it's local to the current environment or group, or you can set it back to 1 explicitly, or if it really is only sporadic images what's wrong with [scale=.25] –  David Carlisle Feb 8 '13 at 12:47
    
aetting back to 1 is a good idea. They are sporadic, all images must be scaled by the same factor. I am currently adding images as I go. If I get Overfull then I step down the scaling a notch. –  aiao Feb 8 '13 at 12:50
    
@aiao scale is not the right key for solving the overfull line problems. Use width=\columnwidth or width=.9\textwidth (adjust the factor to suit). –  egreg Feb 8 '13 at 13:46
    
@egreg but that would mess up the scaling ratio across images, which is imporatant in my case –  aiao Feb 8 '13 at 13:50

Defining a private \includegraphics allows you to call macros as optional arguments:

\protected\def\newincludegraphics{\@testopt\new@includegraphics{}}
\def\new@includegraphics[#1]{%
  \begingroup
  \@protected@edef\x{\endgroup
    \noexpand\includegraphics
    \if\relax\detokenize{#1}\relax\else[#1]\fi
   }\x
}

\newincludegraphics[\scalefactor]{image}
share|improve this answer
    
but if you want to do this you should probably at least use \@protected@edef rather than \edef but even then it makes the argument a "moving argument" in which fragile commands will break. The keyval parser goes to a lot of effort to avoid that, and this disables all of that mechanism. –  David Carlisle Feb 8 '13 at 14:04
    
@DavidCarlisle: Thanks. Do you have examples of the possibly fragile arguments? I haven't come across them in \includegraphics. The values of keys or a file to be inserted? –  Ahmed Musa Feb 8 '13 at 17:08
    
well you can go width=\ifdim\Gin@nat@width>\textwidth \textwidth \else \Gin@nat@width\fi to set the size to be natural size or textwidth, but that relies on \ifdim not being expanded during the keyval parsing and as I say the parser is designed so that it works. –  David Carlisle Feb 8 '13 at 17:12
    
@DavidCarlisle: OK, thanks. I will leave the answer with \@protected@edef. Most likely the OP didn't intend to call fragile commands in the optional argument. –  Ahmed Musa Feb 8 '13 at 20:26
    
I am getting this error: ERROR: You can't use `\spacefactor' in vertical mode. Anybody has an idea? –  nrs Jul 5 at 18:37

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.