在 LaTeX 中,如何才能将特殊字符{
和}
逐字逐句地写入外部文件,而不进行平衡?
显然下面的做法是行不通的:
\immediate\write\my@outfile{{}
\immediate\write\my@outfile{}}
答案1
编写平衡的括号不需要任何特殊要求,如以下交互式 TeX 会话的记录所示:
$ 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
{}
如果你想写不平衡的括号,你可以这样做
\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
即分别使用\wbgroup
和\wegroup
来书写开括号和闭括号。的内容temp.dat
将是
{
}
请注意,LaTeX 已经有和的等效物,称为和,\wbgroup
它们实际上扩展为类别代码 11 个字符。\wegroup
\@charlb
\@charrb
\wbgroup
和的替代定义\wegroup
扩展到类别代码 12 个字符
\begingroup\lccode`?=`\{ \lccode`!=`\}
\lowercase{\endgroup\def\wbgroup{?}\def\wegroup{!}}
或者
\edef\wbgroup{\iftrue\string{\else}\fi}
\edef\wegroup{\iffalse{\else\string}\fi}
答案2
为了编写不平衡的括号,您应该使用宏来将它们保存为逐字字符。写入文件时,这些将被扩展。LaTeX2e 定义了\@charlb
(左括号) 和\@charrb
(右括号),它们当然需要\makeatletter
..。您可以在或更好的\makeatother
中找到这些列表。source2e
macros2e
\immediate\write\my@outfile{\@charlb}
\immediate\write\my@outfile{\@charrb}
\Verbdef
您还可以使用我的newverbs
包(不要与包混淆\verbdef
)轻松定义您自己的宏verbdef
。以这种方式定义的宏可用于写入外部文件(与\verbdef
哪些宏可输入不同)。
\usepackage{newverbs}
\Verbdef\leftbrace|{|
\Verbdef\rightbrace|}|
% ...
\immediate\write\myoutfile{\leftbrace}
\immediate\write\myoutfile{\rightbrace}
答案3
取决于你想做什么,你可以尝试逃避它
\newwrite\temp
\immediate\openout\temp=temp.dat
\immediate\write\temp{\}}
\bye
这将写入文件\delimiter "5267309
中temp.dat
,或者您可以写入\string\}
,这将写入 \}
文件中。