假设我有一个作者和一个环境(实际上是一个环境),定义为
\documentclass{article}
\usepackage{environ} % www.ctan.org/pkg/environ
\newwrite\mywriter
\NewEnviron{writethis}
{\immediate\write\mywriter{\BODY}}
\begin{document}
\immediate\openout\mywriter=writehere.txt
...
\immediate\closeout\mywriter
\input{writehere.txt}
\begin{document}
我想要做的是将writethis
环境中的所有内容writehere.txt
复制到稍后的文档中。
当我想写反斜杠时,就会出现问题。不仅仅是\textbackslash
或$\backslash$
(在数学模式下),而且可以用来编写诸如 in 之类的命令\textbf{abc}
。(编译器拒绝写入\
via \textbackslash
。)
我知道解决办法
\makeatletter
\begin{writethis}\@backslashchar textbf{abc}\end{writethis}
\makeatother
\makeatletter...\makeatother
但每次我需要时都要写,这真的很乏味\
。我有点天真地尝试定义一个命令来替代上面的命令:
\newcommand\back
{\makeatletter\@backslashchar\makeatother}
为了简单起见
\begin{writethis}\back textbf{abc}\end{writethis}
但编译器拒绝了。(它说Improper alphabetic constant. \spacefactor
,我不知道为什么\spacefactor
会弹出这个。)
我的问题是:
有没有办法将 写入
\
文件,并且比 更短\makeatletter\@backslashchar\makeatother
?
这可能与这问题(也许是重复的?)。我读过它,但不明白如何使用 Philippe Goutet 的解决方案。
答案1
你想要一个“几乎逐字逐句”的写法:
\documentclass{article}
\usepackage{environ} % www.ctan.org/pkg/environ
\newwrite\mywriter
\NewEnviron{writethis}
{\immediate\write\mywriter{\unexpanded\expandafter{\BODY}}}
\begin{document}
\immediate\openout\mywriter=\jobname-later.tex
\begin{writethis}\textbf{abc}\end{writethis}
\immediate\closeout\mywriter
Something
\input{\jobname-later}
\end{document}
以下是内容\jobname-later
(我使用\jobname
它来避免破坏我的文件,您可以使用任何您喜欢的名称):
\textbf {abc}
输入时空格将被忽略。
如果要在环境内容前后添加固定文本,请执行以下操作
\NewEnviron{writethis}{%
\immediate\write\mywriter{%
\unexpanded{<before>}%
\unexpanded\expandafter{\BODY}}%
\unexpanded{<after>}%
}%
}
其中<before>
和<after>
代表任意 TeX 代码。不总体而言,他们需要\expandafter
在中期实现扩张\BODY
。
答案2
你已经给了 egreg 简单的部分勾选-) 所以我会回答
我不知道为什么
\spacefactor
会弹出这个。)
你有
\newcommand\back
{\makeatletter\@backslashchar\makeatother}
\makeatletter
改变 catcode@
使其成为字母,但 catcodes 会影响输入的转换人物到代币. 它们对已经读取的标记没有影响。
此时,参数\newcommand
已被读取并存储,使用有效的 catcodes,因此定义是(每行显示一个标记)
\makeatletter
\@
b%
a%
a%
c%
k%
s%
l%
a%
s%
h%
c%
h%
a%
r%
\makeatother
因此,\back
使用时\makeatletter
会执行,但对后续操作没有影响代币因此下一个要执行的标记是,\@
它被设计用来在 a 旁边使用.
以影响句子空间,它的定义是
\def\@{\spacefactor\@m}
因此您最终尝试在垂直模式下分配 10000 \spacefactor
。解决方案(一般来说,尽管在这种情况下可以通过不同的方式避免问题)是在进行定义时更改 catcode,而不是在使用它时,因此:
\makeatletter
\newcommand\back
{\@backslashchar}
\makeatother