7

问题

VerbatimOut“fancyvrb”包中的 UTF-8 字符不能很好地播放。

最小的工作示例:

\documentclass{minimal}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{fancyvrb}

\begin{document}
\begin{VerbatimOut}{\jobname.test}
é
\end{VerbatimOut}

\input{\jobname.test}
\end{document}

错误信息

使用 编译时pdflatex mini,会出现错误

文件在扫描使用时结束\UTFviii@three@octets

é上面的唯一出现被其他东西替换时,会发生不同的错误,例如é */

包 inputenc 错误:Unicode 字符\u8:###未设置为与 LaTeX 一起使用。

– 表示在这种情况下,LaTeX 成功读取了一个多字节 UTF-8 字符,但不知道如何处理它(即它是错误的字符)。

实际上,当我.test手动打开生成的文件时,它包含字符é,但采用 Latin-1 编码

证明:当我在十六进制编辑器中打开文件时,我得到以下信息:

  • 原始文件:(C3 A9对应于 UTF-8 中带有 ACUTE 的拉丁小写字母 E)
  • 书面文件:(E9对应é于Latin-1)

问题

如何VerbatimOut正确设置?

filecontents*(来自“filecontents”)表明它可以工作。不幸的是,我不理解这两个代码,所以我无法通过手动复制文件内容中的逻辑来修复 fancyvrb 的代码。

我也不能使用filecontents*代替,VerbatimOut因为前者不能在 a 中工作\newenvironment,而后者可以。

(哦,顺便说一句:vanillaVerbatim而不是VerbatimOut也可以按预期工作。错误似乎发生在写入文件时,而不是在读取逐字输入时)

4

5 回答 5

4

您的最终目标是逐字书写符号和重音符号吗?因为你可以这样做:

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\'{e} \~{e} \`{e} \^{e}
\end{Verbatim}
\end{document}

commandchars 选项允许\ { }字符像往常一样工作。

资料来源:http ://ctan.mirror.garr.it/mirrors/CTAN/macros/latex/contrib/fancyvrb/fancyvrb.pdf

于 2010-01-25T15:06:08.763 回答
3

这还没有解决?我再看看。你到底想要什么:你的包使用 VerbatimOut,还是让它不干扰它?

测试

TexLive 2009 的 Xelatex 编译良好。使用 pdflatex,版本

This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009)

我收到一条错误消息,它比您收到的错误消息更有用:


! Argument of \UTFviii@three@octets has an extra }.
 
                \par 
l.8 é

? i \makeatletter\show\UTFviii@three@octets
! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.8 é

如果我要做出一个疯狂的猜测,我会说带有 pdftex 的 inputenc 使用 pdftex 原语对字符表进行一些毛茸茸的存储和恢复,并且某个地方的某个表很少出现错误。

可能相关

我从 2003 年的 pdf-tex 邮件列表档案中看到了 Vladimir Volovich 的一篇文章,其中讨论了 inputenc 和 fancyvrb 之间的冲突,并发布了一个“解决问题”的补丁。谁知道,也许他也面临同样的问题?可能值得给他发电子邮件。

于 2010-01-26T10:34:47.860 回答
2

XeTeX有更好的 Unicode 支持。以下运行在和输出 PDFxelatex中都生成“é” 。\jobname.test

\documentclass{minimal}
\usepackage{fontspec}
\tracingonline=1
\usepackage{fancyvrb}

\begin{document}
\begin{VerbatimOut}{\jobname.test}
é
\end{VerbatimOut}

\input{\jobname.test}
\end{document}

fontspec加载支持 Unicode 的拉丁现代字体。标准的 TeX Computer Modern 字体没有正确的表来支持 Unicode。

如果您使用的字符在当前字体中没有字形,默认情况下 XeTeX 会在 PDF 中写入一个空格并在日志中打印警告,但不会在终端上打印。\tracingonline=1将警告打印到终端。

于 2010-01-26T17:48:45.380 回答
2

http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.LiterateAgda上,他们建议您应该使用

\usepackage{ucs}
\usepackage[utf8x]{inputenc}

在序言中。我成功地使用它来将 unicode 插入逐字环境。

于 2011-06-30T15:23:00.940 回答
1
\documentclass{article}

\usepackage{fancyvrb}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\newenvironment{MonVerbatim}{%
\count0=128\relax %
\loop
   \catcode\count0=11\relax
   \advance\count0 by 1\relax 
   \ifnum\count0<256
   \repeat
   \VerbatimOut[commandchars=\\\{\}]{VerbatimText.tex}%
}{\endVerbatimOut}

\newcommand\test{A command producing accented characters éà}

\begin{document}
\begin{MonVerbatim}
     A little bit text in verbatim mode éà_].
     \test
\end{MonVerbatim}
Followed by some accented character éà.
\end{document}

此代码适用于 TeXLive 2018 和 pdflatex。如果您使用 16 位 TeX(lualatex 或 xelatex),您可能应该避免更改 catcode。

您可以使用包“iftex”来检查使用的 tex 引擎。

于 2019-05-15T17:30:25.390 回答