Verweis im Text auf eine Zahl in einer Tabelle

Verweis im Text auf eine Zahl in einer Tabelle

Ich habe mich gefragt, ob es möglich ist, im Text einen Querverweis auf eine bestimmte Zahl in einer Tabelle zu erstellen, sodass sich die Zahl im Text ändert, wenn sich die Zahl, auf die ich mich im Text beziehe, in der Tabelle ändert. In meinem Text muss ich wiederholt auf eine bestimmte Summe in einer Tabelle verweisen. Das Problem besteht darin, dass ich die Zahl im Text mehrmals manuell ändern muss, da die Elemente, aus denen die Summe abgeleitet wird, ständig geändert werden. Ich befürchte, dass ich möglicherweise vergesse, einige der Zahlen im Text zu korrigieren. Nehmen wir als Beispiel an, dass Tabelle 1 die folgende Form hat

$$\begin{array}{|c|c|} 
 & \text{Sum}  \\ \hline
Bla bla & 5  \\ \hline
\end{array}$$

In Tabelle 1 beträgt die Summe 5.

Da ich immer wieder in ähnlicher Weise auf die Summe verweise, hätte ich auf eine Lösung wie diese gehofft:

„Tabelle 1 zeigt, dass die Summe gleich \ref{Summe in Tabelle 1} ist“

, wobei ich die Zahl 5 in Tabelle 1 mit „Summe in Tabelle 1“ „beschriftet“ habe. (Ich wollte ein Beispiel anführen, aber ich glaube nicht, dass das möglich ist.) Schließlich hoffe ich auf eine „allgemeinere Lösung“, da ich in meiner eigentlichen Arbeit mehrere Tabellen „dieser Art“ habe.

Antwort1

Im Text deiner Frage verwendest du die Umgebung, arrayum eine Tabelle zu erstellen. Die Umgebung arraywird aber verwendet, um Matrizen im Mathematikmodus zu erstellen. Ich empfehle, die Umgebung nicht arrayzum Erstellen von Tabellen zu missbrauchen, sondern die Umgebung zum Erstellen von Tabellen zu verwenden tabular.


Mit dem PaketzrefSie können ganz einfach Ihr eigenes Querverweissystem analog zum im LaTeX-2ε-Kernel implementierten -Mechanismus \labeleinführen :\ref

Das folgende Beispiel definiert

\StoreNumber{⟨ID/label⟩}{⟨something that in the text should denote a number⟩}

Und

\RetrieveNumber{⟨ID/label⟩}


Bearbeitung am 5. November 2020:

Ich (Ulrich Diez) habe übersehen, dass „Zahl“ nicht „Ganzzahl“ bedeutet.
Ich habe das \number\numexpr...\relax-Ding aus entfernt \StoreNumber.

Mit⟨etwas, das im Text eine Zahl bezeichnen soll⟩Sie müssen sich um die Verhinderung der Erweiterung und die Erstellung von PDF-Strings für die Lesezeichen der PDF-Datei kümmern.

Bei den Zref-Dingen habe ich den Zref-Wrapper zum Aktivieren von Babel-Kurzschriften nicht verwendet.
Wenn ich dies täte und \RetrieveNumberes als Teil des Arguments eines Abschnittsbefehls enden würde, der auch in PDF-Lesezeichen enden könnte, würde der Wrapper von zref für Babel-Abkürzungen Probleme verursachen, während das Lesezeichen für den betreffenden Abschnitt erstellt wird.


\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}

Da das Speichern und Abrufen von Zahlen ähnlich dem \label- \ref-Mechanismus des LaTeX 2ε-Kernels implementiert ist, muss das Dokument mindestens zweimal kompiliert werden, bis alles übereinstimmt und??werden überall im Dokument durch die richtige Nummer ersetzt. Falls das Paket hyperref verwendet wird, während das Paket bookmark nicht geladen ist, müssen Sie das Dokument mindestens dreimal kompilieren.

In meinem Beispiel habe ich das Textcase-Paket geladen. Es bietet die Möglichkeit, die Groß- und Kleinschreibung von Zeichen zu verhindern.

Bei Dokumentklassen wie article, die \pagestyle{headings}automatisch Seitenköpfe mit Abschnittstiteln in Großbuchstaben erstellen, ist dies erforderlich, um die Großschreibung von Zeichen zu verhindern, die die Namen von Referenzierungslabels oder abzurufenden Zahlen bezeichnen. Andernfalls \Retrievenumber{sum in table 1}würde in Seitenköpfen ein in umgewandelt \Retrievenumber{SUM IN TABLE 1}, was ein Problem darstellen würde, da (anders als die Zahl "sum in table 1") eine Zahl "SUM IN TABLE 1" nie gespeichert wurde.

Bildbeschreibung hier eingeben

Lesezeichen sehen folgendermaßen aus:

Bildbeschreibung hier eingeben

verwandte Informationen