我正在尝试从 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}
排版符合预期的输出,所以这显然是ěščřžýáíé
字符串的扩展形式,但不是我想要的。
这newfile
LaTeX 包
命令\addtostream
我接下来尝试的\addtostream
是newfile
LaTeX 包。
\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
如果我使用csplain
或pdfcsplain
(即经过少许修改的纯 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}