Использование Unicode в VerbatimOut fancyvrb

Проблема

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.

- указывая, что в этом случае LaTeX успешно читает многобайтовый символ UTF-8, но не знает, что с ним делать (т.е. это неправильный символ).

Фактически, когда я открываю созданный .test файл вручную, он содержит символ é, но в кодировке Latin-1!

Доказательство: когда я открываю файлы в шестнадцатеричном редакторе, я получаю следующее:

  • Исходный файл: C3 A9 (соответствует СТРОЧНОЙ ЛАТИНСКОЙ БУКВЕ E С ОСТРЫМ в UTF-8)
  • Письменный файл: E9 (соответствует é на латинице-1)

Вопрос

Как правильно настроить VerbatimOut?

filecontents* (от «filecontents») показывает, что это может работать. К сожалению, я не понимаю ни один из этих кодов, поэтому я не могу исправить код fancyvrb, реплицируя логику из содержимого файлов вручную.

Я также не могу использовать filecontents* вместо VerbatimOut, потому что первый не работает с \newenvironment, а второй работает.

(О, кстати: vanilla Verbatim вместо VerbatimOut также работает должным образом. Кажется, ошибка возникает при записи файла, нет при чтении дословного ввода)


person Konrad Rudolph    schedule 25.01.2010    source источник


Ответы (5)


Ваша конечная цель - писать символы и акценты на языке Verbatim? Потому что это можно сделать так:

\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

person Steve Tjoa    schedule 25.01.2010
comment
Спасибо за подсказку, но это решение нельзя использовать, потому что сохраненный дословный код будет в дальнейшем обрабатываться другой программой, которая не знает о LaTeX, поэтому мне действительно нужно иметь возможность напрямую использовать символы Unicode. - person Konrad Rudolph; 25.01.2010
comment
Ах хорошо. Тогда я не совсем уверен. Удачи. - person Steve Tjoa; 25.01.2010
comment
Обновленная гиперссылка: ctan.mirror.garr.it / mirrors / CTAN / macros / latex / contrib / fancyvrb / - person MattAllegro; 03.09.2015

Это еще не исправлено? Я посмотрю еще раз. Что именно вы хотите: чтобы ваш пакет использовал VerbatimOut или чтобы он не мешал ему?

Тесты

Xelatex от TexLive 2009 компилируется нормально. С 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 с pdftex использует примитивы pdftex для некоторого сложного хранения и восстановления таблиц символов, и в какой-то таблице где-то есть редко встречающаяся ошибка.

Возможно, связаны

Я видел сообщение Владимира Воловича в формате pdf-tex архивы списков рассылки, начиная с 2003 года, в которых обсуждается конфликт между inputenc и fancyvrb и публикуется патч для «решения проблемы». Кто знает, может, сталкивался с такой же проблемой? Возможно, стоит написать ему по электронной почте.

person Charles Stewart    schedule 26.01.2010
comment
(Да, это все еще не исправлено.) Это действительно совершенно другая ошибка - хотя я подозреваю, что } отсутствует исключительно потому, что синтаксический анализатор UTF-8 уже прочитал на один символ слишком много. Но почему вы получаете «неопределенную последовательность управления» при попытке показать определение макроса? - person Konrad Rudolph; 13.06.2010
comment
@Konrad: Боюсь, что проблемы с отладкой, вызывающие \ GenericError, - это то, с чем у меня был плохой опыт. Я планирую повторить попытку когда-нибудь, но не в ближайшие несколько дней. - person Charles Stewart; 13.06.2010
comment
Не беспокойся. Это довольно большая проблема, но, к сожалению, у меня сейчас нет на нее времени. Самым простым способом, вероятно, было бы связаться с разработчиком соответствующих пакетов (например, fancyvrb и inputenc), чтобы я попробовал это, как только у меня появится свободное время, чтобы потратить больше времени на эту ошибку. - person Konrad Rudolph; 13.06.2010
comment
Все еще не исправлено в TeXLive2016. - person ScumCoder; 29.06.2016

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 Computer Modern не имеют нужных таблиц для поддержки Unicode.

Если вы используете символ, у которого нет глифа в текущем шрифте, по умолчанию XeTeX записывает пустое пространство в PDF-файл и выводит предупреждение в журнал, но не на терминал. \tracingonline=1 выводит предупреждение на терминал.

person andrewdotn    schedule 26.01.2010
comment
Да, я знаю про XeTeX и использую исключительно его. Но мне это нужно для универсального пакета, и поскольку символы с диакритическими знаками работают в обычном LaTeX, я действительно не хочу нарушать то, что работает небольшая поддержка Unicode. Это не проблема шрифтов Computer Modern. - person Konrad Rudolph; 26.01.2010

На http://wiki.portal.chalmers.se/agda/pmwiki.php?n=Main.LiterateAgda, они предлагают использовать

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

в преамбуле. Я успешно использовал это, чтобы вставить Unicode в дословную среду.

person Alex    schedule 30.06.2011
comment
Однако не весь Юникод работает. В частности, utf8x в значительной степени устарел в пользу простого utf8, как и пакет ucs. Могут быть единичные случаи, когда ваш код работает, а мой - нет, но это будут исключения. В конце концов, реальное решение - собрать pdflatex и использовать вместо него xelatex. Я сделал это два года назад и никогда не оглядывался назад. - person Konrad Rudolph; 30.06.2011

\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. Вам, вероятно, следует избегать изменения catcode, если вы используете 16-битный TeX (lualatex или xelatex).

Вы можете использовать пакет iftex для проверки используемого механизма tex.

person Alan    schedule 15.05.2019
comment
Начиная с texlive 2018 и более поздних версий \usepackage[utf8]{inputenc} больше не требуется, utf8 теперь является кодировкой по умолчанию для pdflatex. - person samcarter_is_at_topanswers.xyz; 16.05.2019