Ссылка на теоремоподобную среду по ее [имени] - PullRequest
7 голосов
/ 04 мая 2010

Я использую ntheorem для набора набора условий. В моей преамбуле я имею:

\theoremstyle{empty}
\newtheorem{Condtion}{Condtion}

Когда я хочу набрать условие, я пишу:

\begin{Condtion}[name]
\label{cnd:nm}
foo foo foo
\end{Condition}

Имя отображается жирным шрифтом на той же строке, что и начало текста условия, без номера или чего-либо еще. Идеально подходит.

Что я хочу сделать сейчас, так это обратиться к условию с помощью некоторого варианта команды \ref, \ ref вызывает номер [который больше нигде не отображается] \ tref пишет "Условие n" для n-го условия \ nameref пишет название СЕКЦИИ метки. решение zref было предложено здесь , но кажется неудовлетворительным и громоздким.

Есть предложения по простому способу сделать это? (Даже более простое решение zref было бы неплохо.) В данный момент я только что определил \newcommand для каждого условия и использую его, а не цитирую само условие. Это семантически непрозрачно и просто неудовлетворительно ...

(правка: я написал одному из авторов ntheorem Вольфгангу Мэйу, и он объяснил, что на самом деле нет способа сделать это в ntheorem, поскольку опция [name] не записана.)

(редактировать: это не обман, как предлагается в комментарии, поскольку мне интересно ссылаться на окружение с помощью необязательной команды name, а не на раздел / главу, в которой он находится.)

Ответы [ 4 ]

10 голосов
/ 21 июля 2010

Я думаю, что следующее может делать то, что вы хотите.

\makeatletter
\def\namedlabel#1#2{\begingroup
   \def\@currentlabel{#2}%
   \label{#1}\endgroup
}
\makeatother

Тогда вы используете его как

\begin{theorem}
  \namedlabel{thm:seamus}{Seamus' Theorem}
  Here is Seamus' Theorem.
\end{theorem}

Here I reference~\ref{thm:seamus}.

К сожалению, тогда на него можно ссылаться только по имени, хотя я полагаю, что вы также можете использовать обычный \label (с другим ключом, конечно).

Для amsthm сред вы можете использовать

\makeatletter
\let\@old@begintheorem=\@begintheorem
\def\@begintheorem#1#2[#3]{%
  \gdef\@thm@name{#3}%
  \@old@begintheorem{#1}{#2}[#3]%
}
\def\namedthmlabel#1{\begingroup
   \edef\@currentlabel{\@thm@name}%
   \label{#1}\endgroup
}
\makeatother
3 голосов
/ 25 июля 2011

nameref не работает: оно ссылается на заголовок РАЗДЕЛА, в котором появляется среда, подобная теореме.

Это ошибка nameref , которая уже была исправлена ​​некоторое время назад: http://web.archiveorange.com/archive/v/9uUx5EuqoCGynIvx3om7#lY2MJxvge2oMgOi

К сожалению, некоторые дистрибутивы Linux, такие как Debian / Ubuntu, поставляются с ужасно старыми версиями пакетов (Ubuntu 11.04 все еще поставляется с TeX Live 2009, хотя последняя версия - TeX Live 2011). Если вы используете такой дистрибутив Linux, прекратите использование пакета Tex Live в дистрибутиве и установите TeX Live прямо отсюда: http://www.tug.org/texlive/ Затем вы можете обновить пакеты с помощью tlmgr (действительно крутого инструмента, который не поставляется с Debian / Ubuntu).

2 голосов
/ 04 мая 2010

вы можете проверить пакет nameref, который распространяется с hyperref. В документации nameref есть раздел о ссылках на "вещи".

Подробнее о ссылках можно найти в разделе часто задаваемых вопросов TeX Ссылки на вещи по их названию .

0 голосов
/ 08 июля 2014

Я думал, что другие могут найти это полезным. Несмотря на то, что у меня был установлен обновленный пакет hyperref, мне пришлось явно вызывать \usepackage{nameref} после \usepackage{hyperref}, чтобы получить правильное поведение от \nameref. Без явного вызова \usepackage{nameref}, \nameref работал, но показал ошибку, обсуждаемую в этой теме.

Обновление: этот обходной путь не требуется для минимального примера (который я проверял). Я не знаю, происходит ли что-то более сложное в моих файлах стилей, но я обновлю это, если найду что-нибудь. Это может помочь кому-то столкнуться с той же проблемой, с которой я столкнулся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...