考虑以下示例,其中句子Ceci est un résumé.
被写入文件\jobname.mytmp
然后被读回。
\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{VerbatimOut}{\jobname.mytmp}
Ceci est un résumé.
\end{VerbatimOut}
\input{\jobname.mytmp}
\end{document}
但是,这无法用 进行编译pdflatex
,因为会得到Package inputenc: Invalid UTF-8 byte sequence
。进一步的调查显示,\jobname.mytmp
不是用 UTF-8 编码的,而是用“Windows 1252”编码的(这是 vscode 猜测的,我个人不知道这是什么)。有办法解决这个问题吗?
答案1
该fancyvrb
包使用\immediate\write
,但这会导致未明确停用的活动字符(例如~
)被扩展。
如果您修补代码以使用“受保护的”立即写入,它就可以起作用。
\documentclass{article}
\usepackage{fancyvrb}
\usepackage{etoolbox}
\makeatletter
% define the same as \protected@write, but with \immediate
\providecommand*\protected@iwrite[3]{%
\begingroup
\let\thepage\relax
#2%
\let\protect\@unexpandable@protect
\edef\reserved@a{\immediate\write#1{#3}}\reserved@a
\endgroup
\if@nobreak\ifvmode\nobreak\fi\fi
}
\patchcmd{\FVB@VerbatimOut}
{\immediate\write\FV@OutFile}
{\protected@iwrite\FV@OutFile{}}
{}{}
\makeatother
\begin{document}
\begin{VerbatimOut}{\jobname.mytmp}
Ceci est un résumé.
\end{VerbatimOut}
\input{\jobname.mytmp}
\end{document}
写入文件的内容是
Ceci est un résumé.