# Writing { and } to a file with LaTeX

How can the special characters { and } be written literally to an external file in LaTeX, without being balanced?

Obviously the following does not work:

 \immediate\write\my@outfile{{}
\immediate\write\my@outfile{}}

-

Writing balanced braces doesn't require anything special, as the following transcript of an interactive TeX session shows:

$tex This is TeX, Version 3.1415926 (TeX Live 2011) **\relax *\newwrite\mywr *\immediate\openout\mywr=temp.dat *\immediate\write\mywr{{}} *\bye No pages of output. Transcript written on texput.log.$ cat temp.dat
{}


If you want to write unbalanced braces you can do with

\begingroup
\catcode<=1 \catcode>=2
\catcode{=12 \catcode}=12
\gdef\wbgroup<{>
\gdef\wegroup<}>
\endgroup

\newwrite\mywr
\immediate\openout\mywr=temp.dat

\immediate\write\mywr{\wbgroup}
\immediate\write\mywr{\wegroup}

\bye


that is, using \wbgroup and \wegroup for writing open and close brace respectively. The contents of temp.dat will be

{
}


Notice that LaTeX already has equivalents of \wbgroup and \wegroup that are called \@charlb and \@charrb, which actually expand to category code 11 characters.

Alternative definitions for \wbgroup and \wegroup that expand to category code 12 characters are

\begingroup\lccode?=\{ \lccode!=\}
\lowercase{\endgroup\def\wbgroup{?}\def\wegroup{!}}


or

\edef\wbgroup{\iftrue\string{\else}\fi}
\edef\wegroup{\iffalse{\else\string}\fi}

-

In order to write unbalanced braces you should use macros which hold them as verbatim characters instead. These will be expanded when written to the file. LaTeX2e defines \@charlb (left brace) and \@charrb (right brace) which require \makeatletter .. \makeatother of course. You can find these listed in source2e or better macros2e.

\immediate\write\my@outfile{\@charlb}
\immediate\write\my@outfile{\@charrb}


You can also define you own macro easily with \Verbdef from my newverbs package (not to be confused with \verbdef from the verbdef package). Macros define this way are usable to be written to an external file (in contrast to \verbdef which macros them typsetable).

\usepackage{newverbs}
\Verbdef\leftbrace|{|
\Verbdef\rightbrace|}|
% ...

\immediate\write\myoutfile{\leftbrace}
\immediate\write\myoutfile{\rightbrace}

-

Depends what you want to do, you can try escaping it

\newwrite\temp
\immediate\openout\temp=temp.dat
\immediate\write\temp{\}}
\bye


This will write \delimiter "5267309 in the temp.dat file or you can write \string\}, which will write \} in the file.

-