Документ взят из кэша поисковой машины. Адрес оригинального документа : http://www.mmonline.ru/forum/read/7/33619/
Дата изменения: Sat Feb 19 23:58:16 2011
Дата индексирования: Sat Feb 19 23:58:16 2011
Кодировка: Windows-1251
MMOnline | Форумы | Разное | проблема с hyperref: переход не на ту страницу

проблема с hyperref: переход не на ту страницу

Автор темы egor 
13.01.2004 00:28
egor
проблема с hyperref: переход не на ту страницу
Я всего несколько дней назад открыл для себя пакет hyperref
и еще не научился им хорошо пользоваться.

Проблема в том, что если какой-то параграф или какая-то теорема начинаются с новой страницы, то при переходе по ссылке попадаю на предыдущую страницу. При этом \pageref показывает правильный номер страницы.

Может, кто-нибудь сталкивался с похожей проблемой
и знает, как ее решать.

13.01.2004 09:07
IVK
oпишите проблему подробнее
Какой вы используете TeX и какая версия обсуждаемого пакета?

Вы компилируете в pdf? Каким приложением полученный файл отображаете?

С какими параметрами пакет запущен? Какие еще пакеты включены?

Вы средства борьбы с overfull'ами используете?

13.01.2004 14:20
egor
подробнее
Спасибо за внимание к моей проблеме.
Используется MiKTeX 2.1, подключаются следующие пакеты:

\documentclass[a4paper]{article}
\usepackage[cp1251]{inputenc}
\usepackage[english, russian]{babel}
\usepackage[intlimits]{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{eucal}
\usepackage{mathrsfs}
\usepackage{hyperref}

Вырезки из log-файла:

This is TeX, Version 3.14159 (MiKTeX 2.1) (preloaded format=latex 2000.11.28)
LaTeX2e <2001/06/01>
Package: amsmath 1997/03/20 v1.2d AMS math features
Package: amsthm 2000/10/26 v2.08
Package: hyperref 2001/12/06 v6.71x Hypertext links for LaTeX
Package hyperref Info: Bookmarks ON on input line 1712.
Package hyperref Info: Hyper figures OFF on input line 1731.
Package hyperref Info: Link nesting OFF on input line 1736.
Package hyperref Info: Hyper index ON on input line 1739.
Package hyperref Info: Plain pages ON on input line 1744.
Package hyperref Info: Backreferencing OFF on input line 1751.

Полученный dvi-файл просматриваю Yap'ом
или перевожу в pdf утилитой dvipdfm (без параметров),
или перевожу tex-файл в pdf утилитой pdflatex (без параметров).

Результат один и тот же: если теорема или раздел начинаются
посередине страницы, то гиперссылка создается правильная,
а если вверху страницы, то \pageref показывает правильный номер,
а гиперссылка указывает на предыдущую страницу.

Может быть, это можно исправить, добавляя искусственные пробелы
в определениях теоремоподобных конструкций?

Что такое средства борьбы с overfull'ами?
Я ставлю \sloppy, а в плохих местах изменяю текст так,
чтобы не было overfull'ов и underfull'ов.
13.01.2004 14:38
egor
странно, на простом примере работает
По Вашему ответу и по отсутствию других откликов
я предположил, что с этой проблемой мало кто сталкивался.
Так что, скорее всего, корень проблемы сидит где-то
в моих собственных заморочках.

На простом пробном файле hyperref работает отлично.
Возможно, в большом файле я переопределяю что-то такое,
что важно для hyperref.
Буду искать.
13.01.2004 15:44
IVK
вы используете старую версию hyperref'а
С версией 2003/01/22 v6.73n этой проблемы у меня не возникало.

Если в вашей версии MiKTeX'а имееется MiKTeX Update Wizard, то я бы рекомендовал им воспользоваться.

Кстати, если полученный pdf вы открываете с помощью Ghostscript'а, то, вероятно, проблема есть одна из его ошибок.
13.01.2004 17:01
IVK
предположение
А как вы создаете ссылки?

Например вот так -- правильно

{
%begin

\chapter*{Предисловие}\addcontentsline{toc}{chapter}{Предисловие}\markboth{Предисловие}{Предисловие}

%cut

\chapter{Моя первая глава}\label{chapter1}

%cut: 1 page of text

\begin{theorem}[Моя сердитая теорема] \label{dreadth}

%cut

\end{theorem}

%end
}

а вот так

{
%begin

\addcontentsline{toc}{chapter}{Предисловие}\markboth{Предисловие}{Предисловие}\chapter*{Предисловие}

%cut

\label{chapter1}\chapter{Моя первая глава}

%cut: 1 page of text

\label{dreadth}\begin{theorem}[Моя сердитая теорема]

%cut

\end{theorem}

%end
}

создает описанную вами проблему. Кстати, этот код и должен приводить к тому результату, к которому приводит, т.е. ссылка будет сгенерирована на строчку после предыдущего абзаца, которая будет на предыдущей странице.

Возможно, конечно, проблема и не из-за этого.

13.01.2004 21:00
egor
вот упрощенный пример, который у меня плохо работает
\documentclass[a4paper]{article}
\usepackage[cp1251]{inputenc}
\usepackage[english, russian]{babel}
\usepackage{hyperref}

\newcounter{sec}
\renewcommand{\sec}[1]{\refstepcounter{sec}\clearpage\thesec. #1}

\begin{document}

\sec{The first section}

Hyperlink to the section \ref{sec:2}.

\sec{The second section}
\label{sec:2}

\end{document}


Сейчас попробую разобраться с Вашим примером.

13.01.2004 22:36
egor
по поводу предположения
Скачал только что новую версию hyperref'а - проблема осталась.
Конечно, \label я ставлю сразу после начала раздела или теоремы.

Со стандартными классами работает правильно,
а с переопределенными, как описано выше, неправильно.

Конечно, можно сделать вывод, что нужно работать
со стандартными классами, но интересно все же разобраться.
14.01.2004 09:59
IVK
не все в TeX'е коммутирует ;-)
Вот так -- правильно:

\renewcommand{\sec}[1]{\clearpage\refstepcounter{sec}\thesec. #1}

14.01.2004 13:16
egor
спасибо; с секциями все стало ясно :)
После Вашего ответа все стало очевидно :)
В исправленном варианте ссылки на параграфы правильные.

Возможно, частичным оправданием моей недогадливости
может послужить то, что такая же проблема возникает и с теоремами, которые я определяю не вручную, а с помощью amsthm:

\newtheorem{theorem}{Теорема}[sec]
14.01.2004 21:21
IVK
проблема с теоремами
Подтверждаю: с теоремами проблема имеет место. Причем это не глюк -- все работает, как должно работать :-(.

Лечение: либо перед ``плохими'' теоремами ставить \clearpage (вредный совет), либо определять теоремы вручную.

15.01.2004 15:39
egor
похоже, в amsthm та же ошибка, что у меня
то есть изменение счетчика стоит раньше,
чем текст заголовка теоремы.

Вот подозрительный кусок из amsthm.sty:

\refstepcounter{#2}%
\def\@tempa{\@oparg{\@begintheorem{#3}{\csname the#2\endcsname}}[]}%

15.01.2004 21:01
egor
как обрабатывать дополнительный аргумент
Уважаемый IVK, по Вашему совету я переопределил
оформление теорем (переопределил команду \newtheorem).
Теперь все работает отлично.

Только одно небольшое неудобство:
в некоторых теоремах уместен дополнительный аргумент,
передаваемый в квадратных скобках
(например, название теоремы или источник, из которого она взята).

Подскажите, пожалуйста,
как в LaTeX'е обрабатываются дополнительные аргументы, передаваемые в квадратных скобках.
У меня, к сожалению, нет книг про TeX низкого уровня,
а по готовым библиотекам разобраться оказалось сложновато :(
16.01.2004 05:18
IVK
аргументы

Переопределять команду \newtheorem, на мой взгляд, -- дурной стиль, лучше просто создайте свое окружение.

Окружения задаются так:

\newenvironment{namе}[args]{begdef}{enddef}
\newenvironment{namе}[args][default]{begdef}{enddef}

где

name -- название

args -- число аргументов (натуральное ;-))

default -- значение первого аргумента, если оно явно не указано при вызове

begdef -- то, что будет выполняться по команде \begin{name}, доступ к значениям аргументов через #n, n -- номер аргумента

enddef -- то, что будет выполняться по команде \end{name}


Кстати, в данном случае смотреть в ``книгу низкого уровня'' не обязательно. Все есть в Львовском. Который есть в электронном виде вот здесь:

http://www.mccme.ru/free-books/

16.01.2004 22:16
egor
аргументы "второго уровня"
Цитата

IVK писал(а) :

Переопределять команду \newtheorem, на мой взгляд, -- дурной стиль, лучше просто создайте свое окружение.
...
Кстати, в данном случае смотреть в ``книгу низкого уровня'' не обязательно. Все есть в Львовском. Который есть в электронном виде вот здесь:

http://www.mccme.ru/free-books/

Львовского я, конечно, давно скачал. :)

Спасибо за описание \newenvironment. Да, newenvironment действительно предусматривает дополнительный аргумент, так что здесь можно "остаться на высоком уровне".

Насчет дурного стиля - вопрос спорный.
Если сама команда \newtheorem не является дурным стилем,
но просто содержит один недочет (с моей точки зрения),
то ее переопределение не так уж неуместно.
Разве лучше создавать 5 почти одинаковых окружений:
для теорем, лемм, предложений, следствий и определений?

Если все же переопределять \newtheorem и при этом заботиться о дополнительном аргументе окружения (определяемого внутри \newtheorem), то возникает интересный (с точки зрения новичка) вопрос: как обращаться к этому аргументу?
Ведь просто #1 будет обозначать первый аргумент \newtheorem,
а не первый аргумент окружения.

Другими словами, если имеется конструкция типа
\newcommand{\c1}[3]{
\newcommand{\c2}[1]{
... }},
то как внутри тела c2 обращаться к аргументу команды c2?
17.01.2004 11:44
IVK
аргументы ``второго уровня'': а такое бывает?
Я вас наверно огорчу, но в latex нет стандартных средств создания вложенных команд. Определение новой команды действует до конца текущей группы. Вы написали не то, что имели в виду ;-).

Посмотрите Львовского стр. 234-235, там все понятно написано.

Да, про стиль. Если вам команда \newtheorem не нравится, то определяйте свою с новым именем, а не переопределяйте старую. Знаете как трудно разбираться в документах, автор которых ``имел в виду'' то, что стандартное окружение должно работать не стандартно?

Хорошее правило: новая команда (с новым эффектом) должна иметь новое имя.

17.01.2004 22:44
egor
да, Вы правы
Действительно, у Львовского в указанном Вами месте написано, что нельзя создавать вложенных \newcommand, но это можно как-то обходить. К сожалению, не написано как.

Тем не менее, внутри \newcommand можно ставить команду
\newenvironment, у которой может быть свой аргумент.
В общем-то, меня интересовал именно этот случай, но я привел неудачный пример.

В оригинальном \newtheorem проблема аргументов вложенных команд, очевидно, как-то решается (возможно, все дело в использовании команды \def), но я не смог разобраться.

В общем, я просто сделал пять новых окружений, и теперь все отлично работает. Еще раз большое спасибо за напоминание о дополнительном параметре \newenvironment.

Насчет переопределения \newtheorem: наверное, действительно лучше придумывать новые названия для переделанных команд.
18.01.2004 10:27
IVK
пишите проще ;-)
Еще одно хорошее правило.

Все сложные конструкции (в TeX'е), обычно эквивалентны (с точностью до ``без лупы не разглядиш'') чему-нибудь простому и понятному.

Что в вашем документе важнее -- содержание или оформление?

TeX -- это язык программирования. На нем даже игрушки пишут ;-) То есть он предоставляет богатые возможности для преврашения процесса оформления одного абзаца в многомесячный труд над проектом с названием ``Мой Самый Наповторимый Абзац'' ;-)

Вам это зачем?

18.01.2004 21:20
egor
упрощать сложно, усложнять просто
При оформлении объемных работ трудно обойтись без определения своих окружений и т.п.

Конечно, лучше писать не талмуды на полторы сотни страниц чепухи, а доказательство какой-нибудь проблемы Гильберта на трех страницах ;), но часто приходится делать не то, о чем можно только мечтать, а то, что кое-как получается.

А насчет игрушек на TeX-е - неужели это правда?
В нем ведь, кажется, даже команды циклы нет?

Извините, только зарегистрированные пользователи могут публиковать сообщения в этом форуме.

Кликните здесь, чтобы войти