\openin
& \openout
¶Synopsis:
\openin number=filename
or:
\openout number=filename
Open a file for reading material, or for writing it. In most engines,
the number must be between 0 and 15, as in \openin3
; in
LuaLaTeX, number can be between 0 and 127.
Here TeX opens the file presidents.tex for reading.
\newread\presidentsfile \openin\presidentsfile=presidents \typeout{presidentsfile is \the\presidentsfile} \read\presidentsfile to\presidentline \typeout{\presidentline}
The \newread
command allocates input stream numbers from 0
to 15 (there is also a \newwrite
). The
\presidentsfile
is more memorable but under the hood it is still
a number; the first \typeout
gives something like
‘presidentsfile is 1’. In addition, \newread
keeps track of
the allocation so that if you use too many then you get an error like
‘! No room for a new \read’. The second \typeout
gives the
first line of the file, something like ‘1 Washington, George’.
Ordinarily TeX will not try to open the file until the next page
shipout. To change this, use
\immediate\openin number=filename
or
\immediate\openout number=filename
.
Close files with \closein number
and
\closeout number
.
How LaTeX handles filenames varies among distributions, and even can vary among versions of a distribution. If the file does not have an extension then TeX will add a .tex. This creates presidents.tex, writes one line to it, and closes it.
\newwrite\presidentsfile \openout\presidentsfile=presidents \write\presidentsfile{1 Washington, George} \closeout\presidentsfile
But filenames with a period can cause trouble: if TeX finds a filename of presidents.dat it could look first for presidents.dat.tex and later for presidents.dat, or it could do the opposite. Your distribution’s documentation should say more, and if you find something that works for you then you are good, but to ensure complete portability the best thing is to use file names containing only the twenty six ASCII letters (not case-sensitive) and the ten digits, along with underscore and dash, and in particular with no dot or space.
For \openin
, if TeX cannot find the file then it does not give
an error. It just considers that the stream is not open (test for this
with \ifeof
; one recourse is the command
\InputIfFileExists
, see Class and package commands). If you
try to use the same number twice, LaTeX won’t give you an error. If
you try to use a bad number then you get an error message like ‘!
Bad number (16). <to be read again> = l.30 \openin16=test.jh’.