纯 TeX

纯 TeX

我正在尝试从 LaTeX 中自动生成 BiBTeX 文件。我想扩展所有控制序列,但在输出中禁用任何活动字符扩展。想法是以下伪代码:

\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
  \def\macro{ěščř}
  \output{\jobname.output}{\macro žýáíé}
\end{document}

ěščřžýáíé应该生成一个包含UTF-8的文件。

纯 TeX

我首先想到的是这个 Plain TeX 解决方案:

\documentclass{article}
\usepackage[utf8]{inputenc}
\begin{document}
  \def\macro{ěščř}
  \immediate\newwrite\fd
  \immediate\openout\fd=\jobname.output
  \immediate\write\fd{\macro žýáíé}
  \immediate\closeout\fd
\end{document}

这生成了一个包含

\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {e\global \mathchardef \accent@spacefactor \spacefactor }\accent 20 e\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {s\global \mathchardef \accent@spacefactor \spacefactor }\accent 20 s\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {c\global \mathchardef \accent@spacefactor \spacefactor }\accent 20 c\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {r\global \mathchardef \accent@spacefactor \spacefactor }\accent 20 r\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {z\global \mathchardef \accent@spacefactor \spacefactor }\accent 20 z\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {y\global \mathchardef \accent@spacefactor \spacefactor }\accent 19 y\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {a\global \mathchardef \accent@spacefactor \spacefactor }\accent 19 a\egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {\OT1\i \global \mathchardef \accent@spacefactor \spacefactor }\accent 19 \OT1\i \egroup \spacefactor \accent@spacefactor \unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {e\global \mathchardef \accent@spacefactor \spacefactor }\accent 19 e\egroup \spacefactor \accent@spacefactor

哇哦。插入\input{\jobname.output}排版符合预期的输出,所以这显然是ěščřžýáíé字符串的扩展形式,但不是我想要的。

newfileLaTeX 包

命令\addtostream

我接下来尝试的\addtostreamnewfileLaTeX 包。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newfile}
\begin{document}
  \newoutputstream{out}
  \openoutputfile{\jobname.output}{out}
  \def\macro{ěščř}
  \addtostream{out}{\macro žýáíé}
  \closeoutputstream{out}
\end{document}

这生成了一个包含

\IeC {\v e}\IeC {\v s}\IeC {\v c}\IeC {\v r}\IeC {\v z}\IeC {\'y}\IeC {\'a}\IeC {\'\i }\IeC {\'e}

这同样不是我想要的。

环境writeverbatim

接下来我尝试了writeverbatim包提供的环境。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{newfile}
\begin{document}
  \newoutputstream{out}
  \openoutputfile{\jobname.output}{out}
  \begin{writeverbatim}{out}ěščřžýáíé\end{writeverbatim}
  \closeoutputstream{out}
\end{document}

这生成了一个包含 UTF-8 的文件ěščřžýáíé,正如我所希望的那样,但我需要控制序列扩展。有什么想法吗?

答案1

您可以使用与解释 UTF-8 字符相同的机制来禁用对 UTF-8 字符的解释,即重新定义\UTF@two@octets和类似的宏来生成以下字符的字符串表示形式。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\newcommand{\disable@UTF}{%
  \def\UTFviii@two@octets##1##2{\string##1\string##2}%
  \def\UTFviii@three@octets##1##2##3{\string##1\string##2\string##3}%
  \def\UTFviii@four@octets##1##2##3##4{\string##1\string##2\string##3\string##4}%
}
\newwrite\witiko@out
\immediate\openout\witiko@out=\jobname.dat
\newcommand{\witikowrite}[1]{%
  \protected@write\witiko@out{\disable@UTF}{#1}%
}
\makeatother

\begin{document}

Something for activating \texttt{\string\write}

\witikowrite{\emph{ěščřžýáíé}}

\end{document}

这将写入.dat文件中

\emph  {ěščřžýáíé}

根据您的需要,您可能希望在第二个参数中添加其他“中和”分配\protected@write

答案2

如果我使用csplainpdfcsplain(即经过少许修改的纯 TeX)与源代码(UTF8 格式):

\newwrite\fout
\immediate\openout\fout=test.txt
\immediate\write\fout{ěščřžýáíé}
\def\macro{žřů}
\immediate\write\fout{\macro}
\bye

test.txt然后我在以 UTF8 读取的文件中得到了结果:

ěščřžýáíé
žřů

很简单。这里的效果是由于csplain激活 encTeX 扩展(pdfTeX 的 UTF8 编码扩展)的格式。

答案3

看看下面的内容(摘自我的一篇博客文章),我使用它来存储\\外部文件以生成地址文件。据我所知,它也适用于您的角色。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{xpatch}

\makeatletter
% get a copy of `\protected@write
\let\protected@iwrite\protected@write
% patch the copy to add \immediate
\xpatchcmd{\protected@iwrite}{\write}{\immediate\write}{}{}
\makeatother


\newwrite\tempfile
\newcommand{\Anschrift}{ěščř}
\immediate\openout\tempfile=Anschrift.txt
\makeatletter
\protected@iwrite\tempfile{\let\\\relax}{\Anschrift žýáíé}
\immediate\closeout\tempfile
\makeatother

\begin{document}

\input{Anschrift.txt}

\end{document}

截屏

相关内容