2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 LaTeX, UTF8, renewcommand и украинский
Сообщение20.09.2011, 17:58 


15/06/11
5
Осваиваю LaTeX, как и многие, в академических целях. Благодаря разным howto дошёл своим умом до элементарных вещей, но во время подгона документа под ГОСТы столкнулся со странной ошибкой.
Итак, документ следующий:
Код:
\documentclass [oneside , final , 14pt] {article}
\usepackage[utf8x]{inputenc}
\usepackage{ucs}
\usepackage[T1]{fontenc}
\usepackage[russian,ukrainian]{babel}

\renewcommand{\section}[1]{\par#1\par}

\begin{document}
\tableofcontents
\newpage
\section{Це - перша секція документу}
\LaTeX forever!
\end{document}


То есть, переопределили section и аргументом ей передаём строку с украинскими буквами. Ошибка выпадает следующая: Malformed UTF8 sequence. При попытках манипулировать в преамбуле возникают новые ошибки вроде того, что данные символы хотя и законно существуют в UTF8, в ЛаТеХ не определены.
Гугление не помогло. Чтение рекомендуемой в этих случаях литературы - тоже. Есть даже мой вопрос на ВиО (http://otvety.google.ru/otvety/thread?tid=4bfb0a066c749d64&hl=ru), но там тоже глухо.

Прошу помощи.

 Профиль  
                  
 
 Re: LaTeX, UTF8, renewcommand и украинский
Сообщение21.09.2011, 01:12 


19/09/09
13
Livich в сообщении #484529 писал(а):
То есть, переопределили section и аргументом ей передаём строку с украинскими буквами.

Подозреваю, что не это вызывает ошибку. Попробуйте убрать переопределение (или даже убрать саму команду, оставив только текст на украинском языке). Проблема остается?

Кроме того, такое переопределение некорректно. Команда \section передает свои аргументы на выполнение другой команде. С таким грубым переопределением Вы, вероятно, «кашу» получите на выходе.

Для украинского языка нужна кодировка шрифта T2A, а не T1. Но здесь, возможно, вызов fontenc и вовсе не нужен: inputenc сам подберет нужную кодировку шрифта.

Нужен ли Вам utf8x? Или достаточно utf8?

Livich в сообщении #484529 писал(а):
Ошибка выпадает следующая: Malformed UTF8 sequence. При попытках манипулировать в преамбуле возникают новые ошибки вроде того, что данные символы хотя и законно существуют в UTF8, в ЛаТеХ не определены.

Предполагаю, что причина проблемы в том, что Ваш файл на самом деле не в кодировке UTF-8, а какой-то другой, например, windows-1251. Да, написано utf8, LaTeX верит, подключает необходимые инструменты, и вдруг вместо UTF-8 какой-то мусор! Потому что у меня Ваш пример обрабатывается без ошибок, если файл сохранить в кодировке UTF-8.

Проверьте, поддерживает ли Ваш текстовый редактор UTF-8 и попробуйте более простой пример. Если пойдет, то и Ваш пример должен.
Используется синтаксис LaTeX
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[ukrainian]{babel}
\begin{document}
Українська. English.
\end{document}

Если не поддерживает, замените в этом примере utf8 на cp1251 (если работаете в Windows, например), сохраните файл в соответствующей кодировке и попробуйте снова.

 Профиль  
                  
 
 Re: LaTeX, UTF8, renewcommand и украинский
Сообщение21.09.2011, 02:07 


15/06/11
5
Дело в кодировке аргумента передаваемого функции.
Тот пример что выше - это лишь воспроизведение проблемы, мой файл мало смахивает на готовый шаблон. Действительно, после установки T2A проблема решилась. И формально вопрос решён.

Но при применении на реальном коде данное решение влечёт за собой ошибку гораздо раньше - PDFLaTeX внезапно начинает писать что, мол, чего-то где-то недозакрыли. Скобку то есть.
Код:
Например:
! Missing \endcsname inserted.
<to be read again>
                   \protect
l.25 ...rs \cyrt }}}}{{}{2}{\relax }{Doc-Start}{}}

Это наблюдается при использовании переопределённой \section с кириллическим аргументом. Если переопределённая конструкция не используется, всё проходит на ура.

Т.о. выхода я вижу два: решить вопрос с "незакрытой скобкой", то есть решить проблему с кириллицей в латексе (что невозможно ибо как видно из истории все с этим бодаются) или отказаться от использования переопределений. Второе я тоже сделать не могу по той причине, что LaTeX упорно не хочет, например, убирать такие паразитные в моём деле слова как "Part N", а даже если переопределить слово Part на пустоту, то будет показан номер. Вообще, всякие стилевые надстройки которые уже подключены очень мешают, ИМХО. Кроме того, мне нужна особенная запись в оглавлении, не как у людей и не как это делает ЛаТеКс.

Например, вот как в реальности выглядит моё переопределение:
Используется синтаксис LaTeX
\renewcommand{\section}[2]{
\newpage
\addtocounter{section}{1}
\setcounter{subsection}{0}
\setcounter{subsubsection}{0}
\addcontentsline{toc}{section}{#1}
\par \begin{center}\bf{#1 \label{section:#2}\\} \end{center}
}
 

Хочу заметить, что я ввёл второй аргумет тоже в угоду кривой подержке кириллицы, так как label с кириллическим аргументом не проходит.

Предотвращая возможные предложения скажу, что современные шаблоны (какие я видел) не подходят для моих задач: я готовлю шаблон в соответствии с нормами украинских ГОСТов и (что самое страшное) в соответствии с нормами определёнными университетом.

 Профиль  
                  
 
 Re: LaTeX, UTF8, renewcommand и украинский
Сообщение22.09.2011, 00:48 


15/06/11
5
Окей, на третьи сутки я решил эту проблему :D .
Дело не в кириллице в самом латексе. Дело в файле aux и цифре 0.

После переопределения section я польовался ею так:
Используется синтаксис LaTeX
\section{Имя секции документа}{0}
 

Здесь 0 - это номер по которому создается label вида section:#2 (section:0). К сожалению, после попадания в aux файл такой метки, она приходит туда в виде:
Используется синтаксис LaTeX
\newlabel{section:1}{{}{}{\relax }{Doc-Start}{}}
 

Это неверно потому что второй аргумент обязан быть передан. После замены начала нумерации с нуля на единицу получается такой код, например для третьей секции:
Используется синтаксис LaTeX
\newlabel{section:1}{{}{3}{\relax }{Doc-Start}{}}
 


off: возвращаясь к вопросу о переопределении команд типа section можно сказать, что их переопределять-таки можно. Например, здесь об это много написано: автор не стесняется и переназначает что угодно и как угодно. И работает же :)

 Профиль  
                  
 
 Re: LaTeX, UTF8, renewcommand и украинский
Сообщение26.09.2011, 00:07 


19/09/09
13
Livich в сообщении #484674 писал(а):
Дело в кодировке аргумента передаваемого функции.

О кодировке заботится inputenc. Команда \section получает и обрабатывает список знаков. Ни о каких кодировках она не знает.

Livich в сообщении #485089 писал(а):
off: возвращаясь к вопросу о переопределении команд типа section можно сказать, что их переопределять-таки можно. Например, здесь об это много написано: автор не стесняется и переназначает что угодно и как угодно. И работает же :)

Я не говорил, что категорически нельзя. :-) Нужно делать это аккуратно. Посмотрите определение команды \section в классе article и сравните со своим, а потом с определением из цитированной статьи. Стандартная команда \section вообще не имеет аргументов. Она только вызывает команду \@startsection, у которой куча своих аргументов и которая подхватывает аргументы команды \section. Вот, Вы переопределили \section по-своему и используете, как указано выше. Все хорошо. Но вдруг \tableofcontents вызывает \section вот так:
Используется синтаксис LaTeX
\section*{Имя секции документа}

А она именно так и вызывает. Все, теперь вместо названия звездочка, а вместо метки — кириллические буквы. Вот и получаются ошибки на ровном месте.

LaTeX — строгая система. Маленькие и, казалось бы, незначительные изменения в одном элементе приводят к маленьким или большим изменениям во множестве других элементов. Или даже к краху системы. Поэтому переопределять можно (и нужно), но делать это осторожно.

Павел Самолысов как раз переопределил \section аккуратно: взял стандартное определение как заготовку, изменил и добавил то, что ему было нужно.

 Профиль  
                  
 
 Re: LaTeX, UTF8, renewcommand и украинский
Сообщение16.10.2011, 19:23 


15/06/11
5
Оу, тема ещё жива :) Спасибо Вам за поддержку, честно говоря, думал что уже все забыли...
Да, действительно, проблема со звёздочкой в названии возникала - пришлось править моё переопределение.
Спасибо за столь подробное объяснение - эта проблема решена (что не избавило меня от появления новых, но это уже в другой теме).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group