
Me preguntaba si es posible hacer una referencia cruzada en el texto a un número específico en una tabla, de modo que el número en el texto cambie cada vez que el número al que me refiero en el texto cambie en la tabla. En mi texto, tengo que hacer referencia repetidamente a una suma específica en una tabla. El problema es que, debido a que los elementos utilizados para derivar la suma se modifican continuamente, tengo que cambiar el número del texto manualmente varias veces. Me temo que podría omitir corregir algunos de los números del texto. Para dar un ejemplo, supongamos que la Tabla 1 adopta la siguiente forma
$$\begin{array}{|c|c|} & \text{Sum} \\ \hline Bla bla & 5 \\ \hline \end{array}$$
En la Tabla 1, la suma es igual a 5.
Como repetidamente hago una referencia similar a la suma, esperaba una solución como:
"La tabla 1 muestra que la suma es igual a \ref{suma en la tabla 1}"
, donde he 'etiquetado' el número de 5 en la Tabla 1 como "suma en la tabla 1". (Quería dar un ejemplo, pero no creo que sea posible) finalmente, espero una "solución más general", ya que tengo varias tablas "de este tipo" en mi tesis actual.
Respuesta1
En el texto de tu pregunta utilizas el entorno array
para crear una tabla. Pero el entorno array
se utiliza para crear matrices en modo matemático. Recomiendo no hacer un mal uso del entorno array
para crear tablas sino utilizar el tabular
entorno para crear tablas.
Por medio del paquetezrefpuede introducir fácilmente su propio sistema de referencias cruzadas de forma análoga al \label
mecanismo \ref
implementado en el kernel LaTeX 2ε:
El siguiente ejemplo define
\StoreNumber{⟨ID/label⟩}{⟨something that in the text should denote a number⟩}
y
\RetrieveNumber{⟨ID/label⟩}
Editar el 5 de noviembre de 2020:
Yo (Ulrich Diez) pasé por alto que "número" no implica "entero".
Quité la \number\numexpr...\relax
cosa de \StoreNumber
.
Con⟨algo que en el texto debe denotar un número⟩debe encargarse de la prevención de expansión y de la creación de cadenas pdf para los marcadores del archivo .pdf.
Con zref-things no utilicé el contenedor de zref para habilitar babel-shorthands.
Si lo hiciera y \RetrieveNumber
terminara como parte del argumento de un comando de sección que también podría terminar en marcadores de pdf, entonces el contenedor de zref para babel-shorthands causaría problemas mientras se crea el marcador para la sección en cuestión.
\documentclass{article}
\usepackage[unicode=true]{hyperref}
\usepackage[overload]{textcase}
\usepackage{zref}
\makeatletter
\@ifpackageloaded{hyperref}{%
\@ifdefinable\RetrieveNumber@RefUndefText{%
\DeclareRobustCommand\RetrieveNumber@RefUndefText{%
\texorpdfstring{\nfss@text{\reset@font\bfseries ??}}{??}%
}%
}%
\@ifdefinable\RetrieveNumber{%
\DeclareRobustCommand\RetrieveNumber[1]{%
\texorpdfstring{\zref@refused{#1}}{}%
\zref@extractdefault{#1}{numbertostore}{\RetrieveNumber@RefUndefText}%
}%
}%
}{%
\@ifdefinable\RetrieveNumber@RefUndefText{%
\DeclareRobustCommand\RetrieveNumber@RefUndefText{%
\nfss@text{\reset@font\bfseries ??}%
}%
}%
\@ifdefinable\RetrieveNumber{%
\DeclareRobustCommand\RetrieveNumber[1]{%
\zref@refused{#1}%
\zref@extractdefault{#1}{numbertostore}{\RetrieveNumber@RefUndefText}%
}%
}%
}%
%
\zref@newprop{numbertostore}[0]{0}%
\@ifdefinable\StoreNumber{%
\DeclareRobustCommand\StoreNumber[2]{%
\begingroup
\zref@setcurrent{numbertostore}{#2}%
\zref@labelbyprops{#1}{numbertostore}%
\endgroup
\RetrieveNumber{#1}%
}%
}%
\@ifdefinable\CheckWhetherMath{%
\DeclareRobustCommand\CheckWhetherMath{%
\relax\ifmmode\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}%
}%
\makeatother
\usepackage{amsmath}
\usepackage[cbgreek]{textgreek} % cbgreek/euler/artemisia
\pagestyle{headings}
\begin{document}
\section{About a sum which equals \protect\NoCaseChange{\RetrieveNumber{sum in table 1}}}
\label{about a sum in table 1}
This section has the title: \nameref*{about a sum in table 1}.
\bigskip
\noindent\autoref*{table1} shows that the sum equals \RetrieveNumber{sum in table 1}.
% pi-symbol is 0x03C0 in utf-16.
% higher byte is 03 (Hex) = 3(dec) = 003(oct),
% lower byte is C0 (Hex) = 192(dec) = 300(oct),
% Higher byte must be marked by \9, thus the unicode-octal-triplet-pdfstring is: \9003\300
\begin{table}[h]
\centering
\begin{tabular}{|c|c|}
\hline
&\text{Sum}\\ \hline
Bla bla&\StoreNumber{sum in table 1}{\string\texorpdfstring{\CheckWhetherMath{\pi}{\textpi}}{\string\9003\string\300}}\\\hline
\end{tabular}%
\caption{A table where the sum equals \RetrieveNumber{sum in table 1}}%
\label{table1}%
\end{table}
\noindent\autoref*{table1} shows that the sum equals \RetrieveNumber{sum in table 1}.
\begin{equation}
\RetrieveNumber{sum in table 1}+\RetrieveNumber{sum in table 1}=2\cdot\RetrieveNumber{sum in table 1}
\end{equation}
\bigskip
\noindent\autoref*{table1} has the title: \nameref*{table1}
\bigskip
\hrule
\bigskip
\section{About a sum which equals \protect\NoCaseChange{\RetrieveNumber{sum in table 2}}}
\label{about a sum in table 2}
This section has the title: \nameref*{about a sum in table 2}.
\bigskip
\noindent\autoref*{table2} shows that the sum equals \RetrieveNumber{sum in table 2}.
\begin{table}[h]
\centering
\begin{tabular}{|c|c|}
\hline
&\text{Sum}\\ \hline
Bla bla&\StoreNumber{sum in table 2}{\number\numexpr(1*3)+1+1\relax}\\\hline
\end{tabular}%
\caption{A table where the sum equals \RetrieveNumber{sum in table 2}}%
\label{table2}%
\end{table}
\noindent\autoref*{table2} shows that the sum equals \RetrieveNumber{sum in table 2}.
\bigskip
\noindent\autoref*{table2} has the title: \nameref*{table2}
\begin{equation}
\RetrieveNumber{sum in table 2}+\RetrieveNumber{sum in table 2}=2\cdot\RetrieveNumber{sum in table 2}
\end{equation}
\bigskip
\hrule
\bigskip
\tableofcontents
\listoftables
\end{document}
Como el almacenamiento y la recuperación de números se implementa de forma similar al \label
mecanismo \ref
del kernel LaTeX 2ε, es necesario compilar el documento al menos dos veces hasta que todo coincida y??se reemplazan por el número correcto en todas partes del documento. En caso de que el paquete hyperref esté en uso mientras el marcador del paquete no esté cargado, deberá compilar el documento al menos tres veces.
En mi ejemplo cargué el paquete textcase. Proporciona medios para evitar el uso de caracteres en mayúsculas o minúsculas.
Con clases de documentos como artículo que \pagestyle{headings}
crean automáticamente encabezados de página con títulos de sección en letras mayúsculas, esto es necesario para evitar el uso de caracteres en mayúsculas que denotan los nombres de las etiquetas de referencia o los números a recuperar. De lo contrario, a \Retrievenumber{sum in table 1}
se convertiría en \Retrievenumber{SUM IN TABLE 1}
encabezados de página, lo que sería un problema ya que (a diferencia del número "suma en la tabla 1") nunca se almacenó un número "SUMA EN LA TABLA 1".
Los marcadores se ven así: