2010-05-04 6 views
5

J'utilise ntheorem pour composer un ensemble de conditions. Dans mon préambule, j'ai:Référencement d'un environnement de type théorème par son [nom]

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

Quand je veux composer une condition, j'écrire:

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

Le nom apparaît BoldFace sur la même ligne que le début du texte de la condition, avec pas de numéro ou quoi que ce soit. Parfait.

Ce que je veux faire maintenant se référer à la condition par une variante de la commande \ref, \ ref appelle le numéro [qui est affiché nulle part ailleurs] \ THREF écrit « Condition n » pour la condition n-ième \ nameref écrit le nom de la SECTION de l'étiquette. une solution zref a été suggéré here, mais semble insatisfaisante et peu maniable.

Des suggestions sur une manière simple de faire cela? (Même une solution zref plus simple serait bien) Pour le moment, je viens de définir un \newcommand pour chaque condition et l'utiliser plutôt que de citer la condition elle-même. Ceci est sémantiquement opaque et juste insatisfaisant ...

(edit: J'ai envoyé un e-mail à un auteur de ntheorem, Wolfgang May, et il m'a expliqué qu'il n'y a pas vraiment moyen de le faire au sein de ntheorem, puisque l'option [name] (edit: Ceci n'est pas dupe comme suggéré dans le commentaire, puisque je suis intéressé à référencer un environnement par sa commande de nom optionnelle, sans faire référence à la section/chapitre dans laquelle il se trouve.)

+1

Vérifiez http://stackoverflow.com/questions/1491842/references-with-text-in-latex qui * pourrait * être un doublon efficace. Aussi http://stackoverflow.com/questions/2613506/ref-chapter-name-in-latex et les choses vont de là. – dmckee

+0

zref pourrait fonctionner, mais cela semble être une façon de faire très compliquée. Je veux dire, le [nom] est déjà déclaré au début de l'environnement. Je veux juste l'appeler par son nom et non son numéro ... – Seamus

Répondre

7

Je pense que ce qui suit peut faire ce que vous voulez.

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

Ensuite, vous l'utiliser comme

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

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

Malheureusement, il ne peut alors être référencé par son nom, mais je suppose que vous pouvez utiliser une \label normale aussi bien (avec une autre touche bien sûr).

Pour les amsthm environnements vous pouvez utiliser

\makeatletter 
\let\@[email protected]=\@begintheorem 
\def\@begintheorem#1#2[#3]{% 
    \gdef\@[email protected]{#3}% 
    \@[email protected]{#1}{#2}[#3]% 
} 
\def\namedthmlabel#1{\begingroup 
    \edef\@currentlabel{\@[email protected]}% 
    \label{#1}\endgroup 
} 
\makeatother 
+0

Ce genre de travaux. Mais ce n'est toujours pas idéal. Le point est, je veux utiliser le contenu de l'argument optionnel de la condition comme le nom que j'appelle. Donc j'ai '\ begin {Condition} [Cnd Name]' et je veux avoir une étiquette qui, quand je le 'ref', dira" Cnd Name ", en gras comme c'est le cas quand la condition est écrite pour la première fois. De cette façon, je dois ajouter un argument supplémentaire à l'étiquette et m'assurer qu'il correspond à "Cnd Name" ... – Seamus

+0

Cela dépend de l'environnement utilisé. Vous devrez probablement créer un wrapper pour chacun de ces environnements, car la plupart d'entre eux ne sauvegardent probablement pas cette information n'importe où. Si tout ce que vous voulez est pour les environnements Amsthm, j'ai ajouté cela à la réponse. –

+0

OK merci. Je vais essayer ça plus tard. Est-ce qu'une chose semblable fonctionnera pour ntheorem? – Seamus

2

vous souhaitez peut-être consulter le package nameref, qui est distribué avec hyperref. Il y a une section dans la documentation sur le référencement nameref « trucs »: http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=nameref

En savoir plus sur le référencement: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=nameref

+1

nameref ne fonctionne pas: il fait référence au titre de la SECTION dans laquelle apparaît l'environnement de type théorème. Je vérifie d'autres possibilités trouvées dans les dupes possibles du commentaire au dessus. – Seamus

3

nameref ne fonctionne pas. Il fait référence au titre de la section de l'environnement du théorème semblable apparaît dans

C'est un nameref bug qui était déjà corrigé il y a longtemps: http://web.archiveorange.com/archive/v/9uUx5EuqoCGynIvx3om7#lY2MJxvge2oMgOi

Malheureusement certaines distributions Linux comme Debian/Ubuntu sont livrées avec des versions horriblement anciennes des paquets (Ubuntu 11.04 est toujours livré avec TeX Live 2009 bien que la dernière version soit TeX Live 2011).Si vous utilisez un tel arrêt de distribution Linux en utilisant le paquet Tex Live dans la distribution, et installez TeX Live directement à partir d'ici: http://www.tug.org/texlive/ Vous pouvez ensuite mettre à jour les paquets en utilisant tlmgr (un outil vraiment cool qui n'est pas livré avec Debian/Ubuntu) .

0

Je pensais que d'autres pourraient trouver cela utile. Même si j'ai installé un paquet hyperref mis à jour, j'ai dû appeler explicitement \usepackage{nameref} après \usepackage{hyperref} afin d'obtenir le comportement correct de \nameref. Sans l'appel explicite à \usepackage{nameref}, \nameref travaillé, mais exposé le bug discuté dans ce fil.

Mise à jour: cette solution de contournement n'est pas requise pour un exemple minimal (que j'ai vérifié). Je ne sais pas s'il y a quelque chose de plus compliqué dans mes fichiers de style, mais je le mettrai à jour si je trouve quelque chose. Cela peut encore aider quelqu'un qui rencontre le même problème que moi.

Questions connexes