将反斜杠写入文件的有效方法

将反斜杠写入文件的有效方法

假设我有一个作者和一个环境(实际上是一个环境),定义为

\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

相关内容