Write18
When write18 is turned on, it means that it's possible to execute external programs in the middle of a TeX run. This is required to make some modules such as those for R, lilypond, gnuplot, ... etc. to work properly, but may impose a security leak if you would be running TeX on a server with untrusted sources of TeX files, so it's turned off by default.
Contents
How to turn on write18
Windows - MikTeX
MikTeX 2.5/2.6
Each application now has its own configuration file. To enable write18
run
initexmf --edit-config-file=miktex\config\pdftex.ini
or (if you have MikTeX 2.5 or a version of ConTeXt from 2006)
initexmf --edit-config-file=miktex\config\pdfetex.ini
and put
EnableWrite18=t
into it. An alternative is to set the environment variable MIKTEX_ENABLEWRITE18=t
.
Windows/Linux/Mac - TexLive
TexLive 2008
Open the file 'path to TexLive'/texmf/web2c/texmf.cnf and search in the file for the following passage:
% Enable system commands via \write18{...}? Obviously insecure, despite % being so useful. shell_escape = f
change here the option from false to true so that the last line above looks like
shell_escape = t
After that you just have to recompile your formats. That is done by
texexec --make --all
or/and
texexec --make --all cont-xx
where xx stands for your needed countrycode. Additionally if you're using MK IV already you have to do the following steps afterwards to get a running environment:
luatools --generate context --make --all context --make --all cont-xx
after that write18 sould be enabled and you sould be able to use it.
Linux/Mac
First try to figure out where your configuration file resides:
kpsewhich texmf.cnf
will should return you something like
/usr/local/teTeX/texmf.cnf
or
/usr/local/gwTeX/texmf.cnf
In that file you'll probably find a line reading
shell_escape = f
Change that "f" (false) to "t" (true) to enable it.
How to check if write18 is turned on
Sometimes while writings a module, one needs to check if write18 is enabled or not. There are different ways in which this can be done.
- A new primitive in pdftex 1.30: {{cmd|pdfshellescape</cmd> is a read-only integer that is 1 if {{cmd|write18</cmd> is enabled, 0 otherwise.
- ConTeXt defines {{cmd|systemcommandmode</cmd> that is 2 if {{cmd|write18</cmd> is enabled, 1 otherwise.
- A primitive {{cmd|ifeof18</cmd> that is
true
if {{cmd|write18</cmd> is disabled,false
otherwise.
{{cmd|ifeof18</cmd> works with both pdfTeX and XeTeX, while {{cmd|pdfshellescape</cmd> only works with pdfTeX.
Hans response on the mailing list
write 18 is a hack and pdfshellescape a sane replacement
in luatex it will probably be gone completely since there we have
\directlua 0 { os.execute("...") }