The grffile package ∗
Heiko Oberdiek
†November 11, 2019
Abstract
The package extends the file name processing of packagegraphicsto sup- port a larger range of file names. For example, the file name may contain several dots. Or in case of pdfTEX in PDF mode the file name may contain spaces.
Contents
1 Usage 2
1.1 Optionmultidot . . . 2
1.2 Optionbabel . . . 2
1.3 Optionextendedchars . . . 3
1.4 Optionencoding . . . 3
1.4.1 Optioninputencoding. . . 3
1.4.2 Optionfilenameencoding . . . 3
1.4.3 Example. . . 3
1.5 Optionspace . . . 4
1.6 General use . . . 4
1.7 Default settings . . . 5
2 Implementation 5 2.1 New Package status. . . 5
2.2 Identification . . . 5
2.3 Catcode stuff . . . 5
2.4 Options . . . 6
2.5 Fix\Gin@iiof packagegraphicx . . . 14
3 Test 15 3.1 Multidot with default rule . . . 15
4 Installation 15 4.1 Download . . . 15
4.2 Bundle installation . . . 16
4.3 Package installation . . . 16
4.4 Refresh file name databases . . . 16
4.5 Some details for the interested . . . 16
5 Catalogue 17
∗The documentation here describes version 1.x, accessed via\usepackage{grffile}[=v1], the current version 2.0 does nothing as the current graphics package handles multiple dots, spaces and UTF-8 characters in filenames
†Please report any issues at https://github.com/ho-tex/grffile/issues
6 References 18
7 History 18
[2004/07/18 v0.5] . . . 18
[2006/08/15 v1.0] . . . 18
[2006/08/17 v1.1] . . . 18
[2006/11/30 v1.2] . . . 18
[2007/04/11 v1.3] . . . 18
[2007/06/13 v1.4] . . . 18
[2007/08/16 v1.5] . . . 18
[2007/11/11 v1.6] . . . 18
[2007/11/24 v1.7] . . . 19
[2008/08/11 v1.8] . . . 19
[2008/10/13 v1.9] . . . 19
[2009/09/25 v1.10] . . . 19
[2010/01/28 v1.11] . . . 19
[2010/08/26 v1.12] . . . 19
[2010/12/09 v1.13] . . . 19
[2011/10/04 v1.14] . . . 19
[2011/10/17 v1.15] . . . 19
[2012/04/05 v1.16] . . . 19
[2016/05/16 v1.17] . . . 19
[2017/06/30 v1.18] . . . 19
8 Index 20
1 Usage
1.1 Option multidot
The file name parsing of packagegraphicsis changed, in order to detect known ex- tensions. This allows both the use of dots inside the base file name and extensions with several dots.
Assume there are two files in the currect directory: Hello.World.eps and Hello.World.pdf. \includegraphics{Hello.World}will findHello.World.pdf with driverpdftexorHello.World.epswith driverdvips.
Limitations: Problem could occur on systems, which don’t use the dot as ex- tension delimiter. These systems needs an owntexsys.cfgcontaining definitions for\filename@parse. The author could not test that, due to a missing example.
1.2 Option babel
This option allows the use of shorthand characters of package babel inside the graphics file name. Additionally the tilde ‘˜’ is supported. The option is turned on as default. (In version v1.1 or below of this package, the features of this option were part of optionextendedchars.)
Example:
\usepackage[frenchb]{babel}
\usepackage{grffile}
Image: \includegraphics{C:/path/image}
1.3 Option extendedchars
If the input encoding is the same encoding as the encoding that is used for file names and the driver allows non-ascii characters. Without option extendedchars the 8-bit characters are expanded, if they are active characters. For example, see the LATEX packageinputenc. However a file name is not input for LATEX. Therefore this optionextendedchars removes the active status and the 8-bit characters are not expandable any more.
Example:
\usepackage[latin1]{inputenc}
\usepackage[extendedchars]{grffile}
\includegraphics{B¨ackerstraße}
If thedraftoption of the graphics package is enabled, the file name is printed with the current font encoding for \ttfamily. Thus it is possible, that such characters are omitted or the wrong characters are displayed, if the font encoding is not the same as the file name encoding.
1.4 Option encoding
Consider the following scenario. Your file system is using UTF-8 as encoding for file names. But you uselatin1as input encoding for your TEX files, because some packages are not ready for multi-byte encodings (listings, . . . ).
Then this option encoding loads support for converting encodings by loading packagestringenc. The option is not defined after the preamble, because LATEX limits package loading to the preamble.
File names are converted, if packagestringencis loaded and the encodings are known, see optionsinputencodingandfilenameencoding.
1.4.1 Option inputencoding
Optioninputencoding specifies the encoding of the file name in your TEX input file.
Packageinputenxand packageinputencsince version 2006/02/22 v1.1a remem- ber the name of the input encoding that is looked up by this package. Therefore optioninputencodingis usually not mandatory.
1.4.2 Option filenameencoding
This is the encoding of the filename of your file system. This option is mandatory, file names are not converted without this option. The option is disabled, if the value is empty.
1.4.3 Example
Back to the scenario where the file system uses UTF-8 and the LATEX input files are encodind in latin1.
\usepackage[latin1]{inputenc}[2006/02/22]
% \usepackage[latin1]{inputenx}
\usepackage{graphicx}
\usepackage[encoding,filenameencoding=utf8]{grffile}
For older versions of packageinputenc optioninputencodingprovides the nec- essary informations.
\usepackage[latin1]{inputenc}
\usepackage{graphicx}
\usepackage{grffile}
\grffilesetup{
encoding,
inputencoding=latin1, filenameencoding=utf8, }
1.5 Option space
This option allows graphics file names that contain spaces if possible.
In general it is not possible to use space inside file names, because TEX considers the space character as termination in its syntax for commands that expect a file name.
Regarding graphics inclusion with the package graphicsfile names are used in two or three contexts:
1. The basic\specialstatement or primitive command for graphics inclusion.
The\specialstatements for drivers dvips ordvipdfm do not allow spaces.
However pdfTEX’s primitive\pdfximageuses curly braces to delimit the file name and allows spaces. In case of X E TEX file names can be enclosed in quotes to support spaces (at the cost that quotes no longer work).
2. \includegraphicschecks the existence of the file. Also it looks for the right extension if the extension is not given.
If pdfTEX 1.30 is given, the file existence test can be rewritten using a new primitive that allows spaces. This works in both modes DVI and PDF.
In case of X E TEX the file existence test is rewritten to automatically add quotes.
3. Sometimes files are read as TEX input files. For example,.bbfiles or MPS files.
If pdfTEX 1.30 or greater is used in PDF mode then the graphics file names may contain spaces except for MPS files. Therefore option space is only enabled by default, if the supported pdfTEX in PDF mode is detected or X E TEX is running.
You can enable the option manually, if you know, your DVI driver supports spaces in its\specialsyntax and if there is no need to read the image file as TEX input file (third context).
1.6 General use
The options can be given at many places:
1. As package options:
\usepackage[<options>]{grffile}
2. Setup command of packagegrffile:
\grffilesetup{<options>}
3. The options are also available as options for packagegraphicx:
\setkeys{Gin}{<options>}
4. If package graphicx is loaded the options can also be applied for a single image:
\includegraphics[<options>]{...}
1.7 Default settings
multidot true
babel true
extendedchars false
space true if pdfTEX 1.30 or greater is used in PDF mode false otherwise
2 Implementation
2.1 New Package status.
Changes to the coregraphicscode have made the main features of this package (supporting multiple dots and spaces in filenames) unneeded as they are supported in the core code. The changes in the core also mean some patches in this package no longer work.
So by default this package does nothing but (especially if you have rolled back other aspects of the latex code) you may want the original version, which is available as
\usepackage{grffile}[=2017/06/30]
1h*newi
2\DeclareRelease{v1}{2017-06-30}{grffile-2017-06-30.sty}
3\DeclareCurrentRelease{}{2019-11-11}
4\ProvidesPackage{grffile}%
5 [2019/11/11 v2.1 Extended file name support for graphics (legacy)]%
6\PackageInfo{grffile}{This package is an empty stub for compatibility}
7\DeclareOption*{}
8\ProcessOptions
9\RequirePackage{graphicx}
10h/newi
2.2 Identification
11h*packagei
12\NeedsTeXFormat{LaTeX2e}
13\ProvidesPackage{grffile}%
14 [2017/06/30 v1.18 Extended file name support for graphics (HO)]%
2.3 Catcode stuff
15\edef\grffile@RestoreCatcodes{%
16 \catcode‘\noexpand\=\the\catcode‘\=\relax
17 \catcode‘\noexpand\:\the\catcode‘\:\relax
18 \catcode‘\noexpand\.\the\catcode‘\.\relax
19 \catcode‘\noexpand\’\the\catcode‘\’\relax
20 \catcode‘\noexpand\<\the\catcode‘\<\relax
21 \catcode‘\noexpand\>\the\catcode‘\>\relax
22 \catcode‘\noexpand\*\the\catcode‘\*\relax
23 \catcode‘\noexpand\^\the\catcode‘\^\relax
24 \catcode‘\noexpand\~\the\catcode‘\~\relax
25}
26\@makeother\=
27\@makeother\:
28\@makeother\.
29\@makeother\’
30\@makeother\<
31\@makeother\>
32\@makeother\*
33\catcode‘\^=7 %
34\catcode‘\~=\active
2.4 Options
35\RequirePackage{ifpdf}[2010/01/28]
36\RequirePackage{ifxetex}[2010/09/12]
37\RequirePackage{kvoptions}[2006/08/17]
38\SetupKeyvalOptions{%
39 family=Gin,%
40 prefix=grffile@%
41}
42\DeclareDefaultOption{\@unknownoptionerror}
43\DeclareBoolOption[true]{multidot}
44\DeclareBoolOption[true]{babel}
45\DeclareBoolOption[false]{extendedchars}
46\DeclareBoolOption{space}
47\DeclareVoidOption{encoding}{%
48 \RequirePackage{stringenc}\relax
49}
50\DeclareStringOption{inputencoding}
51\DeclareStringOption{filenameencoding}
52\DeclareDefaultOption{%
53 \PassOptionsToPackage\CurrentOption{graphics}%
54}
Default setting for optionspace.
55\RequirePackage{pdftexcmds}[2007/11/11]
56\ifxetex
57 \grffile@spacetrue
58\else
59 \begingroup\expandafter\expandafter\expandafter\endgroup
60 \expandafter\ifx\csname pdf@filesize\endcsname\relax
61 \grffile@spacefalse
62 \let\grffile@space@disabled\@empty
63 \def\grffile@spacetrue{%
64 \PackageWarning{grffile}{%
65 Option ‘space’ is not available,\MessageBreak
66 because it needs pdfTeX >= 1.30 or XeTeX%
67 }%
68 }%
69 \else
70 \ifpdf
71 \grffile@spacetrue
72 \else
73 \grffile@spacefalse
74 \fi
75 \fi
76\fi
77\ProcessKeyvalOptions*
78\AtBeginDocument{%
79 \DisableKeyvalOption[package=grffile]{Gin}{encoding}%
80}
81\RequirePackage{graphics}
\grffilesetup
82\newcommand*{\grffilesetup}{%
83 \setkeys{Gin}%
84}
\grffile@org@Ginclude@graphics
85\let\grffile@org@Ginclude@graphics\Ginclude@graphics
\Ginclude@graphics
86\renewcommand*{\Ginclude@graphics}{%
87 \ifx\grffile@filenameencoding\@empty
88 \else
89 \ifx\grffile@inputencoding\@empty
90 \expandafter\ifx\csname inputencodingname\endcsname\relax
91 \expandafter\ifx\csname
92 CurrentInputEncodingOption\endcsname\relax
93 \else
94 \let\grffile@inputencoding\CurrentInputEncodingOption
95 \fi
96 \else
97 \let\grffile@inputencoding\inputencodingname
98 \fi
99 \fi
100 \ifx\grffile@inputencoding\@empty
101 \else
102 \grffile@extendedcharstrue
103 \fi
104 \fi
105 \ifnum0\ifgrffile@babel 1\fi\ifgrffile@extendedchars 1\fi>\z@
106 \begingroup
Support of babel’s shorthand characters.
107 \ifgrffile@babel
108 \csname @safe@activestrue\endcsname Support of active tilde.
109 \edef~{\string~}%
Support of characters controlled by packageinputenc.
110 \fi
111 \ifgrffile@extendedchars
112 \grffile@inputenc@loop\^^A\^^H%
113 \grffile@inputenc@loop\^^K\^^K%
114 \grffile@inputenc@loop\^^N\^^_%
115 \grffile@inputenc@loop\^^?\^^ff%
116 \fi
117 \expandafter\grffile@extchar@Ginclude@graphics
118 \else
119 \expandafter\grffile@Ginclude@graphics
120 \fi
121}
\grffile@extchar@Ginclude@graphics
122\def\grffile@extchar@Ginclude@graphics#1{%
123 \toks@{#1}%
124 \edef\grffile@filename{\the\toks@}%
125 \ifx\grffile@inputencoding\@empty
126 \else
127 \ifx\grfile@filenameencoding\@empty
128 \else
129 \ifx\grffile@inputencoding\grffile@filenameencoding
130 \else
131 \expandafter\ifx\csname StringEncodingConvert\endcsname\relax
132 \PackageError{grffile}{%
133 Package ‘stringenc’ is not loaded,\MessageBreak
134 omitting file name conversion%
135 }\@ehc
136 \else
137 \StringEncodingConvert\grffile@temp\grffile@filename
138 \grffile@inputencoding\grffile@filenameencoding
139 \StringEncodingSuccessFailure{%
140 \let\grffile@filename\grffile@temp
141 }{%
142 \PackageError{grffile}{%
143 Filename conversion failed%
144 }\@ehc
145 }%
146 \fi
147 \fi
148 \fi
149 \fi
150% \toks@\expandafter{\grffile@filename}%
151 \edef\x{\endgroup
152% \noexpand\grffile@Ginclude@graphics{\the\toks@}%
153 \noexpand\grffile@Ginclude@graphics{\grffile@filename}%
154 }%
155 \x
156}
\grffile@inputenc@loop
157\def\grffile@inputenc@loop#1#2{%
158 \count@=‘#1\relax
159 \loop
160 \begingroup
161 \uccode‘\~=\count@
162 \uppercase{%
163 \endgroup
164 \edef~{\string~}%
165 }%
166 \ifnum\count@<‘#2\relax
167 \advance\count@\@ne
168 \repeat
169}
Support for optionspace
\grffile@space@getbase
170\def\grffile@space@getbase#1{%
171 \edef\grffile@tempa{%
172 \def\noexpand\@tempa####1#1\noexpand\@nil{%
173 \def\noexpand\Gin@base{####1}%
174 }%
175 }%
176 \grffile@IfFileExists{\filename@area\filename@base#1}{%
177 \grffile@tempa
178 \expandafter\@tempa\grffile@file@found\@nil
179 \edef\Gin@ext{#1}%
180 }{%
181 }%
182}
183\begingroup\expandafter\expandafter\expandafter\endgroup
184\expandafter\ifx\csname pdf@filesize\endcsname\relax
185 \ifxetex
\grffile@XeTeX@IfFileExists
186 \long\def\grffile@XeTeX@IfFileExists#1{%
187 \openin\@inputcheck"#1" %
188 \ifeof\@inputcheck
189 \closein\@inputcheck
190 \expandafter\@secondoftwo
191 \else
192 \closein\@inputcheck
193 \expandafter\@firstoftwo
194 \fi
195 }%
\grffile@IfFileExists
196 \long\def\grffile@IfFileExists#1{%
197 \grffile@XeTeX@IfFileExists{#1}{%
198 \edef\grffile@file@found{#1}%
199 \@firstoftwo
200 }{%
201 \let\reserved@a\@secondoftwo
202 \ifx\input@path\@undefined
203 \else
204 \expandafter\@tfor\expandafter\reserved@b\expandafter
205 :\expandafter=\input@path\do{%
206 \grffile@XeTeX@IfFileExists{\reserved@b#1}{%
207 \edef\grffile@file@found{\reserved@b#1}%
208 \let\reserved@a\@firstoftwo
209 \iftrue\@break@tfor\fi
210 }{}%
211 }%
212 \fi
213 \reserved@a
214 }%
215 }%
\grffile@org@Gread@QTm Patch\Gread@QTm of xetex.def.
216 \def\grffile@org@Gread@QTm#1{%
217 \IfFileExists{\[email protected]}{%
218 \Gread@eps{\[email protected]}%
219 }{%
220 \G@measure@QTm{\Gin@base}{\Gin@ext}%
221 }%
222 }%
223 \ifx\Gread@QTm\grffile@org@Gread@QTm
\Gread@QTm
224 \def\Gread@QTm#1{%
225 \grffile@IfFileExists{\[email protected]}{%
226 \Gread@eps{\[email protected]}%
227 }{%
228 \G@measure@QTm{\Gin@base}{\Gin@ext}%
229 }%
230 }%
231 \PackageInfo{grffile}{\string\Gread@QTm\space patched}%
232 \else
233 \begingroup\expandafter\expandafter\expandafter\endgroup
234 \expandafter\ifx\csname Gread@QTm\endcsname\relax
235 \@ifpackagelater{graphics}{2017/06/01}
236 {}
237 {%
238 \PackageWarning{grffile}{%
239 \string\Gread@QTm\space of xetex.def not found%
240 }%
241 }%
242 \else
\grffile@org@Gread@QTm
243 \let\grffile@org@Gread@QTm\Gread@QTm
\Gread@QTm
244 \def\Gread@QTm#1{%
245 \let\grffile@saved@IfFileExists\IfFileExists
246 \let\IfFileExists\grffile@IfFileExists
247 \grffile@org@GreadQTm{#1}%
248 \let\IfFileExists\grffile@saved@IfFileExists
249 }%
250 \fi
251 \fi
\grffile@org@Gread@eps
252 \let\grffile@org@Gread@eps\Gread@eps
253 \def\grffile@temp#1\immediate\openin#2 #3\grffile@nil#4\grffile@NIL{%
254 \begingroup
255 \toks@{#2}%
256 \edef\grffile@temp{\the\toks@}%
257 \def\grffile@test{\@inputcheck####1}%
258 \ifx\grffile@temp\grffile@test
259 \expandafter\@firstoftwo
260 \else
261 \expandafter\@secondoftwo
262 \fi
263 {%
264 \toks@{%
265 #1%
266 \immediate\openin\@inputcheck"##1"\relax
267 #3%
268 }%
269 \expandafter\endgroup
270 \expandafter\def\expandafter\Gread@eps
271 \expandafter##\expandafter1\expandafter{%
272 \the\toks@
273 }%
274 \PackageInfo{grffile}{%
275 \string\Gread@eps\space patched%
276 }%
277 }{%
278 \@ifpackagelater{graphics}{2017/06/01}
279 {}
280 {%
281 \PackageWarning{grffile}{%
282 Unsupported \string\Gread@eps\space not patched%
283 }%
284 }%
285 \endgroup
286 }%
287 }%
288 \expandafter\grffile@temp\Gread@eps{#1}\grffile@nil
289 \immediate\openin{} \grffile@nil\grffile@NIL
290 \else
291 \begingroup
292 \let\on@line\@empty
293 \PackageInfo{grffile}{%
294 \string\grffile@IfFileExists\space without space support,%
295 \MessageBreak
296 because pdfTeX’s \string\pdffilesize\space is not available%
297 \MessageBreak
298 or XeTeX is not running%
299 }%
300 \endgroup
\grffile@IfFileExists
301 \long\def\grffile@IfFileExists#1{%
302 \IfFileExists{#1}{%
303 \let\grffile@IFE@next\@firstoftwo
304 }{%
305 \let\grffile@file@found\@filef@und
306 \let\grffile@IFE@next\@secondoftwo
307 }%
308 \grffile@IFE@next
309 }%
310 \fi
311\else
\grffile@IfFileExists
312 \long\def\grffile@IfFileExists#1{%
313 \expandafter\expandafter\expandafter
314 \ifx\expandafter\expandafter\expandafter\\\pdf@filesize{#1}\\%
315 \let\reserved@a\@secondoftwo
316 \ifx\input@path\@undefined
317 \else
318 \expandafter\@tfor\expandafter\reserved@b\expandafter
319 :\expandafter=\input@path\do{%
320 \expandafter\expandafter\expandafter
321 \ifx\expandafter\expandafter\expandafter
322 \\\pdf@filesize{\reserved@b#1}\\%
323 \else
324 \edef\grffile@file@found{\reserved@b#1}%
325 \let\reserved@a\@firstoftwo
326 \@break@tfor
327 \fi
328 }%
329 \fi
330 \expandafter\reserved@a
331 \else
332 \edef\grffile@file@found{#1}%
333 \expandafter\@firstoftwo
334 \fi
335 }%
336\fi
\grffile@Ginclude@graphics
337\def\grffile@Ginclude@graphics#1{%
338 \begingroup
339 \ifgrffile@space
340 \let\Gin@getbase\grffile@space@getbase
341 \fi
342 \ifgrffile@multidot
343 \let\filename@base\@empty
344 \let\filename@simple\grffile@filename@simple
345 \fi
346 \grffile@org@Ginclude@graphics{#1}%
347 \endgroup
348}%
\grffile@filename@simple
349\def\grffile@filename@simple#1.#2\\{%
350 \ifx\\#2\\%
351 \def\filename@base{#1}%
352 \let\filename@ext\relax
353 \else
354 \def\filename@base{}%
355 \grffile@analyze@ext{#1}.{#2}\\%
356 \fi
357}
\grffile@analyze@ext
358\def\grffile@analyze@ext#1.#2\\{%
359 \let\grffile@next\relax
360 \ifx\\#2\\%
361 \edef\filename@base{\filename@base#1}%
362 \let\filename@ext\relax
363 \def\grffile@next{\grffile@try@extlist}%
364 \else
365 \edef\filename@base{\filename@base #1}%
366 \edef\filename@ext{\filename@dot#2\\}%
367 \expandafter\ifx\csname Gin@rule@.\filename@ext\endcsname\relax
368 \edef\filename@base{\filename@base.}%
369 \def\grffile@next{\grffile@analyze@ext#2\\}%
370 \else
371 \grffile@IfFileExists{\filename@area\filename@base.\filename@ext}{%
372 % success
373 }{%
374 \edef\filename@base{\filename@base.\filename@ext}%
375 \let\filename@ext\relax
376 \def\grffile@next{\grffile@try@extlist}%
377 }%
378 \fi
379 \fi
380 \grffile@next
381}
\grffile@try@extlist
382\def\grffile@try@extlist{%
383 \@for\grffile@temp:=\Gin@extensions\do{%
384 \grffile@IfFileExists{\filename@area\filename@base\grffile@temp}{%
385 \ifx\filename@ext\relax
386 \edef\filename@ext{\expandafter\@gobble\grffile@temp\@empty}%
387 \fi
388 }{}%
389 }%
390 \ifx\filename@ext\relax
391 \expandafter\let\expandafter\filename@base\expandafter\@empty
392 \expandafter\grffile@use@last@ext\filename@base.\\%
393 \fi
394}
\grffile@use@last@ext
395\def\grffile@use@last@ext#1.#2\\{%
396 \ifx\\#2\\%
397 \edef\filename@base{\expandafter\filename@dot\filename@base\\}%
398 \def\filename@ext{#1}%
399 \expandafter\@gobble
400 \else
401 \edef\filename@base{\filename@base#1.}%
402 \expandafter\@firstofone
403 \fi
404 {%
405 \grffile@use@last@ext#2\\%
406 }%
407}
Print current option setting
\grffile@option@status
408\def\grffile@option@status#1{%
409 \begingroup
410 \let\on@line\@empty
411 \PackageInfo{grffile}{%
412 Option ‘#1’ is %
413 \expandafter\ifx\csname ifgrffile@#1\expandafter\endcsname
414 \csname iftrue\endcsname
415 set to ‘true’%
416 \else
417 \expandafter\ifx\csname grffile@#1@disabled\endcsname\@empty
418 not available%
419 \else
420 set to ‘false’%
421 \fi
422 \fi
423 }%
424 \endgroup
425}
426\grffile@option@status{multidot}
427\grffile@option@status{extendedchars}
428\grffile@option@status{space}
2.5 Fix \Gin@ii of package graphicx
If the image file name contains the hash character macro \Gin@ii of package graphicxbreaks.
\grffile@Gin@ii@graphicx
429\def\grffile@Gin@ii@graphicx[#1]#2{%
430 \def\@tempa{[}%
431 \def\@tempb{#2}%
432 \ifx\@tempa\@tempb
433 \def\@tempa{\Gin@iii[#1][}% hash-ok
434 \expandafter\@tempa
435 \else
436 \begingroup
437 \@tempswafalse
438 \toks@{\Ginclude@graphics{#2}}%
439 \setkeys{Gin}{#1}%
440 \Gin@esetsize
441 \the\toks@
442 \endgroup
443 \fi
444}
\grffile@Gin@ii@fixed
445\def\grffile@Gin@ii@fixed[#1]#2{%
446 \def\@tempa{[}%
447 \begingroup
448 \toks@={#2}%
449 \edef\@tempb{\the\toks@}%
450 \expandafter\endgroup
451 \ifx\@tempa\@tempb
452 \def\@tempa{\Gin@iii[#1][}% hash-ok
453 \expandafter\@tempa
454 \else
455 \begingroup
456 \@tempswafalse
457 \toks@{\Ginclude@graphics{#2}}%
458 \setkeys{Gin}{#1}%
459 \Gin@esetsize
460 \the\toks@
461 \endgroup
462 \fi
463}
\grffile@Fix@Gin@ii
464\def\grffile@Fix@Gin@ii{%
465 \let\Gin@ii\grffile@Gin@ii@fixed
466 \begingroup
467 \escapechar=92 %
468 \PackageInfo{grffile}{\string\Gin@ii\space of package ‘graphicx’ fixed}%
469 \endgroup
470}
471\ifx\Gin@ii\grffile@Gin@ii@graphicx
472 \grffile@Fix@Gin@ii
473\else
474 \AtBeginDocument{\grffile@Fix@Gin@ii}%
475\fi
476\grffile@RestoreCatcodes
477h/packagei
3 Test
3.1 Multidot with default rule
478h*test1i
479\NeedsTeXFormat{LaTeX2e}
480\documentclass{article}
481\usepackage{filecontents}
482% file grffile-test.mp:
483% beginfig(1);
484% draw fullcircle scaled 2cm withpen pencircle scaled 2mm;
485% endfig;
486% end
487\begin{filecontents*}{grffile-test.1}
488%!PS
489%%BoundingBox: -32 -32 32 32
490%%Creator: MetaPost
491%%CreationDate: 2004.06.16:1257
492%%Pages: 1
493%%EndProlog
494%%Page: 1 1
495 0 5.66928 dtransform truncate idtransform setlinewidth pop [] 0 setdash
496 1 setlinejoin 10 setmiterlimit
497newpath 28.34645 0 moveto
49828.34645 7.51828 25.35938 14.72774 20.04356 20.04356 curveto
49914.72774 25.35938 7.51828 28.34645 0 28.34645 curveto
500-7.51828 28.34645 -14.72774 25.35938 -20.04356 20.04356 curveto
501-25.35938 14.72774 -28.34645 7.51828 -28.34645 0 curveto
502-28.34645 -7.51828 -25.35938 -14.72774 -20.04356 -20.04356 curveto
503-14.72774 -25.35938 -7.51828 -28.34645 0 -28.34645 curveto
5047.51828 -28.34645 14.72774 -25.35938 20.04356 -20.04356 curveto
50525.35938 -14.72774 28.34645 -7.51828 28.34645 0 curveto closepath stroke
506showpage
507%%EOF
508\end{filecontents*}
509\usepackage{graphicx}
510\usepackage[multidot]{grffile}[2008/10/13]
511\DeclareGraphicsRule{*}{mps}{*}{} % for pdflatex
512\begin{document}
513\includegraphics{grffile-test.1}
514\end{document}
515h/test1i
4 Installation
4.1 Download
Package. This package is available on CTAN1:
CTAN:macros/latex/contrib/grffile/grffile.dtx The source file.
CTAN:macros/latex/contrib/grffile/grffile.pdf Documentation.
1http://ctan.org/pkg/grffile
Bundle. All the packages of the bundle ‘oberdiek’ are also available in a TDS compliant ZIP archive. There the packages are already unpacked and the docu- mentation files are generated. The files and directories obey the TDS standard.
CTAN:install/macros/latex/contrib/grffile.tds.zip
TDS refers to the standard “A Directory Structure for TEX Files” (CTAN:tds/
tds.pdf). Directories with texmfin their name are usually organized this way.
4.2 Bundle installation
Unpacking. Unpack the oberdiek.tds.zip in the TDS tree (also known as texmftree) of your choice. Example (linux):
unzip oberdiek.tds.zip -d ~/texmf
Script installation. Check the directory TDS:scripts/oberdiek/ for scripts that need further installation steps. Packageattachfile2comes with the Perl script pdfatfi.plthat should be installed in such a way that it can be called aspdfatfi.
Example (linux):
chmod +x scripts/oberdiek/pdfatfi.pl
cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/
4.3 Package installation
Unpacking. The .dtx file is a self-extracting docstrip archive. The files are extracted by running the.dtxthrough plain TEX:
tex grffile.dtx
TDS. Now the different files must be moved into the different directories in your installation TDS tree (also known astexmftree):
grffile.sty →tex/latex/grffile/grffile.sty grffile.pdf →doc/latex/grffile/grffile.pdf
test/grffile-test1.tex→doc/latex/grffile/test/grffile-test1.tex grffile.dtx →source/latex/grffile/grffile.dtx
If you have adocstrip.cfgthat configures and enablesdocstrip’s TDS installing feature, then some files can already be in the right place, see the documentation of docstrip.
4.4 Refresh file name databases
If your TEX distribution (teTEX, mikTEX, . . . ) relies on file name databases, you must refresh these. For example, teTEX users runtexhashormktexlsr.
4.5 Some details for the interested
Attached source. The PDF documentation on CTAN also includes the .dtx source file. It can be extracted by AcrobatReader 6 or higher. Another option is pdftk, e.g. unpack the file into the current directory:
pdftk grffile.pdf unpack_files output .
Unpacking with LATEX. The.dtxchooses its action depending on the format:
plain TEX: Rundocstripand extract the files.
LATEX: Generate the documentation.
If you insist on using LATEX for docstrip (really, docstrip does not need LATEX), then inform the autodetect routine about your intention:
latex \let\install=y\input{grffile.dtx}
Do not forget to quote the argument according to the demands of your shell.
Generating the documentation. You can use both the.dtx or the .drv to generate the documentation. The process can be configured by the configuration fileltxdoc.cfg. For instance, put this line into this file, if you want to have A4 as paper format:
\PassOptionsToClass{a4paper}{article}
An example follows how to generate the documentation with pdfLATEX:
pdflatex grffile.dtx
makeindex -s gind.ist grffile.idx pdflatex grffile.dtx
makeindex -s gind.ist grffile.idx pdflatex grffile.dtx
5 Catalogue
The following XML file can be used as source for theTEX Catalogue. The elements caption and description are imported from the original XML file from the Catalogue. The name of the XML file in the Catalogue isgrffile.xml.
516h*cataloguei
517<?xml version=’1.0’ encoding=’us-ascii’?>
518<!DOCTYPE entry SYSTEM ’catalogue.dtd’>
519<entry datestamp=’$Date$’ modifier=’$Author$’ id=’grffile’>
520 <name>grffile</name>
521 <caption>Extended file name support for graphics.</caption>
522 <authorref id=’auth:oberdiek’/>
523 <copyright owner=’Heiko Oberdiek’ year=’2006-2012’/>
524 <license type=’lppl1.3’/>
525 <version number=’1.18’/>
526 <description>
527 The package extends the file name processing of package
528 <xref refid=’graphics’>graphics</xref> to support a larger range
529 of file names. For example, the file name may contain several dots.
530
531 Or in case of <xref refid=’pdftex’>pdfTeX</xref> in PDF mode the
532 file name may contain spaces.
533 <p/>
534 The package is part of the <xref refid=’oberdiek’>oberdiek</xref>
535 bundle.
536 </description>
537 <documentation details=’Package documentation’
538 href=’ctan:/macros/latex/contrib/grffile/grffile.pdf’/>
539 <ctan file=’true’ path=’/macros/latex/contrib/grffile/grffile.dtx’/>
540 <miktex location=’oberdiek’/>
541 <texlive location=’oberdiek’/>
542 <install path=’/macros/latex/contrib/grffile/grffile.tds.zip’/>
543</entry>
544h/cataloguei
6 References
[1] David Carlisle, Sebastian Rahtz: The graphics package; 2006/02/20 v1.0o;
CTAN:macros/latex/required/graphics/graphics.dtx.
[2] Sebastian Rahtz, Heiko Oberdiek: The graphicx package; 1999/02/16 v1.0f;
CTAN:macros/latex/required/graphics/graphicx.dtx.
7 History
[2004/07/18 v0.5]
• First version, published in newsgroupde.comp.text.tex:
“Re: Dateinamenproblem”2
[2006/08/15 v1.0]
• File existence check by new primitives of pdfTeX 1.30.
• Implementation partly rewritten.
• New DTX framework.
[2006/08/17 v1.1]
• Adaptation to version 2.3 of packagekvoptions.
[2006/11/30 v1.2]
• New optionbabel. Before this feature was part of optionextendedchars.
[2007/04/11 v1.3]
• Line ends sanitized.
[2007/06/13 v1.4]
• Encoding support added with optionsencoding,inputencoding, and filenameencoding.
[2007/08/16 v1.5]
• Bug fix in encoding support.
[2007/11/11 v1.6]
• Use of packagepdftexcmds for LuaTEX support.
2Url: http://groups.google.com/group/de.comp.text.tex/msg/b85984095d1a3c95
[2007/11/24 v1.7]
• Bug fix of broken previous version.
[2008/08/11 v1.8]
• Code is not changed.
• URLs updated.
[2008/10/13 v1.9]
• Fix for option ‘multidot’ with default rule.
[2009/09/25 v1.10]
• Rewrite of ‘multidot’ algorithm to fix a problem (‘multidot’ with
\graphicspath).
[2010/01/28 v1.11]
• Undefined\pdf@filesizefixed.
[2010/08/26 v1.12]
• Macro\Gin@iiof packagegraphicxfixed for the case that the file name contains a hash.
[2010/12/09 v1.13]
• Optionspacealso supports X E TEX.
[2011/10/04 v1.14]
• Fix for optionspacesupport of X E TEX for EPS files (\Gread@eps). (Bug reported by Peter Davis.)
[2011/10/17 v1.15]
• Bug fix for optionspacesupport of X E TEX. Wrong usage of\@break@tfor fixed. (Bug reported by Martin Schr¨oder.)
[2012/04/05 v1.16]
• Some fix for optionextendedchars.
[2016/05/16 v1.17]
• Documentation updates.
[2017/06/30 v1.18]
• Update to followgraphicschanges.
8 Index
Numbers written in italic refer to the page where the corresponding entry is de- scribed; numbers underlined refer to the code line of the definition; plain numbers refer to the code lines where the entry is used.
Symbols
\’ . . . 19,29
\* . . . 22,32
\. . . 18,28
\: . . . 17,27
\< . . . 20,30
\= . . . 16,26
\> . . . 21,31
\@break@tfor . . . 209,326
\@ehc . . . 135,144
\@empty . . . 62,87,89,100,125, 127, 292, 343, 386, 391, 410, 417
\@filef@und . . . 305
\@firstofone . . . 402
\@firstoftwo . . . . . 193,199,208,259,303,325,333
\@for . . . 383
\@gobble . . . 386,399
\@ifpackagelater . . . 235,278
\@inputcheck 187,188,189,192,257,266
\@makeother . . 26,27,28,29,30,31,32
\@ne . . . 167
\@nil . . . 172,178
\@secondoftwo . 190,201,261,306,315
\@tempa . . . 172,178,430, 432, 433, 434, 446, 451, 452, 453
\@tempb . . . 431,432,449,451
\@tempswafalse . . . 437,456
\@tfor . . . 204,318
\@undefined . . . 202,316
\@unknownoptionerror . . . 42
\\ 314,322,349,350,355,358,360, 366, 369, 392, 395, 396, 397, 405
\^ . . . 23,33,112,113,114,115
\~ . . . 24,34,161 A
\active . . . 34
\advance . . . 167
\AtBeginDocument . . . 78,474 B
\begin . . . 487,512 C
\catcode . . . 16, 17,18,19,20,21,22,23,24,33,34
\closein . . . 189,192
\count@ . . . 158,161,166,167
\csname . . . 60,90,91,108, 131, 184, 234, 367, 413, 414, 417
\CurrentInputEncodingOption . . . . 94
\CurrentOption . . . 53 D
\DeclareBoolOption . . . . 43,44,45,46
\DeclareCurrentRelease . . . 3
\DeclareDefaultOption . . . 42,52
\DeclareGraphicsRule . . . 511
\DeclareOption . . . 7
\DeclareRelease . . . 2
\DeclareStringOption . . . 50,51
\DeclareVoidOption . . . 47
\DisableKeyvalOption . . . 79
\do . . . 205,319,383
\documentclass . . . 480 E
\end . . . 508,514
\endcsname . . . 60,90,92,108, 131, 184, 234, 367, 413, 414, 417
\escapechar . . . 467 F
\filename@area . . . 176,371,384
\filename@base . . . 176, 343, 351, 354, 361, 365, 368, 371, 374, 384, 391, 392, 397, 401
\filename@dot . . . 366,397
\filename@ext . . 352,362,366,367, 371, 374, 375, 385, 386, 390, 398
\filename@simple . . . 344 G
\G@measure@QTm . . . 220,228
\Gin@base . . . . . 173,217,218,220,225,226,228
\Gin@esetsize . . . 440,459
\Gin@ext . . . 179,220,228
\Gin@extensions . . . 383
\Gin@getbase . . . 340
\Gin@ii . . . 465,468,471
\Gin@iii . . . 433,452
\Ginclude@graphics . . . 85,86,438,457
\Gread@eps . . . . . 218,226,252,270,275,282,288
\Gread@QTm 223,224,231,239,243,244
\grffile@analyze@ext . . . 355,358
\grffile@extchar@Ginclude@graphics . . . 117,122
\grffile@extendedcharstrue . . . 102
\grffile@file@found . . . . . . . 178,198,207,305,324,332
\grffile@filename . . . . . . . 124,137,140,150,153
\grffile@filename@simple . . . 344,349
\grffile@filenameencoding 87,129,138
\grffile@Fix@Gin@ii . . . 464,472,474
\grffile@Gin@ii@fixed . . . 445,465
\grffile@Gin@ii@graphicx . . . 429,471
\grffile@Ginclude@graphics . . . . . . . . 119,152,153,337
\grffile@IFE@next . . . . 303,306,308
\grffile@IfFileExists . . 176,196, 225, 246, 294, 301, 312, 371, 384
\grffile@inputenc@loop . . . . . . . 112,113,114,115,157
\grffile@inputencoding . . . . . . . . 89,94,97,100,125,129,138
\grffile@next . 359,363,369,376,380
\grffile@NIL . . . 253,289
\grffile@nil . . . 253,288,289
\grffile@option@status . . . . . . . 408,426,427,428
\grffile@org@Ginclude@graphics . . . . 85,346
\grffile@org@Gread@eps . . . 252
\grffile@org@Gread@QTm 216,223,243
\grffile@org@GreadQTm . . . 247
\grffile@RestoreCatcodes . . . . 15,476
\grffile@saved@IfFileExists 245,248
\grffile@space@disabled . . . 62
\grffile@space@getbase . . . . 170,340
\grffile@spacefalse . . . 61,73
\grffile@spacetrue . . . 57,63,71
\grffile@temp . . . 137,140, 253, 256, 258, 288, 383, 384, 386
\grffile@tempa . . . 171,177
\grffile@test . . . 257,258
\grffile@try@extlist . . 363,376,382
\grffile@use@last@ext . . . 392,395
\grffile@XeTeX@IfFileExists . . . . . . . 186,197,206
\grffilesetup . . . 82
\grfile@filenameencoding . . . 127 I
\ifeof . . . 188
\IfFileExists . 217,245,246,248,302
\ifgrffile@babel . . . 105,107
\ifgrffile@extendedchars . . . 105,111
\ifgrffile@multidot . . . 342
\ifgrffile@space . . . 339
\ifnum . . . 105,166
\ifpdf . . . 70
\iftrue . . . 209
\ifx . . . 60,87,89, 90,91,100,125,127,129,131, 184, 202, 223, 234, 258, 314, 316, 321, 350, 360, 367, 385, 390, 396, 413, 417, 432, 451, 471
\ifxetex . . . 56,185
\immediate . . . 253,266,289
\includegraphics . . . 513
\input@path . . . 202,205,316,319
\inputencodingname . . . 97 L
\loop . . . 159 M
\MessageBreak . . . 65,133,295,297 N
\NeedsTeXFormat . . . 12,479
\newcommand . . . 82 O
\on@line . . . 292,410
\openin . . . 187,253,266,289 P
\PackageError . . . 132,142
\PackageInfo . 6,231,274,293,411,468
\PackageWarning . . . 64,238,281
\PassOptionsToPackage . . . 53
\pdf@filesize . . . 314,322
\pdffilesize . . . 296
\ProcessKeyvalOptions . . . 77
\ProcessOptions . . . 8
\ProvidesPackage . . . 4,13 R
\renewcommand . . . 86
\repeat . . . 168
\RequirePackage 9,35,36,37,48,55,81
\reserved@a 201,208,213,315,325,330
\reserved@b 204,206,207,318,322,324 S
\setkeys . . . 83,439,458
\SetupKeyvalOptions . . . 38
\space 231,239,275,282,294,296,468
\StringEncodingConvert . . . 137
\StringEncodingSuccessFailure . . 139 T
\the . . 16,17,18,19,20,21,22,23, 24,124,152,256,272,441,449,460
\toks@ . . . 123, 124, 150, 152, 255, 256, 264, 272, 438, 441, 448, 449, 457, 460
U
\uccode . . . 161
\uppercase . . . 162
\usepackage . . . 481,509,510 X
\x . . . 151,155 Z
\z@ . . . 105