在自定义命令中,我执行以下操作来写入文件:
\newcommand\mycommand[1]{
\newwrite\file
\immediate\openout\file=foobar.tex
\immediate\write\file{
foo
bar
#1
blarg
}
\immediate\closeout\file
}
当然,当我以 方式调用它时\mycommand{baz}
,我得到以下内容foobar.tex
:
foo bar baz blarg
所有新行都通过 变成空格LaTeX
。我的问题是,有没有办法将这些行“按预期”输出到文件中,即每行末尾都有真正的新行而不是空格?我想一些\catcode
魔法应该可以解决问题,但我不确定我需要重新定义哪个字符以及将其重新定义为哪个类别代码。
更新
解决方案cmhughes 的回答运行完美。唯一的问题是当包含嵌入的换行符时。我当然可以将其连同其自己的一系列一起#1
发送到,我想知道是否有办法避免这种情况。mycommand
^^J
答案1
我认为您遗漏了\newcommand
之前\mycommand
和[1]
之后的内容。
首先,至少应该
\newwrite\file
\newcommand\mycommand[1]{
\immediate\openout\file=foobar.tex
\immediate\write\file{
foo
bar
#1
blarg
}
\immediate\closeout\file
}
或者每次调用\mycommand
都会分配一个新的输出流。现在,让我们看看如何处理换行符。正如其他人所观察到的,在 LaTeX 中^^J
设置为\newlinechar
,所以我们可以使用它。但是,如果您希望 write 也尊重换行符,例如
\mycommand{a
b
c}
你必须更加努力。这里有一个可能性,通过改变类别代码^^M
:
%\newlinechar`^^J % LaTeX already does this
\newwrite\file
\def\mycommand{\begingroup\obeylines\mycommandaux}
\begingroup\obeylines
\gdef\mycommandaux#1{%
\obeylines%
\def^^M{^^J}%
\immediate\openout\file=foobar.tex%
\immediate\write\file{%
foo
bar
#1
blarg% <- no new line at the end
}%
\immediate\closeout\file%
\endgroup%
}
\endgroup
\mycommand{a
b
c}
以下是foobar.tex
foo
bar
a
b
c
blarg
有一个明显的限制:\mycommand
不能成为另一个命令的参数。
答案2
您可以^^J
按如下方式使用
\mycommand{%
\newwrite\file
\immediate\openout\file=foobar.tex
\immediate\write\file{%
foo^^J%
bar^^J%
#1^^J%
blarg^^J%
}%
\immediate\closeout\file%
}%