Внутритекстовая ссылка на число в таблице

Внутритекстовая ссылка на число в таблице

Мне было интересно, возможно ли сделать внутритекстовую перекрестную ссылку на определенное число в Таблице, так чтобы внутритекстовое число изменялось всякий раз, когда число, на которое я ссылаюсь в тексте, изменяется в Таблице? В моем тексте мне неоднократно приходится ссылаться на определенную сумму в таблице. Проблема в том, что, поскольку элементы, используемые для вывода суммы, постоянно изменяются, мне приходится вручную изменять внутритекстовое число несколько раз. Я боюсь, что могу упустить исправление некоторых внутритекстовых чисел. Приводя пример, предположим, что Таблица 1 имеет следующий вид

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

В таблице 1 сумма равна 5.

Поскольку я неоднократно ссылался на подобную сумму, я надеялся на решение вроде:

"Таблица 1 показывает, что сумма равна \ref{sum in table 1}"

, где я «обозначил» число 5 в Таблице 1 как «сумма в Таблице 1». (Я хотел привести пример, но не думаю, что это возможно) Наконец, я надеюсь на более «общее решение», поскольку в моей настоящей диссертации есть несколько Таблиц «такого рода».

решение1

В тексте вашего вопроса вы используете среду arrayдля создания таблицы. Но среда arrayиспользуется для создания матриц в математическом режиме. Я рекомендую не злоупотреблять средой arrayдля создания таблиц, а использовать tabularсреду для создания таблиц.


С помощью пакетаzrefвы можете легко ввести собственную систему перекрестных ссылок аналогично \label- \ref-механизму, реализованному в ядре LaTeX 2ε:

Следующий пример определяет

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

и

\RetrieveNumber{⟨ID/label⟩}


Редактировать 5 ноября 2020 г.:

Я (Ульрих Диц) упустил из виду, что "число" не подразумевает "целое".
Я удалил \number\numexpr...\relax-thingie из \StoreNumber.

С⟨то, что в тексте должно обозначать число⟩вам необходимо позаботиться о предотвращении расширения и создании pdf-строк для закладок .pdf-файла.

При использовании zref-things я не использовал оболочку zref для включения babel-shorthands.
Если бы я это сделал и \RetrieveNumberоказался бы частью аргумента команды sectioning-command, которая также могла бы оказаться в pdf-bookmarks, то оболочка zref для babel-shorthands вызвала бы проблемы при создании закладки для соответствующего раздела.


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

Так как хранение и извлечение чисел реализовано аналогично \labelмеханизму \refядра LaTeX 2ε, вам необходимо скомпилировать документ как минимум дважды, пока все не совпадет и??заменяются правильным номером везде в документе. В случае, если пакет hyperref используется, а закладка пакета не загружена, вам необходимо скомпилировать документ как минимум три раза.

В моем примере я загрузил textcase-package. Он предоставляет средства для предотвращения заглавных/строчных символов.

С классами документов, такими как article, которые \pagestyle{headings}автоматически создают заголовки страниц с заголовками разделов в верхнем регистре, это необходимо для предотвращения заглавия символов, которые обозначают имена ссылочных меток или чисел для извлечения. В противном случае a \Retrievenumber{sum in table 1}будет преобразовано в \Retrievenumber{SUM IN TABLE 1}внутри заголовков страниц, что станет проблемой, поскольку (в отличие от числа "sum in table 1") число "SUM IN TABLE 1" никогда не сохранялось.

введите описание изображения здесь

Закладки выглядят так:

введите описание изображения здесь

Связанный контент