![\MakeShortVerb{\§} и \usepackage[utf8]{inputenc}](https://rvso.com/image/330816/%5CMakeShortVerb%7B%5C%C2%A7%7D%20%D0%B8%20%5Cusepackage%5Butf8%5D%7Binputenc%7D.png)
У меня есть книга, изданная более 10 лет назад. В ее преамбуле содержится следующий код:
\documentclass{article}
\usepackage[cp1251]{inputenc}
\usepackage[T1,T2A]{fontenc}
\usepackage[english,russian]{babel}
\usepackage{shortvrb}
\MakeShortVerb{\§}
\begin{document}
§\begin{i}§
\end{document}
Теперь я хочу конвертировать исходные файлы в юникод. Однако после изменения cp1251
кодировки наutf8
\usepackage[utf8]{inputenc}
компиляция остановлена с сообщением об ошибке, указывающим на проблему с \MakeShortVerb{\§}
:
! Missing \endcsname inserted.
<to be read again>
\protect
l.8 \MakeShortVerb{\В§}
? h
The control sequence marked <to be read again> should
not appear between \csname and \endcsname.
? h
Sorry, I already gave what help I could...
Maybe you should try asking a human?
An error might have occurred before I noticed any problems.
``If all else fails, read the instructions.''
?
! Package inputenc Error: Keyboard character used is undefined
(inputenc) in inputencoding `utf8'.
See the inputenc package documentation for explanation.
Type H <return> for immediate help.
...
l.8 \MakeShortVerb{\В§}
? r
Как обойти эту проблему?Ничего такого, что я хотел бы использовать §
в качестве разделителей для короткого дословного текста.Совместим ли shortverb
пакет с utf8
кодировкой?
решение1
@egreg опять слишком быстро. Но у меня был обед, который нужно было подготовить...
\documentclass{article}
\usepackage[T1,T2A]{fontenc}
\usepackage[english,russian]{babel}
\usepackage[utf8]{inputenc}
%\usepackage{shortvrb}
\makeatletter
\DeclareUnicodeCharacter{00A7}{\IgorSVerb}
\def\IgorSVerb{\begingroup\def\IgorSVerb{\verb@egroup\endgroup}\verb^^a7}
\makeatother
\begin{document}
Hello
§\begin{i}$&^\}{"'çÂ\]%§
§\begin{i}$&^\}{"'çÂ\]%§
\selectlanguage{english}
§\begin{i}$&^\}{"'çÂ\]%§
§\begin{i}$&^\}{"'çÂ\]%§<
\end{document}
решение2
Проблема в том, что в UTF-8 §
длина составляет два байта, а \MakeShortVerb
требуется только один.
Лучшее, что я могу предложить, это следующее:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1,T2A]{fontenc}
\usepackage[english,russian]{babel}
\begingroup\uccode`~="C2 \uppercase{\endgroup
\DeclareUnicodeCharacter{00A7}{\verb~}}
\begingroup\uccode`~="A7 \uppercase{\endgroup\def~}{}
\begin{document}
§\begin{i}§
§{-{\§
\end{document}
Ограничение заключается в том, что ни один символ, который в UTF-8 имеет префикс , не <C2>
может появляться в дословном тексте: список запрещенных символов
¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿
то есть диапазон Unicode 00A1
– 00BF
.