Использование Unicode в fancyvrb's VerbatimOut - PullRequest
7 голосов
/ 25 января 2010

Задача

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 (соответствует ЛАТИНСКОМУ МАЛЕНЬКОМУ ПИСЕМУ E С ОСТРОМ в UTF-8)
  • Письменный файл: E9 (соответствует é на латинице-1)

Вопрос

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 25 января 2010

Ваша конечная цель - писать символы и акценты в 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

3 голосов
/ 26 января 2010

Это все еще незафиксировано? Я еще раз посмотрю. Что именно вы хотите: чтобы ваш пакет использовал 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, и выкладывается патч для «решения проблемы». ». Кто знает, может, он сталкивался с такой же проблемой? Возможно, стоит написать ему.

2 голосов
/ 30 июня 2011

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

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

в преамбуле. Я успешно использовал это для вставки юникода в дословную среду.

2 голосов
/ 26 января 2010

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 загружает латинские шрифты Modern, которые поддерживают Unicode. Стандартные шрифты TeX Computer Modern не имеют нужных таблиц для поддержки Unicode.

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

1 голос
/ 15 мая 2019
\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.

...