Автор Гілка: Класи LaTeX для дисертації та автореферату  (Прочитано 197256 раз)

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3628
  • Карма: +2/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Шановні добродії!

Виникла ось яка проблемка з Vakaref:

у мене кодування UTF8, відповідно файли класів  я перекодував у UTF8,
так от після того, як я це зробив, не можу скомпілювати титульну сторінку автореферату.

Що робити?  
Перевірте, чи у заголовку вашого файла написано
Цитата
\usepackage[utf8x]{inputenc}
Denounce the demagogues
King diamonds to discard
Deploy the dialogue
Your word against the law

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
Ось це у заголовку

\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,russian,ukrainian]{babel}

Якщо поміняти на  

\usepackage[T2A]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[english,russian,ukrainian]{babel}

все одно не працює.
« Змінено: 2011-02-01 19:39:39 від buenasdiaz »

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3628
  • Карма: +2/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Файл назв спеціальностей перекодували?
Denounce the demagogues
King diamonds to discard
Deploy the dialogue
Your word against the law

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
І назви спеціальностей (speciality.20070212N70) і відмінювання слів (casus.sty) перекодував.

Видає, власне, таке:
! Missing number, treated as zero.
<to be read again>
                   �
l.155 \council{Д~26.206.01}
                            
?

А якщо закоментовую \council{Д~26.206.01}, то отримую таке:
! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.171 \maketitle
                
?

З такою командою \setcounter{errorcontextlines}{999} у преамбулі програма видає:
! Missing number, treated as zero.
<to be read again>
                   �
\council #1->\catcode `м
                         =11 \def \@council@code {#1}\@ifnextchar [\o@counci...
l.155 \council{Д~26.206.01}
                            
?

Мені здається, що проблема у рядку № 301 з файлу vakaref.cls, який перекодовується так:
\newcommand{\council}[1]{\catcode`м=11А саме у букві "м" після апострофа. Тому питання таке:
що там є у оригіналі?
« Змінено: 2011-02-01 20:47:21 від buenasdiaz »

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3628
  • Карма: +2/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Цитата
\newcommand{\council}[1]{\catcode`м=11
Заміна на
Цитата
\newcommand{\council}[1]{\catcode 172=11
не допомагає. Якась вада, пов’язана з Unicode. XeLaTex не допомагає.
Denounce the demagogues
King diamonds to discard
Deploy the dialogue
Your word against the law

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
А навіщо ця команда \catcode`м=11 в даному конкретному випадку?

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3628
  • Карма: +2/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
А навіщо ця команда \catcode`м=11 в даному конкретному випадку?
Треба автора спитати, вона змушує TeX вважати «м» (???) звичайною літерою ASCII.
Denounce the demagogues
King diamonds to discard
Deploy the dialogue
Your word against the law

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
Що ж, запитаю тоді у автора.

Відсутній yurchor

  • Видавець
  • *******
  • дописів: 3628
  • Карма: +2/-0
  • Grateful for our Iron Lung
    • Вікі користувачів KDE
Що ж, запитаю тоді у автора.
Якщо ви не у курсі, автор — модератор цієї дошки. Ймовірно, скоро він сам відповість на ваше питання тут.  ;)
Denounce the demagogues
King diamonds to discard
Deploy the dialogue
Your word against the law

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
Дякую.

Відсутній Олександр Барановський

  • Модератор дошки
  • Графоман
  • *****
  • дописів: 359
  • Карма: +0/-0
А навіщо ця команда \catcode`м=11 в даному конкретному випадку?
Треба автора спитати, вона змушує TeX вважати «м» (???) звичайною літерою ASCII.
Щоб мати можливість працювати з різними кодуваннями, LaTeX кириличним буквам присвоює категорію 13 (активний символ). Потім ці активні символи замінюються на команди \cyrm, \CYRA тощо. А ці команди мають різні означення залежно від кодування документа.

Мені треба було, щоб команда \council з адреси установи, де створено раду, витягувала назву міста (це треба писати на обкладинці автореферату). Тобто якщо маємо
\council{Д~26.206.01}
  [Інститут математики, Національна академія наук України]
  {Інститут математики НАН України}
  {01601 м.~Київ, вул.~Терещенківська, 3}
то \council читає свій третій обов'язковий аргумент, знаходить там «м.~» і вважає, що далі йде назва міста (до коми). Тому я присвоюю кириличній букві «м» категорію 11 (буква):
\catcode`м=11Я думав, що це треба робити, щоб її там виловити і щось з нею робити. Але насправді мене цікавить не так конкретна буква, як щось із крапкою, тобто третій обов'язковий аргумент повинен мати таку структуру:
<щось>.<~ або нічого><місто>,<ще щось>
З такою командою \setcounter{errorcontextlines}{999} у преамбулі програма видає:
! Missing number, treated as zero.
<to be read again>
                   �
\council #1->\catcode `м
                         =11 \def \@council@code {#1}\@ifnextchar [\o@counci...
l.155 \council{Д~26.206.01}
                            
?
Напевно, це треба розуміти так. Буква «м» в унікоді кодується більш ніж одним байтом. Команда \catcode читає перший байт, а далі очікує код категорії: 11, 13 тощо. А насправді отримує другий байт букви «м». Тому й матюкається. Чи правильно я розумію, що такої проблеми не виникало, поки всі файли були в кодуванні cp1251 (koi8-u, тощо)? Це повідомлення з'явилося тільки після перекодування в унікод? Якщо так, то це підтверджує гіпотезу.

Можна спробувати обійтися без зміни категорії букви «м». Додайте в преамбулу свого документа
\makeatletter
\renewcommand{\council}[1]{%
  \def\@council@code{#1}%
  \@ifnextchar[\o@council\@council}
\makeatother
Я лінуюся зараз перекодовувати всі свої файли в унікод. Я тільки помітив, що навіть без зміни категорії назва міста коректно витягується з третього аргумента (у мене приклад автореферату і файли класів у кодуванні cp1251). Спробуйте зі своїм документом.

Можливо, я планував ще щось робити з цієї буквою «м» (наприклад, з чимось порівнювати) або просто помилково вважав, що треба змінювати категорію в цій ситуації. Можливо, таке переозначення \council зламає щось інше. Якщо помітите, будь ласка, повідомте.
У своїх заявках дехто з науковців описував, якими корисними будуть їхні заплановані дослідження для національних інтересів, тоді як насправді ними рухала щира наукова допитливість і бажання написати пару статей.
Станіслав М. Улям, «Пригоди математика»

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
Так, дійсно, такої проблеми не було доки всі файли були у cp1251.
Правильно я зрозумів, що крім вставки нового коду
\makeatletter
\renewcommand{\council}[1]{%
  \def\@council@code{#1}%
  \@ifnextchar[\o@council\@council}\makeatother
я ще закоментовую "\catcode'м=11"?
« Змінено: 2011-02-02 18:36:28 від buenasdiaz »

Відсутній Олександр Барановський

  • Модератор дошки
  • Графоман
  • *****
  • дописів: 359
  • Карма: +0/-0
Правильно я зрозумів, що крім вставки нового коду
\makeatletter
\renewcommand{\council}[1]{%
  \def\@council@code{#1}%
  \@ifnextchar[\o@council\@council}\makeatother
я ще закоментовую "\catcode'м=11"?
Ні, новий код замінює старий. Цього достатньо. Немає потреби редагувати vakaref.cls.

Звичайно, при бажанні Ви можете редагувати безпосередньо відповідний .cls- або .dtx-файл. Але тоді потурбуйтеся, будь ласка, про те, щоб умови ліцензії LPPL було виконано.
У своїх заявках дехто з науковців описував, якими корисними будуть їхні заплановані дослідження для національних інтересів, тоді як насправді ними рухала щира наукова допитливість і бажання написати пару статей.
Станіслав М. Улям, «Пригоди математика»

Відсутній buenasdiaz

  • Новачок
  • *
  • дописів: 14
  • Карма: +0/-0
Спробував з новим кодом, але виходить ось що:
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.175 \maketitle
                
?

Відсутній Олександр Барановський

  • Модератор дошки
  • Графоман
  • *****
  • дописів: 359
  • Карма: +0/-0
Спробував з новим кодом, але виходить ось що:
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}]
! Undefined control sequence.
\GenericError  ...                                
                                                    #4  \errhelp \@err@     ...
l.175 \maketitle
                
?
Інше джерело проблем — це пакет casus.sty. Алгоритм відмінювання не працює, якщо текст в унікоді. Спробуйте додати в преамбулу свого документа такий код:
\makeatletter
\AtBeginDocument{%
  \renewcommand{\transformsentence}[2]{#2\ignorespaces}%
}
\makeatother
Це забороняє команді \transformsentence відмінювати свій аргумент. Після цього у мене повідомлення про помилки зникають.

Але тепер виникає інша проблема — назви установ не відмінюються. Треба або відразу в документі задавати назви установ у потрібному відмінку, або переозначити команду \@makereverse (у певних місцях просто непотрібні команди замінити на відповідний текст).

Інший спосіб розв'язання проблеми — не використовувати UTF-8. Якщо Вам не підходить cp1251, перекодуйте свої документи, а також файли класів і допоміжні файли, в koi8-u, наприклад.

Можливо, варто взагалі відмовитися від відмінювання назв установ? Варіантів не так багато, можна додати ще факультативних аргументів для назв в інших відмінках. Що шановне товариство може сказати з цього приводу?
У своїх заявках дехто з науковців описував, якими корисними будуть їхні заплановані дослідження для національних інтересів, тоді як насправді ними рухала щира наукова допитливість і бажання написати пару статей.
Станіслав М. Улям, «Пригоди математика»