代码之家  ›  专栏  ›  技术社区  ›  Konrad Rudolph

在fancyvrb中逐字使用unicode

  •  7
  • Konrad Rudolph  · 技术社区  · 15 年前

    问题

    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 char \u8:### 未设置为与乳胶一起使用。

    这表示在本例中,latex成功地读取了一个多字节的utf-8字符,但不知道该如何处理它(即它是错误的字符)。

    事实上,当我打开 .test 手动文件,它包含字符 γ射线 ,但使用拉丁语-1编码 !

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

    • 原始文件: C3 A9 (对应于拉丁文小写字母E,UTF-8中带锐音符)
    • 书面文件: E9 (对应于 γ射线 拉丁语-1)

    问题

    如何设置 逐字 正确上升?

    filecontents* (来自filecontents)显示 可以 工作。不幸的是,这两种代码我都不理解,所以我无法通过手动从文件内容复制逻辑来修复fancyvrb的代码。

    我也不能用 文件内容* 而不是 逐字 因为前者在 \newenvironment ,而后者则是。

    (哦,顺便说一下:香草味的) Verbatim 而不是 逐字 也能按预期工作。写入文件时出现错误, 读取逐字输入时)

    4 回复  |  直到 5 年前
        1
  •  4
  •   Steve Tjoa    9 年前

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

    \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

        2
  •  3
  •   Charles Stewart    14 年前

    这个还没修好?我再看一眼。你到底想要什么:你的软件包使用逐字记录,还是不干扰它?

    测验

    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 é
    

    如果我胡乱猜测的话,我会说inputenc with pdftex使用pdftex原语对字符表进行一些毛茸茸的存储和恢复,而某些地方的表很少出错。

    可能相关

    我看见了 a post by Vladimir Volovich 在2003年的pdf-tex邮件列表存档中,讨论了inputenc&fancyvrb之间的冲突,并发布了一个补丁来“解决问题”。谁知道,也许他也面临同样的问题?可能值得给他发邮件。

        3
  •  2
  •   andrewdotn    15 年前

    XeTeX 有更好的Unicode支持。以下内容贯穿始终 xelatex 在中同时生成 \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 将警告打印到终端。

        4
  •  2
  •   Alex    13 年前

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

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

    在序言中。为了将unicode插入到逐字记录环境中,我成功地使用了它。

        5
  •  1
  •   Alan    5 年前
    \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引擎。