2010-05-04 9 views
5

Estoy usando ntheorem para componer un conjunto de condiciones. En mi exposición de motivos que tengo:Hace referencia a un entorno similar a un teorema por su [nombre]

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

Cuando quiero componer una condición, que escribe:

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

el nombre aparece en negrita en la misma línea que el comienzo del texto de la condición, la sin número ni nada. Perfecto.

Lo que quiero hacer ahora es referirse a la condición por alguna variante del comando \ref, \ ref llama al número [que no se visualiza ninguna otra parte] \ thref escribe "Condición n" para la condición enésima \ nameref escribe el nombre de la SECCIÓN de la etiqueta. se sugirió una solución zref here, pero parece insatisfactoria y difícil de manejar.

¿Alguna sugerencia sobre una manera simple de hacer esto? (Incluso una solución de zref más simple sería agradable) En este momento acabo de definir un \newcommand para cada condición y usar eso en lugar de citar la condición misma. Esto es semánticamente opaco y simplemente insatisfactorio ...

(Editar: Envié un correo electrónico a un autor de ntheorem, Wolfgang May, y me explicó que no hay realmente una manera de hacerlo dentro de ntheorem, ya que la opción [nombre] no está registrado.)

(edit: Esto no es un engaño como se sugiere en el comentario, ya que estoy interesado en hacer referencia a un entorno por su comando de nombre opcional, sin hacer referencia a la sección/capítulo en el que se encuentra.)

+1

Compruebe http://stackoverflow.com/questions/1491842/references-with-text-in-latex que * podría * ser un duplicado efectivo. También http://stackoverflow.com/questions/2613506/ref-chapter-name-in-latex y cosas enlazan desde allí. – dmckee

+0

zref podría funcionar, pero parece una manera muy complicada de hacer las cosas. Quiero decir, el [nombre] ya está declarado al comienzo del entorno. Solo quiero llamarlo por su nombre, no por su número ... – Seamus

Respuesta

7

Creo que lo siguiente puede hacer lo que quiera.

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

A continuación, se utiliza como

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

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

Desafortunadamente, puede entonces sólo se hace referencia por su nombre, aunque supongo que se podría utilizar una normal de \label así (con una clave diferente, por supuesto).

Para los entornos amsthm puede utilizar

\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

Ese tipo de trabajo. Pero todavía no es ideal. El punto es que quiero usar el contenido del argumento opcional de la condición como el nombre que estoy llamando. Así que tengo '\ begin {Condition} [Cnd Name]' y quiero tener una etiqueta que, cuando lo 'ref', diga" Cnd Name ", en negrita como es cuando la condición se escribe por primera vez. De esta manera, tengo que agregar un argumento adicional a la etiqueta y asegurarme de que coincida con "Cnd Name" ... – Seamus

+0

Eso dependerá del entorno utilizado. Probablemente tengas que crear un contenedor para cada entorno, ya que la mayoría de ellos probablemente no guarde esa información en ningún lugar. Si todo lo que quieres es para los entornos amsthm, lo he agregado a la respuesta. –

+0

OK gracias. Lo probaré más tarde. ¿Funcionará algo similar para el teorema? – Seamus

2

es posible que desee comprobar el paquete nameref, que se distribuye con hyperref. Hay una sección en la documentación sobre nameref referencia a "cosas": http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=nameref

Más de referencia: http://www.tex.ac.uk/cgi-bin/texfaq2html?label=nameref

+1

nameref no funciona: hace referencia al título de la SECCIÓN en la que aparece el entorno similar a un teorema. Estoy comprobando otras posibilidades encontradas en los posibles engaños del comentario encima. – Seamus

3

nameref no funciona:. Hace referencia el título de la sección del medio ambiente como teorema aparece en

Esta es una nameref bug que ya fue arreglado hace un tiempo: http://web.archiveorange.com/archive/v/9uUx5EuqoCGynIvx3om7#lY2MJxvge2oMgOi

Desafortunadamente, algunas distribuciones de Linux como Debian/Ubuntu se envían con versiones horriblemente viejas de los paquetes (Ubuntu 11.04 todavía envía TeX Live 2009, aunque la última versión es TeX Live 2011).Si está utilizando una distribución Linux así, deje de usar el paquete Tex Live en la distribución e instale TeX Live directamente desde aquí: http://www.tug.org/texlive/ Puede actualizar paquetes utilizando tlmgr (una herramienta realmente genial que no se incluye con Debian/Ubuntu) .

0

Pensé que a otros podría ser útil. Aunque tenía un paquete actualizado hyperref instalado, tuve que llamar explícitamente al \usepackage{nameref} después de \usepackage{hyperref} para obtener el comportamiento correcto desde \nameref. Sin la llamada explícita a \usepackage{nameref}, \nameref funcionó, pero exhibió el error discutido en este hilo.

Actualización: esta solución no es necesaria para un ejemplo mínimo (que revisé). No sé si hay algo más complicado en mis archivos de estilo, pero lo actualizaré si encuentro algo. Esto aún puede ayudar a alguien a encontrarse con el mismo problema que yo.

Cuestiones relacionadas