在fancyvrb’中使用Unicode;逐字逐句 问题

在fancyvrb’中使用Unicode;逐字逐句 问题,unicode,latex,verbatim,Unicode,Latex,Verbatim,“fancyvrb”软件包中的逐字输出无法很好地处理UTF-8字符 最简单的工作示例: 错误消息 使用pdflatex mini编译时,会出现错误 文件在扫描\UTFviii@three@八位字节 当上面唯一出现的é被其他内容替换时,会发生不同的错误,例如é*/: Package Inpuntec错误:Unicode字符\u8:####未设置为与LaTeX一起使用 –表示在这种情况下,LaTeX成功读取多字节UTF-8字符,但不知道如何处理它(即,它是错误的字符) 事实上,当我手动打开生成的.t

“fancyvrb”软件包中的
逐字输出
无法很好地处理UTF-8字符

最简单的工作示例: 错误消息 使用
pdflatex mini
编译时,会出现错误

文件在扫描
\UTFviii@three@八位字节

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

Package Inpuntec错误:Unicode字符
\u8:####
未设置为与LaTeX一起使用

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

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

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

  • 原始文件:
    C3 A9
    (对应于UTF-8中带锐音符的拉丁文小写字母E)
  • 书面文件:
    E9
    (对应于拉丁语-1中的
    ee
问题: 如何正确设置
逐字移动?

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

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


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

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

\documentclass{article}
\usepackage{fancyvrb}
\begin{document}
\begin{Verbatim}[commandchars=\\\{\}]
\'{e} \~{e} \`{e} \^{e}
\end{Verbatim}
\end{document}
commandchars选项允许
\
{
}
字符正常工作


来源:

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

测试

TexLive 2009的Xeletex编译得很好。使用pdflatex,版本

这是pdfTeX,版本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的INPUNEC使用pdftex原语对字符表进行一些复杂的存储和恢复,而某些地方的表很少出错

可能相关

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

有更好的Unicode支持。下面通过运行Xeletex在
\jobname.test
和输出PDF中生成“é”

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

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

\input{\jobname.test}
\end{document}
fontspec
加载支持Unicode的拉丁现代字体。标准的TeX计算机现代字体没有Unicode支持的正确表格

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

在上,他们建议您使用

\usepackage{ucs}
\usepackage[utf8x]{inputenc}
在预赛中。为了将unicode插入到逐字记录环境中,我成功地使用了它。

\documentclass{article}
\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}
\usepackage{fancyvrb} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \新环境{MonVerbatim}{% \count0=128\relax% \环路 \catcode\count0=11\relax \按1前进\count0\relax
\ifnum\count0感谢您的提示,但该解决方案不可用,因为保存的逐字代码将由另一个不了解LaTeX的程序进一步处理–因此我确实需要能够直接使用Unicode字符。啊,好吧。那么我不太确定。祝您好运。更新的超链接:是的,我知道XeTeX,并且我使用它非常好。但是我需要一个通用的软件包,因为重音字符在普通的LaTeX中可以工作,所以我不想破坏Unicode支持的功能。这不是计算机现代字体的问题。(是的,这仍然没有解决。)这确实是一个完全不同的错误——尽管我怀疑是
}缺少
,完全是因为UTF-8解析器已经读取了过多的一个字符。但是为什么在试图显示宏的定义时会出现“未定义的控制序列”@Konrad:恐怕调试问题抛出\genericeror是我经历过的不好的事情。我计划什么时候再试一次,但不会在接下来的几天内。不用担心。这是一个相当大的问题,但不幸的是,我现在也没有时间花在这上面。最简单的方法可能是联系相关软件包的维护人员(即fancyvrb和inputenc),因此,一旦我有时间花更多的时间在这个bug上,我会尝试一下。TeXLive2016中仍然没有修复。不过,并非所有Unicode都能工作。特别是,
utf8x
非常不推荐使用普通的
utf8
,包
ucs
也是如此。可能会有一些单独的情况,你的代码可以工作,而我的代码不能工作——但这些都是例外。最终,真正的解决方案是将pdflatex装箱并使用Xeletex。两年前我做了这个转换,以后再也没有回头。对于texlive 2018和更高版本的
\usepackage[utf8]{inputenc}
应该不再需要了,utf8现在是pdflatex的默认编码
\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}