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.

The syntax of TeX's \openout command is rather simple:

\openoutN=filename

where N is a four-bit number, but what is filename? How do you open a file whose name stars with a dot? More generally, how do you deal with a filename passed as a parameter which may include strange characters?


To make my difficulty concrete, here is a sequence of commands that:

  1. Will switch to a temporary directory
  2. Remove any remaining files from previous runs
  3. Create a demo tex file, named joseph.tex which tries to write to a file named wright, and then to a file named .joseph.
  4. Examine the result via ls
  5. Try to print out the resulting files

pushd /tmp; rm -f joseph* .joseph* wright*;cat<<EOF >joseph.tex
\newwrite\mywrite
\immediate\openout\mywrite=wright
\immediate\write\mywrite{Hello, World!}
\immediate\openout\mywrite=.joseph.tex
\immediate\write\mywrite{Hello, World!}
\bye
EOF
echo q | tex joseph.tex
ls -ls joseph* .joseph* wright*; cat wright.tex; popd

(copy/paste the above to your favorite command shell) My output is:

    This is TeX, Version 3.1415926 (TeX Live 2010)
    (./joseph.tex
    tex: Not writing to .joseph.tex (openout_any = p).

    ! I can't write on file `.joseph.tex'.
    l.4 \immediate\openout\mywrite=.joseph.tex

    (Press Enter to retry, or Control-D to exit; default file extension is `.tex')
    Please type another output file name:  )
    No pages of output.
    Transcript written on joseph.log.
    0 /tmp 12:12:05 $ ls -ls joseph* .joseph* wright*; cat wright.tex; popd
    /bin/ls: cannot access .joseph*: No such file or directory
    4 -rw-r--r-- 1 yogi yogi 449 2011-03-12 12:12 joseph.log
    4 -rw-r--r-- 1 yogi yogi 176 2011-03-12 12:12 joseph.tex
    4 -rw-r--r-- 1 yogi yogi  14 2011-03-12 12:12 wright.tex
    Hello, World!
    /tmp

which I interpret to be a failure to create file named .joseph, but success in creating the file named wright. I tried creating a file named ./joseph but this does not seem to work as well. I fear the worst when I will try to create a file in a directory, e.g., .joseph/wright.thanks

share|improve this question
add comment

2 Answers 2

up vote 6 down vote accepted

This is a security restriction which is enabled by default in TeX Live.

Quoting the default texmf.cnf:

% Allow TeX \openin, \openout, or \input on filenames starting with `.'
% (e.g., .rhosts) or outside the current tree (e.g., /etc/passwd)?
% a (any)        : any file can be opened.
% r (restricted) : disallow opening "dotfiles".
% p (paranoid)   : as `r' and disallow going to parent directories, and
%                  restrict absolute paths to be under $TEXMFOUTPUT.
openout_any = p
openin_any = a

Hence you need to set openout_any to a for your example to work. Note that you should refrain from changing this feature system-wide and instead use the openout_any environment variable:

> openout_any=a tex myfile.tex
share|improve this answer
1  
@Yossi: See also this answer to How can I safely compile other people's LaTeX documents?. –  Martin Scharrer Mar 12 '11 at 10:49
add comment

For me, a simple test file

\newwrite\mywrite
\openout\mywrite=.test
\immediate\write\mywrite{Hello world}
\bye

works entirely as expected. Apart from the restrict that UTF-8 characters might not work as expected with pdfTeX, I don't think TeX is too worried about the file name. Of course, spaces are a different matter!

share|improve this answer
    
Thanks Joseph for taking interest in this. I tried adding more detail to my question to show where I experience the difficulty. –  Yossi Gil Mar 12 '11 at 10:23
add comment

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.