VerbatimOut of fancyvrb 中的 Unicode 字符

VerbatimOut of fancyvrb 中的 Unicode 字符

考虑以下示例,其中句子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é.

相关内容